0x00 前言
前段时间,在做mysql弱口令检测优化,痛苦的把mysql源码读了一遍。业余时间就一直在想关于弱口令的林林总总。其实很多个人信息泄露,都是由于缺乏安全意识,使用
12345
888888
asdfghjkl
等弱密码造成的。
今天我就用实际行动来证实一下,弱口令的危害。
0x01 思路
海康威视等厂商旗下的设备,大多都采用了很简单的初始密码,而且大部分用户也不会去修改初始密码。
今天我们来验证一下,能否通过弱口令来访问这些公共设备。
首先我们需要一个引擎,来抓取暴露在互联网上的在线设备的信息,而恰恰就有这么一个强大的引擎:
https://www.shodan.io 是一个检索全球在线设备的引擎。比方说输入关键字“Apache”,就能检索到世界范围内的很多Apache主机的详细信息。
好了,利用这个引擎,我们就来做一次有趣的编程。
0x02 准备环境:
1. 操作系统,我们首选Linux
2. 编程语言,Python3
3. shodan网站引擎的python库(以及API_KEY)
确认Python3已经安装,然后安装第三方shodan库:
sudo pip3 install shodan
0x03 Shodan API 使用:
通过下面一段代码,可以发现这个API的使用还是很简单的
# !/usr/bin/env python3
# -*- encoding:utf-8 -*-
'''
read the API doc, we know the format of results
{
'total': 8669969,
'matches': [
{
'data': 'HTTP/1.0 200 OK\r\nDate: Mon, 08 Nov 2010 05:09:59 GMT\r\nSer...',
'hostnames': ['pl4t1n.de'],
'ip': 3579573318,
'ip_str': '89.110.147.239',
'os': 'FreeBSD 4.4',
'port': 80,
'timestamp': '2014-01-15T05:49:56.283713'
},
...
]
}
'''
__author = 'zhe'
import shodan
import json
import os
MY_SHODAN_API_KEY = 'replace to your own api key'
api = shodan.Shodan(MY_SHODAN_API_KEY)
def GetRawJsonPath(key_words):
file_path = os.path.join(os.getcwd(), key_words + '_raw.json')
return file_path
def Search(key_words):
try:
# Call api to search key_words, and save results in a dict
results = {}
results = api.search(key_words)
print( ('search %i matched result about %s') % (results['total'], key_words))
# We save the results to a json file
with open(GetRawJsonPath(key_words), 'w') as f:
f.write(json.dumps(results))
print(('results saved to path: %s') % GetRawJsonPath(key_words))
except shodan.APIError as e:
print ('Error: %s') % e
def test():
Search('NVR Webserver')
if __name__ == '__main__':
test()
下面就是我们运行python脚本后得到的Json文件:
0x04 信息提取
打开刚刚得到的Json文件,我们发现详细,但是我们只需要其中的一小部分信息。
所以接下来我们来提取对我们有用的信息
上代码
def Parse(key_words):
data = {}
filter_data = []
with open(GetRawJsonPath(key_words), 'r') as f:
data = json.load(f)
for item in data['matches']:
elem = {}
elem['city'] = item['location']['city']
elem['ip'] = item['ip_str']
elem['port'] = item['port']
filter_data.append(elem)
# save filter json to file
with open(GetFilterJsonPath(key_words), 'w') as f:
f.write(json.dumps(filter_data))
print(('filter results saved to path: %s') % GetFilterJsonPath(key_words))
同样,运行脚本后,得到结果:
[
{
"city": "New Rochelle",
"ip": "72.69.197.*",
"port": 80
},
{
"city": "Baotou",
"ip": "116.116.225.*",
"port": 80
},
{
"city": "Baotou",
"ip": "1.31.92.*",
"port": 80
}
...
]
0x05 先验证一下
这时候,弱口令就排上用场了,我们随机验证几个:
很容易就登陆进去了
0x06 批量验证,筛选有效设备
现在就需要了解HTTP协议了,我先去恶补一下网络协议>>>
这一步,我的思路是,用脚本批量构造POST请求,分别验证每一个设备密码是否正确(这里可以考虑使用弱口令表,来暴利破解)
但是现在就卡在了,如何构造正确的POST请求,请求中包括用户名和密码信息。