信息收集工具之处理subDomainBrute结果

最近在学习如何挖SRC,首先是域名收集部分。
主要用的lijijie的subDomainsBrute。 一般输出的结果,是域名\sIP[,IP]格式。

为了解析这个结果文件,我自己用了两个方法, 一个是自己写的脚本, 另外一个是用burpsuite。

方法1

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
#!/usr/bin/env python
#coding=utf-8
"""
@version 1.0
@author shinpachi8
@describe
用来对lijiejie的subDomainBrust工具生成的
txt文件做处理, 即分隔开域名与IP,
并对域名进行访问,如果是200,保留
如果是301、302,那么保留跳转后的地址,
如果是其他的,不管。
"""
import re
import threading
import sys
import argparse
import logging
from Queue import Queue
from requests import head
pattern = re.compile(r"(.*\.cn|.*\.com)\s*?(.*)")
lock = threading.Lock()
url_queue = Queue()
queue_out = Queue()
logging.basicConfig(level=logging.INFO,
format='%(asctime)s**%(threadName)s**:\t %(message)s')#输出格式
class dealSubDomainBrust(threading.Thread):
"""docstring for ClassName"""
def __init__(self, args, url_queue, queue_out):
threading.Thread.__init__(self)
self.args = args
self.queue = url_queue # 队列
self.queue_out = queue_out
def run(self):
while not self.queue.empty():
url = self.queue.get()
if not url.startswith("http"):
url = "http://" + url
url_valid = self.connect(url)
if url_valid is not None:
# lock.acquire()
self.queue_out.put(url)
logging.info(url)
# lock.release()
self.queue.task_done()
"""
@param url: string,
对传入的参数做访问,如果是可以访问的,就返url,
如果不可以访问,就返回None.
为了时间快这里用的是head方法
"""
def connect(self, url):
headers = {
"User-Agent" : ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4)"
" AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 "
"Safari/537.36"),
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
}
try:
res = head(url, headers=headers, timeout=10)
if res.status_code == 200:
return url
elif res.status_code in [301, 302]:
return res.headers["Location"]
else:
return None
except Exception as e:
# print "[-]Connect Error Happend"
return None
"""
解析
"""
def parseArg():
parser = argparse.ArgumentParser()
parser.add_argument("-i", "--input", help="Input Your fileName to Deal.")
parser.add_argument("-ou", "--outurl", help="Output file to save url")
parser.add_argument("-oi", "--outip", help="Output file to save ip")
parser.add_argument("-t", "--thread", type=int, default=100, help="thread number, default 100")
args = parser.parse_args()
if args.input is None:
parser.print_usage()
sys.exit(0)
else:
return args
"""
通过正则来匹配域名和Ip
"""
def format_txt(input_file):
_url_list = []
IP = []
with open(input_file, "r") as fp:
for line in fp:
matchs = pattern.match(line)
if matchs:
url = matchs.groups()[0]
ip = matchs.groups()[1]
ip = ip.split(",")
IP.extend(ip)
_url_list.append(url.strip()) # 删除后边的空格与回车
IP = list(set(IP))
_url_list = list(set(_url_list))
for url in _url_list:
url_queue.put(url)
return IP
# return (self.queue, self.IP)
"""
@param ip_filename: 保存处理后的IP
@param IP: IP数组
"""
def save_dealed_ip(outip, IP):
with open(outip, "w") as fp:
for ip in IP:
fp.write(ip.strip() + "\r\n")
logging.info("Ip 已经写完!")
def save_dealed_url(outurl, queue_out):
with open(outurl, "w") as fp:
while not queue_out.empty():
fp.write(queue_out.get() + "\r\n")
logging.info("Thanks God. URL Done TOO")
def choice1(input_file, outurl, outip):
ou = []
oi = []
with open(input_file, "r") as fp:
for line in fp:
matchs = pattern.match(line)
if matchs:
ou.append(matchs.groups()[0])
ip = matchs.groups()[1].split(",")
oi.extend(ip)
ou = list(set((ou)))
oi = list(set((oi)))
with open(outurl, "w") as fp:
for url in ou:
fp.write(url + "\r\n")
with open(outip, "w") as fp:
for ip in oi:
fp.write(ip.strip() + "\r\n")
logging.info(u"客人,您的1号套餐已经就绪,请您就餐")
def main():
args = parseArg()
# 处理参数
if args.outip is None:
outip = args.input.split(".")[0] + "_ip.txt"
else:
outip = args.outip
if args.outurl is None:
outurl = args.input.split(".")[0] + "_url.txt"
else:
outurl = args.outurl
if args.thread is None:
thread = 100 # 默认线程
else:
thread = args.thread
while True:
print u"只想分离URL和IP, 输入1, 想执行全过程, 输入2"
choice = raw_input()
if choice in ["1", "2"]:
break
if choice == "1":
choice1(args.input, outurl, outip)
sys.exit(0)
# 单线程走一波
# save_dealed_url(URL_QUEUE, fp)
IP = format_txt(args.input)
save_dealed_ip(outip, IP)
logging.info("Thanks God. Did One Thing Right.")
threads = []
for t in xrange(thread):
tt = dealSubDomainBrust(args, url_queue, queue_out)
threads.append(tt)
for tt in threads:
tt.setDaemon(True)
tt.start()
try:
while True:
count = 0
for tt in threads:
if tt.is_alive():
pass
else:
count += 1
if count == thread:
break
except KeyboardInterrupt as e:
logging.info("[-]Oh, U kill ME. U murderer.")
save_dealed_url(outurl, queue_out)
if __name__ == '__main__':
main()

使用方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
usage: deal_subDomainBrust.py [-h] [-i INPUT] [-ou OUTURL] [-oi OUTIP]
[-t THREAD]
optional arguments:
-h, --help show this help message and exit
-i INPUT, --input INPUT
Input Your fileName to Deal.
-ou OUTURL, --outurl OUTURL
Output file to save url
-oi OUTIP, --outip OUTIP
Output file to save ip
-t THREAD, --thread THREAD
thread number, default 100
  • -i 其实是必须的,它是subDomainsBrute的结果文件 如163.txt
  • -ou 输出的域名文件, 默认 输入文件_url.txt
  • -oi 输出的IP的文件, 默认 输入文件_IP.txt
  • -t 线程数量 默认100

示例输出为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
只想分离URL和IP, 输入1, 想执行全过程, 输入2
2
2017-04-06 11:02:17,171**MainThread**: Ip 已经写完!
2017-04-06 11:02:17,171**MainThread**: Thanks God. Did One Thing Right.
2017-04-06 11:02:18,192**Thread-1**: http://110.alipay.com
2017-04-06 11:02:18,765**Thread-6**: http://home.alipay.com
2017-04-06 11:02:18,839**Thread-7**: http://clive.alipay.com
2017-04-06 11:02:18,860**Thread-8**: http://er.alipay.com
2017-04-06 11:02:18,930**Thread-9**: http://taobao.wap.alipay.com
2017-04-06 11:02:19,530**Thread-12**: http://image.alipay.com
2017-04-06 11:02:20,588**Thread-15**: http://static.alipay.com
2017-04-06 11:02:20,687**Thread-20**: http://piao.alipay.com
2017-04-06 11:02:21,129**Thread-21**: http://accounts.alipay.com
2017-04-06 11:02:21,209**Thread-23**: http://qy.alipay.com
2017-04-06 11:02:22,265**Thread-28**: http://a.alipay.com

如果只想分离IP和域名,只需要选1即可, 如果想对域名进行筛选,选出其中可以访问的,选2. 但是这只是head方法去请求,查看返回状态码,只选取200, 301, 302, 几个。

方法2

写一个简单的php脚本,然后用burpsuite来帮忙跑,查看返回的大小等来识别。

1
2
3
4
5
6
7
8
9
10
<?php
if (isset($_GET['url']))
{
$link = $_GET['url'];
$out = file_get_contents($link);
echo $out;
}
?>

其实就是一个简化的ssrf漏洞代码。通过服务端来请求,返回响应的内容。
1
2
3

结尾

其实这只是自己的一点尝试,毕竟在大一点厂商中,子域名可能不下几千个, 如果手工去侦别可能并不现实。
所以萌发利用其他人的工具,加上自己的脚本来处理的想法。

目前只是自己写的一个demo。 望大家多提意见。

文章目录
  1. 1. 方法1
  2. 2. 方法2
  3. 3. 结尾
|