WitnessMe 主要是一个受Eyewitness启发的 Web 库存工具,它也是可扩展的,允许您创建自定义功能,以利用它在后端驱动的无头浏览器。
WitnessMe 使用Pyppeteer库来驱动 Headless Chromium。
目录
动机
还有其他工具可以做到这一点吗?当然有。请参阅以下项目以了解替代方案(我相信还有更多,这些是我亲自尝试过的):
我编写 WitnessMe 的原因是,这些项目都没有我想要/需要的所有功能,无法在我的工作流程中很好地工作。此外,其中一些项目很容易出现大量的安装/依赖问题。
以下是 WitnessMe 的一些“脱颖而出”的主要功能:
- 使用 Python 3.7+ 编写
- 能够解析极大的 Nessus 和 NMap XML 文件
- 兼容 Docker
- 无需安装/依赖
- 完整的测试套件!一切都不容易出错
- CSV 和 HTML 报告
- HTTP 代理支持
- 提供 RESTful API!远程扫描内容!
- CLI 界面用于查看和搜索扫描结果,而无需查看报告。
- 签名扫描(签名使用 YAML 文件)
- 直接在终端中预览截图(在 MacOSX/ITerm2 和一些 Nix 终端上)
- 可扩展编写,允许您添加可利用无头铬的功能。
- 构建用于部署到云端(例如 GCP Cloud Run、AWS ElasticBeanstalk 等…)
安装
Docker
完全支持从 Docker 容器运行 WitnessMe,这是使用该工具最简单/推荐的方式。
注意:强烈建议在进行大型扫描时为 Docker 容器提供至少 4GB 的 RAM,因为 Chromium 可能会占用大量资源。如果您不断遇到“页面崩溃”错误,那是因为您的容器内存不足。在 Mac/Windows 上,您可以通过单击 Docker 任务栏图标 -> 首选项 -> 资源来更改此设置。对于 Linux,请参阅 Docker 的文档
从 Docker Hub 拉取镜像:
docker pull byt3bl33d3r/witnessme
然后,您可以启动一个 docker 容器,像主witnessme
脚本一样运行它并传递相同的参数:
docker run --rm -ti $IMAGE_ID screenshot https://google.com 192.168.0.1/24
或者,您可以进入容器内的 shell 并以此方式运行工具。这也允许您执行wmdb
和wmapi
脚本。
docker run --rm -ti --entrypoint=/bin/sh $IMAGE_ID
Python 包
WitnessMe 也可作为 Python 包使用(需要 Python 3.7 或更高版本)。如果您以这种方式安装,强烈建议使用pipx,因为它会为您无缝地在隔离环境中安装所有内容。
运行以下命令:
python3 -m pip install --user pipx pipx install witnessme
所有 WitnessMe 脚本现在都应该在您的 PATH 中并可以运行。
开发安装
如果您打算破解源代码,您确实应该只以这种方式安装 WitnessMe。您将使用 Python 3.7+ 和Poetry:请参阅 Poetry 安装文档以进行安装。
git clone https://github.com/byt3bl33d3r/WitnessMe && cd WitnessMe poetry install
快速入门
查找易受 CVE-2020-5902 攻击的 F5 负载均衡器
使用 Docker 安装 WitnessMe:
docker pull byt3bl33d3r/witnessme
$IMAGE_ID
从命令输出中获取docker images
,然后运行以下命令进入容器内的 shell。此外,指定标志-v
以将容器内的当前目录挂载到路径,/transfer
以便将扫描结果复制回主机(如果需要):
docker run -it --entrypoint=/bin/sh -v $(pwd):/transfer $IMAGE_ID
使用 WitnessMe 扫描您的网络,它可以接受多个 .Nessus 文件、Nmap XML、IP 范围/CIDR。示例:
witnessme screenshot 10.0.1.0/24 192.168.0.1-20 ~/my_nessus_scan.nessus ~/my_nmap_scan.xml
扫描完成后,将在当前目录中创建一个包含结果的文件夹。使用wmdb
命令行实用程序访问结果:
wmdb scan_2020_$TIME/
要快速识别 F5 负载均衡器,首先使用命令执行签名扫描scan
。然后使用命令搜索“BIG-IP”或“F5” servers
(这将在签名名称、页面标题和服务器标头中搜索“BIG-IP”和“F5”字符串):

此外,您可以使用以下命令生成 HTML 或 CSV 报告:
WMDB ≫ generate_report html
WMDB ≫ generate_report csv
然后,您可以将包含所有报告和结果的整个扫描文件夹复制到该文件夹中,并将其复制到主机/transfer
。
抓取 JavaScript 含量较高的网页
从 v1.5.0 开始,WitnessMe 有一个grab
命令,允许您通过首先使用 Headless Chromium 呈现页面,然后使用指定的 XPath 解析生成的 HTML(请参阅此处的XPath 备忘单)来快速抓取 Javascript 繁重的网页。
下面是一些可帮助您入门的示例。
这将从Hurricane Electric 的 BGP Toolkit144.161.160.0/23
中抓取子网上所有已公布域的列表:
witnessme -d grab -x '//div[@id="dns"]/table//tr/td[2]/a/text()' https://bgp.he.net/net/144.161.160.0/23#_dns
REST 风格的 API
从 1.0 版开始,WitnessMe 有一个 RESTful API,允许您远程与该工具进行交互。
注意:目前,API 未实现任何身份验证机制。请确保在传输级别允许/拒绝访问
要启动 RESTful API 进行测试/开发,请运行:
wmapi
然后,API 文档将在http://127.0.0.1:8000/docs上提供
应使用Uvicorn来启用 SSL 并在生产中运行 API。请参阅此 dockerfile以获取示例。
部署至云端 (™)
由于 WitnessMe 现在有 RESTful API,您可以将其部署到神奇的云并从那里执行扫描。这将带来许多好处,包括每次扫描时都为您提供全新的外部 IP(在评估红队的攻击面时,OPSEC 更加安全)。
有很多方法可以做到这一点,你显然可以采用传统方式(例如启动机器、安装 docker 等)。
最近,云服务提供商开始提供在完全托管的环境中直接运行 Docker 容器的方法。可以将其视为仅使用 Docker 容器的无服务器函数(例如 AWS Lambdas)。
从技术上讲,这将允许您真正快速地部署和运行 WitnessMe(或 Docker 容器中的任何东西),而不必担心底层基础设施,并消除了随之而来的许多安全问题。
下面是我尝试过的一些方法以及运行所需的步骤和遇到的任何问题。
GCP 云运行
不幸的是,Cloud Run 似乎不允许对容器进行出站互联网访问,如果有人知道解决这个问题的方法,请联系我们
到目前为止,Cloud Run 是这些服务中最容易使用的。
该存储库包含cloudbuild.yaml
完成此设置和运行所需的文件。
从存储库根文件夹(在您经过身份验证并设置项目后),这两个命令将自动构建 Docker 映像,将其发布到 Gcloud Container Registry 并将工作容器部署到 Cloud Run:
gcloud builds submit --config cloudbuild.yaml gcloud run deploy --image gcr.io/$PROJECT_ID/witnessme --platform managed
输出将为您提供一个 HTTPS URL,以便从中调用 WitnessMe RESTful API 🙂
完成后:
gcloud run services delete witnessme gcloud container images delete gcr.io/$PROJECT_ID/witnessme
AWS ElasticBeanstalk
待办事项
用法
主要有 3 个实用程序:
witnessme
:是主 CLI 界面。wmdb
:允许您浏览数据库(每次扫描时创建)以查看结果并生成报告。wmapi
:提供 RESTful API 来安排、启动、停止和监控扫描。
运作模式
从 v1.5.0 开始,该实用程序支持两种主要模式(命令)witnessme
:
- 该
screenshot
命令,您猜对了,就是截取网页截图。这是主要功能。 - 该
grab
命令允许您抓取页面并快速抓取服务器标头。
usage: witnessme [-h] [--threads THREADS] [--timeout TIMEOUT] [-d] [-v] {screenshot,grab} ...
WitnessMe!
positional arguments:
{screenshot,grab}
optional arguments:
-h, --help show this help message and exit
--threads THREADS Number of concurrent browser tab(s) to open
[WARNING: This can cause huge RAM consumption if set to high values] (default: 15)
--timeout TIMEOUT Timeout for each connection attempt in seconds (default: 15)
-d, --debug Enable debug output (default: False)
-v, --version show program's version number and exit
截图模式
$ witnessme screenshot --help usage: witnessme screenshot [-h] [-p PORTS [PORTS ...]] target [target ...] positional arguments: target The target IP(s), range(s), CIDR(s) or hostname(s), NMap XML file(s), .Nessus file(s) optional arguments: -h, --help show this help message and exit -p PORTS [PORTS ...], --ports PORTS [PORTS ...] Ports to scan if IP Range/CIDR is provided
可以接受 .Nessus 文件、Nmap XML 文件、包含 URL 和/或 IP、IP 地址/范围/CIDR 和 URL 的文件混合,或者从标准输入读取。
注意:WitnessMe 通过扩展名检测 .Nessus 和 NMap 文件,因此请确保 Nessus 文件具有.nessus
扩展名,并且 NMap 扫描具有.xml
扩展名
长话短说,应该能够处理你抛出的任何问题:
witnessme screenshot 192.168.1.0/24 192.168.1.10-20 https://bing.com ~/my_nessus_scan.nessus ~/my_nmap_scan.xml ~/myfilewithURLSandIPs
$ cat my_domain_list.txt | witnessme screenshot -
如果将 IP 地址/范围/CIDR 指定为目标,WitnessMe 将默认尝试截取端口 80、8080、443、8443 上的 HTTP 和 HTTPS 页面。这可以通过--port
参数自定义。
扫描完成后,包含所有屏幕截图和数据库的文件夹将位于当前目录中,指向wmdb
该文件夹即可查看结果。
wmdb scan_2019_11_05_021237/
抓取模式
$ witnessme grab --help usage: witnessme grab [-h] [-x XPATH | -l] target [target ...] positional arguments: target The target IP(s), range(s), CIDR(s) or hostname(s), NMap XML file(s), .Nessus file(s) optional arguments: -h, --help show this help message and exit -x XPATH, --xpath XPATH XPath to use -l, --links Get all links
该grab
子命令允许您呈现包含大量 Javascript 的网页并使用 XPath 抓取其内容。请参阅本节中的一些示例。
与扫描数据库交互
一旦扫描完成(使用screenshot
模式),包含所有屏幕截图和数据库的文件夹将位于当前目录中,指向wmdb
该文件夹即可查看结果。
wmdb scan_2019_11_05_021237/
这会将您带入 WMDB CLI 菜单。
按下 Tab 键将显示可用的命令和帮助菜单:

CLI中的servers
和命令接受 1 个参数。WMCLI 足够智能,知道您要用该参数做什么hosts
wmdb
服务器命令
不带参数将显示所有发现的服务器。传递参数将在title
和server
列中搜索该模式(不区分大小写)。
例如,如果您想搜索所有已发现的 Apache Tomcat 服务器:
servers tomcat
或者servers 'apache tomcat'
同样,如果您想查找标题中带有“登录”的服务器:
servers login
Hosts 命令
没有参数将显示所有发现的主机。传递参数将在IP
和Hostname
列中搜索该模式(不区分大小写)。如果值对应于主机 ID,它将显示主机信息和在该主机上发现的所有服务器,这对于报告目的和/或定位特定主机非常有用。
签名扫描
您可以使用该命令对所有发现的服务执行签名扫描scan
。
生成报告
您可以使用cligenerate_report
中的命令wmdb
生成 HTML 或 CSV 格式的报告。要生成 HTML 报告,只需运行generate_report
而不带任何参数。以下是它的示例:

要生成 CSV 报告:
WMDB ≫ generate_report csv
报告将在扫描文件夹中提供。
代理
从 v1.5 开始,WitnessMe 支持通过 HTTP 代理代理其所有流量。指定HTTP_PROXY
环境变量以强制底层无头浏览器通过所需主机代理其流量:
HTTP_PROXY=http://127.0.0.1:8080 witnessme screenshot ~/my_targets.txt
HTTP_PROXY=http://127.0.0.1:8080 witnessme grab https://www.google.com
直接在终端中预览截图
注意:此功能仅在您使用 MacOSX 并使用 ITerm2 时才有效
您可以使用以下命令直接在终端中预览屏幕截图show
:

撰写签名
如果您遇到新的 Web 应用程序,请为其编写签名!这非常简单,而且它们全部采用 YAML!
不相信吗?这是 AirOS 签名(您可以在签名目录中找到它们):
credentials: - password: ubnt username: ubnt name: AirOS signatures: - airos_logo.png - form enctype="multipart/form-data" id="loginform" method="post" - align="center" class="loginsubtable" - function onLangChange() # AirOS ubnt/ubnt
没错,就是这样。只需将其放入签名文件夹即可!完成。