关于个人编写的web扫描器概述(长更)

项目简述

想用python写一款简单易用又功能齐全的扫描器,依赖库很少,都是用“笨方法”实现的,但目前测试稳定,扫描准确性和速度也挺不错。横向对比之前工作室的扫描器,去除了(令人心生疑惑的)redis数据存储,代码也更整洁高效。

技术层面的话,都是用一种能行的通但可能不是最优解的方法实现的,某些模块也存在着一些顽疾,后面会细说。但整体上,还真的达到了能用的地步。

此篇文章的目的,就当作一种技术积累记录一下,可能以后会成为大佬的笑柄,但还是希望有大佬看到我的一些不足之处能够指出并给予建议,也希望能给有相同想法的人一些参考。

项目地址
https://github.com/T-Jinhao/Scanner

更新时间
2020.12.23

如何使用?

main.py是程序的入口,目前只在这里写了调用其它模块的方法,其它模块还未考虑添加单独启动的方法。

页面展示(不定时更新):
2020.12.23更新

所以想做什么就直接调用这个文件即可,参数选项已经设置的较为直观了。参数均可多选,而且我特意把耗时的任务调到后面了,即同时开展多个功能的话,速度快的会优先安排…

最近把许多重复的组件给提取出来并重构项目,添加了终端彩色输出,输出可以使用-n命名保存输出结果的文件夹,发包用了异步,速度实测提升10倍以上(需要设置线程,线程越大越快)。

端口扫描

对应文件:
func_ports.py

示例用法:

python main.py -u www.keyboy.xyz -P  # 常用端口检测  
python main.py -u 104.248.222.130 -PX  # 自定义端口范围扫描  

实现方法:
即使输入域名也会提取到IP,遍历字典内存放常用的端口,使用socket探测端口是否开启。

最新更新:
– 输出结果会展示banner信息。

crazy实现方法:
范围由常用端口改为用户指定端口(范围)。

存活主机探测

对应文件:
func_hosts.py

示例用法:

python main.py -u www.keyboy.xyz -H  # 全段扫描  

实现方法:
遍历1-255的主机c段IP,探测目标80端口是否开启。

改进点:
– 增加自定义范围的探测

网站信息提取:

对应文件:
func_spider.py

示例用法:

python main.py -u www.keyboy.xyz -S # 基本  
python main.py -u www.keyboy.xyz -S --cookies={cookies} --threads=30  # 高级设置
python main.py -u www.keyboy.xyz -SX  # crazy模式下会对页面的js文件进行信息提取
...  

实现方法:
通过访问参数url,获得网页源码,再使用bs4模块提取各种链接,再嗅探链接的存活性和提取其中的邮箱手机号等信息。

crazy实现方法:
通过提取并访问页面的js文件,使用正则提取其中的中文文本。

改进点:
– 可以增加自定义要爬取的链接类型
– 提取注释中的链接
– 提取js方法内的跳转路径

目录爆破

对应文件:
func_burp.py

示例用法:

python main.py -u www.keyboy.xyz -B  # 基本  
python main.py -u www.keyboy.xyz -BX # 额外使用一个更大的目录字典  
python main.py -u www.keyboy.xyz -B -F {payload.txt}  # 使用{payload.txt}中的payload  

实现方法:
自动探测网站类型并加载对应的路径字典。
遍历读取到的payload,使用grequests模块,检测对应的网站状态码。另会自动识别网站是否设置了自定义的404页面,并根据匹配名单进行识别。

crazy实现方法:
额外加载一个payload文件,更大payload但感觉常用的频次不高,碰撞的概率很低。(不足)

改进点:
– 线程数如果设置过大,容易搞崩网站

子域名挖掘

对应文件:
func_domain.py

示例用法:

python main.py -u www.keyboy.xyz -D  # 基本  
python main.py -u keyboy.xyz -DX     # 通过在线的DNS记录平台获取历史解析记录数据并爆破
python main.py -u keyboy.xyz -D -F {payload.txt}   # 使用{payload.txt}中的payload  

略微不足:
因为域名形式多种多样,因此需要手动确认一下域名是否正确,有可能未能注意造成进程持续等待。

实现方法:
先传参到站长之家进行查询,正则提取结果。【可能为空】
遍历读取到的payload,使用requests模块,获得对应的网站状态码。

crazy实现方法:
通过强大的DNS解析记录平台rapiddns获取数据,并进行存活性探测。【未挂载代理可能会获取失败,自动转入普通模式】

改进点:
– 使用异步请求后基本能在一分钟内出结果
– 输出会展示域名跳转情况

SQL注入检测

对应文件:
func_sqli.py

示例用法:

python main.py -u www.keyboy.xyz?id=1 -I   # 只fuzz漏洞点
python main.py -u www.keyboy.xyz?id=1 -IX  # 调用sqlmapapi自动扫描

crazy实现方法:
调用了sqlmapapi,传参进去即可自动跑

持续待开发中…

2 Replies to “关于个人编写的web扫描器概述(长更)”

  1. 使用redis作为缓存,用于分布式扫描。
    如果扫描的量级特别大,比如一秒钟100个poc的检测,单个机器是搞不定的。

    redis作为celery等任务调度框架的存储,但是不适合作为持久化,比如漏洞的输出、资产的存储。

    理想的应该是redis作为不同节点任务传输过程中的存储、以及热点存储(从mysql读取的任务数、配置等访问频次特别高的,用redis更快)

    读写不频繁的就改用mysql等DB。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注