DNS-py2/main.py
Benjamyn Love e62b756155 Adjusted template (dns.html) for DNS and whois
Adjusted main.py to return values instead of print them
2018-05-13 23:43:59 +10:00

178 lines
6.0 KiB
Python
Executable File

#!/usr/bin/python2.7
#GUI REWRITE
import whois
import signal
import dns.resolver
import json
import warnings
import os
import platform
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
from libs import cc
# Loaded from the config file
jsonData = config.readConf("~/config.json")
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"])
CSVFile = jsonData["country_codes"]
# Endconfig block
dnsrecs = {}
if platform.system().lower() == "linux":
import readline
else:
colour_attn = ""
colour_good = ""
colour_pretty = ""
colour_default = ""
running = 1
prompt = ': '
indent = '~ '
whoisrecs = ["NotFound", "DomainName", "Registrar", "Status", "UpdatedDate", "CreationDate", "ExpirationDate", "RegistrantName", "RegistrantEmail", "EligibilityName", "EligibilityType", "EligibilityID", "RegistrantID", "NameServer"]
ipData = {"asn_country_code":"Country", "asn_description":"Owner"}
CountryDict = cc.parseCSV(cc.openCSV(CSVFile))
def domainWhois(inData):
whoisData = whois.whois(inData).query()
return whois.Parser(inData, whoisData[1]).parse()
def signal_handler(singal, frame):
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 cnameToA(cname):
data = dns.resolver.query(cname, "A")
for rdata in data:
return rdata
def parseInput(inData):
tmpInData = inData.lower()
tmpInData = tmpInData.strip()
if tmpInData == "quit":
quit()
if checkIfIP(tmpInData):
lookupIP(tmpInData)
else:
lookupDomain(tmpInData)
def recLookup(inData):
global dnsrecs
for dnsrec in dnsrecords:
try:
data = dns.resolver.query(inData, dnsrec)
for rdata in data:
rdataTMP = rdata.to_text().split(" ")
if dnsrec != "MX":
if dnsrec != "NS":
#print( indent + colour_pretty + "%s:\t%s%s" % (dnsrec, colour_good, rdata) + colour_default)
dnsrecs[dnsrec] = rdata
else:
tmpData = cnameToA(rdata.to_text())
#print( indent + colour_pretty + "%s:\t%s%s -> %s" % (dnsrec, colour_good, rdata, tmpData) + colour_default)
dnsrecs[dnsrec] = rdata
else:
tmpData = cnameToA(rdataTMP[1])
#print( indent + colour_pretty + "%s:\t%s%s -> %s" % (dnsrec, colour_good, rdata, tmpData) + colour_default)
dnsrecs[dnsrec] = rdata
except Exception as e:
pass
def subLookup(inData, sub):
global dnsrecs
try:
data = dns.resolver.query(sub + '.' + inData)
for rdata in data:
if data.qname == data.canonical_name:
#Old function printed the result now I am returning the result, may add to a dict.
#print(indent + colour_pretty + "%s:\t%s%s" % (sub, colour_good, rdata) + colour_default)
dnsrecs[sub] = rdata
else:
for rdata in dns.resolver.query(sub + '.' + inData, "CNAME"):
#print(indent + colour_pretty + "%s:\t%s%s -> %s" % (sub, colour_good, rdata, cnameToA(sub + "." + inData).to_text()) + colour_default)
dnsrecs[sub] = rdata
except Exception as e:
pass
def lookupDomain(inData):
global dnsrecs
dnsrecs = {}
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("\nSub Domains")
for subs in subdomains:
subLookup(inData, subs)
return dnsrecs, result
def lookupIP(inData):
with warnings.catch_warnings():
warnings.filterwarnings("ignore", category=UserWarning)
ipnet = Net(inData)
ipobj = IPASN(ipnet)
results = ipobj.lookup()
for types in ipData:
if types == "asn_country_code":
print(indent + "%s%s:%s\t%s%s" % (colour_pretty, ipData[types], colour_good, CountryDict[results[types]], colour_default))
else:
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)
if __name__ == '__main__':
while running == 1:
parseInput(raw_input("Please Enter a domain" + prompt) )
print('\n')