Web框架漏洞扫描工具-vulcat

念旧   ·   发表于 2022-07-07 10:43:28   ·   安全工具

0. 注意事项

本工具仅供与学习或合法渗透测试,使用时请遵守中华人民共和国网络安全法:http://www.gov.cn/xinwen/2016-11/07/content_5129723.htm
如果您在使用本工具的过程中存在任何非法行为, 或造成了任何后果, 您需自行承担相应责任, 我们将不承担任何法律及连带责任。

1. 前言

  • 工作期间在对网站进行渗透时,遇到过各种各样的框架,通常都是上网查找相应的漏洞Payload,然后拿着一个个Payload对网站进行尝试,久而久之,感觉这样特别繁琐,所以想在网上寻找一个专门扫描框架漏洞的工具,但是找寻结果不尽人意。
  • 要么POC太过零散,需要对一个个工具和脚本进行配置、运行;
  • 要么就是工具太久没有更新,POC和功能都不太好用;
  • 看到这些工具都是Python写的,我刚好也会,所以打算自己写一个,于是在参考多个工具的写法和功能之后,vulcat横空出世。

1.1 什么是vulcat?

  1. vulcat可用于扫描web端漏洞(框架、中间件、CMS等), 发现漏洞时会提示目标urlpayload, 使用者可以根据提示 对漏洞进行验证并进一步利用。

简单来说,vulcat可以用于扫描框架漏洞,例如ThinkPHP等;当扫描出漏洞时,将会返回漏洞所在url以及相应数据,你可以访问该url验证漏洞,或配合Burp进行深度利用。

接下来将会介绍vulcat的使用,以及它的各个参数

2. vulcat基本使用

2.1 下载与安装

2.1.1 Python3下载

本工具基于python3开发,电脑上需要提前安装python3

  • Python3下载: https://www.python.org/downloads/

2.1.2 vulcat下载

  • Git: git clone https://github.com/CLincat/vulcat.git
  • Zip: 点我

(本文章的附件里面也有)

2.1.3 目录结构

下载完成之后进行解压,进入vulcat文件夹,将会看见以下文件

2.1.4 安装vulcat需要的python第三方库

接下来在当前文件夹打开命令行,输入以下命令安装一下python第三方库

  1. 由于各个计算机配置不同,命令也会有所不同,以下5条命令都可以尝试一下,一条不行就换下一条:
  2. pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
  3. pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
  4. python -m pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
  5. python3 -m pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple
  6. py -3 -m pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple

使用pip,安装install,指定文件-r,指定镜像源-i(默认使用的是国外的镜像源,下载速度很慢,我这里指定了国内的阿里云镜像源,快很多)

安装好之后,在命令行运行以下命令,即可看到vulcat的提示信息

  1. 由于各个计算机配置不同,命令也会有所不同,以下3条命令都可以尝试一下,一条不行就换下一条:
  2. python vulcat.py
  3. python3 vulcat.py
  4. py -3 vulcat.py

2.2 -h/—help 参数

输入以下命令,可以查看vulcat的帮助信息,你将看到vulcat支持的所有参数,接下来我们会一个一个讲解

  1. python vulcat.py -h
  2. python vulcat.py --help


2.3 —version 参数

输入以下命令,可以查看vulcat的版本信息,当前vulcat为1.1.0版本

  1. python vulcat.py --version

2.4 —list 参数

输入以下命令,可以查看vulcat支持扫描的所有漏洞信息,最底下的数字是统计数量

  1. python vulcat.py --list


3. vulcat指定扫描目标

如何使用vulcat指定url并进行扫描

3.1 -u/—url 参数

输入以下命令,可以对一个url进行扫描

  1. python vulcat.py -u https://www.example.com/
  2. python vulcat.py --url https://www.example.com/

  • 如果url输入错误,例如http写成了htp,会提示目标错误

3.2 扫描过程

扫描大致分为5个过程:

  1. WAF检测
  2. Web框架指纹识别
  3. 安全漏洞扫描
  4. 等待所有线程结束
  5. 输出扫描结果

3.2.1 WAF检测

WAF检测:vulcat目前支持阿里云盾、腾讯云盾等WAF的检测

  1. 当vulcat检测到目标疑似存在WAF时,将会给出以下提示,并征求用户的意见,是否继续扫描

  2. 如果用户输入了n或者no,vulcat会跳过当前url,不对其进行扫描(n和no不区分大小写)

  3. 当然,如果用户不信邪,想要继续扫描,就可以输入y或yes,vulcat将会继续扫描,并进入到下一阶段(y和yes不区分大小写)

3.2.2 Web框架指纹识别

Web框架指纹识别:vulcat目前支持二十个框架的漏洞扫描,其中80%的框架具备指纹识别功能

  • 如果识别出了目标框架类型,则扫描相应的漏洞,例如识别出目标为ThinkPHP框架,则vulcat只会进行ThinkPHP的漏洞扫描
  • 如果没有识别出目标框架类型,vulcat将扫描所有的漏洞
  • 例如:(看进度条就可以知晓POC数量不同)

3.2.3 安全漏洞扫描

安全漏洞扫描:这个没什么好说的了吧

  • 扫描时会出现进度条,提示扫描的进度

3.2.4 等待所有线程结束

  • 当扫描结束之后,需要等待一段时间,具体要等多久,取决以下2点
  1. 目标url的响应速度:如果一个网站本来就很卡很卡,打开以后要加载半天的那种,那么等待的时间也会大大拉长
  2. 第三方api的响应速度:由于一些漏洞没有回显,需要请求dnslog来判断漏洞是否存在,vulcat默认使用dnslog.cn,但是dnslog.cn有的时候会很卡很卡,等待时间也会大大拉长(这里我推荐同学们手动更改为ceye.io,具体怎么更改,继续看下去)

3.2.5 输出扫描结果

  • 扫描完成后,如果存在漏洞,则会有这样的提示:
  • 我们复制Target,或者复制Url+Path,然后到浏览器中访问,学过的同学应该都知道这是一个RCE,使用echo输出了6个字符
  • 我们更改echo为id,可以看到命令成功被执行,而且页面中有回显

3.3 -f/—file 参数

指定一个文件,vulcat可以读取每一行的url,实现多个目标一起扫描

  1. python vulcat.py -f url.txt
  2. python vulcat.py --file url.txt
  • 创建一个文件,写上2个url,一行一个
  • 然后…应该都会吧,我就不细说了,看图:

  • 当然,url如果写错了,也会:

3.4 -r/—recursive 参数

递归扫描url的每层目录,该参数不用指定参数值,指定目标后,直接写上-r或—recursive即可

  1. python vulcat.py -u https://www.example.com/ -r
  2. python vulcat.py -u https://www.example.com/ --recursive
  3. python vulcat.py -f url.txt --r
  4. python vulcat.py -f url.txt --recursive
  • 我们来看看-r的效果,咋一看,好像没什么效果

  • 但是,如果url有多层目录的时候:

  • -r/—recursive参数就会将每层目录都扫描一遍,假如有一个漏洞存在/qwe/目录下,但是你图方便,只扫描了/qwe/asd/zxc/目录,那你就错过了这个漏洞,-r参数可以帮你解决这个问题

3.5 中途暂停

如果你扫描到一半,想退出、暂停、终止扫描并查看结果时,该怎么操作呢?

  • 你可以在指纹识别,或漏洞扫描的过程中,按下键盘上的Ctrl+C,此时扫描将会暂停,并要求用户输入(不区分大小写)

  • 如果你输入q或quit,将会直接退出扫描

  • 如果你输入c或continue,将会继续扫描

  • 如果你输入n或next,将会跳过当前扫描,进行下一个扫描

  • 如果你输入wq或sava and exit,将会保存现有的扫描结果,终止运行,等待现有的线程结束后,将会输出扫描结果

  • 如果你按了一次Ctrl+C之后,再按一次Ctrl+C,和输入q/quit是一样的效果。当然,也有可能会报错误:

4. vulcat通用参数

此类参数可以启用或禁用一些功能

4.1 —no-waf 参数

禁用waf检测,如果你觉得不需要waf检测功能,你可以将其禁用


4.2 —no-poc 参数

禁用安全漏洞扫描,如果你不想进行漏洞扫描,只想进行WAF检测和Web框架指纹识别,那么你可以禁用漏洞扫描

4.3 —batch 参数

yes/no的选项不需要用户输入,使用默认选项。例如WAF检测的时候,如果检测出WAF,那么会要求用户输入yes或no,否则扫描将会一直停在这里,如果你觉得太繁琐,可以使用—batch参数,vulcat将会帮你选择默认选项

  • 默认选项的首字母将会大写,例如Y(es)或者N(o);不是默认选项,首字母将会小写,例如y(es)或n(o)
  • WAF检测的默认选项是no


5. vulcat指定框架或漏洞

如果你想“禁用Web框架指纹识别”,或者只想扫描“某个框架的多个漏洞”或“某个框架的1个漏洞”,你可以使用以下两个参数

5.1 -a/—application 参数

看下面这个页面,是不是很像ThinkPHP(把很像去掉,就是)vulcat默认情况会进行指纹识别,但是人家直接把框架拍你脸上了,你还识别个嘚

  • 这时候你可以使用-a thinkphp来指定框架类型,vulcat只会扫描你指定框架的漏洞
  • 例如vulcat支持thinkphp的5个漏洞POC,那么vulcat只会使用这5个POC来进行漏洞扫描

  • 可以看到,vulcat并没有进行指纹识别这一步操作,而是直接进行了漏洞扫描

  • 如果你不想指纹识别,也不想自己去看框架,可以指定-a all,vulcat将会直接使用所有POC

  • 如果指定了一个vulcat不支持的框架名称,则会提示错误

  • 如果你想查看vulcat支持的框架名称,可以使用-h/—help参数进行查看

5.2 -v/—vuln 参数

上面的-a参数是指定框架,但是扫描了5个漏洞,如果你只想扫描单个漏洞,该如何做呢?

  • 先使用-a参数指定一个框架名称,然后使用-v参数指定一个漏洞编号即可

  • 如果你输入了错误的框架名称,或错误的编号:

  • 漏洞编号在哪里查看呢?记得上面教过的—list参数吗,Vul_id那一列就是vulcat支持的漏洞编号了

  • 这时可能有人会问了,为什么有些漏洞没有编号呢?显示的是“None”

  • 因为我在网上查不到这些漏洞的编号,这些漏洞暂时不支持-v/—vuln参数(我在努力了)

6. vulcat可选选项

有一些参数,可以根据自身需要进行更改

6.1 -t/—thread 参数

线程参数,数字越大,vulcat每秒发送数据包的数量就越多,扫描的也越快

  • vulcat默认thread为2,可以理解为每秒有2+个POC在运行
  • 如果指定thread为10,则每秒有10+个POC在运行,从进度条就能看出来差距

6.2 —delay 参数

如果你想扫描的慢一点,例如这个网站非常脆弱,扫描稍微快一点,这个网站就会崩掉,你除了调低-t参数,还可以使用—delay参数

  • —delay参数,会在每个线程直接停顿n秒,默认为1
  • 例如你将线程指定为了5:-t 5
  • 然后将停顿指定为了2:—delay 2
  • 那么vulcat会在每5个POC之间,停顿2秒钟
  • 以此来防止扫描过快,引起的一系列反应,此处就不放图演示了,因为肉眼看不出来效果

6.3 —timeout 参数

超时时间,例如vulcat使用ThinkPHP的漏洞POC去访问了一个网站,如果这个网站特别卡,超过了—timeout设定的时间,那么vulcat就会直接认为 这个网站不存在ThinkPHP的漏洞

  • —timeout默认为10秒,用户可以根据网站的响应速度自定义
  • 此外,—timeout参数也影响“等待所有线程结束”(步骤4)的时间,超时时间越大,等待时间越久,反之越短

6.3 —http-proxy 参数

可以指定http/https代理,通常配合Burp使用

  • 以“—http-proxy 地址:端口”的形式指定代理
  • 例如:—http-proxy 127.0.0.1:8080

配合Burp:

  • 先使用Burp监听好端口,我这里是本地的8080端口
  • 然后在vulcat扫描时,加上—http-proxy参数
  • vulcat扫描时的数据包,都会经过Burp

6.4 —user-agent 参数

自定义User-Agent头,应该都懂吧


  • 不过要注意,尽量不要有中文哦,容易出问题:

6.5 —cookie 参数

自定义Cookie,例如有的漏洞需要登录后台才能发现,那么你可以指定Cookie然后扫描


6.6 —log 参数

vulcat日志,如果你想查看vulcat的运行状态,你可以使用这个参数,并指定一个数字(1-6之间,默认为1)

1、 vulcat默认就是—log 1,没啥好看的
2、 —log 2,日志2级: 框架名称+漏洞编号+状态码

  • 可以看到vulcat的发包过程,是不是清晰了很多

3、 —log 3,日志3级: 2级内容+请求方法+请求目标+POST数据

  • 如果你还想看更多的内容,可以继续增大数字

    4、 —log 4,日志4级: 2级内容+请求数据包

    5、 —log 5,日志5级:4级内容+响应头

    6、 —log 6,日志6级: 5级内容+响应内容

7. vulcat保存扫描结果

vulcat默认情况下,如果扫描出漏洞,只会在命令行中显示结果,不会保存到文件中,你可以使用以下参数,将结果保存到文件中(注意:保存结果时,会在文件末尾追加,不会覆盖整个文件的内容)

7.1 —output-text 参数

如果扫描出漏洞,则保存结果至.txt文件中

  • 打开1.txt文件,可以看到扫描结果已经被保存
  • 如果没有扫描出漏洞的话,则不会生成.txt文件

7.2 —output-json 参数

如果扫描出漏洞,则保存结果至.json文件中

  • json文件:

同—output-text参数,没有漏洞时不会生成.json文件

8. vulcat基本配置与第三方API

8.1 切换中英文

打开/vulcat/lib/initial/language.py

  • 看到return lang[‘zh_cn’]和return lang[‘en_us’]了吗,上下交换它们的位置并保存文件

  • 然后再次运行vulcat,可以看到,已经变成了英文

  • 但是,—list参数目前不支持英文,只有中文版本(在努力了)

8.2 —dns 参数

我们经常需要使用dnslog来配合无回显漏洞的验证,例如dnslog注入,没有回显的RCE等。vulcat目前支持的dnslog平台有2个:dnslog.cn和ceye.io

  • 我们可以指定fastjson框架,并使用—log 4参数来查看vulcat发送的数据包
  • 可以看到,vulcat使用了dnslog.cn的API来辅助漏洞验证
  • —dns会优先使用ceye.io,当ceye.io不可以使用时,将会自动切换为dnslog.cn

  • 你也可以直接指定某个API:

  • 如果你想使用ceye.io,可以指定为—dns ceye

  • 可以看到,此处显示了NotDns,是因为使用ceye.io时,需要进行相关的配置,具体配置见下方

8.3 配置dnslog平台为ceye.io

1、 打开网页http://ceye.io/
2、 点击Login进行登录,如果没有账号的话先注册一个

3、 登录之后,会看到如下页面,主要的东西有2个:“ceye域名”和“Api Token”

  • 这个域名和Token独属于你这个账号,你可以用来作为dnslog使用(注意:要保管好,如果泄露出去的话,别人就可以使用你的dnslog了)

4、 打开/vulcat/lib/initial/config.py,并将你的域名和Token填入

5、 再次进行扫描,—dns参数会优先使用ceye,所以不用特意指定

  • 可以看到,vulcat已经使用你填入的域名进行扫描了

6、 查看结果,如果存在漏洞,则你的DNS Query或者HTTP Request里面会有记录,就和dnslog.cn一样

9. 自定义漏洞POC

你觉得vulcat自带的POC不太好用?想自己写POC?没问题,vulcat已经为你准备好了模板,你只需要填写相应的选项,就能写出一个漏洞POC(最好有一定Python基础)

9.1 准备工作

1、 打开/vulcat/payloads/

  • 可以看到有2个文件“demo.py”和“demo2.py”
  • 这2个文件就是vulcat的POC模板,可以根据需要自行选择模板,2个模板的内容可以混合使用
  • 要是觉得这2个模板不是很好的话,也可以自己进行修改,只要能扫描出漏洞,并返回结果就行

2、 寻找你想写的漏洞

3、 复制demo.py并更改文件名

  • 先将demo.py复制一份并保存,防止模板丢失,下次还能用
  • 然后将其中一份demo.py改名,我习惯命名为要扫描的框架名称,例如我这里要扫discuz的漏洞,我就会将文件名命名为Discuz.py,这样方便辨认

4、 打开Discuz.py,这里我使用了微软的vsCode编辑器+Better Comments插件

  • Better Comments插件可以让代码中的注释具有颜色,看起来更加醒目

9.2 填写注释信息

如果你的POC想给更多人使用,填写该信息会方便其他人查看、了解POC的信息(如果你闲麻烦也可以不写)

  • XXX框架介绍:官网地址
  • XXX扫描类
  • 漏洞名称
  • 漏洞编号
  • 获取攻击payload的网址

9.3 引入Python库

vulcat已经提前引入了需要用到的python库,如果你需要使用别的库,可以自行引入。如果不需要,此处不用理会,默认即可

9.4 填写POC类的基本信息

  • 1:类名
  • 2:框架名称
  • 3:Payload名称,建议与漏洞编号一致,方便区分,格式如图:

9.5 添加Payload

填写该漏洞需要用到的Payload

  • 4:path,url路径
  • 5:data,POST数据
  • 6:headers,Headers头
  • 根据漏洞情况来填写
  • 由于没有POST数据,所以我这里的data为空
  • 由于漏洞点存在Cookie参数里面,所以我需要填写headers,并指定Cookie以及参数
  • 如果需要多个payload的话,将以上内容复制一份即可

9.6 填写POC主体

此处有关POC的运行,以及发现漏洞时回显的信息

  • 7:POC名称,建议与漏洞编号一致,方便区分,格式如图:
  • 8:漏洞类型,根据需要填写,例如远程代码执行就填RCE,任意文件上传就填FileUpload等
  • 9:漏洞编号,根据需要填写
  • 10:漏洞请求方式,是get请求就填GET,是post就填POST,是put就填PUT之类的
  • 3:Payload名称,参考9.4章节,需要一致
  • 11:请求方式,根据实际填写

  • 另外,函数的注释里面,如果你想填东西的话,可以把漏洞的描述填进去,方便查看POC信息:

9.7 判断漏洞是否存在,并回显相关信息

根据你的Payload执行的命令,来判断漏洞是否存在;此处还预定义了回显信息,你可以根据需要进行更改

  • 我的Payload如果攻击成功,页面会显示phpinfo的相关信息,如果显示了phpinfo的信息,就代表漏洞存在
  • 所以我要判断页面中是否存在phpinfo的相关信息
  • 另外,还要定义回显的信息,格式如下

  • 如果是字符类型,例如 ‘键’: ‘值’

    回显方式为 key: value
    键: 值

  • 如果是列表类型,例如 ‘键’: [‘值1’, ‘值2’, ‘值3’]

    回显方式会以空格分隔每个值 key: value1 value2 value3
    键: 值1 值2 值3

  • 如果是字典类型,例如 ‘主键’: {‘键1’: ‘值1’, ‘键2’: ‘值2’}

    回显方式会在每行排列一个键值,看下面
    主键:
    键1: 值1
    键2: 值2
    键3: 值3

  • 我这里返回了以下信息

  • 字符类型的target(目标url)
  • 列表类型的app_name、vul_type、vul_id(框架名称、漏洞类型、漏洞编号)
  • 字符类型的vul_method(漏洞请求方式)
  • 字典类型的Payload(url、漏洞路径、Cookie)

9.8 填写底部信息

此处使用来添加POC扫描线程的

  • 6:POC的名称,参考9.6章节
  • 1:类型,参考9.4章节
  • 13:对象名称,可以自定义,我一般喜欢写成类名的小写,如图:

9.9 在vulcat中引入你的POC

POC编写好之后,需要在vulcat中引入你的POC,就像引入python库一样,引入之后即可使用该POC进行漏洞扫描

  • 我们可以在底部看到这样几行字
  • 根据提示,打开/vulcat/lib/initila/config.py,可以看到一个列表:
  • 将你的对象名称添加进去,对象名称就是你在9.8章节里面填写的那个
  • 然后打开/vulcat/lib/core/coreScan.py,可以看到这里引入了很多POC
  • 根据上方的提示,引入我们的Discuz.py脚本里面的discuz

  • 至此,你的POC就彻底完成了

9.10 扫描测试

来测试一下我们编写的POC

  • 我在本地使用vulhub搭建了一个相应的漏洞环境
  • 然后我们运行vulcat扫描这个目标,并使用—log 3查看日志信息
  • 可以看到,我们的POC已经在运行了,用GET方式访问了一个url,状态码为200
  • 我们再使用-a参数以及—log 4查看发送的数据包,可以看到我们填写的Payload都在其中,并且发现了漏洞,还返回了相应的信息(url、路径、Cookie等)
  • 我们将这个LOG-2-Discuz的数据包复制,并放到Burp里查看
  • 可以看到,命令执行成功了,页面确实出现了phpinfo,我们编写的POC成功了!!!(还好没翻车)

10. 更多自定义

你可以更改vulcat的文件,拥有更多自定义的功能

10.1 自定义WAF指纹

你发现目标url存在WAF,但是vulcat没有收录?你可以自行添加

  • 打开/vulcat/lib/tool/fingerprint.py,这是vulcat用于指纹识别的文件,找到以下代码并添加(复制粘贴的事)
  • WAF名称(字符串类型)
  • WAF状态码(数字)
  • WAF指纹(字符串类型)

10.2 自定义Web框架指纹

你发现目标url是某个很常见的框架,但是vulcat识别不出来?你可以自行添加

  • 打开/vulcat/lib/tool/fingerprint.py,找到以下代码并添加
  • 框架名称(字符串)(注意:这个字符串要和POC的对象名称一致)
  • 路径(字符串,没有可以不填)
  • POST数据(字符串,没有可以不填)
  • Web框架指纹(正则表达式)如果不会正则…建议百度学习一下

  • 我们上面不是添加了一个Discuz的POC吗,我们现在把指纹也给加上

  • 先看看Discuz的页面有哪些指纹
  • 然后把指纹加上,一个框架可以有多个指纹,复制粘贴即可
  • 扫描试一下效果,成功

  • 我这里使用的是powershell命令行,感觉颜色更好看,如果想使用的话,按住 键盘的Shift+鼠标右键 ,然后选择“在此处打开命令行窗口”或者“在此处打开powershell窗口”之类的,就可以在当前目录打开一个powershell命令行

10.3 语言

语言…就是语言

  • 打开/vulcat/lib/initial/language.py
  • 例如,我们可以把我们的discuz加入-a参数支持的框架里面
  • 如图

10.4 —list列表

你可以将自己的漏洞加入—list的列表当中

  • 打开/vulcat/lib/initial/list.py
  • 也是复制粘贴的事

  • 更多功能可以自行发掘,这里就不再讲解了

11. 感谢

vulcat参考了以下开源项目:

12. 结语

vulcat是我编写的第一款工具,如果存在问题还请大家多多谅解。
如果在使用过程当中遇到什么疑问、Bug、需要改进或增加的功能,都可以在社区私信我,或者在Github上面提交相关内容,我会一个个去看的,能回复的我都会尽量回复…吧。

都看到这里了,不去Github给我的vulcat点一颗星星吗:
https://github.com/CLincat/vulcat
不要下次一定

感谢大家的观看,祝大家心想事成,万事如意。
什么,你说你没看?直接滑到最底部了?我给你来几拳

vulcat保持长期更新,你可以时不时上Github查看有无新版本,说不定就有你需要的POC呢。

用户名金币积分时间理由
Track-劲夫 1000.00 0 2022-07-08 14:02:10 一个受益终生的帖子~~

打赏我,让我更有动力~

附件列表

vulcat-v1.1.0.zip   文件大小:0.336M (下载次数:10)

4 条回复   |  直到 2023-11-29 | 1970 次浏览

1198950962
发表于 2022-7-10

tql

评论列表

  • 加载数据中...

编写评论内容

花海
发表于 2022-7-26

大佬,请收下我的膝盖

评论列表

  • 加载数据中...

编写评论内容

veritas
发表于 2023-1-14

评论列表

  • 加载数据中...

编写评论内容

chase
发表于 2023-11-29

大佬,请收下我的膝盖

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.