Slide 1

Slide 1 text

Dangerous usage of JNDI @okuken3 2021.12.21 第14回 初心者のためのセキュリティ勉強会

Slide 2

Slide 2 text

== CAUTION (Disclaimer) == ■本資料の内容は、ローカル環境で個人的に行った検証の結果です JNDIの危険な使い方、具体的には、信頼できない値をJNDI Lookupに渡す実装が行われた場合に、どのような内部処理を経て RCEが成立するのかを把握し、チェックや対策に役立てることを目的として、自身のローカル環境で個人的に検証を行いまし た。本内容を共有する目的も同様であり、悪用を助長するような意図は一切ないことをあらかじめご認識おきください。な お、悪用の意図がない場合であっても、自身の管理下にないシステムに対して管理者の許可なく検証行為を行うことは法令違 反に当たる可能性もあり、行わないようにご注意ください。 ■網羅的な内容ではありません 本資料で記載した攻撃手法を全て防いだ場合でも、記載以外の既知の手法はもちろん、少し捻られたり、新たな手法が発見さ れる可能性も大いにあるため、万全な対策とは言えません。信頼できない値をJNDI Lookupに渡さない、これが対策の原則に なるかと思います。また、昨今話題の、ライブラリ経由で意図せずJNDIの危険な使い方を行っているケースでは、然るべき発 行元からの情報を元に、バージョンアップ等の適切な対策を実施いただければと思います。 ■敢えて既知の脆弱性が存在するバージョンを使用しています 本資料と同様の検証をご自身で実施される場合は、自身の管理下のサンドボックス環境で実施するなど細心の注意を払った上 で、自己責任で行ってください。脆弱なシステムを動かすことで思わぬ攻撃の被害にあう可能性があります。 ■個人の見解です 記載の内容はあくまで個人の検証内容および見解であり、所属組織とは一切関係ありません。

Slide 3

Slide 3 text

Test Environment Vulnerable Server: https://github.com/okuken/sectest_java  - Spring Boot 2.6.1 *use spring-boot-starter-web  - Log4j 2.14.1 *CVE-2021-44228  - Java   - 8u112 *https://www.oracle.com/java/technologies/javase/8u121-relnotes.html#notes-8u121   - 8u181 *CVE-2018-3149   - 8u191 Attacker Server (PoC): https://github.com/pimps/JNDI-Exploit-Kit

Slide 4

Slide 4 text

※ It’s for illustration purpose. (not actual code) Flow Vulnearable Server 127.0.0.1:8080 Attacker Server (PoC) [RMI] 127.0.0.1:10990 [LDAP] 127.0.0.1:13890 [HTTP] 127.0.0.1:8180 Attacker ①HTTP Request ②LDAP Lookup ③Response (javaCodeBase is URL of Attacker HTTP Server) ④HTTP Request ⑤Response(.class) ⑥

Slide 5

Slide 5 text

Java 8u112 - RMI [Attacker Server (PoC)] [Vulnerable Server] ...

Slide 6

Slide 6 text

Java 8u112 - LDAP [Attacker Server (PoC)] [Vulnerable Server] ... ...

Slide 7

Slide 7 text

Java 8u181 - RMI [Attacker Server (PoC)] [Vulnerable Server] ... NO calc

Slide 8

Slide 8 text

Java 8u181 - LDAP [Attacker Server (PoC)] [Vulnerable Server] ...

Slide 9

Slide 9 text

Java 8u191 - LDAP [Attacker Server (PoC)] [Vulnerable Server] NO calc

Slide 10

Slide 10 text

Flow -bypass with EL- Vulnearable Server 127.0.0.1:8080 Attacker Server (PoC) [RMI] 127.0.0.1:10990 Attacker ①HTTP Request ②RMI Lookup ③Response (crafted ResourceRef *use javax.el.ELProcessor ) ④

Slide 11

Slide 11 text

Java 8u191 – RMI(bypass with EL) [Attacker Server (PoC)] [Vulnerable Server]

Slide 12

Slide 12 text

Flow -serialized payload- Vulnearable Server 127.0.0.1:8080 Attacker Server (PoC) [LDAP] 127.0.0.1:13890 Attacker ①HTTP Request ②LDAP Lookup ③Response (serialized payload *generated by ysoserial ) ④

Slide 13

Slide 13 text

Java 8u191 - LDAP(serialized payload) *add Apache Commons Collections 4.0 to classpath [Attacker Server (PoC)] [Vulnerable Server] ...

Slide 14

Slide 14 text

Demo

Slide 15

Slide 15 text

Reference ■ Log4j, CVE-2021-44228 - https://logging.apache.org/log4j/2.x/security.html#CVE-2021-44228 - https://logging.apache.org/log4j/2.x/security.html#Older_.28discredited.29_mitigation_measures - https://www.lunasec.io/docs/blog/log4j-zero-day/ - https://mbechler.github.io/2021/12/10/PSA_Log4Shell_JNDI_Injection/ ■ JNDI, Deserialization - https://www.veracode.com/blog/research/exploiting-jndi-injections-java - https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP- Manipulation-To-RCE.pdf - https://cheatsheetseries.owasp.org/assets/Deserialization_Cheat_Sheet_GOD16Deserialization.pdf ■ PoC - https://github.com/okuken/sectest_java - https://github.com/pimps/JNDI-Exploit-Kit - https://github.com/frohoff/ysoserial