Defcon 23最新開源工具NetRipper程式碼分析與利用

來源:互聯網
上載者:User

標籤:執行   資料   保護   主機   展開   流控   擴充   firefox   註冊   

0×01 研究背景

在分析了俄羅斯人被曝光的幾個銀行木馬的源碼後,發現其大多均存在通過劫持瀏覽器資料包來擷取使用者個人資訊的模組,通過截獲瀏覽器記憶體中加密前或解密後的資料包來得到資料包的明文資料。在Defcon 23被發布的工具NetRipper具備了以上惡意銀行木馬的這一能力,其開源的代碼結構清晰,易於擴充,研究該工具對於研究該類惡意行為很有意義。其github地址在【github】 ,作者還提供了metasploit和powershell版本的利用模組,本文將分析其不同版本模組均會用到的c++代碼實現的核心部分。 

0×02 NetRipper工具概括

該開源工具實現的功能,主要是通過Hook進程的網路函數關鍵點(封包加密之前與封包解密之後的網路函數)來劫持用戶端程式的明文資料。其中包括了諸多主流用戶端,例如:Chrome,Firefox,IE,WinSCP,Putty以及一些程式碼程式庫中提供的網路封包加解密函數介面,根據函數介面的函數性質來分的話,可以分為“未匯出的函數介面”和“匯出的函數介面”。其中Chrome,Putty,SecureCrt以及WinSCP中的網路加解密介面是屬於UnExported,需要通過逆向工程來找到其Signature的位置,然後通過HOOK劫持;例如Mozilla Firefox使用了nss3.dll和nspr4.dll這兩個模組中的加解密函數,nss3.dll中匯出了PR_Read,PR_Write以及PR_GetDescType,後者匯出了PR_Send和PR_Recv。其他的例如ncrypt.dll、secur32.dll和ssh2core73u.dll等。

 

還有對winsock2下的普通網路傳輸函數進行Hook來直接擷取到一些未加密的資訊。

 

 

對於未匯出函數hook的處理需要先找出hook點,這比hook已知匯出函數的過程複雜許多,首先需要通過逆向分析進程的收發包過程來找到關鍵點(加密前與解密後的資料包處理的函數介面)。例如,對於chrome/putty/winscp進程是需要這樣做的,可以通過其開源的代碼作為輔助分析,首先找到其網路函數的Signature,HOOK之前在進程的記憶體空間中搜尋其所在地址:

 

 

伴隨著軟體的升級與安全保護的增強,可能明文層次上的收發包函數會有一些變化,那麼NetRipper代碼就需要修改去適應這些變化,重新調試分析找到對應的Signature,進而重新設定Hook點。

 

以putty為例來驗證下:

 

 

使用CE尋找發送函數的標識,位置在0x00408AD7。

 

 

IDA中顯示 Sub_408ad7這個函數的原型定義與代碼中聲明是一致的: 

 

 

至於如何調試找出未匯出函數的HOOK點,這方面的內容較多,下一篇文章詳細分析。對於putty和winscp用戶端,因為均已開源,可以參考其開源的代碼;對於chrome,那就需要逆向偵錯工具來定位HOOK點了。

 

0×03 Hook的位移地址計算

 

E8 XXXXXXXX

 

其中XXXXXXXX = 目標地址 – 原始地址 – 5 

 

舉個例子,OD載入calc.exe:

 

 

指令中的位移地址:0xFFFF99EB

 

目標地址:0x6c768

 

當前指令地址:0x72d78

 

計算公式:0xFFFFFFFF – ( 0x72d78 + 5 – 0x6c768 )  =  0xFFFF99eb

 

QA1:為什麼需要使用0xFFFFFFFF減去位移值呢?

 

計算補碼

 

地址為一個DWORD(unsigned long)佔4個位元組的整型,可以表示的位址範圍是有符號的2倍,可以表示的範圍是0×00000000~0xFFFFFFFF。

 

QA2:為什麼需要當前指令地址加上5,然後減去目標地址來計算位移量呢?

 

這涉及到CALL/JMP指令計算位移的基礎,首先CALL/JMP(E8或E9)均是佔用了5個位元組,要跳到目標地址,那麼首先就需要跳過當前指令的長度,然後再跳到目標地址。在上面的例子中也可以看到,通過計算才是正確的結果。

 

NetRipper實際例子:

 

 

NetRipper也處理了在碰到Hot-Patching的情況,其處理的方式與上面的一致,只不過將函數地址加了5個位元組,將新的位置作為函數的HOOK點。

 

 

NetRipper 對Hook的處理也很有意思:

 

(1)使用一個結構HookStruct來儲存(或者叫註冊一個函數Hook資訊)被HOOK的函數的資訊,使用一個vector維護。

 

(2)回呼函數使用內聯彙編編寫,代碼的功能是:當原始函數被調用就執行這一段彙編代碼,然後在彙編代碼中調用Hooker::GetHookStructByOriginalAddress函數,這個函數將原始函數的地址作為參數,在所有已經註冊了HOOK結構的vector<HokStruct>中檢索該函數的HOOK資訊,根據函數的地址來確定回呼函數。

對於這一段內聯彙編代碼的解釋,在下面會給出分析。

 

注意:對於Recv這樣的函數來說,只有先調用了原始的函數,才能夠得到recv的資訊。這存在一個Hook後回呼函數中的處理問題。

 

0×04 NetRipper 中Hook的處理 

 

 

0×05 NetRipper中的注入

 

NetRipper中提供了常規遠程注入和反射注入兩種注入方法,其中反射注入在目前已經非常常見了,除了惡意代碼常常會採用,對於metasploit滲透架構也採用了這種注入方式。關於這種注入方法,資料較多,這裡就不展開了。

 

0×06代碼架構分析

 

作者為了使該工具擴充性強,包括核心代碼在內,其他輔助模組均通過C++類來封裝,具有較低耦合性,易於配置來完成不同的任務。

 

(1)注入與動態配置

 

核心模組在一個DLL中,所以需要注入到目標進程,提供了注入代碼,該注入部分的代碼提供了常規遠程線程注入和反射注入技術兩種選擇,注入器採用命令列形式,可以用於配置要注入的DLL。

 

(2)外掛程式系統

 

代碼中使用了作者編寫的一個外掛程式系統,封裝在一個C++類種,以成員函數形式提供了幾個外掛程式函數,也可以根據其代碼方便擴充。

 

(3)調試日誌

 

提供了調試資訊輸出的功能,作者提供了封裝的這個類,使用者可以通過配置是否使用。

 

(4)函數流量控制

 

可針對每一個被Hook的線程,保證其Hook操作後處理的時候均只做一種類型的操作,通過一個函數流量控制類來控制。例如Hook的回呼函數輸出資訊到檔案,這樣可以控制一個線程中被Hook的函數只輸出到一個log檔案中。

0×07 NetRipper的使用

 

NetRipper主要用於後滲透,目標主機被攻陷後,需要進一步深入橫縱滲透的時候就需要更多的資訊,NetRipper通過劫持瀏覽器/用戶端的明文資訊來達到這一目的。Net Ripper提供了對瀏覽器以及一些常見的用戶端的劫持實現,通過劫持瀏覽器(IE/Chrome/Firefox)來得到使用者請求的資訊;對於WinSCP和putty等用戶端可以直接得到使用者輸入的賬戶等資訊,協助滲透測試人員以及攻擊者從Windows系統過渡到Linux系統,完成攻擊最大化。下面以putty為例測試

 

(1)將DLL注入至putty進程完成利用

 

 

(2)使用putty登陸SSH伺服器來驗證

 

 

(3)預設在使用者目錄下的temp下組建記錄檔檔案:

 

 

(4)putty資料包解密資料

 

 

可以看到輸入的使用者名稱root和密碼qwe以及輸入的命令ifconfig已經被記錄下來了,這是對發包過程的解密操作。

 

 

(5)hook send/recv函數擷取的putty加密的資料

 

 

*本文任子行,轉載請註明FreeBuf.COM

Defcon 23最新開源工具NetRipper程式碼分析與利用

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.