一步一步教你漏洞挖掘之如何在半黑盒模式下挖掘RCE漏洞
引言
很久很久以前,在閑暇之余研究了一下某系統,通過下載客戶端,在半黑盒模式下挖掘出一個JNDI注入漏洞。漏洞本身并不復雜,但是分析漏洞的過程可能對初學者有一定幫助,所以這里分享給大家,大佬請繞道。
客戶端安裝
通過訪問服務端,可以下載到該系統的客戶端軟件UClient.exe,下載后直接進行安裝。

在安裝過程中,會自動下載安裝JRE7u51的支撐環境,并在磁盤上創建一些文件夾。
漏洞分析
在分析客戶端程序時,定位到啟動配置文件`client.esc`,可以修改配置,加入jdwp遠程調試。

客戶端啟動入口:

分析過程中,定位文件`\NCCACHE\CODE\resources\server.properties`:

通過嘗試發現`JavaURLCommunicator`類主要用于向服務器發送HTTP請求。

關注下發送的封裝對象`InvocationInfo`:

從類的參數中可以看出,該類可能用于封裝與HTTP發包相關的過程。回到request函數:

重點看下這個地方:

客戶端對封裝的`InvocationInfo`對象進行序列化操作,然后發送給服務端。雖然沒有拿到服務端代碼,但是可以猜測在服務端應該存在一個反序列化操作。
研究了一會后,觀察日志文件:

客戶端通過lookup發送了大量JNDI請求。此時可以猜想服務端可能也存在同樣操作,聯想到前面分析的`JavaURLCommunicator`類`request`函數可以向服務端發送HTTP請求,其中兩個參數分別是服務端URL以及`InvocationInfo`對象,嘗試構造如下請求:

在處理來自服務端返回數據包的`result`處打下斷點:

猜測服務端確實應該存在`lookup`操作,修改發包測試程序:
import nc.bs.framework.common.InvocationInfo;import nc.bs.framework.comn.cli.JavaURLCommunicator;
public class Test { public static void main(String[]args)throws Exception{ InvocationInfo info=new InvocationInfo(); info.setServiceName("test"); JavaURLCommunicator com=new JavaURLCommunicator(); String url="http://***/ServiceDispatcherServlet"; com.request(info,url); }}
結果如下:

更加證明了上面的猜想,繼續構造JNDI服務:


漏洞驗證成功。由于默認的JDK版本為JDK7u51,可利用LDAP方式實現RCE。
后記
通過后續深入分析,發現系統還存在多個反序列化漏洞,上面主要基于客戶端程序,結合黑盒測試方式,成功挖掘出了一處JNDI注入漏洞,整個過程并不復雜,希望給初學的小伙伴們帶來一些幫助。