信息安全技術實用教程-第4版---張同光---ISBN-9787121423031---5.4.2實例——緩衝區溢出攻擊WindowsXPSP3
https://my.oschina.net/ztguang/blog/5329391
主 編: 張同光
ISBN號: 978-7-121-42303-1 9787121423031
出版日期: 2021-11-20
出版社: 電子工業出版社
頁碼: 定價:¥69.80元
5.4.2 實例——緩衝區溢出攻擊Windows XP SP3
1.實驗環境
實驗環境如圖5.17所示,使用宿主機(Windows 10)、虛擬機KaliLinux(攻擊機)、虛擬機WinXPsp3(目標機),KaliLinux和WinXPsp3虛擬機的網絡連接方式選擇“僅主機(Host-Only)網絡”。攻擊機(192.168.56.109)對目標機(192.168.56.102)進行緩衝區溢出攻擊。
圖5.17 實驗環境
從宿主機將文件slmail55_4433.exe、ImmunityDebugger_1_85_setup.exe和python-2.7.18.msi拖放到目標機(WinXPsp3)。
在目標機(WinXPsp3)中,雙擊slmail55_4433.exe安裝郵件服務器,如圖5.18、圖5.19、圖5.20所示,安裝完成後重啓系統。如圖5.21所示,在命令行窗口執行命令netstat -nao,發現25、110、180端口處於監聽狀態,並且在“計算機管理”窗口可以看到郵件相關的三個服務已啓動,說明郵件服務器安裝成功。在目標機(WinXPsp3)中,接着安裝python-2.7.18.msi和ImmunityDebugger_1_85_setup.exe。
從宿主機將文件mona.py拖放或複製到目標機(WinXPsp3)中Immunity Debugger的安裝目錄C:\Program Files\Immunity Inc\Immunity Debugger\PyCommands裏。
郵件服務器SLmail 5.5.0 Mail Server的POP3 PASS命令存在緩衝區溢出漏洞,無需身份驗證即可實現遠程代碼執行。Immunity Debugger是動態調試工具。腳本mona.py用於定位進程模塊。
爲了本次實驗,關閉Windows防火牆。當然,也可以打開防火牆,不過需要在防火牆增例外:pop3(110端口)和SMTP(25端口)。
圖5.18 安裝郵件服務器 圖5.19 安裝郵件服務器
圖5.20 安裝郵件服務器 圖5.21 查看開放的端口
2.緩衝區溢出攻擊過程
第1步:入侵者測試目標機的25和110端口。
在攻擊機(KaliLinux)執行nc 192.168.56.102 25命令和nc 192.168.56.102 110命令測試目標機(WinXPsp3)是否開放25和110端口,結果表示已經開放,如圖5.22所示。
圖5.22 測試目標機(WinXPsp3)是否開放25和110端口
第2步:入侵者測試目標機緩衝區溢出。
如圖5.23所示,在攻擊機(KaliLinux)執行telnet 192.168.56.102 100命令,然後輸入user命令和pass命令。我們已經知道SLmail 5.5.0中POP3協議的PASS(大小寫均可)命令是存在緩存區溢出漏洞的,所以只要在pass後面輸入的數據量達到某一個量值時,就會出現緩衝區溢出。
圖5.23 手動測試緩衝區溢出漏洞 圖5.24 自動化測試
手動測試緩衝區溢出漏洞的效率太低,下面通過Python腳本進行自動化測試。
Python腳本文件(overflow.py)內容如下。如圖5.24所示,爲overflow.py文件增加可執行權限,然後執行該腳本文件。
#!/usr/bin/python import socket
buffer = ["A"] counter = 300 while len(buffer) <= 20: buffer.append("A" * counter) counter += 300 for string in buffer: print "FUZZING PASS WITH %s BYTES" % len(string) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) connect = s.connect(('192.168.56.102', 110)) s.recv(1024) s.send('USER test' + '\r\n') s.recv(1024) s.send('PASS ' + string + '\r\n') s.send('QUIT\r\n') s.close() |
現在的問題是:向郵件服務器發送這麼多數據後,仍然不知道目標機是否發生了緩衝區溢出。
第3步:判斷目標機是否發生緩衝區溢出。
在目標機(WinXPsp3),命令行窗口執行命令netstat -nao,查看在110端口監聽的進程的PID(1840,注意,每次重啓系統後,該PID的值可能都不一樣),如圖5.21所示。打開Immunity Debugger,依次選擇菜單“File”→“Attach”,如圖5.25所示,選擇PID爲1840(SLmail)的行,然後單擊“Attach”按鈕。進程默認處於暫停狀態(單擊“F12”可以暫停進程的執行),爲了觀察溢出情況,單擊開始按鈕或“F9”繼續執行1840(SLmail)進程,如圖5.26所示。
圖5.25 Attach進程 圖5.26 繼續執行進程
在攻擊機(KaliLinux),再次執行overflow.py,當發送到3000個A的時候停了下來,如圖5.27所示。接下來查看目標機(WinXPsp3)的情況,如圖5.28所示,查看Immunity Debugger調試器,發現進程已經崩潰,且EIP寄存器中的內容爲AAAA的ASCII碼值(41414141,十六進制表示),所以下一條要執行的指令的地址是代碼段中位移量爲41414141的指令,而這個地址基本不是一條有效指令,因此進程崩潰。
圖5.27 執行overflow.py 圖5.28 發生緩衝區溢出,進程崩潰
在攻擊機(KaliLinux),腳本overflow.py每次遞增300個字節向目標機(WinXPsp3)的SLmail發起請求數據,當發送的字節數達到3000時,進程崩潰了,說明PASS指令確實存在緩衝區溢出,接下來要做的事情是得到確切的緩衝區溢出位置,通過緩存區溢出利用EIP寄存器,進而執行Shellcode來進一步控制目標機。
第4步:得到確切緩衝區溢出位置所在的區間。