如何自己开发漏洞扫描工具

article/2025/9/30 15:06:08

漏洞扫描工具,核心就是扫描器,而扫描器的设计思想是:灵活,易扩展,易修改,灵活的意思就是可单独执行专项漏洞的扫描,也可以批量执行集成的所有漏洞探测模块;易扩展的意思就是,新的漏洞检测模块可清晰简单的集成进扫描器;易修改,对各个漏洞扫描模块可根据特殊情况修改探测逻辑。以下我们以网上一款开源的扫描工具来讲解,当然部署过程和使用中可能会处处是坑,只要一一解决就是:

扫描器的源码

扫描器下载地址: https://gitee.com/samllpig/SafeTool-51testing

工具的详细安装教程: http://quan.51testing.com/pcQuan/lecture/117

软件架构图

安装部署

  • 安装 python 3.6 以上环境(如果怕麻烦,就安装3.6,因为安装3.8等高版本还需要调整一点代码兼容性问题,但问题不多)
  • 安装 redis
  • 安装 wxPython==4.0.7
pip install wxPython==4.0.7

#如果安装失败,多执行几编,主要是因为网络超时导致安装失败
#也可以直接去下载相关模块包,如下载 wxPython-4.0.7-cp36-cp36m-win_amd64.whl,到官网下载,一定要下载和python版本匹配的包
#通过安装包来安装指定模块

pip install wxPython-4.0.7-cp36-cp36m-win_amd64.whl

#安装过程如果提示缺什么包,就继续去下载什么包 

 也可以安装更高版本的,比如wxPython==4.1.1

  • 安装openssl

一般安装会有问题,可以直接到官网下载 http://slproweb.com/products/Win32OpenSSL.html

在本地安装后,还需要将库文件拷贝到python目录下,这样才能识别,如:

1、将openssl安装目录下的:C:\Program Files\OpenSSL-Win64\lib 拷贝到 D:\Python\libs

2、将openssl安装目录下的:C:\Program Files\OpenSSL-Win64\include 拷贝到 d:\Python\include

  • 检查requirements.txt

这个文件源代码根目录下,配置了需要安装的模块及版本,我们需要确认自己的python版本是否以其匹配,比如Python3.8就要求改lxml为 lxml==4.6.3

  • pip安装模块包
pip install -r requirements.txt# 如果安装失败,多执行几编,主要是因为网络超时导致安装失败,也可以到官网找模块包下载后来安装
# 如果安装提示版本问题,就需要替换版本,一般Python3.8会遇到
  • 按以下顺序启动服务

启动redis数据库
启动服务端 myproxy.bat
启动客户端 python consoleMain.py 

异常修改

安装部署完后,我们可能还会遇到一些问题,这和代码当初的开发环境不一致有关。

1、关于Python3.8和3.6的兼容

Python3.8已经移出了time.clock()方法,但这份源码里还是用到了,所以如果遇到相关报错,需要自己手动修改,比如获取系统时间,可以改为使用time.perf_counter()

2、路径带空格的问题

这份代码这方面没考虑周全,如果部署的路径带空格,就会报路径错误,比如“D:\Program Files”路径,我们要么就不要部署在带空格的路径下,要么直接改他的代码,比如:

setUp = "python " + path
#可以将path路径用引号全圈起来
setUp = "python '" + path + "'"

 3、启动时报wt.exe找不到错误

我也不知道wt.exe的由来,这个错识有时候不影响启动,因为启动文件consoleMain.py做了相关判断处理,但为了彻底不调用wt.exe,我们也可把consoleMain.py当中的相关代码直接改了:

# wtSetUp = "wt.exe python " + path
# 把以上调用改为直接调PowerShell.exe
wtSetUp = "start cmd /k PowerShell.exe python '" + path + "'"

这么改后,还有个好处,就是遇到代码异常,不会立即关闭cmd窗口,这样就能看到以下具体的报错,对于调试和分析代码错误是有帮助的。

 4、中文报utf-8编码错误

比如在web扫描时执行exec audit,报错:

通过报错,我们可以看到utf-8编码错误,而且报错的是request.py的resp.read().decode方法,我们把编码改为如下(具体改成什么编码,自己可以试试):

self.content = resp.read().decode('gbk')

编码改成功后,再通过 python consoleMain.py 入口调用就没有这个错误了。

5、报list index out of range错误

这个低级错误,一般是使用不当引起,但也看出了代码的健壮性不足,比如执行exec attacks.xss报错如下:

 我们可以看到报错的params.py文件具体那一行,就是self.url.split("?"),问题出在这个问号,因为我开始设置扫描路径是:set url http://172.16.1.63,这是错误的,应该如下设置:

set url http://172.16.1.63/?u=admin

