提出问题
在程序执行命令时,sysmon都会做出对应的监控。攻击者在执行main.exe <argv>都得到参数时候都会被记录,如下:
可以发现我们执行的powershell -c calc.exe已经被系统记录了。
这时候就出现了一个技术:
进程参数欺骗这个技术在Hackin’Fest 2018年里有讲过
https://www.youtube.com/watch?v=l8nkXCOYQC4
前置知识
一些下面会用到的结构体提前先列出来
TEB
可以去看一下:
https://www.vergiliusproject.com/kernels/x86/windows-10/22h2/_TEB
_NT_TEB
typedef struct _NT_TIB
{
PEXCEPTION_REGISTRATION_RECORD ExceptionList;
PVOID StackBase;
PVOID StackLimit;
PVOID SubSystemTib;
union
{
PVOID FiberData;
ULONG Version;
};
PVOID ArbitraryUserPointer;
PNT_TIB Self; //+18 指向自己(TEB)
} NT_TIB, *PNT_TIB;
PEB
可以去看一下:
https://www.vergiliusproject.com/kernels/x86/windows-10/22h2/_PEB
分析
分析还是太难为我了,我还是借助一下大佬的分析过程:
https://wbglil.gitbook.io/cobalt-strike/cobalt-strike-yuan-li-jie-shao/can-shu-qi-pian#dai-ma
分析一下GetCommandLineW的实现
可以看到GetCommandLineW是直接从一个地址中读取的值然后给eax,我们跟进查看是谁给此地址赋值的
在这里就可以很清楚的看到是从PEB里取的值
如果你不明白为什么esi指向PEB可以去函数开头看一下esi是从哪里来的,基本就能明白
现在我们应该清楚进程参数该从哪里获取(PEB.ProcessParameters.CommandLine)
所以我们可以很简单的通过修改PEB达到目的
1.以暂停标志创建进程
2.修改PEB.ProcessParameters.CommandLine
3.继续运行进程
从上面也可以看出来CommandLine是一个UNICODE_STRING结构体
而GetCommandLine根据我们上面分析的结果,它并不解析其中的Length,单单返回Buffer。这就造成了一些问题,进程本身初始化获取参数时不会理会Length,但是部分进程管理工具会通过读取PEB寻找参数,然后依据UNICODE_STRING.Length去读取参数的长度,所以我们还可以利用这点欺骗进程管理工具
运行效果
代码可以去参考一下:
https://www.ctfiot.com/174911.html
END
参考文章:
https://www.ctfiot.com/174911.html
https://wbglil.gitbook.io/cobalt-strike/cobalt-strike-yuan-li-jie-shao/can-shu-qi-pian#dai-ma
https://wbglil.github.io/2019/04/03/利用cs进程参数欺骗绕过杀软添加账号/
原文始发于微信公众号(T3Ysec):进程命令行参数欺骗
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论