代码分享:用Python编写的多协议弱密码审计工具集
作者:网友投稿 时间:2018-03-27 09:01
前几天与大家分享了我自己用C++实现的用于企业内部环境的ssh弱密码审计工具。在实际的工作中,我们还需要对多种常见的协议定期进行弱密码审计。为了灵活地适应企业内部复杂的网络环境,以及领导希望稳定可控的需求,我在Linux环境下基于Python和相关的库实现了telnet、smb、mssql、mysql、ftp等多个协议的弱密码审计工具,并取得了不错的效果,在此也与大家分享相关的代码和经验,希望能够给大家做弱密码审计时能够带来帮助。
一、弱密码审计工作的执行流程下面是各种协议共通的弱密码审计执行流程:
(1)使用开源工具zmap对全网进行相关协议端口的扫描,发现所有潜在的目标主机;
(2)运行相应协议的弱密码审计工具对所有目标主机执行审计,必要时进行二次验证和过滤;
(3)将找到的弱密码记录存入mysql数据库;
当所有的任务跑完之后,按照部门统计弱密码数量,绘制分布图表和总体趋势图表,输出详细的弱密码列表,再交给负责漏洞管理的同事分发给各责任单位要求进行整改。
二、用Python实现弱密码审计工具的优缺点在做弱密码审计工具这件事情上,Python最大的好处是:程序简单易懂易实现;有丰富的库资源,每种协议都能找到支持的库。而它的缺点则有:多线程的性能和稳定性不够理想,例如线程数超过100个就不稳定很大概率出现假死;部分协议库在复杂网络环境下可能会出现异常,例如接收数据时没有超时机制,导致永久的等待。
而应对它的缺点,我也尝试了不少的办法,走了一些弯路,最终的解决经验是:
(1)同时使用多进程和多线程来在并发与稳定性之间取得平衡,比如同时起20个进程,每个进程20个线程,实现400个并发;
(2)深入研究相关的协议库源代码,对相关的代码进行优化修改,例如smb协议我就是修改的impacket库的某文件,增加了timeout参数。有些情况下,可能也会基于源文件做一下大改,近似于重写了,比如telnet协议我就是改动了很多;
(3)懂得适时放弃,另寻它径。ssh协议就是如此,虽然它的paramiko库很强大,但是大并发的时候就会有各种问题,协议复杂,代码量又很大,于是果断放弃,转而使用C++结合libssh2库实现主要功能,再在外层用Python包装一下,完成参数和数据的传递工作就好了。
三、Python弱密码审计工具的设计思路不同于ncrack、hydra等集多种协议于一身、功能强大的弱密码工具,我们实际是为每一种协议单独编写程序,虽然可能会比较零散,但是通过结合crontab、shell脚本等,也能很好地完成任务。
大家可以参考我的github目录:https://github.com/penoxcn/PyWeakPwdAudit,我将最核心的Python代码放在里面了。至于zmap扫描以及与数据库的存取部分,则没有包含在本文范围内,但我相信聪明的读者应该会根据自己的实际情况灵活实现的。
下面说一下代码的框架以及各个代码的作用:
(1)BruteThread.py 是个多线程调度的库。
(2)BruteRunner.py 本文件提供一个接口类Bruter来完成字典文件的加载、目标的加载、扫描进程的创建、扫描结果的保存。该文件需要你们补充一些代码来完成实际的目标加载和扫描结果保存工作,无论是从文件或者数据库。下面代码片段展示了Bruter类启动弱密码扫描任务的过程:

(3)XxxBrute.py 每种协议的用户验证代码,一般有一个XxxAuth类完成单一一次的登录验证过程,一个XxxBruteTester类来完成单个主机的依密码字典审计过程。例如mssql的登录验证就是在MssqlBrute.py里实现的,它调用于pymssql来完成一次Mssql Server的登录验证尝试。如下面的代码片段所展示的:


(4)XxxBruteScan.py 每种协议的主程序入口,在github上我仅提供了MssqlBruteScan.py作为例子,其它的协议几乎完全相同的。在程序main函数中,你需要解析命令行参数,初始化日志,加载配置文件,然后创建Bruter实例,执行实例的start函数就自动完成该协议的弱密码审计任务了。如下面的代码片段所展示的:




