很久之前寫的文章,現在拿出來分享。事先聲明本人是一枚愛搗鼓的小菜,所以對泄漏資料的分析難免會有疏忽或著錯誤,望各位圍觀的大俠手下留情。
今年7月5日晚,一家意大利軟件廠商被攻擊,其掌握的387.05GB漏洞(包括0day)數據泄露出來,由此可能引發的動蕩,引起了業界一片嘩然。因為所有文件加起來的大小整整有387.05GB,光下載就得好久好久。在這里我提供一個完整版的百度網盤下載地址,有興趣的同學可以直接去下載:http://yun.baidu.com/s/1jG8fOxS 。據說之所以這么大是因為里面有很多的郵件。但你不用擔心你的小水管,有好人整理了一個只有1.3G的精華版。在這里我也提供一個百度網盤下載地址:http://yun.baidu.com/s/1eQDFm18 。在下載完完整版之前,我們就先拿精華版解解饞吧。
0×01 前言
這里的IPA不是Apple程序應用文件iPhoneApplication的縮寫,而是Injection Proxy Appliance的縮寫,Injection Proxy Appliance是Galileo Remote Control System(伽利略遠程控制系統,簡稱RCS)的一部分,其主要作用是:
IPA是Hacking Team RCS系統用于攻擊的安全設備,并且其中使用中間人攻擊技術和streamline injection機制,它可以在不同的網絡情況下透明地進行操作,無論是在局域網還是內部交換機上。IPA還可從監控的網絡流量中檢測HTTP連接,對其進行中間人攻擊,主要有三種攻擊方式:注入HTML、注入EXE和替換攻擊。當監控的HTTP連接命中預先設置的規則時,IPA 將執行注入攻擊。IPA 可以設置需要注入的用戶(如IP地址),資源(如可執行文件)等規則。
其vector-ipa的源代碼在Hacked Team\rcs-dev\share\HOME\Fabio\archive\projects\pc\RCSRedirect文件夾中 ,其內容如圖1。
圖1 vector-ipa內容
通過源碼發現,這是在Linux環境下使用Makefile文件對整個工程進行編譯、連接等的C代碼,并且還使用了openssl庫。
0×02 攻擊原理
基于HTTP/1.0協議的客戶機和服務器信息交換的過程包括四個步驟:
(1)建立連接;(2)發送請求;(3)回送響應信息;(4)關閉連接。
IPA通過代理的模式監控的網絡流量中檢測HTTP連接,并劫持HTTP連接的Http Header,通過修改Http Header內容實現攻擊,其攻擊流程如圖2。
圖2 IPA進行http注入攻擊流程
從圖2中可知,其攻擊的最主要的兩個步驟就是 修改HTTP Request Header 和 將木馬寫入HTTP Reply Header 。下面重點介紹一下這兩步。
0×03 HTTP Request Header
1、將HTTP協議從1.1降到1.0以避免分塊編碼和其他問題
首先,HTTP/1.0和HTTP/1.1的其中一個區別就是:
(1)HTTP 1.0規定瀏覽器與服務器只保持短暫的連接,瀏覽器的每次請求都需要與服務器建立一個TCP連接,服務器完成請求處理后立即斷開TCP連接,服務器不跟蹤每個客戶也不記錄過去的請求。如圖3所示。
圖3 HTTP/1.0連接
(2)HTTP 1.1支持持久連接,在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲。一個包含有許多圖像的網頁文件的多個請求和應答可以在一個連接中傳輸,但每個單獨的網頁文件的請求和應答仍然需要使用各自的連接。如圖4所示。
圖4 HTTP/1.1連接
因為http注入不需要使用持久性連接,所以我們需要修改它為HTTP/1.0協議,這樣做的話可以避免分塊編碼和其他一些問題。
2、強制使用純編碼,以避免任何類型的壓縮
HTTP Header中Accept-Encoding是瀏覽器發給服務器,聲明瀏覽器支持的編碼類型的。
Accept-Encoding: compress, gzip //支持compress 和gzip類型Accept-Encoding: //默認是identityAccept-Encoding: * //支持所有類型 Accept-Encoding: compress;q=0.5, gzip;q=1.0//按順序支持 gzip , compressAccept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0 //按順序支持 gzip , identity
為了后面更好的修改HTTP Reply Header,需要將 Accept-Encoding 設置為 none ,這樣可以避免任何類型的壓縮,源碼如圖5所示。
圖5 設置Accept-Encoding為none
3、不使用緩存(避免服務器返回304響應)
不使用緩存就是為了更好的得到新的文件,需要刪除Cache 頭域中的If-Modified-Since和If-None-Match,如圖6所示。
圖6 刪除Cache頭域中的If-Modified-Since和If-None-Match
If-Modified-Since
把客戶端端緩存頁面的最后修改時間發送到服務器去,服務器會把這個時間與服務器上實際文件的最后修改時間進行對比。如果時間一致,那么返回304,客戶端就直接使用本地緩存文件。如果時間不一致,就會返回200和新的文件內容。客戶端接到之后,會丟棄舊文件,把新文件緩存起來,并顯示在瀏覽器中。如圖7所示。
圖7 If-Modified-Since
If-None-Match
If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 當用戶再次請求該資源時,將在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服務器驗證資源的ETag沒有改變(該資源沒有更新),將返回一個304狀態告訴客戶端使用本地緩存文件。否則將返回200狀態和新的資源和Etag。如圖8所示。
圖8 If-None-Match
4、關閉保持連接
我們都知道Connection: keep-alive和Connection: close的區別:
當一個網頁打開完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接不會關閉,如果客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經建立的連接。
代表一個Request完成后,客戶端和服務器之間用于傳輸HTTP數據的TCP連接會關閉, 當客戶端再次發送Request,需要重新建立TCP連接。
前面我們將HTTP協議從1.1降到1.0,為了HTTP Request Header中可能存在Connection: keep-alive而導致后面修改HTTP Reply Header時出問題。
這樣我們就把HTTP Request Header修改完成了,接著就是向服務器發送請求啦~
0×04 木馬文件
在前面我們把修改之后的HTTP Request Header發送到服務器,這樣服務也返回了HTTP Reply Header響應。那接下來的這步也是最關鍵的一步,就是將木馬寫入HTTP Reply Header中。
1、讀取木馬文件內容
在這之前,我們需要對木馬文件進行準備檢測,如果不存在的話,則返回一個新的BIO。
圖9 木馬文件準備檢測
從上面的木馬文件準備檢測可以發現,其中木馬文件如圖10所示。
圖10 木馬文件
注入的原理就是在HTTP Reply Header的
標簽中注入一段JavaScript腳本。其JavaScript腳本的內容如下:從JavaScript腳本中,發現腳本跳轉到一個JwsUpdater.jnlp的文件。先普及一下什么是JNLP?
JNLP(Java Network Launching Protocol )是java提供的一種可以通過瀏覽器直接執行java應用程序的途徑,它使你可以直接通過一個網頁上的url連接打開一個java應用程序。Java桌面應用程序以JNLP 的方式發布,如果版本升級后,不需要再向所有用戶發布版本,只需要更新服務器的版本,這就相當于讓java應用程序有了web應用的優點。
使用jnlp文件就是為了能夠通過瀏覽器打開一個網頁上的URL連接來執行java木馬應用程序。
Java Web Start Updater %SITE_HOSTNAME% %IPA_URL%/backdoor.exe
其中,在
如果檢測通過之后,就是將木馬文件JwsUpdater.html的內容讀取到html_to_inject中。
2、修改IPA_URL
在前面無論是JwsUpdater.html文件,還是JwsUpdater.jnlp文件都有一個“%IPA_URL%”。我需要把“%IPA_URL%”修改為工作服務器的地址。
木馬腳本、服務器網站都修改好,那么萬事俱備只欠東風。對的,設置搜索關鍵字和注入緩沖器就是那陣東風。
struct bio_inject_setup { char *search; char *inject; size_t inject_len;};
其中,有三個成員,分別是搜索關鍵字(search)、注入木馬腳本內容(inject)和注入木馬腳本的長度(inject_len)。
前面也提到了,我們的木馬內容是一段JavaScript腳本,所以注入木馬腳本之處就是html文件中
標簽內。0×05 HTTP Reply Header
木馬文件都準備好,那么接下來就是把木馬文件寫入到HTTP Reply Header中。分下面三個步驟:
1、將木馬寫入HTTP Reply Header
前面我們,設置搜索關鍵字和注入緩沖器。
在HTTP Reply Header搜索關鍵字,再把注入緩沖器的內容寫入到HTTP Reply Header即可。如圖11所示:
圖11 將木馬寫入HTTP Reply Header
2、檢查HTTP Reply Header是否gzip壓縮
HTTP Reply Header必須采用純編碼,不能對其進行壓縮。所以如果發現HTTP Reply Header有壓縮的話,則停止攻擊。
3、調整HTTP Reply Header的Content-Length屬性
前面,在HTTP Reply Header中注入了木馬腳本,所以HTTP Reply Header的長度肯定變化了,所以,我們需要調整HTTP Reply Header的Content-Length屬性。
到這為止,就差最后一步,就是把HTTP Reply Header發送回客戶端。這樣就把木馬程序種植到客戶端。接下來就可以利用后門程序,做一系列的攻擊。
*原創作者:LiukerTeam,本文屬FreeBuf原創獎勵計劃文章,未經許可禁止轉載
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com