我想成为大佬要怎么做
我一贯以为自己是一个有梦想的人,我也想有一天自己的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; }}
这是我写好的脚本,大家可以大略改改运用,目前我写的脚本已经集成到了蜻蜓安全平台里面,你可以一键复制利用
目前我已经集成了46常见的款工具,放在GitHub中开源
作者:汤青松日期:2022-11-29