一眼就看出来了,得加个?问号,表示带参数,这个问题可以直接改他的代码,加个判断,如果不带参数,就提示重新设置,而不是报错。另外这块也说明还需要进一步扩展开发,正常应该由扫描工具主动去扫描和捕获可以进行xss跨站脚本攻击的链接和地方,而不是手动设置url来模拟攻击。

6、执行myproxy.bat找不到mitmdump

明明我们都装了mitmdump,为什么还可能找不到,这是因为pip安装时,是局部还是全局安装,正常mitmdump是安装在python目录下的Scripts中,如D:\Tools\Python\Scripts,假如你没找到,那就需要在代码路径下搜索,是否装在代码目录下了,比如在:SafeTool-51testing\venv\Scripts

这是因为我们用PyCharm Community Edition开发工具来安装部署可能遇到的问题,我们要么挪一下mitmdump,要么直接改myproxy.bat,改一下调用路径:

"D:\Program Files\Project\SafeTool-51testing\venv\Scripts\mitmdump" -q -s myproxy.py -p 8000

7、生成报告的问题

开源的代码里关于这块也是有问题的,具体下面也会提到简单的修改方式 。

简单使用

先打开我们的扫描器看下界面:

 扫描器界面:

好了,上面就是我们的扫描器,全部使用命令操作,简单易记,大家跟着敲就可以了。

  • help命令使用

help: 列出集成的插件命令和描述。

我们开始扫描之前要做些基本的设置,输入help set命令,查看我们需要设置那些参数,带*号的是必选项.

  • info 命令

info :显示详细的漏洞检测模块

info 命令的使用格式是: info [插件名称],插件名称就是上图中输入help命令得到的。

输入info attacks:

输入info audit命令:

可以看到audit插件下的检测模块太少了,后期我们需要加入tomcat、nginx、weblogic等等的扫描模块 。

输入info brute命令:

输入 info disclosure:

  • set命令:

在进行扫描之前需要进行基本的设置工作,通过help set命令查看可以设置的选项,在通过set命令设置,在help set显示的选项中带*号的是必选项,其他的根据需要进行设置。

set 命令格式: set [选项] [参数]

举例: set url http://192.168.16.132/wordpress/?s=11

  • check 命令:

输入check argv 显示set中设置的参数值

其中agent参数,即版本信息默认会随机获取。

  • exec 命令

执行检测命令,命令格式:exec 插件名称[.模块名称]

如果只输入插件名称[attacks,audit,brute,disclosure],则会执行当前插件下所有漏洞检测模块,如果输入 插件名称.模块名称,例如:attacks.xss,则仅会执行当前插件下指定的模块名称。

输入 exec audit : 执行检测中间件插件下的所有模块

输入 exec attacks.xss :使用注入插件中的检测xss漏洞模块:

输入 exec attacks.blindsqli :检测sql盲注漏洞

  • report 命令:

生成测试报告命令

命令参数: report [报告名称]

注:只有执行过起码一次完整的插件检测才能生成报告,而不是专项漏洞检测,即 exec 插件名称,而不是 exec 插件名称.模块名称

输入命令: report webscan

按照提示显示的目录,打开测试报告,报告格式是html的:

好了,以上就是使用扫描器的所有命令和完整的执行流程(这个报告执行了audit和attacks两个模块(插件),但结果都归为第一个插件模块了,原因如下)。

注意:关于生成报告,原来的代码应该是有问题的,如果只执行的是插件子模块,如 exec attacks.xss,再执行report webscan 生成报告是会失败的,这是因为代码里只有在执行插件总模块 exec attacks才会调用报告赋值(调用子模块的函数是startup_spec_attacks,没有重新赋报告值,所以导致exec子模块,报告数据就会并到前面的插件总模块),参见代码如下:

#执行attacks子模块函数,没有对REPORT进行再赋值
def startup_spec_attacks(attack:str):if attack in attacks_info.keys():plugins = spec_attacks_plugins(attack)startup_plugins(plugins)else:warn("模块不存在!")def startup_full_attacks():global resultJsonif not REPORT['startTime']:REPORT['startTime'] = strftime("%Y/%m/%d at %H:%M:%S")execmod.append("attacks")plugins = attacks_plugins()if resultJson:resultJson = {}startup_plugins(plugins)REPORT['attacks'] = resultJson  #调用总的attacks模块,才对报告结果赋值

这个问题需要引起关注,如果想简单的改,直接在startup_spec_attacks函数里加上REPORT赋值(需要有重复判断)就行:

def startup_spec_attacks(attack:str):global resultJsonif not REPORT['startTime']:REPORT['startTime'] = strftime("%Y/%m/%d at %H:%M:%S")if resultJson and not REPORT['attacks']:resultJson = {}if attack in attacks_info.keys():execmod.append("attacks")plugins = spec_attacks_plugins(attack)startup_plugins(plugins)REPORT['attacks'] = resultJsonelse:warn("模块不存在!")

这么一改,再执行以上的扫描步骤,报告模板显得更准确,而且就算执行同一模块的attacks.xss和attacks.blindsqli,后面的也不会覆盖前面的,如下:

当然这样也不能保证完全没有问题,具体以后我还会去细致考虑这方面的优化!

插件的编写

大家按章节一的下载地址,下载工具后,用PyCharm或vscode或你顺手的工具打开,插件扫描器就在scan目录下

我们的插件编写,先从scan\lib\utils\settings.py 全局配置文件开始

第一步:先看基础路径配置,整个项目的目录结构就在这里

第二步,配置字典路径,漏洞检测模块需要用到的字典,统一放在这个路径下

第三步:配置插件路径,新增的插件统一按下面的格式配置

第四步:配置插件描述信息,和第三步的插件路径是对应的

第五步:配置漏洞模块描述信息,和第四步的插件描述是对应的

第六步:配置漏洞模块路径信息,和第四步的插件描述是对应的

第七步:编写插件的加载模块方法

统一命名规则 插件名成_plugins()[全部模块执行方法];spec_插件名称_plugins(key:str)

第八步:编写检测漏洞模块,以attacks插件下的bshi(破壳漏洞检测)检测模块为例,

导入必须的核心库:

创建漏洞检测类,继承Request类,类名需与文件名一致

编写的漏洞检测方法,统一命名为check:

最后编写run方法,命名不建议修改,如果实在需要修改的话,还需要在第九步中修改对应的模块导入逻辑:

第九步:在localapi.py文件下编写本地API调用,为什么有本地API调用,因为我打算再写个远程API调用方法,结合安全工具的web服务使用(这一步不是必须的,只有在扩展新的插件才用到,如果在原有插件的基础上新增漏洞检测模块,则可以跳过这一步)

本地API函数的格式和基本路径,参考下图:

总结下扩展逻辑就是,命名插件便于统一管理模块,模块编写按固定格式,本地API编写用于按指定插件运行检测模块,该扫描器的检测模块还可以继续更新扩展。

由于我就学了半天Python语法和没几天的部署应用,还需要继续了解和学习,语言都是相通的,会Java的学Python也快,学好Python是有助于对这款开源工具的扩展应用和开发。

参考:https://zhuanlan.zhihu.com/p/368859499


http://chatgpt.dhexx.cn/article/MofGrKV6.shtml

相关文章

漏洞扫描工具openvas

openvas简介 安装环境 安装openvas 一系统简介 OpenVAS是开放式漏洞评估系统,也可以说它是一个包含着相关工具的网络扫描器。其核心部件是一个服务器,包括一套网络漏洞测试程序,可以检测远程系统和应用程序中的安全问题。 用户需要一种自动…

漏洞扫描工具汇总

漏洞扫描器可以快速帮助我们发现漏洞,如SQL注入漏洞、CSRF、缓冲区溢出等。下面就介绍几种常用的漏洞扫描工具。 Fortify 代码审计工具Fortify SCA (Fortify Static Code Analyzer),一款软件代码安全测试工具,提供静态源码扫描能力&#xf…

Kali漏洞扫描工具OpenVas

