-
Notifications
You must be signed in to change notification settings - Fork 5
/
nslookup_images.py
98 lines (84 loc) · 3.54 KB
/
nslookup_images.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
"""
Run nslookup and create images of the results
USAGE: python nslookup_images.py <output_dir> <screenshot_dir> <domain>
"""
import re
import os
import logging
import argparse
import subprocess
from utils import utils # noqa
from utils import logging_config # noqa pylint: disable=unused-import
LOG = logging.getLogger("ptscripts.nslookup_images")
def run_nslookup(domain, output_dir, record_type=None, nameserver=None):
html_output = os.path.join(output_dir, "nslookup_{}_{}.html".format(domain, record_type))
if record_type:
_type = "-type={} ".format(record_type)
else:
_type = ""
if nameserver:
_ns = " {}".format(nameserver)
else:
_ns = ""
command = "nslookup {_type}{domain}{_ns}".format(_type=_type, domain=domain, _ns=_ns)
LOG.debug("Running command {}".format(command))
try:
p1 = subprocess.run(command.split(), stdout=subprocess.PIPE, timeout=60 * 5) # pylint: disable=no-member
nslookup_stdout = str(p1.stdout, 'utf-8')
except subprocess.TimeoutExpired: # pylint: disable=no-member
LOG.error("Timeout error occurred.")
raise SystemExit
p2 = subprocess.run(['tee', '/dev/tty'], input=p1.stdout, stdout=subprocess.PIPE) # pylint: disable=no-member
p3 = subprocess.run(['aha', '-b'], input=p2.stdout, stdout=subprocess.PIPE) # pylint: disable=no-member
output = p3.stdout
LOG.debug("Writing output to {}".format(html_output))
command_text = "<p style='color:#00CC00'>{}</p>".format(command)
with open(html_output, 'wb') as h:
h.write(command_text.encode())
h.write(output)
return nslookup_stdout, html_output
def parse_nslookup_ns(content):
ns_re = re.compile('nameserver = (.*)\.') # pylint: disable=anomalous-backslash-in-string
results = ns_re.findall(content)
return results
def main(args):
os.makedirs(args.output, exist_ok=True)
# Run nslookup query for Name Servers
LOG.info("Running nslookup with type NS")
content, ns_html = run_nslookup(args.domain, args.output, "NS")
auth_nameservers = parse_nslookup_ns(content)
if not auth_nameservers:
LOG.error("No authoritative nameservers found, cannot continue.")
sys.exit()
# Run nslookup query for MX records
_, mx_html = run_nslookup(args.domain, args.output, "MX", auth_nameservers[0])
# Run nslookup query for SRV records
_, srv_html = run_nslookup(args.domain, args.output, "SRV", auth_nameservers[0])
# Run nslookup query for any records
_, any_html = run_nslookup(args.domain, args.output, "ANY", auth_nameservers[0])
# Take picture of html file
if args.screenshot:
os.makedirs(args.screenshot, exist_ok=True)
for html_file in [ns_html, mx_html, srv_html, any_html]:
utils.selenium_image(html_file, args.screenshot)
def parse_args(args):
parser = argparse.ArgumentParser(
parents=[utils.parent_argparser()],
description='Capture nslookup data and images',
)
parser.add_argument('output', help="full path to where the results will be saved.")
parser.add_argument('domain', help="Domain to capture.")
parser.add_argument("-s", "--screenshot",
help="full path to where the screenshots will be saved.")
args = parser.parse_args(args)
logger = logging.getLogger("ptscripts")
if args.quiet:
logger.setLevel('ERROR')
elif args.verbose:
logger.setLevel('DEBUG')
else:
logger.setLevel('INFO')
return args
if __name__ == "__main__":
import sys
main(parse_args(sys.argv[1:]))