Made IP lookups much nicer to look at, added subdomain lookups Fixed some bugs with whois parsing, now AUS eligbility info is properly obtained
139 lines
4.5 KiB
Python
Executable File
139 lines
4.5 KiB
Python
Executable File
#!/usr/bin/python2.7
|
|
import whois
|
|
import readline
|
|
import signal
|
|
import dns.resolver
|
|
import json
|
|
import warnings
|
|
from dns import reversename
|
|
from ipwhois.net import Net
|
|
from ipwhois.asn import IPASN
|
|
from pprint import pprint
|
|
from libs import config
|
|
from libs import colours as gc
|
|
|
|
running = 1
|
|
prompt = ': '
|
|
indent = '~ '
|
|
whoisrecs = ["NotFound", "DomainName", "Registrar", "Status", "UpdatedDate", "CreationDate", "ExpirationDate", "RegistrantName", "RegistrantEmail", "EligibilityName", "EligibilityType", "EligibilityID", "RegistrantID", "NameServer"]
|
|
#ipData = ["asn_country_code", "asn_description"]
|
|
ipData = {"asn_country_code":"Country", "asn_description":"Owner"}
|
|
|
|
# Loaded from the config file
|
|
jsonData = config.readConf()
|
|
|
|
subdomains = jsonData["subdomains"]
|
|
dnsrecords = jsonData["dnsrecords"]
|
|
colour_attn = gc.getColour(jsonData["colour_attn"])
|
|
colour_good = gc.getColour(jsonData["colour_good"])
|
|
colour_pretty = gc.getColour(jsonData["colour_pretty"])
|
|
colour_default = gc.getColour(jsonData["colour_default"])
|
|
|
|
# Endconfig block
|
|
|
|
def domainWhois(inData):
|
|
whoisData = whois.whois(inData).query()
|
|
return whois.Parser(inData, whoisData[1]).parse()
|
|
|
|
def signal_handler(singal, frame):
|
|
#print('\n')
|
|
quit()
|
|
|
|
def printWhois(resultData):
|
|
for x in range(0, len(whoisrecs)):
|
|
try:
|
|
for item in resultData[whoisrecs[x]]:
|
|
if whoisrecs[x] == "Status":
|
|
if "ok" in item or "OK" in item:
|
|
print(indent + colour_good + '%s: %s' % (whoisrecs[x], item) + colour_default)
|
|
else:
|
|
print(indent + colour_attn + '%s: %s' % (whoisrecs[x], item) + colour_default)
|
|
else:
|
|
print(indent + '%s: %s' % (whoisrecs[x], item))
|
|
except Exception as e:
|
|
pass
|
|
|
|
def parseInput(inData):
|
|
tmpInData = inData.lower()
|
|
tmpInData = tmpInData.strip()
|
|
if tmpInData == "quit":
|
|
quit()
|
|
if checkIfIP(tmpInData):
|
|
##IP lookup code
|
|
lookupIP(tmpInData)
|
|
else:
|
|
lookupDomain(tmpInData)
|
|
|
|
def recLookup(inData):
|
|
for dnsrec in dnsrecords:
|
|
try:
|
|
for rdata in dns.resolver.query(inData, dnsrec):
|
|
print( indent + colour_pretty + "%s:\t%s%s" % (dnsrec, colour_good, rdata) + colour_default)
|
|
except Exception as e:
|
|
pass
|
|
|
|
def subLookup(inData, sub):
|
|
try:
|
|
data = dns.resolver.query(sub + '.' + inData)
|
|
for rdata in data:
|
|
if data.qname == data.canonical_name:
|
|
for rdata in dns.resolver.query(sub + '.' + inData):
|
|
record = rdata
|
|
else:
|
|
for rdata in dns.resolver.query(sub + '.' + inData, "CNAME"):
|
|
record = rdata
|
|
print(indent + colour_pretty + "%s:\t%s%s" % (sub, colour_good, record) + colour_default)
|
|
except Exception as e:
|
|
pass
|
|
|
|
def lookupDomain(inData):
|
|
try:
|
|
result = domainWhois(inData)
|
|
except Exception as E:
|
|
print('%s : TLD most likely needs to be configured' % (E))
|
|
result = "Error"
|
|
print("\nWhois Information")
|
|
printWhois(result)
|
|
print("\nDNS Records")
|
|
recLookup(inData)
|
|
print("\nSubDomains")
|
|
for subs in subdomains:
|
|
subLookup(inData, subs)
|
|
|
|
def lookupIP(inData):
|
|
with warnings.catch_warnings():
|
|
warnings.filterwarnings("ignore", category=UserWarning)
|
|
ipnet = Net(inData)
|
|
ipobj = IPASN(ipnet)
|
|
results = ipobj.lookup()
|
|
#for key,value in results.iteritems():
|
|
# print('%s: %s' % (key, value))
|
|
for types in ipData:
|
|
print(indent + "%s%s:%s\t%s%s" % (colour_pretty, ipData[types], colour_good, results[types], colour_default))
|
|
rev_name = reversename.from_address(inData)
|
|
try:
|
|
reverseName = str(dns.resolver.query(rev_name, "PTR")[0])
|
|
except Exception as E:
|
|
reverseName = E
|
|
print('\n' + indent + '%sPTR:%s\t\t%s%s' % (colour_pretty, colour_good, reverseName, colour_default))
|
|
|
|
# Taken and modified from DNSpy 1, I am not asahmed it works
|
|
def checkIfIP(in1):
|
|
count = 0
|
|
inSplit = in1.split('.')
|
|
if len(inSplit) != 4:
|
|
return False
|
|
for part in inSplit:
|
|
if part.isdigit():
|
|
count += 1
|
|
else:
|
|
return False
|
|
if count == 4:
|
|
return True
|
|
|
|
signal.signal(signal.SIGINT, signal_handler)
|
|
|
|
while running == 1:
|
|
parseInput(raw_input("Please Enter a domain" + prompt) )
|
|
print('\n')
|