关于弱口令的思考及实战演练

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文件:


关于弱口令的思考及实战演练_第1张图片
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 先验证一下


这时候,弱口令就排上用场了,我们随机验证几个:

关于弱口令的思考及实战演练_第2张图片
Paste_Image.png

很容易就登陆进去了

关于弱口令的思考及实战演练_第3张图片
Paste_Image.png
关于弱口令的思考及实战演练_第4张图片
Paste_Image.png

0x06 批量验证,筛选有效设备


现在就需要了解HTTP协议了,我先去恶补一下网络协议>>>

这一步,我的思路是,用脚本批量构造POST请求,分别验证每一个设备密码是否正确(这里可以考虑使用弱口令表,来暴利破解)
但是现在就卡在了,如何构造正确的POST请求,请求中包括用户名和密码信息。

你可能感兴趣的:(关于弱口令的思考及实战演练)