高效率开发Web安全扫描器之路(一)
一、背景
经常看到一些SRC和CNVD上厉害的大佬提交了很多的漏洞,一直好奇它们怎么能挖到这么多漏洞,开始还以为它们不上班除了睡觉就挖漏洞,后来有机会认识了一些大佬,发现它们大部分漏洞其实是通过工具挖掘的,比如说下面是CNVD上面的白帽子大佬
我想成为大佬要怎么做
我一直觉得自己是一个有梦想的人,我也想有一天自己的ID能出现在排行榜中,于是我凭借着自己那一点开发知识,认真研究了一下市面上的安全工具,以及怎么开发安全工具。
安全工具分析
经过我得研究发现市面上的安全工具其实只有两类,一类是面向某个漏洞的工具比如SQLMap,另外一个一类是综合扫描工具,比如AWVS;
作为一个只想挖漏洞的我,我更偏向于综合型的扫描器开发,可是综合型的扫描器开发难度真的很大,要清晰地了解各种漏洞的原理,而且还需要把他们使用代码去实现,如果是我一个人从头开发我压根做不到啊。
但我并不打算放弃,我准备集结天下之利器,为我扫描器所用;理想是有了,但现实是我要怎么实现,这可真实苦恼了我。
二、 要做的东西
我想要做的扫描器核心目的就是要使用简单,另外就是我可以随心所欲的修改;我希望是我只要给他一个URL地址,它就可以帮我扫描网站的漏洞,以及这个主机本身的漏洞
细致的拆解了一下,我觉得最需要的功能有这几个
- 能自动收集URL地址,爬虫收集和爆破收集
- 能从URL中提取主机IP
- 能快速检测常见的热门POC
- 能自动识别网站的指纹信息
- 能对IP进行端口快速扫描
- 能对端口的banner识别出服务
- 能检测出SQL注入漏洞
- 能检测出反射性XSS漏洞
- 能够通过指纹信息,使用对应的POC工具
- 能够快速扩展功能,且不影响整体逻辑
第一版本差不多就是这些功能吧,功能虽然不算多,但如果完全从头开始实现开发时间可不少。
三、思路分析
为了达到高效率的同时又能自主可控,我决定做一个有水平的缝合侠,简单理解就是我要把很多工具巧妙的融入到我开发的工具来,这里需要考虑的第一个问题是每个工具的使用方法、输入的参数、输出的结果都是不一样的,工具A的结果工具B不一定认识。
要解决这个问题,说简单也简单说难也难,总之我是摸着石头过河成功了;原理是自己给每个工具做一个壳,外部要调用工具A需要先调用工具A的壳,然后才会传到工具A,当工具A返回了结果,工具A的壳也会最先拿到,然后将结果解析出来并按照统一的格式输出就可以了。
通过这个简单的办法,我相当于把其他的安全工具变成了我得一个函数,我需要的时候调用这个函数就可以了。
按照我前面提到的需求,我梳理了一下要试用的工具有这几个:
序号
序号 | 需求 | 工具 |
---|---|---|
1. | 爬去URL的有 | RAD |
2. | 爆破URL的有 | DIRMAP |
3. | 提取主机IP | 正则 |
4. | 快速检测热门POC | xray |
5. | 识别网站的指纹 | dismap |
6. | 对IP端口快速扫描 | masscan |
7. | 能对端口的banner识别出服务 | nmap |
8. | 能检测出SQL注入漏洞 | sqlmap |
9. | 能检测出反射性XSS漏洞 | xsser |
这些工具都是比较常见的工具,我第一步需要对他们的使用方法熟悉,以xray工具为例
xray的使用命令如下所示
./xray_linux_amd64 webscan --url "http://192.168.1.100/" --json-output /tmp/11.json
当xray执行完毕之后,他会将结果输出到指定位置,但是数据格式并不是我所期望的,我需要将它的格式读入,然后再转换成我所需要的格式。
这里我用PHP写了一个简单的脚本,他做了这几件事情:
- 定义了参数来源位置和结果输出位置
- 获取参数中的URL,并执行xray工具
- 获取xray的执行结果,并解析成自定义格式
- 将最终的结果写入到输出位置
代码示例如下所示
<?php
//获取输入的参数
$inputFile = "/data/share/input_".getenv("xflow_node_id").".json";
$outputFile = "/data/share/output_".getenv("xflow_node_id").".json";
//没有input,直接返回
if (!file_exists($inputFile)) {
var_dump($outputFile, json_encode(['code' => 0, 'msg' => "{$inputFile}文件不存在", 'data' => []], JSON_UNESCAPED_UNICODE));
return 0;
}
//读取上游数据
$inputData = json_decode(file_get_contents($inputFile), true);
$url = $inputData['url'];
$data = execTool($url);
//将结果写入到指定位置,供蜻蜓平台导入数据
file_put_contents($outputFile, json_encode($data, JSON_UNESCAPED_UNICODE));
//将工具执行
function execTool($url)
{
$hash = md5($url);
$resultPath = "/tmp/{$hash}/tool.json";
//清理之上一轮的结果
if (file_exists($resultPath)) unlink($resultPath);
//创建文件夹
if (!file_exists(dirname($resultPath))) {
mkdir(dirname($resultPath), 0777, true);
}
$result = [];
$toolPath = "/data/tools/xray";
if (!file_exists($toolPath)) die("xray 工具目录不存在:{$toolPath}");
$path = "cd $toolPath && ";
// 通过系统命令执行工具
$cmd = "{$path} ./xray_linux_amd64 webscan --url \"{$url}\" --json-output {$resultPath}";
echo $cmd;
exec($cmd, $result);
$toolResult = file_exists($resultPath) ? file_get_contents($resultPath) : '[]';
$toolResult = json_decode($toolResult, true);
print_r($toolResult);
return $toolResult;
}
再来sqlmap封装的例子,首先需要知道sqlmap的使用的方法,如下所示
sqlmap -u "http://192.168.1.100/index.php?id=1" --batch --random-agent
当sqlmap执行完毕之后,我需要知道他的执行结果在什么位置,并将结果解析出来,按照规范化的格式输出到指定地址。
这里我同样用PHP写了一个脚本,做了这几件事情:
- 定义了参数来源位置和结果输出位置
- 获取参数中的URL,并执行sqlmap工具
- 获取sqlmap的执行结果,并解析成自定义格式
- 将最终的结果写入到输出位置
<?php
//获取输入的参数
$inputFile = "/data/share/input_".getenv("xflow_node_id").".json";
$outputFile = "/data/share/output_".getenv("xflow_node_id").".json";
//没有input,直接返回
if (!file_exists($inputFile)) {
file_put_contents($outputFile, json_encode([]));
return 0;
}
//读取上游数据
$list = json_decode(file_get_contents($inputFile), true);
print_r($inputFile);
print_r($list);
$data = [];
//处理数据
foreach ($list as $val) {
$url = $val['url'];
$toolPath = "/data/tools/sqlmap/";
print_r("开始扫描URL:{$url}".PHP_EOL);
execTool($url, $toolPath);
//录入检测结果
$tempList = writeData($toolPath, $url);
print_r("扫描URL:{$url}完成".PHP_EOL);
print_r($tempList);
$data = array_merge($data, $tempList);
}
print_r($data);
//将结果写入到指定位置,供蜻蜓平台导入数据
file_put_contents($outputFile, json_encode($data, JSON_UNESCAPED_UNICODE));
function writeData($toolPath, $url)
{
$arr = parse_url($url);
$file_path = $toolPath . 'result/';
$host = $arr['host'];
$outdir = $file_path . "{$host}/";
$outfilename = "{$outdir}/log";
//sqlmap输出异常
if (!is_dir($outdir) or !file_exists($outfilename) or !filesize($outfilename)) {
print_r("sqlmap没有找到注入点: $url");
return [];
}
$ddd = file_get_contents($outfilename);
print_r($ddd);
exec("rm -rf $outdir");
return [["raw" => $ddd]];
}
function execTool($v, $toolPath)
{
$arr = parse_url($v);
$blackExt = ['.js', '.css', '.json', '.png', '.jpg', '.jpeg', '.gif', '.mp3', '.mp4'];
//没有可以注入的参数
if (!isset($arr['query']) or (strpos($arr['query'], '=') === false)) {
print_r(["URL地址不存在可以注入的参数".PHP_EOL, $v]);
return false;
}
$file_path = $toolPath . 'result/';
$cmd = "cd {$toolPath} && python3 ./sqlmap.py -u '{$v}' --batch --random-agent --output-dir={$file_path}";
exec($cmd);
return true;
}
通过前面xray和sqlmap两个工具封装的例子,你回发现其实每个工具封装的流程都差不多,差一点只是程序的输出结果解析而已,所以到现在位置我解决了扫描器的能力问题。
四、动手实践
现在只需要我把几个功能连接起来就行了,这里需要考虑一个新的问题;sqlmap所需要的参数确是具体的多个URL地址,也就是说在调用sqlmap之前,我需要把URL都收集好再调用sqlmap,这里就有数据依赖问题。
这个问题也好办,我们需要准备三张表: 目标表、功能依赖表、数据存放表。
目标表
ID | URL | create_time |
---|
功能表
ID | tool_name | pre_tool_name | create_time |
---|
数据表
ID | tool_name | url | result | create_time |
---|
我们可以首先从目标表中获取一个要扫描的目标,然后读取所有的功能,for循环功能表,只需判断当前有没有依赖问题,或者依赖问题已经解决,那么就可以得到所需的依赖数据,直接执行功能即可。
执行完成结果可以在结果页面看见,这里是我的执行结果。
伪代码如下所示:
<?php
$id = getTarget();
$toolLst = getToolList();
foreach($toolList as $val){
//判断当前工具上级依赖为空或者上级工具已执行
if($val['pre_tool_name'] == '' or 上级工具已经执行){
//开始使用工具对URL扫描
scanUrl();
//保存结果
svaeResult();
} else(){
//上级工具还没执行完成,先跳过
continue;
}
}
这是我写好的脚本,大家可以简单改改应用,目前我写的脚本已经集成到了蜻蜓安全平台里面,你可以一键复制使用
http://qingting.starcross.cn/scenario/detail?id=1931
目前我已经集成了46常见的款工具,放在GitHub中开源,地址:https://github.com/StarCrossPortal/QingTing
作者:汤青松
日期:2022-11-29
微信:songboy8888
高效率开发Web安全扫描器之路(一)的更多相关文章
- HTML5移动Web开发实战 PDF扫描版
<HTML5移动Web开发实战>提供了应对这一挑战的解决方案.通过阅读本书,你将了解如何有效地利用最新的HTML5的那些针对移动网站的功能,横跨多个移动平台.全书共分10章,从移动Web. ...
- 用jsp开发web应用并不是一个高效率的选择
1. Android里有办法让js使用java方法像使用自己的方法一样方便,和flex的很相似,flex里面使用java方法就像使用自己的方法一样. 2. 用Flex开发准确的说就是用as ...
- 用“MEAN”技术栈开发web应用(一)AngularJs前端架构
前言 不知何时突然冒出“MEAN技术栈”这个新词,听起来很牛逼的样子,其实就是我们已经熟悉了的近两年在前端比较流行的技术,mongodb.express.angularjs.nodejs,由于这几项技 ...
- 小白日记28:kali渗透测试之Web渗透-扫描工具-Nikto
扫描工具-Nikto #WEB渗透 靶机:metasploitable 靶场:DVWA[默认账号/密码:admin/password] #新手先将DVWA的安全性,调到最低,可容易发现漏洞 侦察[减少 ...
- 在CI中实现持续Web安全扫描
一. 当前Web应用安全现状 随着中国互联网金融的爆发和繁荣,Web应用在其中扮演的地位也越来越重要,比如Web支付系统.Web P2P系统.Web货币系统等.对于这些金融系统来讲,安全的重要性是不言 ...
- SSM框架开发web项目系列(五) Spring集成MyBatis
前言 在前面的MyBatis部分内容中,我们已经可以独立的基于MyBatis构建一个数据库访问层应用,但是在实际的项目开发中,我们的程序不会这么简单,层次也更加复杂,除了这里说到的持久层,还有业务逻辑 ...
- 一个「学渣」从零开始的Web前端自学之路
从 13 年专科毕业开始,一路跌跌撞撞走了很多弯路,做过餐厅服务员,进过工厂干过流水线,做过客服,干过电话销售可以说经历相当的“丰富”. 最后的机缘巧合下,走上了前端开发之路,作为一个非计算机专业且低 ...
- Web漏洞扫描工具(批量脱壳、反序列化、CMS)
一.什么是Web漏洞扫描工具 即是指“扫描Web应用以查找安全漏洞(如跨站脚本,SQL注入,命令执行,目录遍历和不安全服务器配置)的自动化工具”,其中许多可能是由不安全或不正确的编码和设计.另一方面, ...
- 十大web安全扫描工具
本文来源:绿盟整理 <十大web安全扫描工具> 十大web安全扫描工具 扫描程序可以在帮助造我们造就安全的Web 站点上助一臂之力,也就是说在黑客"黑"你之前, 先测 ...
- web漏洞扫描工具集合
最好用的开源Web漏洞扫描工具梳理 链接:www.freebuf.com/articles/web/155209.html 赛门铁克2017年互联网安全威胁报告中提出在他们今年扫描的网站中,有76%都 ...
随机推荐
- 【一月一本技术书】-【MySQL是怎样运行的】- 8月
mysql 基础 mysql分为 客戶端/服务端 客户端向服务端发送一段文本(mysql语句),服务器处理后向客户端进程返回一段文本. 查询请求执行过程 客户端->处理连接->查询缓存-& ...
- SpringSecurity基本使用
SpringSecurity web 安全管理框架 需要依赖多 shiro 轻量 SSM+Shiro SpringBoot/SpringCloud+SpringSecurity 配置用户名密码 配置文 ...
- 基于Containerd安装部署高可用Kubernetes集群
转载自:https://blog.weiyigeek.top/2021/7-30-623.html 简述 Kubernetes(后续简称k8s)是 Google(2014年6月) 开源的一个容器编排引 ...
- Centos7.6内核升级
文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483766&idx=1&sn=4750fd4e ...
- 使用elasticdump迁移es数据
安装elasticdump github地址:https://github.com/elasticsearch-dump/elasticsearch-dump # yum -y install npm ...
- MySQL数据表更新模板
-- ---------------------------- -- 新增表 -- ---------------------------- CREATE TABLE `biz_circle_lead ...
- 数据卷Volume
数据卷概述 Kubernetes Volume(数据卷)主要解决了如下两方面问题: 数据持久性:通常情况下,容器运行起来之后,写入到其文件系统的文件暂时性的.当容器崩溃后,kubelet 将会重启该容 ...
- MySQL用户也可以是个角色
前言 角色(Role),可以认为是一些权限的集合,一直是存在各个数据库中,比如Oracle.SQL Server.OceanBase等,MySQL 自从 8.0 release 才引入角色这个概念. ...
- CSP-J2020 洛谷P7072 直播获奖(Splay/桶排序)
题目描述 NOI2130 即将举行.为了增加观赏性,CCF 决定逐一评出每个选手的成绩,并直播即时的获奖分数线.本次竞赛的获奖率为 w%,即当前排名前 w% 的选手的最低成绩就是即时的分数线. 更具体 ...
- Future详解
Future模式 [1]Future模式是多线程开发中常见的设计模式,它的核心思想是异步调用.对于Future模式来说,它无法立即返回你需要的数据,但是它会返回一个契约,将来你可以凭借这个契约去获取你 ...