高级Msfvenom载荷生成
众所周知,使用msfvenom生成的可执行载荷可以利用替代模板EXE文件,并通过编码更好地规避终端防御。那么,在不使用替代模板文件的情况下,生成EXE格式的标准流程是什么?如果你像我们许多人一样使用KALI渗透测试发行版,用于EXE生成的模板文件随Metasploit软件一起提供。在当前KALI发行版(截至本文撰写时)中,它们位于目录“/usr/share/metasploit-framework/data/templates”中。
如果你为Windows生成32位EXE格式,则使用模板文件“template_x86_windows.exe”;如果生成64位EXE格式,则使用“template_x64_windows.exe”。
几年前,Metasploit框架要求模板EXE文件具有一个缓冲区(通常长度为4096字节),且该缓冲区的开头包含固定字符串“PAYLOAD:”。模板EXE文件的编写方式使得它们使用“VirtualAlloc”,然后进行“MemCpy()”(内存复制),并在将shellcode复制到内存的可执行部分后直接调用它。这种技术仍然存在于DLL载荷中,但不再用于EXE载荷生成。有趣的是,64位载荷模板仍然包含此缓冲区分配,尽管该EXE文件的功能现在已无关紧要。
如今,Metasploit(msfvenom)通过将shellcode直接放置在PE/COFF文件的“.text”部分,或创建新的随机可执行部分名称并将shellcode放入该新部分,来生成EXE格式的载荷。然后,代码入口点地址被修改为指向新代码,并保存EXE文件。因此,使用这种技术,几乎任何可执行文件都可以用作模板。
“msfvenom”有一个有趣的附加命令行标志,可以将格式更改为“exe-only”而不是“exe”。此标志的效果是创建新的部分头或修改现有“.text”部分(对于64位二进制文件)。对于32位二进制文件,shellcode最终仍位于“.text”部分,但特性标志不同,并且在“exe-only”版本中引入了一些额外的汇编代码。
这一切意味着什么?坦率地说,这为我们提供了额外的机制和可能性来规避终端防御,因为我们利用了修改PE/COFF部分头和使用知名二进制文件(如write.exe或notepad.exe)作为模板的想法。我深入研究了64位情况,因为终端防御在检测Metasploit 64位二进制文件方面的签名触发似乎不太熟练。
为了检查差异,我使用了一个名为“PEInsider”的程序,它允许我们查看PECOFF文件的结构。以下是我用于生成二进制文件的两种不同“msfvenom”命令。注意“-f exe”与“-f exe-only”标志的区别。
在上述两种情况下,我们使用Windows文件“write.exe”作为模板,而不是Metasploit的标准模板文件。通过PEInsider程序查看,我们可以看到在第一种情况(EXE)中,添加了一个具有随机名称的新部分头,并将代码入口点调整为十六进制6000。在第二种情况(EXE-ONLY)中,修改了现有的“.text”部分。此外,在两种情况下,包含shellcode的部分除了标准标志“可执行”、“可读”和“包含代码”之外,还被标记为“可写”。
64位载荷使用“-f exe”标志 64位载荷使用“-f exe-only”标志
为什么这很有趣?嗯,似乎过去渗透测试社区的人们过于关注使用shellcode编码作为潜在的检测规避技术。这有点谬误,因为标准Metasploit模板本身就是一个明显的迹象,无论其中包含的shellcode如何,更重要的是,编码shellcode历史上更多是为了使载荷适应环境条件而不是规避。(即:如果输入缓冲区不能接受特定字符怎么办?)
其次,根据我的经验,终端防御供应商在检测32位载荷方面做得相当不错,但在64位载荷方面有所不足。毫不奇怪,大多数环境如今都稳定运行64位系统,这意味着我们都不应忽略64位攻击面和防御要求。
使用独特的模板EXE或合法的O/S二进制文件,以及可能利用不同的PE/COFF输出格式,为规避提供了机会。此外,防御者应意识到多种64位二进制格式是可能的。特别是,一些精心 crafted 的YARA规则可以帮助发现不寻常的载荷,尤其是那些在“.text”部分具有E0000020作为特性标志的载荷,表明设置了“可写”标志,而不是60000020,这是“.text”部分标志的更正常设置。
虽然总是使用新的性感的PowerShell功能很诱人,但旧的东西可以再次变得新,并产生非常有效和成功的规避技术。事实上,新的PowerShell技术是终端防御现在关注和聚焦的地方。保持多样化的技巧和深度的工具包非常重要,你可能正好需要它们。