Argument Spoofing EX
参数混淆是终端对抗中的常见技巧,本文分享参数混淆对抗EDR的一些技巧。
1. EDR监控
64位系统上,Patch Guard限制了EDR的能力,但提供了PsSetCreateProcessNotifyRoutineEx
API,EDR可以基于其进行进程创建的监控与拦截。
该API会为回调函数提供以下信息
typedef struct _PS_CREATE_NOTIFY_INFO {
SIZE_T Size;
union {
ULONG Flags;
struct {
ULONG FileOpenNameAvailable : 1;
ULONG IsSubsystemProcess : 1;
ULONG Reserved : 30;
};
};
HANDLE ParentProcessId;
CLIENT_ID CreatingThreadId;
struct _FILE_OBJECT *FileObject;
PCUNICODE_STRING ImageFileName;
PCUNICODE_STRING CommandLine;
NTSTATUS CreationStatus;
} PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;
以Sysmon举例,其EVENT ID 1监控进程创建,会通过ETW记录以下字段
Process Create:
RuleName: -
UtcTime: 2022-06-14 01:47:26.436
ProcessGuid: {af692c1b-e8ae-62a7-a09d-6d6c00000000}
ProcessId: 21068
Image: C:t.exe
FileVersion: -
Description: -
Product: -
Company: -
OriginalFileName: -
CommandLine: t.exe test
CurrentDirectory: C:
User: x
LogonGuid: {af692c1b-0f72-62a0-8bf5-0b0000000000}
LogonId: 0xBF58B
TerminalSessionId: 1
IntegrityLevel: High
Hashes: MD5=6244455BD1676884E115025CF34345EC,SHA256=1E0BDCFF50024EB4EE586FB7BDA7093BF3A7B6DAC815FA5B43F271A3A8A88A9A
ParentProcessGuid: {af692c1b-2357-62a7-7e89-b96100000000}
ParentProcessId: 24364
ParentImage: C:WindowsSystem32cmd.exe
ParentCommandLine: "C:WINDOWSsystem32cmd.exe"
EDR可以依据Image, Cmdline, Hash, PID等参数判断该进程是否为恶意进程。其中最直观的是Cmdline参数,例如当执行net user /add
时,只有Cmdline参数能反应攻击者的目的。
2. cmd参数混淆
提到混淆,大多是基于cmd shell的,场景是命令拼接到cmd /c
后,例如
cmd /c (n^et1%ProgramFiles:~10,1%u^ser)
但shell混淆对躲避内核回调的监控是没有太大用处的,经过cmd解释后,内核回调看到的是
net1 user
在这种场景下,( ) & ^ ;
都没有用,但双引号例外。
cmd中双引号会被原封不动的带入子进程命令行,例如ne""t1 u""ser
在Sysmon中的日志为
Process Create:
ProcessId: 10372
Image: C:WindowsSystem32net1.exe
FileVersion: 10.0.19041.844 (WinBuild.160101.0800)
Description: Net Command
Product: Microsoft® Windows® Operating System
Company: Microsoft Corporation
OriginalFileName: net1.exe
CommandLine: ne""t1 u""ser
且对于子进程,只要其通过CommandLineToArgv
或是CRT解析,就可以正常获取命令行参数(反例:wmic和notepad)
wprintf(L"GetCommandLineW: %sn", GetCommandLineW());
for (int i = 0; i < __argc; i++) {
wprintf(L"crt __argv %d: %sn", i, __wargv[i]);
}
int _argc = 0;
wchar_t** _argv = CommandLineToArgvW(GetCommandLineW(), &_argc);
for (int i = 0; i < _argc; i++)
wprintf(L"CommandLineToArgvW %d: %sn", i, _argv[i]);
for (int i = 0; i < argc; i++) {
wprintf(L"crt argv %d: %sn", i, argv[i]);
}
C:>Wtest.exe a""aa bb""b cc""c
GetCommandLineW: Wtest.exe a""aa bb""b cc""c
crt __argv 0: Wtest.exe
crt __argv 1: aaa
crt __argv 2: bbb
crt __argv 3: ccc
CommandLineToArgvW 0: Wtest.exe
CommandLineToArgvW 1: aaa
CommandLineToArgvW 2: bbb
CommandLineToArgvW 3: ccc
crt argv 0: Wtest.exe
crt argv 1: aaa
crt argv 2: bbb
crt argv 3: ccc
猜测cmd的行为是:
1.输入net1 user
2.解释^ & ; 等特殊符号3.通过CommandLineToArgvW解析输入,此时双引号会被解析4.cmd获取到Image为net1,通过环境变量查找到C:/Windows/system32/net1.exe5.创建进程6.设置命令行为经过2.解析的字符串
3. 创建Image和Cmdline不同的进程
如果我们能模拟cmd的行为,那么就可以使创建的net1.exe
进程有ne""t1 u""ser
命令行,但使用CreateProcess
创建进程的逻辑并不与cmd相同,使用以下代码测试,返回了Error Code 2
STARTUPINFOW si = { 0 };
PROCESS_INFORMATION pi = { 0 };
WCHAR cmdline[] = L"n""et1 user";
if (!CreateProcessW(NULL, cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
wprintf(L"%dn", GetLastError());
return -1;
}
通过逆向,发现NtCreateUserProcess
是通过AttributeList参数中PS_ATTRIBUTE_IMAGE_NAME
的项来指示Image的,而ImagePath和CommandLine则是通过RTL_USER_PROCESS_PARAMETERS
传递的。RTL_USER_PROCESS_PARAMETERS
只是PEB中的一个值,与Image并没有必然联系。
CreateProcess
是通过ApplicationName将Image传递给NtCreateUserProcess
的。这个参数需要传递绝对路径,如:
STARTUPINFOW si = { 0 };
PROCESS_INFORMATION pi = { 0 };
WCHAR cmdline[] = L"a us""er";
if (!CreateProcessW(L"C:\Windows\System32\net1.exe", cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
wprintf(L"%dn", GetLastError());
return -1;
}
此时进程命令行为a us""er
4. Argument Spoofing EX
CS中的argue命令[1]有一个缺点,不能混淆argv[0]
,即只能混淆成net1 AAAAAAAAA
。但通过上面的方法,可以实现cmdline全部混淆
加强版的argument spoofer有一个优化点,因为触碰其他进程PEB是一种较为敏感的行为。当命令行不需要传递参数时,可以将例如malware.exe
混淆为C:/path/to/trusted/process
,并且不需要挂起进程修改命令行,因为绝大部分进程是不会关心argv[0]
的值的。
References
[1]
CS中的argue命令: https://blog.xpnsec.com/how-to-argue-like-cobalt-strike/
原文始发于微信公众号(0x4d5a):Argument Spoofing EX
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论