Argument Spoofing EX

admin 2022年6月17日18:40:31安全文章评论10 views3700字阅读12分20秒阅读模式

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.436ProcessGuid: {af692c1b-e8ae-62a7-a09d-6d6c00000000}ProcessId: 21068Image: C:t.exeFileVersion: -Description: -Product: -Company: -OriginalFileName: -CommandLine: t.exe testCurrentDirectory: C:User: xLogonGuid: {af692c1b-0f72-62a0-8bf5-0b0000000000}LogonId: 0xBF58BTerminalSessionId: 1IntegrityLevel: HighHashes: MD5=6244455BD1676884E115025CF34345EC,SHA256=1E0BDCFF50024EB4EE586FB7BDA7093BF3A7B6DAC815FA5B43F271A3A8A88A9AParentProcessGuid: {af692c1b-2357-62a7-7e89-b96100000000}ParentProcessId: 24364ParentImage: C:WindowsSystem32cmd.exeParentCommandLine: "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: 10372Image: C:WindowsSystem32net1.exeFileVersion: 10.0.19041.844 (WinBuild.160101.0800)Description: Net CommandProduct: Microsoft® Windows® Operating SystemCompany: Microsoft CorporationOriginalFileName: net1.exeCommandLine: 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""cGetCommandLineW: Wtest.exe  a""aa bb""b cc""ccrt __argv 0: Wtest.execrt __argv 1: aaacrt __argv 2: bbbcrt __argv 3: cccCommandLineToArgvW 0: Wtest.exeCommandLineToArgvW 1: aaaCommandLineToArgvW 2: bbbCommandLineToArgvW 3: ccccrt argv 0: Wtest.execrt argv 1: aaacrt argv 2: bbbcrt argv 3: ccc


猜测cmd的行为是:

1.输入net1 user2.解释^ & ; 等特殊符号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并没有必然联系。

Argument Spoofing EX

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 Spoofing EX

加强版的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

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月17日18:40:31
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  Argument Spoofing EX http://cn-sec.com/archives/1123435.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: