作为咨询机构的渗透测试员,在信息系统上获得代码执行后“逃避”防病毒是我们工作的一部分。确实有必要证明漏洞被利用,而不是简单地报告它们。如果 AV 检测到我们使用的工具,客户通常会忽略该漏洞,因为他们不相信它造成的风险。
我们注意到 Windows Defender 从内存中的 Metasploit Framework 中检测到 metsrv.dll 并杀死我们的 shell。检测由 mpengine.dll 完成,或者通过模拟二进制文件上的某种标准完成,或者是 DLL 中的字节模式。
现在问题的上下文已经很清楚了,下面是实际问题:我如何才能准确地指出该文件的签名是什么?
在你回答之前,这里是我已经得出的结论:
- Windows Defender 的扫描引擎会在 Metasploit 加载到内存时检测到metsrv.dll。
- 我可以使用 Taviso 的loadlibrary在 GNU/Linux 上静态重现检测,使用以下命令:
./mpclient metsrv.x64.dll
main(): Scanning metsrv.x64.dll...
EngineScanCallback(): Scanning input
EngineScanCallback(): Threat HackTool:Win64/Meterpreter.A!dll identified.
- 我使用 GNU拆分实用程序和“二进制搜索”方法将样本大小从 200 kb 减少到 13 kb :样本被分成两部分,两部分都提供给 Windows Defender,然后检测到的部分被拆分还有两个部分。重复直到可能,以最小化测试用例。
- 反汇编mpengine.dll不是很有用,因为里面有IDA Pro发现的3万多个函数。
- 使用 Pin 进行代码覆盖率分析可以将这个集合减少到 3k 个函数,这对于静态分析来说仍然太多。
- mpengine.dll 可以在 gdb 中调试。我在字符串“Win64/Meterpreter.A!dll”上放置了一个观察点,看看我是否能找到一个有趣的函数,可以在这个位置读取,可能是在接近判决时间的时候。仍然因为代码的大小而丢失,即使观察点被触发了两次。
- GitHub 上一个名为 avwhy.py 的脚本允许通过一次更改一个字节并记住影响 AV 判决的字节来推断来自 AV 的签名。运行 16 多个小时后,该工具将整个文件作为签名的一部分返回给我,这看起来像是一个错误的结果:使用 split 实用程序我不可能找到确切的签名,因为我希望要么有太多字节或从签名中删除了有用的字节。
如您所见,我已经在这方面花费了数小时。目标是找到确切的签名,而不是通过对metsrv.dll应用某种转换来逃避它。我认为这是一个有趣的逆向工程挑战,但我现在被困住了。
为了实现我的目标,我需要采取哪些步骤?
编辑:为了澄清我想要做的事情,这是 Tavis Ormandy 自行发表的论文:Sophhail:对 Sophos Antivirus 的批判性分析
在第 3 页,他显示了文件“注意 629”的签名。我正在努力达到同样的结果。当然,我可以攻击 3k 函数并从这里开始工作,但我认为 Tavis 有更智能的方法,这就是我正在寻找的答案类型。