一、漏洞扫描器 漏洞扫描器通常由两个部分组成 ①进行扫描的引擎部分②包含了世界上大多数系统和软件漏洞特征的特征库 比较优秀的漏洞扫描器: Rapid7 Nexpose:(商用软件)适合较大的网络Tenable Nessus:(商…

10种用于渗透测试的漏洞扫描工具有哪些_渗透测试和漏洞扫描区别

大家好,又见面了,我是你们的朋友全栈 [漏洞]扫描[工具]是IT部门中必不可少的工具之一,因为漏洞每天都会出现,给企业带来安全隐患。 [漏洞扫描工具有助于检测安全漏洞、应用程序、操作系统、硬件和网络系统。 黑客在不停的寻找漏…

5 款漏洞扫描工具:实用、强力、全面(含开源)

目录 引言 5款工具,打包带走吧! 第一款:Trivy 概述 安装 第二款:OpenVAS 概述 安装 第三款:Clair 概述 安装 第四款:Anchore 概述 安装 第五款:Sqlmap 概述 安装 引言 漏洞扫描是一…

漏洞扫描工具大全,妈妈再也不用担心我挖不到漏洞了

漏洞扫描工具大全,妈妈再也不用担心我挖不到漏洞了 1.常见漏洞扫描工具2.AWVS3.AppScan4.X-ray5.Goby6.Goby联动Xray7.Goby联动御剑1.常见漏洞扫描工具 NMAP,AWVS,Appscan,Burpsuite,x-ray,Goby 2.AWVS Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的网络…

工具|2021年十大扫描漏洞工具

自动化已经在每个行业代替了不同的工种, 在网络安全信息战争中也不例外,优秀的黑客工具可以足够半自动挖成渗透测试。只有深度才是独一无二的存在。深度学习关注公众号:Esn技术社区 2021年 十大黑客工具列表 AcunetixNmapMetasploitWiresharkNiktoJohn the RipperK…

渗透测试工具——漏洞扫描工具

安全漏洞产生的原因 技术原因 软件系统复杂性提高,质量难于控制,安全性降低公用模块的使用引发了安全问题 经济原因 “柠檬市场”效应——安全功能是最容易删减的部分 环境原因 从传统的封闭、静态和可控变为开放、动态和难控攻易守难 安全缺陷 安全性缺…

C#在Panel控件中添加另外一个窗体

一,新建窗体如下 二、定义并设置窗体 在新的窗体中定义 Form_Config formConfig new Form_Config(); 设置窗体的属性   formConfig.Dock DockStyle.Fill;   formConfig.TopLevel false;   formConfig.FormBorderStyle System.Windows.Forms.FormBorderSty…

重绘panel控件,实现panel的阴影效果

最近想在项目中添加一个要有阴影的panel控件,找了好多资料,最后通过采用图片的方式实现了panel的阴影效果,效果图如下: 重绘代码如下: 1 using System;2 using System.Collections.Generic;3 using System.ComponentMo…

C# 使用Panel控件实现窗体嵌套

一、准备步骤: 1. 创建一个Windows应用程序 2. 把默认窗口的名字为Form1(如上图) 3. 创建一个Windows窗体,为Form2(如上图) 4. 在Form1窗口中增加一个按钮button,然后增加一个Panel,双击按钮在按钮里面写事件(如下…

asp.net panel 加html,ASP.NET中 Panel 控件的使用方法

Panel 控件在 ASP.NET 网页中提供一种容器控件,可以将它用作静态文本和其他控件的父控件。 一、常见 Panel 属性 属性 描述 HorizontalAlign 指定子控件在面板内的对齐方式(左对齐、右对齐、居中或两端对齐)。 Wrap 指定面板内过宽的内容是要换到下一行,…

C#当中如何使用Panel控件显示其它窗体

【效果图】 要实现点击左边不同的功能时,在右面pannel控件中显示对应的窗体 【代码】 窗体是一个顶级控件,要想将其显示在panel控件中,要将窗体设置为非顶级控件 form.TopLevel false; 下面是一个将窗体显示在Panel控件中的方法 this.pa…

panel中html怎么写,panel控件有什么用 请写出Panel控件的用途

当多个panel控件重叠时,把一个panel的visible/设置为true,其它的设置为f例如有3个panel,分别为panel1,panel2,panel3 如果重叠的话,把他们的大小设置为相同大小,直接通过上下层来控制即可,例如想要panel2显示出来,就用 panel2.BringToFront; 要是想panel1显示则用panel1.B…

多个panel控件重合使用时,某个panel控件不显示问题?

前言 在设计一个界面时,为了节省空间,我将控件分类后分别放到了三个重合放置的Panel中,并添加三个了按钮作为调出对应Panel的媒介,如图1-1所示。 图1-1 简化效果图 按钮的调用代码如下: private void btnOne_Click(o…

C#中Panel控件的使用

大家在创建winform的时候,是不是很多时候都需要建立父窗体,然后再父窗体基础上添加子窗体,然后再单击事件的时候还有可能弹出好多的窗口,今天给大家带来有关panel控件福利。 Panel控件相当于在我们主窗体中添加了一个容器&#xf…

机房重构-panel控件

第一种用法: 以前实现这些需要用属性Enabled为False。 其实VS中自带了一个panel控件可以实现这个。 把text控件放到panel上,在修改按钮这里写入下面代码,就可以使panel上所有控件可修改。 private void btnModify_Click(object sender, Ev…

C# panel控件的移动与扩大

开发环境: 基于 VS2019 基于C#语言 解决问题 C# panel控件的移动与扩大 结果展示 4、源代码下载链接:

Panel控件—让你的界面变好看

panel控件对于美化UI窗体有很大的作用,这不,我们在机房合作的时候就使用了panel控件。使用了panel控件之后,减少了弹出窗体的次数,因为窗体都放在了panel控件中显示出来了。下面来看看一成品图。 今天就来教大家如何使用panel控件…

jsonp 详解

JSONP(JSON with Padding)是JSON的一种“使用模式”&#xff0c;可用于解决主流浏览器的跨域数据访问的问题。由于同源策略&#xff0c;一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通&#xff0c;而 HTML 的<script> 元素是一个例…