使用Skyhook实现隐蔽文件传输
引言
本文向读者介绍了“混淆流程”(The Obfuscation Hustle),这是我用来描述通过签名检测的企业工作站文件传输混淆过程的术语。Skyhook是一个新的开源工具,已在GitHub上提供,它能够有效减少混淆流程中的两个关键步骤,同时提供隐蔽的文件外泄功能。
注意:Skyhook不是隐私工具
读者可能会因为加密算法的使用而将Skyhook视为隐私工具,但请不要这样认为。加密算法的有效性取决于其实现方式,而这里的实现存在缺陷。密钥在Web界面中以明文显示,并且当前以未加密形式存储在客户端的IndexedDB中。任何能够访问这些元素的人都可以轻松从数据包捕获或暂存文件块中恢复数据。
读者还应避免将Skyhook的往返混淆周期与端到端加密(E2EE)混淆。E2EE旨在确保只有拥有加密密钥的实体才能恢复数据,而Skyhook则相反:它混淆数据以绕过控制,然后在写入磁盘之前解混淆。明文输入,明文输出。
简而言之:Skyhook除了欺骗边界控制外,不会增强传输文件的机密性。
背景与混淆流程
BHIS在入侵后场景中的远程访问方法通常涉及与客户合作,通过BHIS维护的VPN隧道建立到内部工作站的RDP访问。这种方法提供了安全可靠的网络访问方式以执行任务。
由于操作员在源自客户黄金镜像的工作站上以标准用户身份操作,信标/Shell不会立即可用以促进加密文件传输。文件必须使用可能被TLS拦截的入侵检测和预防系统(IDPS)审查的替代方法传输,这些系统旨在阻止可疑流量。这些条件导致操作员在传输前对文件进行编码和/或加密,从而混淆其内容并规避检测。
虽然这种方法通常有效,但它为操作员带来了繁重的开销。每个新检索的文件都必须解混淆才能再次使用。更复杂的是,一旦在工作站上解混淆,文件可能会暴露给端点检测和响应(EDR),根据文件内容,可能导致文件被隔离并触发防御警报。深度防御已经介入。
在这种情况下,对给定文件在传输前进行两阶段混淆通常是有效的:一个用于EDR,另一个用于IDPS。受Sean Metcalf的Credential Shuffle启发,我喜欢称之为“混淆流程”。例如,手动将Snaffler二进制文件传输到企业工作站的流程可能大致如下流程图所示。请注意,Skyhook旨在自动化“网络过滤混淆”和“托管下载”阶段。
介绍Skyhook
Skyhook的开发旨在消除手动应用混淆以绕过基于网络的控制的繁琐过程。它使用HTTP(S)文件服务器从磁盘无缝读取明文文件,并以混淆块的形式提供给客户端。每个块通过一系列称为混淆器的管道算法,在传输过程中改变内容。除了文件内容,文件列表和名称也通过相同的链传递以防止泄漏。
我们可以从以下截图中观察Skyhook方法如何混淆文件块,该截图来自后续部分,概述了Skyhook的一般用法。如您所见,HTTP事务的每个关键元素都被加密并进行Base64编码(按此顺序)。
此外,请记住Skyhook的Web界面也能够执行混淆文件上传。当发生这种情况时,JavaScript读取给定文件的切片,并在通过HTTP事务发送到服务器之前对每个切片进行混淆。然后,服务器接收每个块,解混淆,并将其插入目标文件中。
Skyhook服务架构
在开发的早期规划阶段,我们决定使Skyhook尽可能可配置,同时最小化操作员的学习曲线。Web界面被选为最佳方法,但我们也希望确保账户和混淆配置不易被检查。为了适应这种方法,我们决定Skyhook二进制文件应同时运行两个通过React Web界面暴露的HTTPS服务。
管理服务
- 用于管理账户和应用混淆配置。
- 与传输界面区分,以确保秘密值不暴露给防御者。
- 应仅从友好来源/设备访问,即那些没有防御控制的设备。
- 还生成到传输界面的链接,这很方便,因为路径通常是随机化的。
传输服务
- 由操作员从非友好来源/设备访问,即那些被防御者监控的设备。
- 应使用用户级凭据访问此服务。
- 用于流式传输文件到服务器端Web根目录及从该目录流式传输文件。
- 混淆算法在Web汇编中实现,允许以下用Go编写的算法编译用于Web浏览器:
- AES
- Base64
- Blowfish
- Twofish
- XOR
- IndexedDB用于存储混淆的下载文件块。
以下图表说明了此架构的基本数据流。
我们建议在部署Skyhook时考虑“深度进攻”。内部,我们将Skyhook部署到容器堆栈,并通过CDN暴露文件传输服务器。Skyhook的Web根目录通过一对CICD管道填充:一个动态混淆常见的C#工具,另一个消耗原始Shellcode以生成增强的有效载荷。这种方法通过分隔能力和最小化手动键盘劳动为操作员提供价值。
管理服务
管理服务的存在是为了为操作员提供一种清晰的方法来管理配置文件,而无需担心YAML的复杂性。请注意,这只不过是一个美化的YAML编辑器。这里所做的任何更改都会导致配置文件本身的更新。
操作员在认证后会被带到“用户账户”功能,可以用于根据需要添加和删除账户。
点击界面中的“混淆器”按钮显示当前的混淆配置。混淆器是配置的混淆算法。列表默认为空,但请注意Skyhook在写入响应体之前总是应用一轮Base64编码。这是一个安全机制,以确保混淆链不会产生可能破坏HTTP事务的任意字节序列。
可以通过点击“添加”按钮并选择所需算法来初始化混淆器。将出现一个接受必要输入的表单。调整配置后点击“保存”以实施它们。只需确保没有文件传输正在进行,否则失败是不可避免的。
虽然过度,但我们总是可以通过相应添加和重新排序算法来将它们链在一起。只需知道每个阶段都会增加处理开销,因此从JavaScript恢复文件将内存密集且缓慢。
管理界面的最终功能是一个简单的“快速复制按钮”,它生成到传输服务的链接。这些链接将包含当配置文件由Skyhook的创建命令派生时创建的动态生成路径,以及JS加载器的加密密钥(我们将在后面更多讨论)。
点击任何这些按钮将导致引用的链接被复制到剪贴板,以便操作员不必参考配置文件。方便!
文件传输服务
本节致力于演示Skyhook传输服务的一般用法,重点介绍混淆如何应用于HTTP事务的各种元素。参见附录A:重新创建演示环境以访问可用于重新创建类似测试环境的演示Docker容器。
登录传输服务提供的Web界面会导致Web根目录的列表呈现。请记住,指向随机路径的链接在管理服务中可用。
认证后呈现Web根目录的文件列表,显示可交互的目录和文件。
切换到“demo-data”目录显示可以下载的文件。
使用Burp检查加载界面到浏览器的HTTP事务,我们可以清楚地看到到/login的认证POST请求和一个以Base64编码参数结尾的较长URI的PATCH请求。后者有效地表示对Web根目录内容列表的REST调用。这可以通过解码参数并观察“/demo-data”的真实值来确认。
注意:此事务未配置混淆器,因此仅应用了Base64编码。
单轮Base64编码并不特别隐蔽。幸运的是,Skyhook提供了四种可以以随机顺序链在一起的附加混淆方法:AES、XOR、Blowfish、Twofish。添加一个XOR混淆器并将密钥设置为“secret”将加密上述内容以及文件数据。
客户端必须同步其混淆配置以继续与服务交互,否则将无法解混淆输出。应用XOR加密后检查相同的目录列表事务显示数据不再能通过简单Base64解码值恢复。
只需在文件上点击“下载”,界面将开始从服务器以块(默认1MB)检索它,如下所示当下载“100M.data”文件时。当所有块都已存储且文件已重新组装时,浏览器将提示用户保存文件。
检查检索文件块的单个事务,我们可以看到HTTP请求的关键元素被混淆。
这是一个MD5哈希,以证明文件在分块和混淆下载过程后保持了完整性。每个文件名前缀的MD5指纹不是由Skyhook生成的。它是“skyhook-demo”容器的副产品。
上传大文件与下载它们一样简单有效。只需在传输服务界面中点击“浏览”按钮选择并上传文件。检查分块上传请求允许我们确认所有值也被加密。
结论
混淆流程是入侵后场景参与早期阶段操作员效率的令人沮丧的障碍。Skyhook被引入作为通过自动化流程的两个步骤:混淆算法的应用和文件托管,来最小化流程的潜在方法。Skyhook的效用通过提供可用于促进混淆文件外泄的上传功能进一步增强。
由于Skyhook在发布此博客文章前几天才向公众提供,很难确定在面对良好配置的检测能力时底层混淆技术的有效性。无论如何,BHIS操作员报告在少数使用它的任务中,IDPS或其他基于网络的控制零检测事件。如果Skyhook成为常规使用的工具,这预计会改变。
附录A:重新创建演示环境
为了简洁起见,我故意避免了说明演示环境的配置方式,但有一个“演示容器”可用于快速演示Skyhook的功能。
假设Docker已安装,此命令应启动容器以供使用。可以配置Burp以检查各种请求进行检查,但请注意大响应体可能会使其陷入抽搐。此外,我建议现在使用基于Chrome的浏览器,因为Firefox与Web汇编的行为不稳定。
上述命令将在localhost上启动Skyhook服务:
- 管理服务:https://127.1:65535
- 传输服务:https://127.1:8443
注意在容器启动时从标准输出捕获管理凭据,否则管理界面将无法访问: