當前位置:
首頁 > 新聞 > NSA的第七種武器|雙脈衝星(DoublePulsar) 後門詳細分析

NSA的第七種武器|雙脈衝星(DoublePulsar) 後門詳細分析

1. 引言


NSA的一系列SMB 漏洞利用的背後,最後都會使用到雙脈衝星(DoublePulsar)後門。雙脈衝星後門是一個無文件內核級的SMB後門。


2. 雙脈衝星後門的安裝過程


雙脈衝星後門是通過內核級的shellcode來安裝的(在x86 系統上,shellcode一般從地址0xffdff1f1開始)。我們來圍觀一下這段shellcode.

Shellcode的開始就是很有意思的一段代碼:



這段代碼咋看有些多餘, jz的跳轉是永遠不會被執行的。事實上,這段代碼是用來測試系統是否為64 位系統。


在64 位系統上,上述位元組則反彙編為



這樣一來, jz 總是會跳轉。


這段代碼測試CPU是32位還是64位,根據測試結果跳到不同的shellcode代碼。


本文以32位系統為例進行分析。


緊接著,進入如下代碼:


這段代碼又是個什麼鬼呢?這段代碼的作用是hook SYSENTER, 具體可參見 [1]。下次執行SYSENTER指令的時候,控制會轉到ebx+17 的代碼,即地址 FFDFF221。


跟進FFDFF221 代碼,



這段代碼過河拆橋,將上面SYSENTER的Hook摘掉。隨後執行



FFDFF39A這個函數正是試圖安裝雙脈衝星後門的函數。這個函數篇幅略長,但目的非常清晰,替換 srv.sys!SrvTracation2DispatchTable 表中 0xe項函數指針 (即表偏移0x38)。替換後的代碼即為SMB的後門函數。


在ffdff51e處下斷點,就可以非常清楚的觀察到:



這裡ebx就是srv!SrvTransaction2DispatchTable的地址, ebx+0x38就是0xe項的函數指針。eax為替換後的後門函數地址。


3. 雙脈衝星後門功能分析

根據上面的分析,雙脈衝星後門被成功的安裝到了srv!SrvTransaction2DispatchTable 的0xe項。那麼這個後門如何利用呢? 攻擊者只需要構造SMB_COM_TRANSACTION2 請求(0x32),並指定Subcommand 為SESSION_SETUP(0xe)這個無效的值,這時,SrvTransaction2DispatchTable的0xe項派遣函數,也就是被替換的後門函數將被調用。SMB 請求報文如下圖所示



下面分析一下後門函數的功能。


這個函數可謂整個雙脈衝星後門的精華所在,裡面使用了一系列令人眼花繚亂的技巧。



函數開始調用了3個不同的函數:


sub_FFDFF930


sub_FFDFF89F


sub_FFDF8E0

下面對這三個函數逐一進行分析


先看第一個函數sub_FFDFF930。



這個函數雖然代碼非常簡單,但要深入理解卻也著實不易,主要是一些用到的數據結構並沒有公開,只能靠大量的逆向工作來進行猜測。該函數的參數是傳給SrvTransaction2DispatchTable 中Dispatch函數的參數,參數類型沒有公開,權且稱其為CONTEXT。在經過大量的逆向分析後,結論如下:


CONTEXT的 某個偏移的地方存放著一個指針Ptr (進一步的深入分析發現,這個指針其實是個指向IRP的指針,應該就是SMB請求的IRP),這個指針的值正好是CONTEXT的起始地址+Size。所以只需從CONTEXT的起始地址開始步長為4位元組遞增搜索,就可以找到這個指針。


如下圖所示。



找到這個地址後,就可以在此基礎上推算出 SMB響應報文的地址以及SMB請求報文中Parameter存放的地址。


這麼看似費了一番周折,但主要目的是為了避免對於不同平台需要對SMB響應和SMB請求報文的Parameter在結構中的偏移進行硬編碼。


SMB相應 報文的起始地址存放在ebp+44處,而SMB請求報文的Parameter則存放在ebp+38處。

接下來看第二個函數 sub_FFDFF89F:


這個函數更加簡單,用來初始化會話用的密鑰運算操作。


最後,看第三個函數,這個函數對SMB 後門請求報文做一些簡單的合法性檢查,其中又使用了一些技巧來找到內核態的指針,來驗證指針的有效性。其次,它對 ParameterCount 和TotalParameterCount值進行檢測,二者都必須是0xc。這個函數的存在,體現了這段shellcode在穩定性方面做了一些周全的考慮。


三個函數執行完後,調用了FFDFF88B 這個函數,根據函數的計算結果,會跳到不同的分支。


這個函數偽代碼如下:



這個函數就是將dword的四個位元組加起來, 結果轉化成一個位元組。


那麼它的輸入是什麼呢,經調試分析,輸入就是SMB請求的 Timeout 欄位。


也就是說,後門函數將SMB的Timeout請求欄位解碼,把解碼的結果跟0x23,0x77,0xc8比較作為後門的命令。


當結果為0x23時,後門函數用來檢查後門是否已經安裝,即PING命令。

當結果為0x77時,後門函數用來進一步執行傳入的shellcode。


當結果為0xc8時,後門函數用來卸載後門。


下面看一個具體的例子:



這個請求中Timeout的值為 93 89 07 00: 0x93+0x89+0x07+00= 0x123,取最後一個位元組,結果為0x23,根據上面的分析,這是PING命令。



在處理PING 命令時,我們看到,把計算出來的密鑰放在了SMB響應報文的Signature中,已備後面發送shellcode時加密使用。


最後一段PING 命令處理代碼:



這裡會根據不同的狀態將響應報文的MID(Multiplex ID) 加上一個值(正常情況下,響應的MID必須和請求中的MID值一致)。MID增量值具體含義見下表:


下圖是一個PING命令成功的例子,


請求,



可見,請求中的MID為66(0x0042)


響應:



響應中的MID值為82(0x0052)。兩者MID差值為0x0052-0x0042 = 0x10.


在做完這一切後

將控制跳轉到原來的派遣函數

以便回復SMB請求


4. 結束語


本文詳細分析了作為NSA第七種武器的雙脈衝星後門的代碼。該代碼構思相當巧妙,隱蔽性很強。作者對Windows 代碼, 尤其是SMB部分的代碼可謂相當熟悉。整個Shellcode考慮到了通用性,穩定性,猶如做工精良的武器一般。而這樣的內核級後門,對入侵者無疑是敞開了一扇大門,幾乎可以為所欲為。


5. 參考文獻




  1. Rootkits: Subverting the Windows Kernel.(pp94-95)



  2. https://zerosum0x0.blogspot.com.au/2017/04/doublepulsar-initial-smb-backdoor-ring.html



  3. http://blog.checkpoint.com/2017/05/25/brokers-shadows-analyzing-vulnerabilities-attacks-spawned-leaked-nsa-hacking-tools/


*本文作者:蘭雲科技銀河實驗室,轉載請註明FreeBuf.COM




喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

OOB(out of band)分析系列之DNS滲漏
利用系統特性偽裝成一個免密登陸後門

TAG:FreeBuf |

您可能感興趣

射程超AIM-120的空空導彈,搭載雙脈衝發動機,美國也想有
殲20遠戰利器-霹靂15導彈的雙脈衝發動機設計分析
中國民營公司固體火箭發動機試車成功,雙脈衝技術引關注
雙脈衝固體火箭發動機完成試車