New feature: DNS servers/resolvers can now be loaded from a file. Use the command line option -r/--resolvers to specify the path to the resolvers file.
Enter one DNS server IP address per line.
This commit is contained in:
parent
14d52ade3f
commit
c25c4d46a8
|
|
@ -28,6 +28,7 @@ Short Form | Long Form | Description
|
||||||
(none) | --saverdns | Save reverse DNS analysis to specified file
|
(none) | --saverdns | Save reverse DNS analysis to specified file
|
||||||
(none) | --inputfile | Read domains from specified file, and use them for analysis
|
(none) | --inputfile | Read domains from specified file, and use them for analysis
|
||||||
(none) | --debug | Print debug information during the analysis module (-a). Prints mostly raw DNS data, familarity with the DIG Linux DNS utility and it's output is helpful to interpret the debug output
|
(none) | --debug | Print debug information during the analysis module (-a). Prints mostly raw DNS data, familarity with the DIG Linux DNS utility and it's output is helpful to interpret the debug output
|
||||||
|
-r | --resolvers | File with DNS servers to populate as resolvers. File must have only one server IP address per line and only IP addresses are accepted
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
|
|
||||||
|
|
@ -43,6 +44,10 @@ Short Form | Long Form | Description
|
||||||
|
|
||||||
``python turbolist3r.py -d example.com -a --inputfile subdomains.txt``
|
``python turbolist3r.py -d example.com -a --inputfile subdomains.txt``
|
||||||
|
|
||||||
|
* Read subdomains from a file and perform advanced analysis on them:
|
||||||
|
|
||||||
|
``python turbolist3r.py -d example.com -a --inputfile subdomains.txt -r dns_servers.txt``
|
||||||
|
|
||||||
* To enumerate subdomains of specific domain:
|
* To enumerate subdomains of specific domain:
|
||||||
|
|
||||||
``python turbolist3r.py -d example.com``
|
``python turbolist3r.py -d example.com``
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,10 @@ else:
|
||||||
R = '\033[91m' # red
|
R = '\033[91m' # red
|
||||||
W = '\033[0m' # white
|
W = '\033[0m' # white
|
||||||
|
|
||||||
|
# array of characters that can appear in an IP address
|
||||||
|
resolver_chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.']
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def banner():
|
def banner():
|
||||||
print("""%s
|
print("""%s
|
||||||
|
|
@ -97,6 +101,21 @@ def banner():
|
||||||
""" % (R, W, Y))
|
""" % (R, W, Y))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# given a string, parse and check if it is an IP address
|
||||||
|
def is_ip(s):
|
||||||
|
a = s.split('.')
|
||||||
|
if len(a) != 4:
|
||||||
|
return False
|
||||||
|
for x in a:
|
||||||
|
if not x.isdigit():
|
||||||
|
return False
|
||||||
|
i = int(x)
|
||||||
|
if i < 0 or i > 255:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def parser_error(errmsg):
|
def parser_error(errmsg):
|
||||||
banner()
|
banner()
|
||||||
print("Usage: python " + sys.argv[0] + " [Options] use -h for help")
|
print("Usage: python " + sys.argv[0] + " [Options] use -h for help")
|
||||||
|
|
@ -122,6 +141,7 @@ def parse_args():
|
||||||
parser.add_argument('--saverdns', help='Save reverse DNS analysis to specified file')
|
parser.add_argument('--saverdns', help='Save reverse DNS analysis to specified file')
|
||||||
parser.add_argument('--inputfile', help='Read domains from specified file (perhaps from other tool) and use instead of searching engines. Use with -a to analyze domains')
|
parser.add_argument('--inputfile', help='Read domains from specified file (perhaps from other tool) and use instead of searching engines. Use with -a to analyze domains')
|
||||||
parser.add_argument('--debug', default=False, help='Enable technical debug output', action="store_true")
|
parser.add_argument('--debug', default=False, help='Enable technical debug output', action="store_true")
|
||||||
|
parser.add_argument('-r', '--resolvers', help='File with DNS servers to populate as resolvers, one per line')
|
||||||
return parser.parse_args()
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1127,11 +1147,38 @@ if __name__ == "__main__":
|
||||||
analyze = args.analyze
|
analyze = args.analyze
|
||||||
analysisfile = args.saverdns
|
analysisfile = args.saverdns
|
||||||
debug = args.debug
|
debug = args.debug
|
||||||
|
server_file = args.resolvers
|
||||||
if (debug):
|
if (debug):
|
||||||
print("Debugging output enabled for analysis module")
|
print("Debugging output enabled for analysis module")
|
||||||
if verbose or verbose is None:
|
if verbose or verbose is None:
|
||||||
verbose = True
|
verbose = True
|
||||||
|
|
||||||
banner()
|
banner()
|
||||||
|
|
||||||
|
|
||||||
|
# Did the user specifiy a custom resolver file?
|
||||||
|
# If so, try to read it here, so if there is an error we don't waste
|
||||||
|
# running the rest of the script before erroring out
|
||||||
|
resolvers = []
|
||||||
|
if (server_file != None):
|
||||||
|
try:
|
||||||
|
f = open(server_file, 'r')
|
||||||
|
servers = f.readlines()
|
||||||
|
except Exception as e:
|
||||||
|
print("Error opening resolver file " + server_file)
|
||||||
|
print("Exception trace: " + str(e))
|
||||||
|
raise SystemExit
|
||||||
|
# Do some sanity checking on user supplied resolvers
|
||||||
|
for line in servers:
|
||||||
|
# strip newline from the end and any spaces or whatnot at the start
|
||||||
|
line = line.replace('\n', '').replace(' ', '').replace('\t', '')
|
||||||
|
if is_ip(line):
|
||||||
|
# this is probably an IP address
|
||||||
|
resolvers.append(line)
|
||||||
|
else:
|
||||||
|
# use a default list of resolvers
|
||||||
|
resolvers = ['8.8.8.8', '8.8.4.4', '9.9.9.9', '1.1.1.1', '1.0.0.1']
|
||||||
|
|
||||||
if (inputfile != None):
|
if (inputfile != None):
|
||||||
print(B + "[-] Reading subdomains from " + inputfile + W)
|
print(B + "[-] Reading subdomains from " + inputfile + W)
|
||||||
f = open(inputfile, 'r')
|
f = open(inputfile, 'r')
|
||||||
|
|
@ -1143,7 +1190,9 @@ if __name__ == "__main__":
|
||||||
# Code added here
|
# Code added here
|
||||||
if (analyze):
|
if (analyze):
|
||||||
# res is the list of subdomains e.g. www.example.com, mail.example.com, etc
|
# res is the list of subdomains e.g. www.example.com, mail.example.com, etc
|
||||||
resolvers = ['8.8.8.8', '8.8.4.4', '9.9.9.9', '1.1.1.1', '1.0.0.1']
|
print(B + "[-] Using DNS resolvers:" + W)
|
||||||
|
for r in resolvers:
|
||||||
|
print(B + r + W)
|
||||||
server = 0
|
server = 0
|
||||||
count = 0
|
count = 0
|
||||||
total = str(len(res))
|
total = str(len(res))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue