Skip to content

Instantly share code, notes, and snippets.

@vdb-sander
Last active August 24, 2018 20:26
Show Gist options
  • Save vdb-sander/ffaef0334c79074664d0bf5af6d2b774 to your computer and use it in GitHub Desktop.
Save vdb-sander/ffaef0334c79074664d0bf5af6d2b774 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import subprocess
import multiprocessing
from multiprocessing import Process, Queue
import os
import time
import fileinput
import atexit
import sys
import socket
import argparse
import nmap
import re
from time import sleep
start = time.time()
class bcolors:
HEADER = '\033[00;31m'
TITLE = '\033[0;33m'
OKBLUE = '\033[94m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
def parse_args():
parser = argparse.ArgumentParser(description='Automate the recon process')
parser.add_argument('-f', '--dir', help='Local directory where information should be written to',
required=True)
group = parser.add_mutually_exclusive_group()
group.add_argument('-i', '--ip', help='IP or IPRange')
group.add_argument('-d','--dns', help='DNS Hostname/Domain')
return parser.parse_args()
def main():
args = parse_args()
ip = args.ip
domain = args.dns
dir = args.dir
dir = os.path.abspath(dir) + "/"
print bcolors.HEADER + '#############################' + bcolors.ENDC
print bcolors.TITLE + 'Basic Recon & Enumeration' + bcolors.ENDC
print bcolors.HEADER + '#############################' + bcolors.ENDC
if ip is None:
p = multiprocessing.Process(target=dnsRecon, args=(domain,dir,))
p.start()
else:
activeHosts = netdiscover(ip, dir)
p = multiprocessing.Process(target=tcpScan, args=(activeHosts,))
p.start()
p = multiprocessing.Process(target=udpScan, args=(activeHosts,))
p.start()
def multProc(targetin, scanip, port, dir):
jobs = []
p = multiprocessing.Process(target=targetin, args=(scanip,port,dir,))
jobs.append(p)
p.start()
return
def dnsRecon(domain, dir):
print bcolors.TITLE + "\n[*] Gathering DNS information..." + bcolors.ENDC
resolve_to_ip = 'dig +short ' + domain
results_resolve_to_ip = subprocess.check_output(resolve_to_ip, shell=True)
print "\t" + domain + " ---> " + results_resolve_to_ip.strip()
dnsrecon = "dnsrecon -D /usr/share/wordlists/dnsmap.txt -t std -d %s --xml '%sdns_information_%s'" % (domain, dir, resolve_to_ip)
results_dnsrecon = subprocess.check_output(dnsrecon, shell=True)
print bcolors.TITLE + "[*] DNS information collected\n"
activeHosts = netdiscover(results_resolve_to_ip, dir)
def netdiscover(ip, dir):
activeHosts = []
print bcolors.OKGREEN + "[*] Netdiscovery started" + bcolors.ENDC
nm = nmap.PortScanner()
nm.scan(hosts=ip, arguments='-sn', sudo=True)
hosts_list = [(x, nm[x]['status']['state']) for x in nm.all_hosts()]
for host in hosts_list:
host_to_scan = Host(host[0],nm[host[0]].hostname(), dir, nm[host[0]].state())
activeHosts.append(host_to_scan)
print bcolors.OKGREEN + "[*] Netdiscovery finished. Found " + str(len(activeHosts)) + " active host(s)." + bcolors.ENDC
print "\t-------------------"
for host in hosts_list:
ipString = '{:^15}'.format(str(host[0]))
print "\t| " + ipString + " |"
print "\t-------------------"
return activeHosts
def tcpScan(activeHosts):
ipList = getStringList(activeHosts)
print bcolors.OKGREEN + "[*] TCP Scan running..." + bcolors.ENDC
nm = nmap.PortScanner()
nm.scan(hosts=ipList, arguments='-sS -T4 -Pn -p- --open', sudo=True)
parseTcpAndUdp(nm, activeHosts, 'TCP')
print bcolors.OKGREEN + "[*] TCP Scan finished" + bcolors.ENDC
p = multiprocessing.Process(target=serviceScan, args=(activeHosts,'TCP',))
p.start()
def udpScan(activeHosts):
ipList = getStringList(activeHosts)
ports = []
print bcolors.OKGREEN + "[*] UDP Scan running..." + bcolors.ENDC
nm = nmap.PortScanner()
nm.scan(hosts=ipList, arguments='-sU -T4 -Pn -sC --top-ports 200 --open', sudo=True)
parseTcpAndUdp(nm, activeHosts, 'UDP')
print bcolors.OKGREEN + "[*] UDP Scan finished" + bcolors.ENDC
p = multiprocessing.Process(target=serviceScan, args=(activeHosts,'UDP',))
p.start()
def parseTcpAndUdp(nm, activeHosts, proto):
for host in nm.all_hosts():
for proto in nm[host].all_protocols():
ports = []
lport = list(nm[host][proto].keys())
lport.sort()
for port in lport:
port_host = Port(port, proto)
ports.append(port_host)
for activeHost in activeHosts:
if activeHost.getIp() == str(host):
if proto == 'UDP':
activeHost.setUdpPorts(ports)
else:
activeHost.setTcpPorts(ports)
def getStringList(activeHosts):
ipList = ""
for host in activeHosts:
ipList += host.getIp() + " "
return ipList
def serviceScan(activeHosts, proto):
for activeHost in activeHosts:
portsToBeScanned = ""
portList = activeHost.getPorts(proto)
for port in portList:
portsToBeScanned += str(port.getPortNumber()) + ","
portsToBeScanned = portsToBeScanned[:-1]
if len(portList) != 0:
print bcolors.OKGREEN + "[*] " + proto + " Service Scan running..." + bcolors.ENDC
NMAP_ServiceScan = "nmap -sV -A -T4 -Pn -oN '" + activeHost.getDir() + "Nmap_results.nmap' -p" + portsToBeScanned + " " + activeHost.getIp()
results_servicescan = subprocess.check_output(NMAP_ServiceScan, shell=True)
initServiceTesting(results_servicescan, activeHost, proto)
else:
print bcolors.OKBLUE + "[*] No open " + proto + " ports found." + bcolors.ENDC
def initServiceTesting(results, activeHost, proto):
lines = results.split("\n")
ports = activeHost.getPorts(proto)
count = 0
for line in lines:
line = line.strip()
if ("tcp" in line) and ("open" in line) and not ("Discovered" in line):
while " " in line:
line = line.replace(" ", " ");
linesplit = line.split(" ")
service = linesplit[2]
port_ = linesplit[0]
port_ = re.sub(r'/.*', '', port_)
ports[count].setService(service)
count += 1
print bcolors.OKGREEN + "[*] " + proto + " Service Scan finished" + bcolors.ENDC
for port in ports:
serv = port.getService()
if (serv == "http") or (serv == "http-proxy") or (serv == "http-alt") or (serv == "http?"):
multProc(httpEnum, activeHost.getIp(), str(port.getPortNumber()), activeHost.getDir())
elif (serv == "ssl/http") or ("https" == serv) or ("https?" == serv):
multProc(httpsEnum, activeHost.getIp(), str(port.getPortNumber()), activeHost.getDir())
elif serv == "smtp":
multProc(smtpEnum, activeHost.getIp(), str(port.getPortNumber()), activeHost.getDir())
elif serv == "ftp":
multProc(ftpEnum, activeHost.getIp(), str(port.getPortNumber()), activeHost.getDir())
elif (serv == "microsoft-ds") or (serv == "netbios-ssn"):
multProc(smbEnum, activeHost.getIp(), str(port.getPortNumber()), activeHost.getDir())
multProc(smbNmap, activeHost.getIp(), str(port.getPortNumber()), activeHost.getDir())
elif serv == "ms-sql":
multProc(mssqlEnum, activeHost.getIp(), str(port.getPortNumber()), activeHost.getDir())
elif serv == "ssh":
multProc(sshScan, activeHost.getIp(), str(port.getPortNumber()), activeHost.getDir())
elif serv == "msrpc":
multProc(rpcEnum, activeHost.getIp(), str(port.getPortNumber()), activeHost.getDir())
elif serv == "oracle-tns":
multProc(oracleTnsEnum, activeHost.getIp(), str(port.getPortNumber()), activeHost.getDir())
elif serv == "snmp":
multProc(snmpEnum, activeHost.getIp(), str(port.getPortNumber()), activeHost.getDir())
def connect_to_port(ip_address, port, service, dir):
total_communication = ""
service = ""
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip_address, int(port)))
banner = s.recv(1024)
if service == "ftp":
s.send("USER anonymous\r\n")
user = s.recv(1024)
s.send("PASS anonymous\r\n")
password = s.recv(1024)
total_communication = banner + "\r\n" + user + "\r\n" + password
elif service == "smtp":
total_communication = banner + "\r\n"
elif service == "ssh":
total_communication = banner
elif service == "pop3":
s.send("USER root\r\n")
user = s.recv(1024)
s.send("PASS root\r\n")
password = s.recv(1024)
total_communication = banner + "\r\n" + user + "\r\n" + password
s.close()
f = open(dir + "/1. Recon/Service_banner_information.txt", "w+")
f.write(service + "\r\n" + total_communication + "\r\n#######################################\r\n")
f.close()
def oracleTnsEnum(ip_address, port, dir):
print "INFO: Detected Oracle TNS Listener on " + ip_address + ":" + port
ORACLETNSv = "tnscmd10g version -h %s -p %s | tee '%sOracle_TNS_%s_%s.txt'" % (ip_address, port, dir, ip_address, port)
ORACLETNSs = "tnscmd10g status -h %s -p %s | tee -a '%sOracle_TNS_%s_%s.txt'" % (ip_address, port, dir, ip_address, port)
results_oracletnsv = subprocess.check_output(ORACLETNSv, shell=True)
results_oracletnss = subprocess.check_output(ORACLETNSs,shell=True)
print "INFO: Finished with OracleTNS scan for " + ip_address + ":" + port
return
def rpcEnum(ip_address, port, dir):
print "INFO: Detected RPC on " + ip_address + ":" + port
print "INFO: Starting RPC script nmap scan " + ip_address + ":" + port
RPCSCAN = "nmap -p %s --script=msrpc-enum %s -oN '%sRPC-Nmap_%s_%s.nmap'" % (port, ip_address, dir, ip_address, port)
results_rpc = subprocess.check_output(RPCSCAN, shell=True)
print "INFO: Finished with RPC script nmap scan for " + ip_address + ":" + port
return
def dirb_soft(ip_address, port, url_start, dir):
print "INFO: Starting soft dirb scan for " + ip_address + ":" + port
DIRBSCAN = "dirb %s://%s:%s /usr/share/wordlists/dirb/big.txt -o '%sdirb_%s_%s.txt' " % (url_start, ip_address, port, dir, ip_address, port)
results_dirb = subprocess.check_output(DIRBSCAN, shell=True)
print "INFO: Finished with soft dirb scan for " + ip_address + ":" + port
return
def dirb_hard(ip_address, port, url_start, dir):
print "INFO: Starting hard dirb scan for " + ip_address + ":" + port
DIRBSCAN = "dirb %s://%s:%s /usr/share/wordlists/dirb/big.txt -x /usr/share/wordlists/dirb/extensions_common.txt -o '%sdirb_hard_%s_%s.txt' " % (url_start, ip_address, port, dir, ip_address, port)
results_dirb = subprocess.check_output(DIRBSCAN, shell=True)
print "INFO: Finished with hard dirb scan for " + ip_address + ":" + port
return
def nikto(ip_address, port, url_start, dir):
print "INFO: Starting nikto scan for " + ip_address + ":" + port
NIKTOSCAN = "nikto -h %s://%s:%s -p %s -o '%snikto_%s_%s_%s.txt' -Format txt -Tuning 1,2,3,a,b,d,e" % (url_start, ip_address, port, port, dir, url_start, ip_address, port)
results_nikto = subprocess.check_output(NIKTOSCAN, shell=True)
print "INFO: Finished with NIKTO-scan for " + ip_address + ":" + port
return
def httpEnum(ip_address, port, dir):
print "INFO: Detected http on " + ip_address + ":" + port
print "INFO: Performing nmap web script scan for " + ip_address + ":" + port
dirb_soft_process = multiprocessing.Process(target=dirb_soft, args=(ip_address,port,"http", dir,))
dirb_soft_process.start()
dirb_hard_process = multiprocessing.Process(target=dirb_hard, args=(ip_address,port,"http", dir,))
dirb_hard_process.start()
nikto_process = multiprocessing.Process(target=nikto, args=(ip_address,port,"http", dir))
nikto_process.start()
HTTPSCAN = "nmap -sV -Pn -vv -p %s --script=http-vhosts,http-userdir-enum,http-apache-negotiation,http-backup-finder,http-config-backup,http-default-accounts,http-methods,http-method-tamper,http-passwd,http-robots.txt,http-devframework,http-enum,http-frontpage-login,http-git,http-iis-webdav-vuln,http-php-version,http-shellshock,http-vuln-cve2015-1635,http-vuln-cve2006-3392,http-vuln-cve2012-1823,http-vuln-cve2013-0156,http-vuln-cve2013-6786,http-apache-server-status,http-vuln-cve2013-7091,http-aspnet-debug,http-vuln-cve2014-2126,http-enum,http-vuln-cve2014-2127,http-vuln-cve2014-2128,http-vuln-cve2014-2129,http-vuln-cve2014-3704,http-vuln-cve2014-8877,http-vuln-cve2015-1427,http-trace,http-vuln-cve2015-1635,http-vuln-cve2017-1001000,http-vuln-cve2017-5638,http-useragent-tester,http-vuln-cve2017-5689,http-vuln-cve2017-8917 -oN '%shttp_%s_%s.nmap' %s" % (port, dir, ip_address, port, ip_address)
http_results = subprocess.check_output(HTTPSCAN, shell=True)
print "INFO: Finished with HTTP-SCAN for " + ip_address + ":" + port
return
def httpsEnum(ip_address, port, dir):
print "INFO: Detected https on " + ip_address + ":" + port
print "INFO: Performing nmap web script scan for " + ip_address + ":" + port
dirb_soft_process = multiprocessing.Process(target=dirb_soft, args=(ip_address,port,"https", dir,))
dirb_soft_process.start()
dirb_hard_process = multiprocessing.Process(target=dirb_hard, args=(ip_address,port,"https", dir,))
dirb_hard_process.start()
nikto_process = multiprocessing.Process(target=nikto, args=(ip_address,port,"https", dir,))
nikto_process.start()
dir = dir.replace(" ", "\ ")
SSLSCAN = "sslscan %s:%s >> %sssl_scan_%s_%s" % (ip_address, port, dir, port, ip_address)
ssl_results = subprocess.check_output(SSLSCAN, shell=True)
print "INFO: CHECK FILE - Finished with SSLSCAN for " + ip_address + ":" + port
dir = dir.replace("\ ", " ")
HTTPSCANS = "nmap -sV -Pn -vv -p %s --script=http-vhosts,http-userdir-enum,http-apache-negotiation,http-backup-finder,http-config-backup,http-default-accounts,http-methods,http-method-tamper,http-passwd,http-robots.txt,http-devframework,http-enum,http-frontpage-login,http-git,http-iis-webdav-vuln,http-php-version,http-shellshock,http-vuln-cve2015-1635,http-vuln-cve2006-3392,http-vuln-cve2012-1823,http-vuln-cve2013-0156,http-vuln-cve2013-6786http-apache-server-status,http-vuln-cve2013-7091,http-aspnet-debug,http-vuln-cve2014-2126,http-enum,http-vuln-cve2014-2127,http-vuln-cve2014-2128,http-vuln-cve2014-2129,http-vuln-cve2014-3704,http-vuln-cve2014-8877,http-vuln-cve2015-1427,http-trace,http-vuln-cve2015-1635,http-vuln-cve2017-1001000,http-vuln-cve2017-5638,http-useragent-tester,http-vuln-cve2017-5689,http-vuln-cve2017-8917 -oN '%shttp_%s_%s.nmap' %s" % (port, dir, ip_address, port, ip_address)
https_results = subprocess.check_output(HTTPSCANS, shell=True)
print "INFO: Finished with HTTPS-scan for " + ip_address + ":" + port
return
def mssqlEnum(ip_address, port, dir):
print "INFO: Detected MS-SQL on " + ip_address + ":" + port
print "INFO: Performing nmap mssql script scan for " + ip_address + ":" + port
MSSQLSCAN = "nmap -sV -Pn -p %s --script=ms-sql-info,ms-sql-config,ms-sql-dump-hashes --script-args=mssql.instance-port=1433,smsql.username-sa,mssql.password-sa -oN '%smssql_%s_%s.nmap' %s" % (port, dir, ip_address, port, ip_address)
mssql_results = subprocess.check_output(MSSQLSCAN, shell=True)
print "INFO: Finished with MSSQL-scan for " + ip_address + ":" + port
return
def smtpEnum(ip_address, port, dir):
print "INFO: Detected smtp on " + ip_address + ":" + port
connect_to_port(ip_address, port, "smtp", dir)
SMTPSCAN = "nmap -sV -Pn -p %s --script=smtp-commands,smtp-enum-users,smtp-vuln-cve2010-4344,smtp-vuln-cve2011-1720,smtp-vuln-cve2011-1764 %s -oN '%ssmtp_%s_%s.nmap'" % (port, ip_address, dir, port, ip_address)
smtp_results = subprocess.check_output(SMTPSCAN, shell=True)
print "INFO: Finished with SMTP-scan for " + ip_address + ":" + port
return
def smbNmap(ip_address, port, dir):
print "INFO: Detected SMB on " + ip_address + ":" + port
smbNmap = "nmap --script=smb2-capabilities,smb-double-pulsar-backdoor,smb-enum-shares,smb-os-discovery,smb-server-stats,smb-vuln-cve-2017-7494,smb-vuln-ms10-061,smb2-security-mode,smb-enum-domains,smb-enum-users,smb-print-text,smb-system-info,smb-vuln-ms06-025,smb-vuln-ms17-010,smb2-time,smb-enum-groups,smb-protocols,smb-vuln-ms07-029,smb2-vuln-uptime,smb-enum-processes,smb-ls,smb-psexec,smb-vuln-conficker,smb-vuln-ms08-067,smb-enum-sessions,smb-mbenum,smb-security-mode,smb-vuln-cve2009-3103,smb-vuln-ms10-054 %s -oN '%ssmb_%s_%s.nmap'" % (ip_address, dir, ip_address, port)
smbNmap_results = subprocess.check_output(smbNmap, shell=True)
print "INFO: Finished with SMB-Nmap-scan for " + ip_address + ":" + port
return
def smbEnum(ip_address, port, dir):
print "INFO: Detected SMB on " + ip_address + ":" + port
dir = dir.replace(" ", "\ ")
enum4linux = "enum4linux -a %s > %senum4linux_%s_%s" % (ip_address, dir, ip_address, port)
enum4linux_results = subprocess.check_output(enum4linux, shell=True)
print "INFO: CHECK FILE - Finished with ENUM4LINUX-Nmap-scan for " + ip_address + ":" + port
return
def ftpEnum(ip_address, port, dir):
print "INFO: Detected ftp on " + ip_address + ":" + port
connect_to_port(ip_address, port, "ftp", dir)
FTPSCAN = "nmap -sV -Pn -vv -p %s --script=ftp-anon,ftp-bounce,ftp-libopie,ftp-proftpd-backdoor,ftp-vsftpd-backdoor,ftp-vuln-cve2010-4221 -oN '%sftp_%s_%s.nmap' %s" % (port, dir, ip_address, ip_address, port)
results_ftp = subprocess.check_output(FTPSCAN, shell=True)
print "INFO: Finished with FTP-Nmap-scan for " + ip_address + ":" + port
return
def snmpEnum(ip_address, port, dir):
print "INFO: Detected SNMP on " + ip_address + ":" + port
SNMPWALK = "snmpwalk -c public -v1 %s | tee '%ssnmp_%s_%s.txt'" % (ip_address, dir, ip_address, port)
results_snmpwalk = subprocess.check_output(SNMPWALK, shell=True)
ONESIXTYONE = "onesixtyone -c community-names-snmp.txt -i %s | tee -a '%ssnmp_%s_%s.txt'" % (ip_address, dir, ip_address, port)
results_onesixtyone = subprocess.check_output(ONESIXTYONE, shell=True)
print "INFO: Finished with SNMP scan for " + ip_address + ":" + port
def sshScan(ip_address, port, dir):
print "INFO: Detected SSH on " + ip_address + ":" + port
connect_to_port(ip_address, port, "ssh", dir)
def pop3Scan(ip_address, port, dir):
print "INFO: Detected POP3 on " + ip_address + ":" + port
connect_to_port(ip_address, port, "pop3", dir)
class Host:
def __init__(self, ip, hostname, dir, state):
self.ip = ip
self.hostname = hostname
self.dir = dir
self.state = state
self.tcpPorts = []
self.udpPorts = []
self.createFolderStructure()
def createFolderStructure(self):
if not os.path.exists(self.dir):
os.makedirs(self.dir)
dirs = os.listdir(self.dir)
if not self.ip in dirs:
os.mkdir(self.dir + self.ip)
os.mkdir(self.dir + self.ip + "/1. Recon/")
os.mkdir(self.dir + self.ip + "/2. Exploit/")
os.mkdir(self.dir + self.ip + "/3. Privilege Escalation/")
self.setDir(self.dir + self.ip + "/1. Recon/")
def setDir(self,dir):
self.dir = dir
def setTcpPorts(self, ports):
self.tcpPorts = ports
def setUdpPorts(self, ports):
self.UdpPorts = ports
def getIp(self):
return self.ip
def getDir(self):
return self.dir
def getState(self):
return self.state
def getPorts(self,proto):
if proto == 'TCP':
return self.tcpPorts
else:
return self.udpPorts
def getHostname(self):
return self.hostname
class Port:
def __init__(self, portNumber, proto):
self.portNumber = portNumber
self.proto = proto
self.service = None
def getPortNumber(self):
return self.portNumber
def getService(self):
return self.service
def setPortNumner(self, portNumber):
self.portNumber = portNumber
def setService(self, service):
self.service = service
if __name__=='__main__':
exit(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment