文章总结: 本文介绍了利用Windows长文件名特性逃避安全工具检测的渗透测试技巧。通过使用超过260字符的文件路径并添加\?\前缀,可以使EDR监控工具如ProcessExplorer无法正确显示或访问恶意载荷,从而避免被收集和分析。实验表明,Sysmon等工具会自动删除前缀,导致文件访问失败。文章建议渗透测试人员创建看起来自然的超长路径,同时提醒系统管理员检查文件名长度并添加旁路前缀以确保文件收集完整。
综合评分: 85
文章分类: 渗透测试,红队,免杀,漏洞分析,安全工具
渗透测试技巧:利用 Windows 长文件名,眼不见,心不烦
Ots安全
2025年8月12日 16:00
广东
一、引言
红队成员和渗透测试人员始终需要考虑的一个非常重要的问题是如何保持有效载荷的低调。如果你的有效载荷不断被杀毒软件捕获和拦截,你就无法开展活动。除了避开杀毒软件的监视之外,防止你的有效载荷被提交到互联网上的分析网站(从而落入恶意软件分析师、蓝队等的手中)也至关重要。
在本文中,我将介绍利用 Windows 上的长文件名功能来帮助防止 EDR 收集样本的工具和脚本收集有效载荷的想法。
二、主要部分
1.关于Windows文件名的一些基本信息
Windows 文件名有两种样式:长文件名和短文件名。
短文件名,也称为8.3 文件名,用于较旧的工具、基于 DOS 的脚本和某些安装程序包。
目前,我们正在使用长文件名。
它们可以包括空格、大小写字母、Unicode 字符和大多数符号,除了保留符号,如 <、>、:、”、/、\、|、? 和 *。
长文件名的最大长度为 260 个字符,不区分大小写,并支持大多数 Unicode 字符、空格和许多符号。这包括驱动器号、冒号、反斜杠和终止空字符。
仅文件名:假设文件名位于根目录中,其最大长度(例如,mydocument.txt)通常为 255 个字符。
- 对 Process Explorer 的好奇
你有没有想过,如果设置的文件名超出 260 个字符的限制会发生什么?或者你遇到过类似下面的警告?
当然,Windows 会使用“ \?\ ”前缀或组策略设置来处理超长路径(超过 260 个字符),以解除 MAX_PATH(260 个字符)的限制。
我想知道如果我使用名称长度超过 260 个字符的文件,EDR 的监控工具将如何解析文件名。
例如,让我们考虑一下Process Explorer。我使用下面简单的 PowerShell 脚本调用LoadLibrary API 并将我的 DLL 加载到进程中。
Add-Type @"
using System;
using System.Runtime.InteropServices;
public class NativeMethods
{
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr LoadLibrary(string lpFileName);
}
"@
$libraryPath = "\\?\Long-Path\SampleDLL.dll"
$handle = [NativeMethods]::LoadLibrary($libraryPath)
if ($handle -eq [IntPtr]::Zero) {
$error = [System.Runtime.InteropServices.Marshal]::GetLastWin32Error()
Write-Host "Failed to load library. Error code: $error"
} else {
Write-Host "Library loaded successfully. Handle: $handle"
}
我的 DLL 位于以下路径:
"\\?\C:\TMP\Sample\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\SampleDLL.dll"
由于长度超过 260 个字符的限制,当使用进程资源管理器下方窗格列出加载到进程中的 DLL 时,我的 DLL 将不会出现在列表中。
这可能是因为,在 Process Explorer 中执行列出已加载模块的代码中,程序员使用了一个以常量 MAX_PATH 初始化的数组,而该数组无法处理大于该值的内容。这只是我根据编程经验的推测;如果您想更准确地了解情况,Ghidra ( https://github.com/NationalSecurityAgency/ghidra ) 可以为您提供帮助。
让我们尝试使用 System Informer 检查一下:
此时,System Informer 可以列出已加载的 DLL,但双击查看详细信息时,它会自动删除路径的“ \?\ ”前缀,导致 PE Viewer 工具无法访问该文件。
那么,如果 EDR 解决方案工具监视并记录我的 DLL 的名称,它们会保留原始名称的记录还是通过删除前缀来“美化”文件名?
使用 Sysmon 进行实验:
正如预期的那样,Sysmon 从文件路径中删除了“\?\”前缀。
- 如何利用长文件名逃避安全工具的检测
假设一个EDR使用一套特定的日志解析集来分析Sysmon的结果,Sysmon会自动或手动从客户端获取可疑文件进行进一步分析,或者干脆直接将文件上传到VirusTotal,那么当路径被“美化”之后,可能会出现哪些问题呢?
以我之前提到的 DLL 示例为例,如果使用脚本将文件收集回 EDR 的服务器,则脚本将失败并显示消息“ …不存在”。基于此结果,您很有可能避免被 EDR 收集,并阻止对正在使用的有效载荷样本进行分析。
因为此时返回的文件访问结果并不存在。系统管理员可能会认为文件已被删除或移动到其他位置。当工具/脚本同时与多个客户端交互时,更容易出现这种误解。
当然,您创建的路径应该看起来有些自然,例如:
C:\Users\Doe\AppData\Local\Packages\Microsoft.ApplicationCompatibilityEnhancements_8wekyb3d8bbwe\Settings\RoamingState\ConfigurationPlugin\ ... \Payload.dll
三、结束
Windows 同时使用两种类型的名称:短文件名和长文件名。
短文件名的目的是为了保持与旧操作系统组件的兼容性。
我们在Windows上常用的文件名是长文件名,最大长度为260个字符。
如果要使用长度超过 260 个字符的名称,则可以在路径开头添加前缀“\?\”。
对于渗透测试人员和红队成员来说,如果将有效载荷隐藏在超过 260 个字符的路径中,数据收集工具和脚本很可能无法访问它,从而导致出现“文件不存在”的消息。这是因为这些工具通常不会自动在路径中添加“\?\”前缀。
对于系统管理员和蓝队成员,建议在访问文件名之前检查其长度,并在文件名超过MAX_PATH时添加旁路前缀。这将确保在收集过程中不会遗漏任何文件。
感谢您抽出
.
.
来阅读本文
点它,分享点赞在看都在这里
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Ots安全 《渗透测试技巧:利用 Windows 长文件名,眼不见,心不烦》