9 个月前 上午 8:30 | FaradaySEC 赞助的帖子| 多用户渗透测试环境锡安3R用于 Golang 二进制文件的命令行 Windows API 跟踪工具。
注意:此工具是一个 PoC 和一个正在开发的原型,因此请将其视为 PoC。欢迎随时提供反馈!
它是如何工作的?
尽管 Golang 程序在构建方式和运行时行为方面有很多细微差别,但它们仍然需要与操作系统层交互,这意味着在某些时候它们需要从 Windows API 调用函数。Go 运行时包包含一个名为asmstdcall的函数,该函数是一种用于与 Windows API 交互的“网关”。由于该函数需要调用 Windows API 函数,我们可以假设它需要访问函数地址及其参数等信息,而这正是事情开始变得更加有趣的地方。
Asmstdcall 接收一个参数,该参数是指向类似于以下结构的指针:
struct LIBCALL {<br> DWORD_PTR Addr;<br> DWORD Argc;<br> DWORD_PTR Argv;<br> DWORD_PTR ReturnValue;<br><br> [...]<br>}<br>
其中一些字段是在调用 API 函数后填充的,例如返回值,其他字段由 asmstdcall 接收,例如函数地址、参数数量和参数列表。无论何时设置这些字段,很明显 asmstdcall 函数操纵了大量有关 Golang 中编译的程序执行的有趣信息。
gftrace 利用 asmstdcall 及其工作方式来监控上述结构的特定字段并将其记录给用户。该工具能够记录函数名称、其参数以及 Golang 应用程序调用的每个 Windows 函数的返回值。所有这些都不需要挂接单个 API 函数或为其提供签名。
该工具还会尝试忽略 Go 运行时初始化产生的所有噪音,并且仅记录其后调用的函数(即来自主包的函数)。
如果您想了解有关该项目和研究的更多信息,请查看博客文章。
安装
下载最新版本。用法
- 确保 gftrace.exe、gftrace.dll 和 gftrace.cfg 位于同一目录中。
- 在 gftrace.cfg 文件中指定要跟踪的 API 函数(如果不应用 API 过滤器,该工具将无法工作)。
- 运行 gftrace.exe 并将目标 Golang 程序路径作为参数传递。
配置
您需要做的就是在 gftrace.cfg 文件中指定想要跟踪的函数,并用逗号分隔(不带空格):CreateFileW,ReadFile,CreateProcessW<br>
包 Y 中的 Golang 方法 X 在特定场景中调用的确切 Windows API 函数只能通过分析方法本身或尝试猜测来确定。有一些有趣的特性可用于确定它,例如,Golang 应用程序似乎总是倾向于调用“Wide”和“Ex”集合中的函数(例如 CreateFileW、CreateProcessW、GetComputerNameExW 等),因此您可以在分析过程中考虑它。
默认配置文件包含多个我已经测试过的函数(至少大部分函数),并且可以肯定地说它们可以在某个时候被 Golang 应用程序调用。我最终会尝试更新它。
示例
在一个简单 Golang 文件中跟踪两次调用“os.ReadFile”的 CreateFileW() 和 ReadFile():- CreateFileW("C:\Users\user\Desktop\doc.txt", 0x80000000, 0x3, 0x0, 0x3, 0x1, 0x0) = 0x168 (360)<br>- ReadFile(0x168, 0xc000108000, 0x200, 0xc000075d64, 0x0) = 0x1 (1)<br>- CreateFileW("C:\Users\user\Desktop\doc2.txt", 0x80000000, 0x3, 0x0, 0x3, 0x1, 0x0) = 0x168 (360)<br>- ReadFile(0x168, 0xc000108200, 0x200, 0xc000075d64, 0x0) = 0x1 (1)<br>
追踪 TunnelFish 恶意软件中的 CreateProcessW():
- CreateProcessW("C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe", "powershell /c "Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn; Get-Recipient | Select Name -ExpandProperty EmailAddresses -first 1 | Select SmtpAddress | ft -hidetableheaders"", 0x0, 0x0, 0x1, 0x80400, "=C:=C:\Users\user\Desktop", 0x0, 0xc0000ace98, 0xc0000acd68) = 0x1 (1)<br>- CreateProcessW("C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe", "powershell /c "Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn; Get-Recipient | Select Name -ExpandProperty EmailAddresses -first 1 | Select SmtpAddress | ft -hidetableheaders"", 0x0, 0x0, 0x1, 0x80400, "=C:=C:\Users\user\Desktop", 0x0, 0xc0000c4ec8, 0xc0000c4d98) = 0x1 (1)<br>- CreateProcessW("C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe", "powershell /c "Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn; Get-Recipient | Select Name -ExpandProperty EmailAddresses -first 1 | Select SmtpAddres s | ft -hidetableheaders"", 0x0, 0x0, 0x1, 0x80400, "=C:=C:\Users\user\Desktop", 0x0, 0xc00005eec8, 0xc00005ed98) = 0x1 (1)<br>- CreateProcessW("C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe", "powershell /c "Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn; Get-Recipient | Select Name -ExpandProperty EmailAddresses -first 1 | Select SmtpAddress | ft -hidetableheaders"", 0x0, 0x0, 0x1, 0x80400, "=C:=C:\Users\user\Desktop", 0x0, 0xc0000bce98, 0xc0000bcd68) = 0x1 (1)<br>- CreateProcessW("C:\WINDOWS\system32\cmd.exe", "cmd /c "wmic computersystem get domain"", 0x0, 0x0, 0x1, 0x80400, "=C:=C:\Users\user\Desktop", 0x0, 0xc0000c4ef0, 0xc0000c4dc0) = 0x1 (1)<br>- CreateProcessW("C:\WINDOWS\system32\cmd.exe", "cmd /c "wmic computersystem get domain"", 0x0, 0x0, 0x1, 0x80400, "=C:=C:\Users\user\Desktop", 0x0, 0xc0000acec0, 0xc0000acd90) = 0x1 (1)<br>- CreateProcessW("C:\WINDOWS\system32\cmd.exe", "cmd /c "wmic computersystem get domain"", 0x0, 0x0, 0x1, 0x80400, "=C:=C:\Users\user\Desktop", 0x0, 0xc0000bcec0, 0xc0000bcd90) = 0x1 (1)<br><br>[...]<br>
追踪Sunshuttle恶意软件中的多个功能:
- CreateFileW("config.dat.tmp", 0x80000000, 0x3, 0x0, 0x3, 0x1, 0x0) = 0xffffffffffffffff (-1)<br>- CreateFileW("config.dat.tmp", 0xc0000000, 0x3, 0x0, 0x2, 0x80, 0x0) = 0x198 (408)<br>- CreateFileW("config.dat.tmp", 0xc0000000, 0x3, 0x0, 0x3, 0x80, 0x0) = 0x1a4 (420)<br>- WriteFile(0x1a4, 0xc000112780, 0xeb, 0xc0000c79d4, 0x0) = 0x1 (1)<br>- GetAddrInfoW("reyweb.com", 0x0, 0xc000031f18, 0xc000031e88) = 0x0 (0)<br>- WSASocketW(0x2, 0x1, 0x0, 0x0, 0x0, 0x81) = 0x1f0 (496)<br>- WSASend(0x1f0, 0xc00004f038, 0x1, 0xc00004f020, 0x0, 0xc00004eff0, 0x0) = 0x0 (0)<br>- WSARecv(0x1f0, 0xc00004ef60, 0x1, 0xc00004ef48, 0xc00004efd0, 0xc00004ef18, 0x0) = 0xffffffff (-1)<br>- GetAddrInfoW("reyweb.com", 0x0, 0xc000031f18, 0xc000031e88) = 0x0 (0)<br>- WSASocketW(0x2, 0x1, 0x0, 0x0, 0x0, 0x81) = 0x200 (512)<br>- WSASend(0x200, 0xc00004f2b8, 0x1, 0xc00004f2a0, 0x0, 0xc00004f270, 0x0) = 0x0 (0)<br>- WSARecv(0x200, 0xc00004f1e0, 0x1, 0xc00004f1c8, 0xc00004f250, 0xc00004f198, 0x0) = 0xffffffff (-1)<br><br>[...]<br>
跟踪DeimosC2 框架代理中的多个功能:
- WSASocketW(0x2, 0x1, 0x0, 0x0, 0x0, 0x81) = 0x130 (304)<br>- setsockopt(0x130, 0xffff, 0x20, 0xc0000b7838, 0x4) = 0xffffffff (-1)<br>- socket(0x2, 0x1, 0x6) = 0x138 (312)<br>- WSAIoctl(0x138, 0xc8000006, 0xaf0870, 0x10, 0xb38730, 0x8, 0xc0000b746c, 0x0, 0x0) = 0x0 (0)<br>- GetModuleFileNameW(0x0, "C:\Users\user\Desktop\samples\deimos.exe", 0x400) = 0x2f (47)<br>- GetUserProfileDirectoryW(0x140, "C:\Users\user", 0xc0000b7a08) = 0x1 (1)<br>- LookupAccountSidw(0x0, 0xc00000e250, "user", 0xc0000b796c, "DESKTOP-TEST", 0xc0000b7970, 0xc0000b79f0) = 0x1 (1)<br>- NetUserGetInfo("DESKTOP-TEST", "user", 0xa, 0xc0000b7930) = 0x0 (0)<br>- GetComputerNameExW(0x5, "DESKTOP-TEST", 0xc0000b7b78) = 0x1 (1)<br>- GetAdaptersAddresses(0x0, 0x10, 0x0, 0xc000120000, 0xc0000b79d0) = 0x0 (0)<br>- CreateToolhelp32Snapshot(0x2, 0x0) = 0x1b8 (440)<br>- GetCurrentProcessId() = 0x2584 (9604)<br>- GetCurrentDirectoryW(0x12c, "C:\Users\user\AppData\Local\Programs\retoolkit\bin") = 0x39 (57 )<br><br>[...]<br>
未来特点:
- [x] 支持32位文件的检查。
- [x] 添加对通过“IAT jmp table”调用函数的文件支持,而不是直接在 asmstdcall 中进行 API 调用。
- [x] 为目标进程添加对命令行参数的支持
- [ ] 默认将跟踪日志输出发送到文件,以便于过滤。目前目标文件和 gftrace 输出之间没有区分。另一种方法是使用命令行将 gftrace 输出重定向到文件。
- 该工具会动态检查目标二进制文件,这意味着被跟踪的文件会被执行。如果您正在检查恶意软件或未知软件,请确保在受控环境中进行。
- Golang 程序可能会非常嘈杂,具体取决于被跟踪的文件和/或函数(例如,运行时包总是多次调用 VirtualAlloc,在调用 CreateProcessW 之前多次调用 CreateFileW,等等)。该工具会忽略 Golang 运行时初始化噪音,但此后,由用户决定在每种情况下哪些函数更适合过滤。
执照
gftrace 是在 GPL v3 许可证下发布的。请参阅名为 LICENSE 的文件以获取更多信息。下载 Gftrace