0x00 前言
前段時間腾务,在做mysql弱口令檢測優(yōu)化,痛苦的把mysql源碼讀了一遍躏哩。業(yè)余時間就一直在想關于弱口令的林林總總。其實很多個人信息泄露骇陈,都是由于缺乏安全意識震庭,使用
12345
888888
asdfghjkl
等弱密碼造成的。
今天我就用實際行動來證實一下你雌,弱口令的危害器联。
0x01 思路
海康威視等廠商旗下的設備婿崭,大多都采用了很簡單的初始密碼拨拓,而且大部分用戶也不會去修改初始密碼。
今天我們來驗證一下氓栈,能否通過弱口令來訪問這些公共設備渣磷。
首先我們需要一個引擎,來抓取暴露在互聯(lián)網(wǎng)上的在線設備的信息授瘦,而恰恰就有這么一個強大的引擎:
https://www.shodan.io 是一個檢索全球在線設備的引擎醋界。比方說輸入關鍵字“Apache”竟宋,就能檢索到世界范圍內的很多Apache主機的詳細信息。
好了形纺,利用這個引擎丘侠,我們就來做一次有趣的編程。
0x02 準備環(huán)境:
1. 操作系統(tǒng)逐样,我們首選Linux
2. 編程語言蜗字,Python3
3. shodan網(wǎng)站引擎的python庫(以及API_KEY)
確認Python3已經安裝,然后安裝第三方shodan庫:
sudo pip3 install shodan
0x03 Shodan API 使用:
通過下面一段代碼脂新,可以發(fā)現(xiàn)這個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文件挪捕,我們發(fā)現(xiàn)詳細,但是我們只需要其中的一小部分信息争便。
所以接下來我們來提取對我們有用的信息
上代碼
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 批量驗證,篩選有效設備
現(xiàn)在就需要了解HTTP協(xié)議了酷宵,我先去惡補一下網(wǎng)絡協(xié)議>>>
這一步,我的思路是躬窜,用腳本批量構造POST請求浇垦,分別驗證每一個設備密碼是否正確(這里可以考慮使用弱口令表,來暴利破解)
但是現(xiàn)在就卡在了荣挨,如何構造正確的POST請求男韧,請求中包括用戶名和密碼信息。