Merge branch 'pattern-detection'
This commit is contained in:
commit
0448e4a204
34
autorecon.py
34
autorecon.py
|
@ -26,6 +26,7 @@ port_scan_profile = None
|
||||||
|
|
||||||
port_scan_profiles_config = None
|
port_scan_profiles_config = None
|
||||||
service_scans_config = None
|
service_scans_config = None
|
||||||
|
global_patterns = None
|
||||||
|
|
||||||
username_wordlist = '/usr/share/seclists/Usernames/top-usernames-shortlist.txt'
|
username_wordlist = '/usr/share/seclists/Usernames/top-usernames-shortlist.txt'
|
||||||
password_wordlist = '/usr/share/seclists/Passwords/darkweb2017-top100.txt'
|
password_wordlist = '/usr/share/seclists/Passwords/darkweb2017-top100.txt'
|
||||||
|
@ -85,7 +86,7 @@ def cprint(*args, color=Fore.RESET, char='*', sep=' ', end='\n', frame_index=1,
|
||||||
print(fmted, sep=sep, end=end, file=file)
|
print(fmted, sep=sep, end=end, file=file)
|
||||||
|
|
||||||
def debug(*args, color=Fore.BLUE, sep=' ', end='\n', file=sys.stdout, **kvargs):
|
def debug(*args, color=Fore.BLUE, sep=' ', end='\n', file=sys.stdout, **kvargs):
|
||||||
if verbose >= 1:
|
if verbose >= 2:
|
||||||
cprint(*args, color=color, char='-', sep=sep, end=end, file=file, frame_index=2, **kvargs)
|
cprint(*args, color=color, char='-', sep=sep, end=end, file=file, frame_index=2, **kvargs)
|
||||||
|
|
||||||
def info(*args, sep=' ', end='\n', file=sys.stdout, **kvargs):
|
def info(*args, sep=' ', end='\n', file=sys.stdout, **kvargs):
|
||||||
|
@ -102,7 +103,7 @@ def fail(*args, sep=' ', end='\n', file=sys.stderr, **kvargs):
|
||||||
exit(-1)
|
exit(-1)
|
||||||
|
|
||||||
port_scan_profiles_config_file = 'port-scan-profiles.toml'
|
port_scan_profiles_config_file = 'port-scan-profiles.toml'
|
||||||
with open(os.path.join(__location__, port_scan_profiles_config_file), "r") as p:
|
with open(os.path.join(__location__, port_scan_profiles_config_file), 'r') as p:
|
||||||
try:
|
try:
|
||||||
port_scan_profiles_config = toml.load(p)
|
port_scan_profiles_config = toml.load(p)
|
||||||
|
|
||||||
|
@ -112,12 +113,22 @@ with open(os.path.join(__location__, port_scan_profiles_config_file), "r") as p:
|
||||||
except toml.decoder.TomlDecodeError as e:
|
except toml.decoder.TomlDecodeError as e:
|
||||||
fail('Error: Couldn\'t parse {port_scan_profiles_config_file} config file. Check syntax and duplicate tags.')
|
fail('Error: Couldn\'t parse {port_scan_profiles_config_file} config file. Check syntax and duplicate tags.')
|
||||||
|
|
||||||
with open(os.path.join(__location__, "service-scans.toml"), "r") as c:
|
with open(os.path.join(__location__, 'service-scans.toml'), 'r') as c:
|
||||||
try:
|
try:
|
||||||
service_scans_config = toml.load(c)
|
service_scans_config = toml.load(c)
|
||||||
except toml.decoder.TomlDecodeError as e:
|
except toml.decoder.TomlDecodeError as e:
|
||||||
fail('Error: Couldn\'t parse service-scans.toml config file. Check syntax and duplicate tags.')
|
fail('Error: Couldn\'t parse service-scans.toml config file. Check syntax and duplicate tags.')
|
||||||
|
|
||||||
|
with open(os.path.join(__location__, 'patterns.toml'), 'r') as p:
|
||||||
|
try:
|
||||||
|
global_patterns = toml.load(p)
|
||||||
|
if 'pattern' in global_patterns:
|
||||||
|
global_patterns = global_patterns['pattern']
|
||||||
|
else:
|
||||||
|
global_patterns = None
|
||||||
|
except toml.decoder.TomlDecodeError as e:
|
||||||
|
fail('Error: Couldn\'t parse patterns.toml config file. Check syntax and duplicate tags.')
|
||||||
|
|
||||||
if 'username_wordlist' in service_scans_config:
|
if 'username_wordlist' in service_scans_config:
|
||||||
if isinstance(service_scans_config['username_wordlist'], str):
|
if isinstance(service_scans_config['username_wordlist'], str):
|
||||||
username_wordlist = service_scans_config['username_wordlist']
|
username_wordlist = service_scans_config['username_wordlist']
|
||||||
|
@ -132,6 +143,11 @@ async def read_stream(stream, address, tag='?', color=Fore.BLUE):
|
||||||
if line:
|
if line:
|
||||||
line = str(line.rstrip(), 'utf8', 'ignore')
|
line = str(line.rstrip(), 'utf8', 'ignore')
|
||||||
debug(color + '[' + Style.BRIGHT + address + ' ' + tag + Style.NORMAL + '] ' + Fore.RESET + '{line}', color=color)
|
debug(color + '[' + Style.BRIGHT + address + ' ' + tag + Style.NORMAL + '] ' + Fore.RESET + '{line}', color=color)
|
||||||
|
if verbose >= 1:
|
||||||
|
for p in global_patterns:
|
||||||
|
matches = re.findall(p['pattern'], line)
|
||||||
|
for match in matches:
|
||||||
|
info('{bgreen}{tag}{rst} on {byellow}{address}{rst} - ' + p['description'])
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
|
|
||||||
|
@ -175,6 +191,12 @@ async def parse_port_scan(stream, tag, address, pattern):
|
||||||
parse_match = re.search(pattern, line)
|
parse_match = re.search(pattern, line)
|
||||||
if parse_match:
|
if parse_match:
|
||||||
ports.append(parse_match.group('port'))
|
ports.append(parse_match.group('port'))
|
||||||
|
|
||||||
|
if verbose >= 1:
|
||||||
|
for p in global_patterns:
|
||||||
|
matches = re.findall(p['pattern'], line)
|
||||||
|
for match in matches:
|
||||||
|
info('{bgreen}{tag}{rst} on {byellow}{address}{rst} - ' + p['description'])
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
|
|
||||||
|
@ -192,6 +214,12 @@ async def parse_service_detection(stream, tag, address, pattern):
|
||||||
parse_match = re.search(pattern, line)
|
parse_match = re.search(pattern, line)
|
||||||
if parse_match:
|
if parse_match:
|
||||||
services.append((parse_match.group('protocol').lower(), int(parse_match.group('port')), parse_match.group('service')))
|
services.append((parse_match.group('protocol').lower(), int(parse_match.group('port')), parse_match.group('service')))
|
||||||
|
|
||||||
|
if verbose >= 1:
|
||||||
|
for p in global_patterns:
|
||||||
|
matches = re.findall(p['pattern'], line)
|
||||||
|
for match in matches:
|
||||||
|
info('{bgreen}{tag}{rst} on {byellow}{address}{rst} - ' + p['description'])
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
[[pattern]]
|
||||||
|
description = 'Nmap script found a potential vulnerability. ({bblue}{match}{rst})'
|
||||||
|
pattern = 'State: (?:LIKELY|VULNERABLE)'
|
||||||
|
|
||||||
|
[[pattern]]
|
||||||
|
description = 'HTTP Server: {bblue}{match}{rst}'
|
||||||
|
pattern = 'Server: ([^\n]+)'
|
Loading…
Reference in New Issue