你是否曾想要一种简单、轻松且隐秘的方法来绕过多种安全产品?pstf^2(读作 pstf-square)是一个基于 HTTP 服务器的被动浏览器指纹识别实现——它可能正是你寻找的工具。 当攻击者试图通过互联网传递有效载荷时,他们需要克服多种能够扫描传入链接的工具。邮件过滤器、扫描引擎,甚至通过 URL 提交到沙箱——一旦 pstf2 以被动方式检测到它们,所有这些都可以被绕过。检测到后,该工具可以区分安全服务与潜在受害者,并传递恶意或良性响应。
该工具已在 2020 年欧洲黑帽大会上发布: https://www.blackhat.com/eu-20/arsenal/schedule/#pstf2-link-scanners-evasion-made-easy-21763
研究详情可查阅此博客文章: https://blogs.akamai.com/sitr/2020/12/evading-link-scanning-security-services-with-passive-fingerprinting.html
真正的问题是——链接扫描器是如何工作的?检查恶意链接是一个涉及 Web 客户端发送 HTTP GET 请求的行为。每个供应商使用不同的内部实现——大多数试图在一定程度上模仿真实用户交互。 pstf^2 是一个基于 Python 的简单 HTTP 服务器,它应用了众所周知的机器人检测策略来确定传入请求是否来自自动化安全工具。 服务器操作员可以自定义响应,例如——如果检测到扫描器,则重定向到 Google,否则发送恶意内容。
以下是 pstf^2 实现的主要策略:
安全工具试图伪装成合法客户端,冒充真实浏览器,但通常情况并非如此。 常见的现象是,维护不善的工具使用虚假的用户代理头,对应的是十年前浏览器版本。 pstf^2 允许你设置你认为真正非过时版本的最低阈值。
该工具能够检测多种奇怪的实现类型。 在 BlackHat 演讲中展示的几个例子包括:
via: 头,暴露了用于沙箱的虚拟主机的性质。referer: 头表明链接是从 Google 到达的,例如 referer: google.com/search?q=specific.site.com。
在我们测试的场景中,这毫无意义,因为该产品扫描的是电子邮件,当有人点击邮件中的链接时(而非通过 Web 界面),此头不存在。多个 TCP 参数可能暗示特定的操作系统版本或特定风格。某些客户端会伪造用户代理头,但其运行的操作系统与声明的不一致。
托管在特定云提供商网络上的客户端具有不同于标准 1500 字节的 MTU 值。
在某些情况下,请求来自明确与特定安全供应商关联的 ASN。在其他情况下,请求来源是云托管提供商,虽然不能指责任何特定供应商,但不太可能是典型用户。
在罕见情况下,客户端的 IP 地址有 PTR 记录,将其与安全供应商相关的 URL 关联起来。
假设你已经安装了 Docker,只需简单执行:
docker-compose up
如果你希望避免使用 Docker,请按以下步骤操作。
运行:
pip install requirements.txt
这将安装所需的外部 Python 模块。
在部署 pstf^2 之前,请下载并安装 p0f。当前可在以下地址获取:
https://lcamtuf.coredump.cx/p0f3/
现在,正确配置 lib/servers/server_config.yml 以指向正确路径,例如:
p0f_config:
# 至少更改你的用户名,记得在两个路径中都修改
p0f_bin_path: '/Users/$your_user_name/$more_folders/web_fp/p0f-3.09b/p0f'
p0f_fp_path: '/Users/$your_user_name/$more_folders/web_fp/p0f-3.09b/p0f.fp'
iface: 'lo0'
p0f_named_socket: '/tmp/p0f_socket'
还要确认 iface 与你运行 Python HTTP 服务器的接口相同。在上面的示例中,它是回环接口。
满足依赖后,运行:
python driver.py
你可以使用以下任何标志:
--p0f_bin_path P0F_BIN_PATH
--p0f_fp_path P0F_FP_PATH
--p0f_iface P0F_IFACE
所有这些都用于调整与 p0f 相关的参数:二进制文件本身、指纹文件以及我们使用的接口(默认值为 eth0)。
你应该会看到类似以下的输出:
2020-04-15 17:37:06,896 - pstf2_logger - INFO - 正在启动 p0f...
2020-04-15 17:37:06,896 - pstf2_logger - INFO - 正在运行命令:
/Users/gbitensk/work/web_fp/p0f-3.09b/p0f -i lo0 -s /tmp/p0f_socket -f /Users/gbitensk/work/web_fp/p0f-3.09b/p0f.fp
2020-04-15 17:37:06,898 - pstf2_logger - INFO - p0f 已启动!
2020-04-15 17:37:06,898 - pstf2_logger - INFO - 正在启动 HTTP 服务器...
2020-04-15 17:37:06,898 - pstf2_logger - INFO - HTTP 服务器已启动!
2020-04-15 17:37:06,899 - pstf2_logger - INFO - 如果你想终止服务器,请按 CTRL+C
通过按 Ctrl+C 终止服务器,它将同时杀死 HTTP 和 p0f 实例。 你应该会看到类似以下内容:
2020-04-15 17:37:48,263 - pstf2_logger - INFO - HTTP 服务器已停止!
2020-04-15 17:37:48,263 - pstf2_logger - INFO - 正在杀死 p0f...
2020-04-15 17:37:48,263 - pstf2_logger - INFO - p0f 已被杀死!
2020-04-15 17:37:48,263 - pstf2_logger - INFO - 正在退出...
请注意,设置 DNS 记录将 URL 指向你的服务器超出了 pstf^2 的范围,并且由你自己负责。
pstf^2 具有在 server_config.yml 中定义的默认有效载荷,并且可以轻松自定义。
有两种模式,通过将 rickroll_mode 变量设置为 YES 或 NO 来切换。
如果启用,安全工具将被重定向到一个 YouTube 页面,播放著名的 Rickrolling 视频;否则,它将提供在同一 YAML 文件中定义的字符串。
默认情况下,“恶意”响应设置为 EICAR 标准测试字符串。
我选择将此工具作为开源项目公开发布,原因如下:
在构建该工具的过程中,它已针对 15 种不同的产品进行了测试,全部失败。虽然我已经负责任地披露了关于攻击的细节,但我们仍有很长的路要走,我的期望是,通过公开该工具,我们将提高对这些策略的认识,而这些策略已经被“坏蛋”所滥用。
感谢 @Den1al 在构建此工具时提供建议,特别是关于如何正确编写 Python 代码,以及协助将其创建为 Docker 镜像。