Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
m0rtem
GitHub Repository: m0rtem/CloudFail
Path: blob/master/DNSDumpsterAPI.py
138 views
1
"""
2
This is the (unofficial) Python API for dnsdumpster.com Website.
3
Using this code, you can retrieve subdomains
4
5
"""
6
7
from __future__ import print_function
8
import requests
9
import re
10
import sys
11
import base64
12
13
from bs4 import BeautifulSoup
14
15
16
class DNSDumpsterAPI(object):
17
18
"""DNSDumpsterAPI Main Handler"""
19
20
def __init__(self, verbose=False, session=None):
21
self.verbose = verbose
22
if not session:
23
self.session = requests.Session()
24
else:
25
self.session = session
26
27
def display_message(self, s):
28
if self.verbose:
29
print('[verbose] %s' % s)
30
31
def retrieve_results(self, table):
32
res = []
33
trs = table.findAll('tr')
34
for tr in trs:
35
tds = tr.findAll('td')
36
pattern_ip = r'([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})'
37
try:
38
ip = re.findall(pattern_ip, tds[1].text)[0]
39
domain = str(tds[0]).split('<br/>')[0].split('>')[1].split('<')[0]
40
header = ' '.join(tds[0].text.replace('\n', '').split(' ')[1:])
41
reverse_dns = tds[1].find('span', attrs={}).text
42
43
additional_info = tds[2].text
44
country = tds[2].find('span', attrs={}).text
45
autonomous_system = additional_info.split(' ')[0]
46
provider = ' '.join(additional_info.split(' ')[1:])
47
provider = provider.replace(country, '')
48
data = {'domain': domain,
49
'ip': ip,
50
'reverse_dns': reverse_dns,
51
'as': autonomous_system,
52
'provider': provider,
53
'country': country,
54
'header': header}
55
res.append(data)
56
except:
57
pass
58
return res
59
60
def retrieve_txt_record(self, table):
61
res = []
62
for td in table.findAll('td'):
63
res.append(td.text)
64
return res
65
66
67
def search(self, domain):
68
dnsdumpster_url = 'https://dnsdumpster.com/'
69
70
req = self.session.get(dnsdumpster_url)
71
soup = BeautifulSoup(req.content, 'html.parser')
72
csrf_middleware = soup.findAll('input', attrs={'name': 'csrfmiddlewaretoken'})[0]['value']
73
self.display_message('Retrieved token: %s' % csrf_middleware)
74
75
cookies = {'csrftoken': csrf_middleware}
76
headers = {'Referer': dnsdumpster_url, 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'}
77
data = {'csrfmiddlewaretoken': csrf_middleware, 'targetip': domain, 'user': 'free'}
78
req = self.session.post(dnsdumpster_url, cookies=cookies, data=data, headers=headers)
79
80
if req.status_code != 200:
81
print(
82
"Unexpected status code from {url}: {code}".format(
83
url=dnsdumpster_url, code=req.status_code),
84
file=sys.stderr,
85
)
86
return []
87
88
if 'There was an error getting results' in req.content.decode('utf-8'):
89
print("There was an error getting results", file=sys.stderr)
90
return []
91
92
soup = BeautifulSoup(req.content, 'html.parser')
93
tables = soup.findAll('table')
94
95
res = {}
96
res['domain'] = domain
97
res['dns_records'] = {}
98
res['dns_records']['dns'] = self.retrieve_results(tables[0])
99
res['dns_records']['mx'] = self.retrieve_results(tables[1])
100
res['dns_records']['txt'] = self.retrieve_txt_record(tables[2])
101
res['dns_records']['host'] = self.retrieve_results(tables[3])
102
103
# Network mapping image
104
try:
105
tmp_url = 'https://dnsdumpster.com/static/map/{}.png'.format(domain)
106
image_data = base64.b64encode(self.session.get(tmp_url).content)
107
except:
108
image_data = None
109
finally:
110
res['image_data'] = image_data
111
112
# XLS hosts.
113
# eg. tsebo.com-201606131255.xlsx
114
try:
115
pattern = r'/static/xls/' + domain + '-[0-9]{12}\.xlsx'
116
xls_url = re.findall(pattern, req.content.decode('utf-8'))[0]
117
xls_url = 'https://dnsdumpster.com' + xls_url
118
xls_data = base64.b64encode(self.session.get(xls_url).content)
119
except Exception as err:
120
print(err)
121
xls_data = None
122
finally:
123
res['xls_data'] = xls_data
124
125
return res
126
127