漏洞扫描器开发与设计的一点感悟

活着的意义……是在你快死的瞬间划过你脑海的那些事啊……

关于广度优先原则

即再批量漏扫的时候,如果对网址又相同的网址请求,可以采用基于网址优先循环,即

http://www.langzi.fun/admin.php
http://www.123456.cn/admin.php
http://www.1111.com/admin.php
http://www.la.cc/admin.php

即基于网址循环,这样不仅可以减少目标服务器压力,不至于把目标扫死,还能隐藏一些身份。

关于超链接获取

这是很深的感悟,即你的漏洞大部分都存在网址参数中,比如xss,sql注入,命令执行,任意文件包含,目录遍历等等,那么获取提升漏扫效率就要从下面两点开始:

1. 获取更加多更加深层的网址
2. 提高扫描验证的效率

关于sql注入扫描,我采用的是直接拉sqlmap过来验证,效率还是可以保证的,还有一些关于服务器层的,我都是直接调用nmap的脚本批量实现,虽然我自己也写了好几十种服务器,web层的未授权访问漏洞验证工具,但是个人终究还是比不上专业工具。

关于url的深度,除了从页面提取有效连接之外,还有更加深层的,我的想法是通过selenium+mitmproxy实现,我一开始是想使用requests实现,毕竟节省内存资源。后来在准备安全巡航项目时,想到还能通过puppeteer进行网页爬行获取连接。后来看到nmask的文章,利用chrome_remote_interface实现程序化、自动化Web安全测试学到了新姿势。

并且selenium本身就是专业的测试工具,自然能挖掘到更多深层的url,我本来想通过分析selenium的日志来获取网页的深层url请求和链接,但是这样比较慢,吃内存大,于是采用mitmproxy中间人代理,获取所有的深层url,然后通过算法获取到有效的深层url。

漏洞库整理

条件允许的话,可以把一些同种类型的漏洞检测方式写在每个单独的文件夹,方便调用。Github

关于自动化生成报表

使用python操作word自然可以,但是感觉生成的结果不太美观,可以做一些优化,生成图表或者添加页眉,格式化等等。

当然如果不需要再编辑可以再转换成pdf文件。获取截图使用pillow,但是这个库转换成exe后,截图后保存只能保存为png格式的图片,勿忘。

更新安全巡航0.97版本时候,初衷是为了简单上手,挂机扫洞的原则,所以一切都配置好,生成的报表文件都是固定写好,后续再更新的话,让用户自己写模板自然是不可能也不现实,可以自己定义好几套模板,提供一个选择模板的接口即可。

关于数据存储

一开始我都是使用记事本存储数据,一来是方便,二来是数据量不大,但是漏扫总共会涉及到超大数据量。

所以建议使用数据库,个人推荐mysql或者redis。数据库一开始一定要做好构架设计,这个非常非常重要,几乎占你漏扫全部的30%核心,一定要有可读性,方便拓展。

如果数据量大了,并发很大,并且你非常有钱拥有很多服务器可以做分布式(偷偷流下了羡慕的眼泪),可以使用mysql+redis做数据存储。

拓展漏洞功能

一些小白刚开始学会写漏扫的时候,看到别人有什么好东西就像加进去,然后发现数据库结构不行,代码也要重构,然后东改西改,最后自己都看不懂代码的真面目了。

一定要做好漏扫的结构设计,分好类,比如服务器端的,web层的,中间件层的存储不同的数据库结构,怎么样才能方便拓展,这些都要提前想好,但是像我这种人只能靠经验慢慢到磨砺了。

系统性构架

不同扫描对象,使用检测方式不一样,这里指的是批量扫描,即对于一些特定目录扫描,可以基于广度优先原则。

减少对方服务器压力并且能防止ban ip,但是这也就意味着,你这个模块需要接受的参数为100个url,但是扫描注入的时候,接受的参数可能是只能是一个url,这里就会出现调度冲突,解决方法有很多,比如分文件处理,每个漏扫模块必须完全独立,然后在数据库中做好结构设计,这一块实在是太大太深奥,我也是自己摸索着学习。

软件工程设计

个人野生菌,习惯独自打仗,所以很多软件都是自己做产品,然后构架代码结构,尝试开发,最后不断测试,更新修复代码,这里最重要的就是软件的结构和变量的命名,建议是对功能做独立分块,高内聚低耦合。

变量命名方式

个人建议是驼峰式命名,名字不宜太长,简短但是又能直观的展示变量或者函数名的作用。

模式借用

即你在某个程序中,实现了一个很骚的方法,比如我之前的yolandan扫描器的核心就是挂机无限扫描,虽然时间过去很久,现在回头看代码发现写的很垃圾,不过里面核心还是值得推荐,由此出现无限url采集,无限cms识别采集等等,并且将来加载到安全巡航实现全自动挂机刷洞生成报表

不在劳累情况下编码

很多时候为了实现一个功能,折腾到凌晨三四点,越写越乱看着就头大,这种情况下需要好好休息,让头脑冷静下来后,仔细思考就会发现很多问题迎刃而解。

调用第三方漏扫

他山之石,可以攻玉。比如SQL注入,模板的注入,如果自己不是很熟或者没有精力去维护一个种类的漏洞资源库的话,不妨直接使用第三方,直接调用nmap,sqlmap,awvs进行漏扫,然后对结果做一个接口维护清洗数据后保存到数据库。

使用第三方功能必然会让软件工程失去主动性和自由性,所以要考虑漏洞种类,数量,扫描策略等。

不要急于动手

当有了一个比较好的灵感,开始构架的时候,不要过度着急,构架完毕也不要马上动手。

因为很多时候,你不可能一次性完成完美的构架设计,肯定在某些地方有缺陷,当时又想不到。但是过上小半天或者一晚上又有要补充的地方。

灵感与知识来源

多上乌云漏洞库看看,每次看到别人提交的漏洞,需要思考如何才能使用工具实现自动批量化。

其次是漏洞复现,在复现的过程总了解漏洞产生的原因和如何验证。

心态良好

这个因人而异,当看到别人写出了大规模全方便易拓展的漏扫,心里又是羡慕又是焦虑,这种心态不行滴~要好好告诫自己:做人不要太攀比,踏踏实实做自己~

只要不死,慢慢学,要相信你终究会成为别人眼里的技术大牛的,最后的加油送给正在努力路上的你。

坚持原创技术分享,您的支持将鼓励我继续创作!
------ 本文结束 ------

版权声明

LangZi_Blog's by Jy Xie is licensed under a Creative Commons BY-NC-ND 4.0 International License
由浪子LangZi创作并维护的Langzi_Blog's博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于Langzi_Blog's 博客( http://langzi.fun ),版权所有,侵权必究。

0%