forked from ring04h/wydomain
-
Notifications
You must be signed in to change notification settings - Fork 0
/
wydomain.py
352 lines (308 loc) · 13.3 KB
/
wydomain.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
#!/usr/bin/env python
# encoding: utf-8
# author: @ringzero
# email: [email protected]
'''
流程
0、利用FOFA插件,获取兄弟域名
根域名透视
兄弟域名透视
用FOR循环便利兄弟域名的节点
aizhan IP 反查
bing IP 反查
1、检查是否存在域传送漏洞
存在
遍历ZONE记录,返回到总域名表
流程结束 exit(0)
不存在
跳转到 step: 2
2、取得公开记录
获取 NS 记录
获取 MX 记录
获取 SOA 记录
3、二级域名字典暴力破解
返回
结果剔除与公开记录重合的记录
4、使用第三方API查询域名的二级域名,并合并去重
5、过滤掉泛域名解析
方法
利用dns_serverlist里面的NS服务器,逐个解析一个不存在的域名,IP设置黑名单
剔除掉域名解析结果为IP列表里面的结果,保留RANK值高的可信域名
6、递归获取已有域名的CNAME记录、TXT记录、A记录
返回IP列表
'''
import sys
import subprocess
import time
import re
from dnsfunc import *
from fofaplugin import start_fofa_plugin
from wysubdomain import wy_subdomain_run
from wydomain_ip2domain import ip2domain_start
from split_domain import gender_domian_view
def start_wydomain(domain):
# 初始化全局数据
wydomains = {'domain': {},'ipaddress': {}, 'dns': {}, 'mx': {}, 'soa': {}}
print '-' * 50
print '* Starting fofa plugin search'
print '-' * 50
fofa_result = start_fofa_plugin(domain)
# 检查是否拥有兄弟域名
if len(fofa_result['partner']) > 1:
# 有兄弟域名,进入处理流程
for pdomain in fofa_result['partner']:
print '-' * 50
print '* Starting process [%s] partner domain' % pdomain
print '-' * 50
wydomains['domain'][pdomain] = {}
wydomains['dns'][pdomain] = []
wydomains['mx'][pdomain] = []
wydomains['soa'][pdomain] = []
# 开始逐个处理FOFA域名查询的结果信息
for subdomain in fofa_result['partner'][pdomain]['domains']:
wydomains['domain'][pdomain][subdomain] = get_a_record(subdomain)
for ipaddr in fofa_result['partner'][pdomain]['ipaddrs']:
ipaddr = ipaddr.split('.')
ipaddr[-1] = '0/24'
ipaddr = '.'.join(ipaddr)
wydomains['ipaddress'][ipaddr] = {}
# 获取NS记录压入wydomains全局数据中,并检查域名是否存在域传送漏洞
print '* Starting get ns record'
print '-' * 50
ns_result = get_ns_record(pdomain)
# 判断dns server是否为dns厂商,如果不是,将记录压入全局变量中
for ns_server in ns_result['ns']:
if not check_whitelist(ns_server):
wydomains['dns'][pdomain].append(ns_server)
wydomains['domain'][pdomain][ns_server] = get_a_record(ns_server)
else:
wydomains['dns'][pdomain].append(ns_server)
# 检查域传送漏洞的状况,并取得对应的记录,存在漏洞,会返回['zone']记录数组
if ns_result['is_zone_vul'] == True:
# 存在域传送漏洞,处理ZONE里面的解析数据
# 处理 A 记录 & CNAME 记录
for a_record_line in ns_result['zone']['a']:
subdomain = a_record_line[0]
wydomains['domain'][pdomain][subdomain] = {'a':[],'cname':[]}
for cname_record_line in ns_result['zone']['cname']:
subdomain = cname_record_line[0]
wydomains['domain'][pdomain][subdomain] = {'a':[],'cname':[]}
for a_record_line in ns_result['zone']['a']:
subdomain = a_record_line[0]
wydomains['domain'][pdomain][subdomain]['a'].append(a_record_line[1])
for cname_record_line in ns_result['zone']['cname']:
subdomain = cname_record_line[0]
subdomain_a_record = get_a_record(subdomain)['a']
wydomains['domain'][pdomain][subdomain]['a'].extend(subdomain_a_record)
wydomains['domain'][pdomain][subdomain]['cname'].append(cname_record_line[1])
# 处理 MX 记录
mx_server = get_mx_record(pdomain)
# 检查MX服务器是否为免费的企业邮箱
for mx_server in mx_server['mx']:
if not check_mx_whitelist(mx_server):
wydomains['mx'][pdomain].append(mx_server)
mx_server_record = get_a_record(mx_server)
# MX的服务器地址对于一个企业非常重要
for ipaddr in mx_server_record['a']:
ipaddr = ipaddr.split('.')
ipaddr[-1] = '0/24'
ipaddr = '.'.join(ipaddr)
wydomains['ipaddress'][ipaddr] = {}
wydomains['domain'][pdomain][mx_server] = mx_server_record
else:
wydomains['mx'][pdomain].append(mx_server)
# 处理 SOA 记录
soa_server = get_soa_record(pdomain)
for soa_server in soa_server['soa']:
wydomains['soa'][pdomain].append(soa_server)
# 清洗数据,生成C段IP地址,并用bing、aizhan等接口分析整个C段的旁站信息
# 生成C段IP地址
for subdomain in wydomains['domain'][pdomain].keys():
for ipaddr in wydomains['domain'][pdomain][subdomain]['a']:
ipaddr = ipaddr.split('.')
ipaddr[-1] = '0/24'
ipaddr = '.'.join(ipaddr)
wydomains['ipaddress'][ipaddr] = {}
# 生成一个子域名的IP地址,继续处理其它域名,获得更多的IP,再统一递归查询
# # 进入IP地址转换成C段,并查询整个C段IP绑定列表
# for ip_c_block in wydomains['ipaddress']:
# if not check_ip_whitelist(ip_c_block):
# ip2domain_result = ip2domain_start(ip_c_block)
# for ipaddress in ip2domain_result.keys():
# wydomains['ipaddress'][ip_c_block][ipaddress] = ip2domain_result[ipaddress]
# 处理完毕,等待数据可视化后处理 wydomains 数组
# 不存在域传送漏洞,用暴力穷举+第三方API查询的方式做处理
else:
print '-' * 50
# 不存在域传送漏洞,获取可以获取的公开信息 MX、SOA记录
mx_server = get_mx_record(pdomain)
# 检查MX服务器是否为免费的企业邮箱
for mx_server in mx_server['mx']:
if not check_mx_whitelist(mx_server):
wydomains['mx'][pdomain].append(mx_server)
mx_server_record = get_a_record(mx_server)
# MX的服务器地址对于一个企业非常重要
for ipaddr in mx_server_record['a']:
ipaddr = ipaddr.split('.')
ipaddr[-1] = '0/24'
ipaddr = '.'.join(ipaddr)
wydomains['ipaddress'][ipaddr] = {}
wydomains['domain'][pdomain][mx_server] = mx_server_record
else:
wydomains['mx'][pdomain].append(mx_server)
# 处理SOA记录
soa_server = get_soa_record(pdomain)
for soa_server in soa_server['soa']:
wydomains['soa'][pdomain].append(soa_server)
# 进入用字典穷举二级域名,用开放的接口查询二级域名流程
subdomains_result = wy_subdomain_run(pdomain)
for sub_domain in subdomains_result['domain'][pdomain]:
wydomains['domain'][pdomain][sub_domain] = subdomains_result['domain'][pdomain][sub_domain]
for ipaddr in subdomains_result['ipaddress']:
wydomains['ipaddress'][ipaddr] = {}
# 获取并处理了传递进来的子域名可得到的信息,全部结束后,统一用bing.com、aizhan.com查询C段IP域名信息
# 进入IP地址转换成C段,并查询整个C段IP绑定列表
for ip_c_block in wydomains['ipaddress']:
if not check_ip_whitelist(ip_c_block):
ip2domain_result = ip2domain_start(ip_c_block)
for ipaddress in ip2domain_result.keys():
wydomains['ipaddress'][ip_c_block][ipaddress] = ip2domain_result[ipaddress]
else:
# 没有兄弟域名
print '* No parent domain'
print '-' * 50
wydomains['domain'][domain] = {}
wydomains['dns'][domain] = []
wydomains['mx'][domain] = []
wydomains['soa'][domain] = []
for domain in fofa_result['partner'].keys():
# 获取NS记录压入wydomains全局数据中,并检查域名是否存在域传送漏洞
print '* Starting get ns record'
print '-' * 50
ns_result = get_ns_record(domain)
# 判断dns server是否为dns厂商,如果不是,将记录压入全局变量中
for ns_server in ns_result['ns']:
if not check_whitelist(ns_server):
wydomains['dns'][domain].append(ns_server)
wydomains['domain'][domain][ns_server] = get_a_record(ns_server)
else:
wydomains['dns'][domain].append(ns_server)
# 检查域传送漏洞的状况,并取得对应的记录,存在漏洞,会返回['zone']记录数组
if ns_result['is_zone_vul'] == True:
# 存在域传送漏洞,处理ZONE里面的解析数据
# 处理 A 记录 & CNAME 记录
for a_record_line in ns_result['zone']['a']:
subdomain = a_record_line[0]
wydomains['domain'][domain][subdomain] = {'a':[],'cname':[]}
for cname_record_line in ns_result['zone']['cname']:
subdomain = cname_record_line[0]
wydomains['domain'][domain][subdomain] = {'a':[],'cname':[]}
for a_record_line in ns_result['zone']['a']:
subdomain = a_record_line[0]
wydomains['domain'][domain][subdomain]['a'].append(a_record_line[1])
for cname_record_line in ns_result['zone']['cname']:
subdomain = cname_record_line[0]
subdomain_a_record = get_a_record(subdomain)['a']
wydomains['domain'][domain][subdomain]['a'].extend(subdomain_a_record)
wydomains['domain'][domain][subdomain]['cname'].append(cname_record_line[1])
# 处理 MX 记录
mx_server = get_mx_record(domain)
# 检查MX服务器是否为免费的企业邮箱
for mx_server in mx_server['mx']:
if not check_mx_whitelist(mx_server):
wydomains['mx'][domain].append(mx_server)
mx_server_record = get_a_record(mx_server)
# MX的服务器地址对于一个企业非常重要
for ipaddr in mx_server_record['a']:
ipaddr = ipaddr.split('.')
ipaddr[-1] = '0/24'
ipaddr = '.'.join(ipaddr)
wydomains['ipaddress'][ipaddr] = {}
wydomains['domain'][domain][mx_server] = mx_server_record
else:
wydomains['mx'][domain].append(mx_server)
# 处理 SOA 记录
soa_server = get_soa_record(domain)
for soa_server in soa_server['soa']:
wydomains['soa'][domain].append(soa_server)
# 清洗数据,生成C段IP地址,并用bing、aizhan等接口分析整个C段的旁站信息
# 生成C段IP地址
for subdomain in wydomains['domain'][domain].keys():
for ipaddr in wydomains['domain'][domain][subdomain]['a']:
ipaddr = ipaddr.split('.')
ipaddr[-1] = '0/24'
ipaddr = '.'.join(ipaddr)
wydomains['ipaddress'][ipaddr] = {}
# 进入IP地址转换成C段,并查询整个C段IP绑定列表
for ip_c_block in wydomains['ipaddress']:
# 检查IP是否是内网IP,如果是,别查询了
if not check_ip_whitelist(ip_c_block):
ip2domain_result = ip2domain_start(ip_c_block)
for ipaddress in ip2domain_result.keys():
wydomains['ipaddress'][ip_c_block][ipaddress] = ip2domain_result[ipaddress]
# 处理完毕,等待数据可视化后处理 wydomains 数组
# 不存在域传送漏洞,用暴力穷举+第三方API查询的方式做处理
else:
print '-' * 50
# 不存在域传送漏洞,获取可以获取的公开信息 MX、SOA记录
mx_server = get_mx_record(domain)
# 检查MX服务器是否为免费的企业邮箱
for mx_server in mx_server['mx']:
if not check_mx_whitelist(mx_server):
wydomains['mx'][domain].append(mx_server)
mx_server_record = get_a_record(mx_server)
# MX的服务器地址对于一个企业非常重要
for ipaddr in mx_server_record['a']:
ipaddr = ipaddr.split('.')
ipaddr[-1] = '0/24'
ipaddr = '.'.join(ipaddr)
wydomains['ipaddress'][ipaddr] = {}
wydomains['domain'][domain][mx_server] = mx_server_record
else:
wydomains['mx'][domain].append(mx_server)
# 处理SOA记录
soa_server = get_soa_record(domain)
for soa_server in soa_server['soa']:
wydomains['soa'][domain].append(soa_server)
# 进入用字典穷举二级域名,用开放的接口查询二级域名流程
subdomains_result = wy_subdomain_run(domain)
for sub_domain in subdomains_result['domain'][domain]:
wydomains['domain'][domain][sub_domain] = subdomains_result['domain'][domain][sub_domain]
for ipaddr in subdomains_result['ipaddress']:
wydomains['ipaddress'][ipaddr] = {}
# 进入IP地址转换成C段,并查询整个C段IP绑定列表
for ip_c_block in wydomains['ipaddress']:
# 检查IP是否是内网IP,如果是,别查询了
if not check_ip_whitelist(ip_c_block):
ip2domain_result = ip2domain_start(ip_c_block)
for ipaddress in ip2domain_result.keys():
wydomains['ipaddress'][ip_c_block][ipaddress] = ip2domain_result[ipaddress]
# 生成数据时,将MX、NS、SOA项去重
for mx_domain in wydomains['mx'].keys():
wydomains['mx'][mx_domain] = list(set(wydomains['mx'][mx_domain]))
for dns_domain in wydomains['dns'].keys():
wydomains['dns'][dns_domain] = list(set(wydomains['dns'][dns_domain]))
for soa_domain in wydomains['soa'].keys():
wydomains['soa'][soa_domain] = list(set(wydomains['soa'][soa_domain]))
# 生成数据可视化页面
html_content = gender_domian_view(wydomains)
filepath = './report/result_%s.html' % domain
try:
file_object = open(filepath, 'w')
file_object.writelines(html_content)
file_object.close()
except Exception, e:
return "error"
finally:
print '-' * 50
print "* Report is generated"
print '-' * 50
# file_object.close()
return wydomains
if __name__ == "__main__":
if len(sys.argv) == 2:
print start_wydomain(sys.argv[1])
sys.exit(0)
else:
print ("usage: %s domain" % sys.argv[0])
sys.exit(-1)