my current main module and modularized input sort, lookup and display functions
This commit is contained in:
parent
4f36411a50
commit
af860ff215
11
cli_lookup.py
Normal file
11
cli_lookup.py
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
from src.lookup import lookup
|
||||||
|
from src.type_hosts import type_hosts
|
||||||
|
from src.user_input import user_input
|
||||||
|
from src.display import display
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
hosts = user_input()
|
||||||
|
validated_hosts = type_hosts(hosts)
|
||||||
|
lookedup_hosts = lookup(validated_hosts)
|
||||||
|
display(lookedup_hosts)
|
0
src/__init__.py
Normal file
0
src/__init__.py
Normal file
25
src/display.py
Normal file
25
src/display.py
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
from rich.console import Console
|
||||||
|
from rich.table import Table, errors
|
||||||
|
|
||||||
|
def display(lookup_results):
|
||||||
|
table = Table(title="results", highlight=True, show_lines=True, row_styles=["dim", ""])
|
||||||
|
# Remember: the dimension/column is not the host type, but the lookup result! So a whois, a DMARC, an SPF, etc. Because for one host, there are multiple lookup results (I guess???)
|
||||||
|
table.add_column('host')
|
||||||
|
table.add_column('domain registered')
|
||||||
|
table.add_column('registrar')
|
||||||
|
table.add_column('dnssec')
|
||||||
|
table.add_column('spf')
|
||||||
|
table.add_column('dmarc')
|
||||||
|
|
||||||
|
for lookedup in lookup_results:
|
||||||
|
try:
|
||||||
|
table.add_row(str(lookedup.host), str(lookedup.whois['creation_date']), str(lookedup.whois['registrar']), str(lookedup.whois['dnssec']), lookedup.spf, lookedup.dmarc)
|
||||||
|
except errors.NotRenderableError as error:
|
||||||
|
print(error.args, lookup_results, lookedup)
|
||||||
|
table.add_section()
|
||||||
|
table.add_row("", "", "", "", "*** -all = hard fail ***", "*** p=reject (drop email)***", style="green")
|
||||||
|
table.add_row("", "", "", "", "*** ~all = hard fail ***", "*** p=quarantine (email in spam)***", style="green")
|
||||||
|
table.add_row("", "", "", "", "*** all = allow all ***", "*** p=none (ignore email)***", style="green")
|
||||||
|
|
||||||
|
console = Console()
|
||||||
|
console.print(table)
|
108
src/lookup.py
Normal file
108
src/lookup.py
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
from whois import whois
|
||||||
|
from checkdmarc.spf import get_spf_record, SPFRecordNotFound
|
||||||
|
from checkdmarc.dmarc import get_dmarc_record, DMARCRecordNotFound
|
||||||
|
import time
|
||||||
|
import tldextract
|
||||||
|
from tqdm import tqdm
|
||||||
|
import progressbar
|
||||||
|
|
||||||
|
|
||||||
|
def progress_bar():
|
||||||
|
widgets = ["TESTING A PROGRESS BAR", progressbar.Bar()]
|
||||||
|
bar = progressbar.ProgressBar(widgets=widgets).start()
|
||||||
|
return bar
|
||||||
|
|
||||||
|
|
||||||
|
class Lookup(object):
|
||||||
|
def __init__(self, host):
|
||||||
|
self.host = host
|
||||||
|
self.whois = dict(whois(host))
|
||||||
|
self.dmarc = None
|
||||||
|
self.spf = None
|
||||||
|
|
||||||
|
|
||||||
|
def lookup(validated_hosts):
|
||||||
|
bar = progress_bar()
|
||||||
|
lookups = []
|
||||||
|
for key, value in validated_hosts.items():
|
||||||
|
if key == "domains":
|
||||||
|
print("[Looking up domains...]")
|
||||||
|
if any(value):
|
||||||
|
for host in tqdm(value):
|
||||||
|
lookedup = Lookup(host)
|
||||||
|
try:
|
||||||
|
lookedup.dmarc = dict(get_dmarc_record(host))["record"]
|
||||||
|
except DMARCRecordNotFound as error:
|
||||||
|
print("DMARC exception. Should start using raise :)")
|
||||||
|
lookedup.dmarc = error.args[0]
|
||||||
|
try:
|
||||||
|
lookedup.spf = dict(get_spf_record(host))["record"]
|
||||||
|
except SPFRecordNotFound as error:
|
||||||
|
print(
|
||||||
|
"SPF exception. Should start using raise :)",
|
||||||
|
error.args,
|
||||||
|
type(error.args),
|
||||||
|
error.args[0],
|
||||||
|
)
|
||||||
|
# this 'works', as in, error.args returns some valuable detail (DNS timeout) and the host to look up.
|
||||||
|
lookedup.spf = error.args[0]
|
||||||
|
lookups.append(lookedup)
|
||||||
|
time.sleep(1)
|
||||||
|
# bar.update()
|
||||||
|
elif key == "email":
|
||||||
|
print("[Looking up email addresses...]")
|
||||||
|
if any(value):
|
||||||
|
for host in tqdm(value):
|
||||||
|
domain = str.split(host, "@")[-1]
|
||||||
|
lookedup = Lookup(domain)
|
||||||
|
try:
|
||||||
|
lookedup.dmarc = dict(get_dmarc_record(domain))["record"]
|
||||||
|
except DMARCRecordNotFound as error:
|
||||||
|
print("DMARC exception. Should start using raise :)")
|
||||||
|
try:
|
||||||
|
lookedup.spf = dict(get_spf_record(domain))["record"]
|
||||||
|
except SPFRecordNotFound as error:
|
||||||
|
print("SPF exception. Should start using raise :)",
|
||||||
|
error.args,
|
||||||
|
type(error.args),
|
||||||
|
error.args[0],
|
||||||
|
)
|
||||||
|
lookups.append(lookedup)
|
||||||
|
time.sleep(1)
|
||||||
|
elif key == "URL":
|
||||||
|
print("[Looking up URLs...]")
|
||||||
|
if any(value):
|
||||||
|
for host in tqdm(value):
|
||||||
|
domain = tldextract.extract(host).domain
|
||||||
|
lookedup = Lookup(domain)
|
||||||
|
lookedup.dmarc = dict(get_dmarc_record(domain))["record"]
|
||||||
|
lookedup.spf = dict(get_spf_record(domain))["record"]
|
||||||
|
lookups.append(lookedup)
|
||||||
|
# TODO add VirusTotal-lookup and return score?
|
||||||
|
time.sleep(1)
|
||||||
|
elif key == "hostname":
|
||||||
|
print("Looking up hostnames...]")
|
||||||
|
if any(value):
|
||||||
|
for host in tqdm(value):
|
||||||
|
pass
|
||||||
|
elif key == "IP":
|
||||||
|
print("Looking up IPs...]")
|
||||||
|
if any(value):
|
||||||
|
for host in tqdm(value):
|
||||||
|
lookedup = Lookup(host)
|
||||||
|
lookups.append(lookup)
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
else:
|
||||||
|
print("No hosts to look up in ", key)
|
||||||
|
bar.update()
|
||||||
|
|
||||||
|
return lookups
|
||||||
|
|
||||||
|
|
||||||
|
def lookup_spf(validated_hosts):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def lookup_dmarc(validated_hosts):
|
||||||
|
pass
|
43
src/type_hosts.py
Normal file
43
src/type_hosts.py
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
import validators
|
||||||
|
|
||||||
|
def normalize(host):
|
||||||
|
domain_name, tld = "", ""
|
||||||
|
if host.startswith('www.'):
|
||||||
|
domain_name, tld = str.split(host,'.')[-2:]
|
||||||
|
normalized_domain = domain_name + '.' + tld
|
||||||
|
return normalized_domain
|
||||||
|
else:
|
||||||
|
return host
|
||||||
|
|
||||||
|
def type_hosts(hosts):
|
||||||
|
validated_hosts = {
|
||||||
|
"URLs": [],
|
||||||
|
"domains": [],
|
||||||
|
"IPs": [],
|
||||||
|
"email": [],
|
||||||
|
"hostnames": [],
|
||||||
|
}
|
||||||
|
URLs = []
|
||||||
|
domains = []
|
||||||
|
IPs = []
|
||||||
|
email = []
|
||||||
|
hostnames = []
|
||||||
|
for host in hosts:
|
||||||
|
if validators.url(host):
|
||||||
|
URLs.append(host)
|
||||||
|
elif validators.domain(host):
|
||||||
|
domains.append(normalize(host))
|
||||||
|
elif validators.ipv4(host) or validators.ipv6(host):
|
||||||
|
IPs.append(host)
|
||||||
|
elif validators.email(host):
|
||||||
|
email.append(host)
|
||||||
|
elif validators.hostname(host):
|
||||||
|
hostnames.append(host)
|
||||||
|
else:
|
||||||
|
print("This is not a URL, IP, email address or hostname: ", host)
|
||||||
|
validated_hosts["URLs"].extend([i for i in URLs])
|
||||||
|
validated_hosts["domains"].extend([i for i in domains])
|
||||||
|
validated_hosts["IPs"].extend([i for i in IPs])
|
||||||
|
validated_hosts["email"].extend([i for i in email])
|
||||||
|
validated_hosts["hostnames"].extend([i for i in hostnames])
|
||||||
|
return validated_hosts
|
12
src/user_input.py
Normal file
12
src/user_input.py
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
import re
|
||||||
|
|
||||||
|
def user_input():
|
||||||
|
while True:
|
||||||
|
hosts = str(input("Type in or copy-paste "
|
||||||
|
"one or more IP addresses, domain names "
|
||||||
|
"URLs or email addresses: "
|
||||||
|
))
|
||||||
|
if hosts.strip() != '':
|
||||||
|
sanitized = re.split("; |, | ", hosts)
|
||||||
|
return sanitized
|
||||||
|
# break
|
Loading…
Reference in New Issue
Block a user