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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
SC3010-Computer-Security — Struts2とPowerShellを使用してCVE-2017-5638 OGNL Injection脆弱性を再現する。 | Kitploit
ツール/GitHubGitHub/aipeacs/sc3010-computer-security
静的分析脆弱性分析コード分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育ペイロード開発ラボと実践Archived
GitHubaipeacs/sc3010-computer-security

SC3010-Computer-Security

Struts2とPowerShellを使用してCVE-2017-5638 OGNL Injection脆弱性を再現する。

54ヶ月前未レビュー
リポジトリを見る

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
共有

SC3010-Computer-Security — CVE-2017-5638 攻撃の再現

このリポジトリは、SC3010 コンピュータセキュリティコースプロジェクトの一部です。
CVE-2017-5638 を再現します。これは Apache Struts 2(バージョン 2.3.5~2.3.31 および 2.5~2.5.10)における重大なリモートコード実行(RCE)脆弱性であり、2017年の Equifax データ漏洩で悪用され、約1億4700万人分の個人記録が流出したことで有名です。

この脆弱性は、単一の設計上の欠陥に起因します:Apache Struts が multipart/form-data アップロードリクエストの解析に失敗したとき、サニタイズせずに生の Content-Type ヘッダーを文字列に埋め込み、その文字列が OGNL 式評価器に渡されることでエラーメッセージを構築します。攻撃者が Content-Type ヘッダー内に OGNL 式を仕込むと、それが Tomcat プロセスユーザーとしてサーバーサイドで実行されます。

このリポジトリには以下が含まれます:

  • ファイルアップロードエンドポイントを備えた、実際に脆弱な Java/Maven サーバー(Struts2 2.3.28)
  • インジェクションから RCE までの完全なチェーンを示す PowerShell エクスプロイトスクリプト
  • Apache Struts 2.3.28 の注釈付き参照ソースファイル。コールチェーンの各ステップをマッピングしています。

背景知識

  • OGNL インジェクションはどのように機能するか?

リポジトリ構造

root@kitploit:~
SC3010-Computer-Security/
├── simulation/
│   ├── backend/          # 脆弱な Apache Struts2 2.3.28 サーバー(Java/Maven)
│   └── attack-script/    # CVE-2017-5638 向けエクスプロイトスクリプト
│       └── exploit_cve_2017_5638.ps1   # PowerShell(クロスプラットフォーム)
├── struts-src-code/          # Apache Struts2 参照ソース + 法的通知
│   ├── licenses/             # LICENSE、NOTICE、およびコンポーネントライセンス
│   └── src/
│       ├── struts2-core/     # リクエストパイプラインクラス + 脆弱な JakartaMultiPartRequest
│       ├── xwork2/           # ActionContext.java、OgnlUtil.java
│       └── ognl/             # OgnlContext.java
├── diagrams/                 # 状態機械図 + シーケンス図、注釈付き OGNL ペイロード
└── _notes/                   # 背景情報

エクスプロイトシミュレーション

  • セットアップと使用方法については、simulation/README.md を参照してください。

攻撃状態機械図

以下の図は、Struts2 リクエストパイプラインの各分岐ポイントを示しています。赤い経路が攻撃者が強制する経路です。灰色の → ... の分岐は、エクスプロイト中には適用されない安全な経路です。

root@kitploit:~
flowchart TD
    Start([攻撃者が HTTP POST /upload.action を送信<br/>Content-Type: &#37;&#123;OGNL_PAYLOAD&#125;.multipart/form-data])
    Start --> PIPE

    PIPE["<b>Struts2 フィルター → ラップ → パースパイプライン</b><br/>doFilter() → PrepareOperations.wrapRequest()<br/>→ Dispatcher.wrapRequest() → new MultiPartRequestWrapper()"]
    PIPE --> D_CT{"Content-Type に<br/>&quot;multipart/form-data&quot; が含まれているか?"}
    D_CT -- "いいえ → 通常のリクエスト ..." --> OUT_NORM([非アップロードパス ...])
    D_CT -- "はい(攻撃者がペイロードに<br/>.multipart/form-data を追加)" --> PARSE

    PARSE[/"<b>JakartaMultiPartRequest.parse()</b><br/>→ Commons FileUpload.parseRequest()"/]
    PARSE --> D_VALID{"FileUpload が Content-Type を<br/>解析できるか?"}
    D_VALID -- "はい → 通常のファイルアップロード ..." --> OUT_OK([ファイルが抽出され、アクションが実行される ...])
    D_VALID -- "いいえ — 不正な Content-Type<br/>InvalidContentTypeException をスロー<br/>(メッセージ = 生の Content-Type 文字列)" --> CATCH

    CATCH["parse() のキャッチブロック<br/>buildErrorMessage(e, &#123;&#125;) を呼び出す"]
    CATCH --> FIND

    FIND[/"<b>buildErrorMessage()</b><br/>→ LocalizedTextUtil.findText(class, errorKey, locale, e.getMessage(), args)"/]
    FIND --> D_KEY{"リソースバンドルにキー<br/>struts.messages.upload.error.* が存在するか?"}
    D_KEY -- "はい → 安全なローカライズメッセージ ..." --> OUT_SAFE([エラーが安全に表示される ...])
    D_KEY -- "いいえ — デフォルトとして<br/>e.getMessage() にフォールバック<br/>(攻撃者の生の Content-Type)" --> TRANSLATE

    TRANSLATE["TextParseUtil.translateVariables()<br/>文字列をスキャンして &#37;&#123;...&#125; 式を探す"]
    TRANSLATE --> D_OGNL{"文字列に<br/>&#37;&#123;...&#125; OGNL 式が含まれているか?"}
    D_OGNL -- "いいえ → プレーンなエラー文字列 ..." --> OUT_PLAIN([安全なエラーメッセージ ...])
    D_OGNL -- "はい — 攻撃者のコンテンツ内の<br/>OGNL を評価" --> SANDBOX

    SANDBOX[/"<b>OGNL サンドボックス回避</b><br/>#ognlUtil.getExcludedClasses().clear()<br/>#ognlUtil.getExcludedPackageNames().clear()"/]
    SANDBOX --> ACCESS

    ACCESS[/"<b>無制限のリフレクション</b><br/>#context.setMemberAccess(DEFAULT_MEMBER_ACCESS)"/]
    ACCESS --> RCE

    RCE[/"<b>RCE</b><br/>Runtime.getRuntime().exec(cmd)"/]
    RCE --> Done([コマンドが Tomcat プロセスユーザーとして実行される])

    style Start fill:#d32f2f,color:#fff
    style Done fill:#d32f2f,color:#fff
    style OUT_NORM fill:#9e9e9e,color:#fff
    style OUT_OK fill:#9e9e9e,color:#fff
    style OUT_SAFE fill:#9e9e9e,color:#fff
    style OUT_PLAIN fill:#9e9e9e,color:#fff
    style SANDBOX fill:#b71c1c,color:#fff
    style ACCESS fill:#b71c1c,color:#fff
    style RCE fill:#b71c1c,color:#fff
    style CATCH fill:#e65100,color:#fff
    style TRANSLATE fill:#e65100,color:#fff

分岐の説明付きの完全な状態機械については、diagrams/cve-2017-5638-state-machine.md を参照してください。
シーケンス図と注釈付き OGNL ペイロードの内訳については、diagrams/cve-2017-5638-attack-chain.md を参照してください。


サードパーティソフトウェアに関する通知

このリポジトリは、学術的なセキュリティ研究目的で Apache Struts 2.3.28 ソースコードの一部を再現しています。

Apache Struts は Copyright © 2000–2016 The Apache Software Foundation です。
Apache License, Version 2.0 の下でライセンスされています。
ライセンスのコピーは struts-src-code/licenses/LICENSE.txt にあります。
Apache License で要求される完全な帰属表示は struts-src-code/licenses/NOTICE.txt にあります。

Apache Struts 2 は追加のサードパーティコンポーネントをバンドルしており、それぞれが独自のライセンスに従います:

コンポーネントライセンスファイル
OGNL (Object-Graph Navigation Library)struts-src-code/licenses/OGNL-LICENSE.txt
XWorkstruts-src-code/licenses/XWORK-LICENSE.txt
FreeMarkerstruts-src-code/licenses/FREEMARKER-LICENSE.txt

ソース参照:

  • apache/struts @ STRUTS_2_3_28 — Struts2 コアと XWork
  • jkuhnert/ognl — OGNL 3.0.x
  • Gemini — 一般的な OGNL 言語に関するコンサルテーション
ツールをダウンロード