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

项目简述

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

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

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

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

记录时间
2019.10.29

如何使用?

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

页面展示(不定时更新):
2019.9.29暂时记录

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

端口扫描

对应文件:
func_ports.py

示例用法:

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

展示页面:
2019.10.29暂时记录

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

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

存活主机探测

对应文件:
func_hosts.py

示例用法:

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

展示页面:
2019.10.29暂时记录

实现方法:
遍历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 -SR  # crazy模式下会进入页面上的网站链接再爬取一遍  
...  

展示页面:
2019.10.29暂时记录

实现方法:
其实只是通过访问参数url,获得网页源码,再使用bs4模块提取信息。

crazy实现方法:
使标志位激活,调用文件内的crazy()方法,把已爬取的链接再传入自身,最后把标志位置否,即只递归一次。

改进点:
– 可以增加自定义要爬取的链接类型
– crazy模式下对网站采用相对链接的链接过滤不够完善

目录爆破

对应文件:
func_burp.py

示例用法:

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

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

展示页面:
2019.10.29暂时记录

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

改进点:
– 感觉用requests模块比较耗费网站资源,暂未找到其它替代方法
– crazy线程数感觉太多了,容易搞崩网站

子域名挖掘

对应文件:
func_domain.py

示例用法:

python main.py -u www.keyboy.xyz -D  # 基本  
python main.py -u keyboy.xyz -DR     # 额外加载更大的payload,线程加至50  
python main.py -u keyboy.xyz -D -F {payload.txt}   # 使用{payload.txt}中的payload  

展示页面:
因为域名形式多种多样,因此需要手动确认一下域名是否正确,有可能未能注意造成进程持续等待。
2019.10.29暂时记录

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

crazy实现方法:
额外加载一个payload文件,但指定了{payload.txt}将不再加载额外的payload文件。

改进点:
– 感觉用requests模块比较耗费网站资源,暂未找到其它替代方法
– crazy线程数感觉太多了,容易搞崩网站

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自动扫描

展示页面:
国内的不敢扫,先扫扫国外的。但国外的连接稳定性又不够,就摆到国外服务器上跑了
2019.11.22

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

持续待开发中…

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

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

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

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

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

发表评论

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