diff --git a/autorecon.py b/autorecon.py index 664792c..28a0e22 100644 --- a/autorecon.py +++ b/autorecon.py @@ -436,7 +436,7 @@ async def scan_target(target): else: continue - info('Found {bmagenta}' + service.name + '{rst} on {bmagenta}' + service.protocol + '/' + str(service.port) + '{rst} on {byellow}' + target.address + '{rst}') + info('Identified service {bmagenta}' + service.name + '{rst} on {bmagenta}' + service.protocol + '/' + str(service.port) + '{rst} on {byellow}' + target.address + '{rst}') if not config['only_scans_dir']: with open(os.path.join(target.reportdir, 'notes.txt'), 'a') as file: @@ -1026,9 +1026,9 @@ async def main(): continue if isinstance(ip, ipaddress.IPv4Address): - autorecon.pending_targets.append(Target(ip_str, 'IPv4', 'ip', autorecon)) + autorecon.pending_targets.append(Target(ip_str, ip_str, 'IPv4', 'ip', autorecon)) elif isinstance(ip, ipaddress.IPv6Address): - autorecon.pending_targets.append(Target(ip_str, 'IPv6', 'ip', autorecon)) + autorecon.pending_targets.append(Target(ip_str, ip_str, 'IPv6', 'ip', autorecon)) else: fail('This should never happen unless IPv8 is invented.') except ValueError: @@ -1052,9 +1052,9 @@ async def main(): continue if isinstance(ip, ipaddress.IPv4Address): - autorecon.pending_targets.append(Target(ip_str, 'IPv4', 'ip', autorecon)) + autorecon.pending_targets.append(Target(ip_str, ip_str, 'IPv4', 'ip', autorecon)) elif isinstance(ip, ipaddress.IPv6Address): - autorecon.pending_targets.append(Target(ip_str, 'IPv6', 'ip', autorecon)) + autorecon.pending_targets.append(Target(ip_str, ip_str, 'IPv6', 'ip', autorecon)) else: fail('This should never happen unless IPv8 is invented.') @@ -1062,6 +1062,7 @@ async def main(): try: addresses = socket.getaddrinfo(target, None, socket.AF_INET) + ip = addresses[0][4][0] found = False for t in autorecon.pending_targets: @@ -1072,10 +1073,11 @@ async def main(): if found: continue - autorecon.pending_targets.append(Target(target, 'IPv4', 'hostname', autorecon)) + autorecon.pending_targets.append(Target(target, ip, 'IPv4', 'hostname', autorecon)) except socket.gaierror: try: addresses = socket.getaddrinfo(target, None, socket.AF_INET6) + ip = addresses[0][4][0] found = False for t in autorecon.pending_targets: @@ -1086,7 +1088,7 @@ async def main(): if found: continue - autorecon.pending_targets.append(Target(target, 'IPv6', 'hostname', autorecon)) + autorecon.pending_targets.append(Target(target, ip, 'IPv6', 'hostname', autorecon)) except socket.gaierror: error(target + ' does not appear to be a valid IP address, IP range, or resolvable hostname.') errors = True diff --git a/autorecon/targets.py b/autorecon/targets.py index 49acc75..4d7512e 100644 --- a/autorecon/targets.py +++ b/autorecon/targets.py @@ -5,8 +5,9 @@ from autorecon.io import e, info class Target: - def __init__(self, address, ipversion, type, autorecon): + def __init__(self, address, ip, ipversion, type, autorecon): self.address = address + self.ip = ip self.ipversion = ipversion self.type = type self.autorecon = autorecon diff --git a/plugins/default-port-scan.py b/plugins/default-port-scan.py index 0246d3a..137d950 100644 --- a/plugins/default-port-scan.py +++ b/plugins/default-port-scan.py @@ -1,6 +1,6 @@ from autorecon.plugins import PortScan -from autorecon.io import error -import os +from autorecon.io import info, error +import os, re class QuickTCPPortScan(PortScan): @@ -36,7 +36,18 @@ class AllTCPPortScan(PortScan): if target.ports: # Don't run this plugin if there are custom ports. return [] process, stdout, stderr = await target.execute('nmap {nmap_extra} -A --osscan-guess --version-all -p- -oN "{scandir}/_full_tcp_nmap.txt" -oX "{scandir}/xml/_full_tcp_nmap.xml" {address}', blocking=False) - services = await target.extract_services(stdout) + services = [] + while True: + line = await stdout.readline() + if line is not None: + match = re.search('^Discovered open port ([0-9]+)/tcp', line) + if match: + info('Discovered open port {bmagenta}tcp/' + match.group(1) + '{rst} on {byellow}' + target.address + '{rst}') + service = target.extract_service(line) + if service: + services.append(service) + else: + break await process.wait() return services @@ -59,7 +70,18 @@ class Top100UDPPortScan(PortScan): return [] else: process, stdout, stderr = await target.execute('nmap {nmap_extra} -sU -A --version-all --top-ports 100 -oN "{scandir}/_top_100_udp_nmap.txt" -oX "{scandir}/xml/_top_100_udp_nmap.xml" {address}', blocking=False) - services = await target.extract_services(stdout) + services = [] + while True: + line = await stdout.readline() + if line is not None: + match = re.search('^Discovered open port ([0-9]+)/udp', line) + if match: + info('Discovered open port {bmagenta}udp/' + match.group(1) + '{rst} on {byellow}' + target.address + '{rst}') + service = target.extract_service(line) + if service: + services.append(service) + else: + break await process.wait() return services else: