1.背景知识
ProcessHollowing技术又叫进程镂空/进程掏空技术,属于进程注入的一种。主要目的是将恶意代码注入到合法(一般为windows系统自带的)的进程,从而实现合法的进程执行恶意代码从而躲过安全软件的检测与查杀。
但是与普通的注入不同的是,ProcessHollowing是创建新的进程而不是对现有的进程进行操作,且不需要调用CreateRemoteThread这个杀软主要检测的API。
该技术在当前的APT组织/其他黑客组织中利用的相当频繁且活跃,使用的APT组织包括但不限于Kimsuky、Patchwork、APT32,其他恶意软件家族包括但不限于Agent Tesla、Cobalt Strike、Lokibot、QakBot、TrickBot、Ursnif等。
2.技术原理
CreateProcess,以挂起的形式创建要hollowing的进程。
ZwUnmapViewOfSection or NtUnmapViewOfSection ,使用此api将目标进程进行内存数据“挖空”。用于下一步写入指定的shellcode。
VirtualAllocEx,根据指定进程句柄来申请内存空间,用于写入shellcode
WriteProcessMemory,根据申请的内存空间地址,将目标shellcode写入。
VirtualProtectEx,修改申请的内存空间的权限,更改为可执行,用于执行shellcode
SetThreadContext,设置注入进程的新的入口点,这里要注意,新的入口点从数据结构角度具体偏移为参数2+0xb0。注意小端排序。
ResumeThread,恢复线程,挂起的进程将会被恢复执行,并且会直接执行第六步的入口点。
3. 技术步骤图
ProcessHollowing技术基本的流程图如下所示,以挂起的形式创建一个合法进程,随后将合法的进程内存掏空,随后注入恶意代码至其内部,设置恶意代码入口点,恢复线程执行入口点函数,执行恶意代码。
4.Att&ck
使用ProcessHollowing技术的组织和家族,其中APT组织运用此技术及为频繁。
ProcessHollowing技术在Att&ck矩阵中的具体展示,位于进程注入的子技术。
5. 实战调试
5.1实战样本信息
实操家族:Gozi/Ursnif
惯用技术:ProcessHollowing
MD5:
136837b24eb33a39fbb5d1b62ab167a5(最终执行注入的exe文件)、49605df8d511a988e22ba2b383cac7b7(母体文件)
5.2原理与步骤(排除动态加载API情况)
在病毒调试阶段确定以挂起形式创建进程的进程名。
在病毒调试阶段跟踪内存映射卸载函数,确保卸载的内存所属进程与第一步的进程一致。
在病毒调试阶段跟踪申请内存空间函数,记录申请后的内存空间地址以及参数中的对应的进程句柄。
在病毒调试阶段跟踪写内存函数(WriteProcessMemory),记录写入内存的地址以及大小。
在病毒调试阶段跟踪设置线程上下文函数,跟踪记录新的入口点。
ProcessHacker定位病毒创建的进程并打开内存,定位入口点(入口点地址为第5步的)
ProcessHacker打开病毒创建的进程内存入口点反汇编修改,无限循环跳转至当前汇编代码,达到附加调试下断条件。
Xdbg附加调试步骤1的进程(病毒创建的进程),随后停留在步骤7的位置,随后还原原始入口点的汇编指令,从而进行接下来的调试操作。
5.3实战具体操作
5.3.1 定位进程创建API
病毒挂起的形式创建目标注入进程:
本样本采用API动态调用,GetProcAddress动态调用,对该API进行下断,待解出ProcessHollowing相关API后,再对这些API进行下断分析,主要针对是SetThreadContext。注意,部分API可能在被调用后由于名称的原因无法直接通过名称跳转(ctrl+G)的形式下断,这种类型可以直接在GetProcAddress执行完后的EAX值进行反汇编窗口跟随随后F2下断。
正常情况下动态加载出来的API
需要通过Eax返回值来对反汇编窗口跟随下断的API(总体而言,思维活跃即可)
定位内存写入API
通过WriteProcessMemory下断分析,可以对参数进行留存观看,主要关注的是写入的shellcode地址以及大小。便于后续ProcessHacker去定位进程内存块。
定位注入点
寻找注入点,利用SetThreadContext的参数2来识别新的注入进程的入口 为0x4016BE。
修改入口点
ProcessHacker修改入口点数据,便于下断调试。
利用ProcessHacker定位要注入的进程内存空间,并找到入口点,对入口点进行下断调试,0xCC或者是EB FE,注意第一种需要将OD设置为实时调试器,方能在注入恢复线程后自动吊起OD对注入进程进行调试,第二种会使线程恢复时进入无限循环,这里建议使用第一种方法,修改完成后,write后,接着运行目前的od调试的程序,注意一定要直接run不要使程序处于调试暂停状态。随后,打开一个调试器od、xdbg都可以。附加被注入的进程,随后更改入口点命令(还原原始值即可),接下来方可进行调试。
找到入口点后,直接对其进行编辑,输入EB FE然后write即可。注意最好将更改前的两字节值进行保存,以便后续附加调试注入进程后及时更改还原原始值。
使用时间作为密钥是gozi的一贯作风,本次分析样本的密钥为"Feb 23 2022",从日期上来看该样本编译时间应该为2月23日前后。
随后关闭,将od调试的进程F9运行,注意一定要使其处于运行状态,哪怕为终止状态也可以,不要为暂停状态,否则会影响被注入进程的附加。
Xdbg附加调试
Xdbg附加调试
结合ProcessHacker定位被注入的进程的PID,随后Xdbg附加模式打开目标进程(xdbg需要以管理员身份运行)。
还原入口点
附加后会定位到入口点,如果没有到入口点,可以直接对入口点进行下断,随后f9运行,自然会断到入口点,随后将原始入口点的值进行还原就可以进行接下来的被注入的进程的调试工作。
注意:ProcessHacker在寻找注入进程的内存时,需要以管理员模式运行(程序自带的),否则无权看到内存空间布局。
Gozi样本ProcessHollowing分析调试shellcode
经过3轮解密操作,将最终的原始数据成功解密,解密密钥为日期(),本次分析样本的密钥为:“Feb 23 2022”这是Gozi惯用的套路。最终的解密数据如下所示:
00300000 4D 00 69 00 63 00 72 00 6F 00 73 00 6F 00 66 00 M.i.c.r.o.s.o.f. 00300010 74 00 00 00 4E 54 44 4C 4C 2E 44 4C 4C 00 4E 54 t...NTDLL.DLL.NT 00300020 44 53 41 50 49 2E 44 4C 4C 00 4B 45 52 4E 45 4C DSAPI.DLL.KERNEL 00300030 33 32 2E 44 4C 4C 00 25 30 38 58 2D 25 30 34 58 32.DLL.%08X-%04X 00300040 2D 25 30 34 58 2D 25 30 34 58 2D 25 30 38 58 25 -%04X-%04X-%08X% 00300050 30 34 58 00 25 00 53 00 25 00 78 00 00 00 4C 6F 04X.%.S.%.x...Lo 00300060 63 61 6C 5C 00 7B 25 30 38 58 2D 25 30 34 58 2D cal\.{%08X-%04X- 00300070 25 30 34 58 2D 25 30 34 58 2D 25 30 38 58 25 30 %04X-%04X-%08X%0 00300080 34 58 7D 00 49 73 57 6F 77 36 34 50 72 6F 63 65 4X}.IsWow64Proce 00300090 73 73 00 57 6F 77 36 34 45 6E 61 62 6C 65 57 6F ss.Wow64EnableWo 003000A0 77 36 34 46 73 52 65 64 69 72 65 63 74 69 6F 6E w64FsRedirection 003000B0 00 44 3A 28 44 3B 4F 49 43 49 3B 47 41 3B 3B 3B .D:(D;OICI;GA;;; 003000C0 42 47 29 28 44 3B 4F 49 43 49 3B 47 41 3B 3B 3B BG)(D;OICI;GA;;; 003000D0 41 4E 29 28 41 3B 4F 49 43 49 3B 47 41 3B 3B 3B AN)(A;OICI;GA;;; 003000E0 41 55 29 28 41 3B 4F 49 43 49 3B 47 41 3B 3B 3B AU)(A;OICI;GA;;; 003000F0 42 41 29 00 2E 62 69 6E 00 53 3A 28 4D 4C 3B 3B BA)..bin.S:(ML;; 00300100 4E 57 3B 3B 3B 4C 57 29 44 3A 28 41 3B 3B 30 78 NW;;;LW)D:(A;;0x 00300110 31 66 66 66 66 66 3B 3B 3B 57 44 29 28 41 3B 3B 1fffff;;;WD)(A;; 00300120 30 78 31 66 66 66 66 66 3B 3B 3B 53 2D 31 2D 31 0x1fffff;;;S-1-1 00300130 35 2D 32 2D 31 29 28 41 3B 3B 30 78 31 66 66 66 5-2-1)(A;;0x1fff 00300140 66 66 3B 3B 3B 53 2D 31 2D 31 35 2D 33 2D 31 29 ff;;;S-1-15-3-1) 00300150 00 5A 77 43 72 65 61 74 65 53 65 63 74 69 6F 6E .ZwCreateSection 00300160 00 5A 77 4D 61 70 56 69 65 77 4F 66 53 65 63 74 .ZwMapViewOfSect 00300170 69 6F 6E 00 5A 77 55 6E 6D 61 70 56 69 65 77 4F ion.ZwUnmapViewO 00300180 66 53 65 63 74 69 6F 6E 00 52 74 6C 4E 74 53 74 fSection.RtlNtSt 00300190 61 74 75 73 54 6F 44 6F 73 45 72 72 6F 72 00 5A atusToDosError.Z 003001A0 77 43 6C 6F 73 65 00 C2 A9 20 32 30 32 30 20 4D wClose.© 2020 M 003001B0 69 63 72 6F 73 6F 66 74 20 43 6F 72 70 6F 72 61 icrosoft Corpora 003001C0 74 69 6F 6E 2E 20 41 6C 6C 20 72 69 67 68 74 73 tion. All rights 003001D0 20 72 65 73 65 72 76 65 64 2E 00 5A 77 53 65 74 reserved..ZwSet 003001E0 43 6F 6E 74 65 78 74 54 68 72 65 61 64 00 5A 77 ContextThread.Zw 003001F0 47 65 74 43 6F 6E 74 65 78 74 54 68 72 65 61 64 GetContextThread 00300200 00 5A 77 57 6F 77 36 34 52 65 61 64 56 69 72 74 .ZwWow64ReadVirt 00300210 75 61 6C 4D 65 6D 6F 72 79 36 34 00 5A 77 57 6F ualMemory64.ZwWo 00300220 77 36 34 51 75 65 72 79 49 6E 66 6F 72 6D 61 74 w64QueryInformat 00300230 69 6F 6E 50 72 6F 63 65 73 73 36 34 00 6B 65 72 ionProcess64.ker 00300240 6E 65 6C 62 61 73 65 00 4C 64 72 52 65 67 69 73 nelbase.LdrRegis 00300250 74 65 72 44 6C 6C 4E 6F 74 69 66 69 63 61 74 69 terDllNotificati 00300260 6F 6E 00 4C 64 72 55 6E 72 65 67 69 73 74 65 72 on.LdrUnregister 00300270 44 6C 6C 4E 6F 74 69 66 69 63 61 74 69 6F 6E 00 DllNotification. 00300280 5A 77 57 72 69 74 65 56 69 72 74 75 61 6C 4D 65 ZwWriteVirtualMe 00300290 6D 6F 72 79 00 5A 77 50 72 6F 74 65 63 74 56 69 mory.ZwProtectVi 003002A0 72 74 75 61 6C 4D 65 6D 6F 72 79 00 4C 6F 61 64 rtualMemory.Load 003002B0 4C 69 62 72 61 72 79 41 00 25 30 32 75 2D 25 30 LibraryA.%02u-%0 003002C0 32 75 2D 25 30 32 75 20 25 30 32 75 3A 25 30 32 2u-%02u %02u:%02 003002D0 75 3A 25 30 32 75 0D 0A 00 36 34 00 00 00 00 00 u:%02u...64.....
循环动态解密所需API
获取用户名、计算机名
解密目标c2(域名、ip、url):
获取到拼接C2通讯的URL原始数据结构,信息含义主要为肉鸡(被害者)PC相关信息。
拼接后的原始URL数据结构如下所示:
具体展示如下:
02AFA5B0 73 6F 66 74 3D 32 26 76 65 72 73 69 6F 6E 3D 32 soft=2&version=2 02AFA5C0 35 30 32 32 37 26 75 73 65 72 3D 34 38 38 62 64 50227&user=488bd 02AFA5D0 30 62 33 38 65 61 37 37 35 39 33 66 62 31 65 65 0b38ea77593fb1ee 02AFA5E0 35 30 30 63 38 33 66 62 66 62 33 26 73 65 72 76 500c83fbfb3&serv 02AFA5F0 65 72 3D 35 30 26 69 64 3D 35 35 35 26 63 72 63 er=50&id=555&crc 02AFA600 3D 31 26 75 70 74 69 6D 65 3D 38 32 39 37 26 73 =1&uptime=8297&s 02AFA610 69 7A 65 3D 30 26 68 61 73 68 3D 30 78 30 30 30 ize=0&hash=0x000 02AFA620 30 30 30 30 30 26 64 6E 73 3D 57 49 4E 2D 45 42 00000&dns=WIN-EB 02AFA630 43 31 49 51 47 30 30 36 47 00 00 00 00 00 00 00 C1IQG006G.......
02AF99B0 68 6A 75 64 73 3D 71 63 6C 73 74 65 26 73 6F 66 hjuds=qclste&sof 02AF99C0 74 3D 32 26 76 65 72 73 69 6F 6E 3D 32 35 30 32 t=2&version=2502 02AF99D0 32 37 26 75 73 65 72 3D 34 38 38 62 64 30 62 33 27&user=488bd0b3 02AF99E0 38 65 61 37 37 35 39 33 66 62 31 65 65 35 30 30 8ea77593fb1ee500 02AF99F0 63 38 33 66 62 66 62 33 26 73 65 72 76 65 72 3D c83fbfb3&server= 02AF9A00 35 30 26 69 64 3D 35 35 35 26 63 72 63 3D 31 26 50&id=555&crc=1& 02AF9A10 75 70 74 69 6D 65 3D 38 32 39 37 26 73 69 7A 65 uptime=8297&size 02AF9A20 3D 30 26 68 61 73 68 3D 30 78 30 30 30 30 30 30 =0&hash=0x000000 02AF9A30 30 30 26 64 6E 73 3D 57 49 4E 2D 45 42 43 31 49 00&dns=WIN-EBC1I 02AF9A40 51 47 30 30 36 47 26 77 68 6F 61 6D 69 3D 65 76 QG006G&whoami=ev 02AF9A50 65 72 73 65 63 40 57 49 4E 2D 45 42 43 31 49 51 ersec@WIN-EBC1IQ 02AF9A60 47 30 30 36 47 00 00 00 C7 65 92 3A 34 0E 00 00 G006G...Çe.:4...
当被害者数据结构拼接完成后,调用Crypt系列APi对数据结构进行加密操作。
密钥为“VOghEBLHCzugGPvo”
随后调用加密函数“CryptEncrypt”
对url数据结构进行编码操作。
编码后的URL数据结构。
内存数据结构展示如下:
02AFB5C0 48 38 6C 4E 67 30 71 31 32 74 4D 37 6D 48 73 32 H8lNg0q12tM7mHs2 02AFB5D0 67 75 6D 61 79 7A 41 76 30 31 39 7A 5A 33 48 33 gumayzAv019zZ3H3 02AFB5E0 39 59 6B 79 47 46 6F 78 4D 41 69 4A 4E 76 4C 52 9YkyGFoxMAiJNvLR 02AFB5F0 6B 65 68 62 7A 79 6B 50 43 4D 36 66 41 70 6F 4B kehbzykPCM6fApoK 02AFB600 66 75 61 30 46 63 44 78 78 53 5F 32 42 68 7A 76 fua0FcDxxS_2Bhzv 02AFB610 79 73 69 5F 32 42 43 6C 5F 32 42 50 41 75 41 32 ysi_2BCl_2BPAuA2 02AFB620 32 6F 52 70 76 4B 6D 4B 56 44 75 44 55 69 51 56 2oRpvKmKVDuDUiQV 02AFB630 59 51 6F 69 49 4B 41 4D 4D 35 37 4A 56 38 68 45 YQoiIKAMM57JV8hE 02AFB640 69 6F 71 6F 53 34 42 4D 59 37 4A 57 30 5F 32 42 ioqoS4BMY7JW0_2B 02AFB650 6C 43 39 57 48 6C 6A 45 51 69 66 68 6D 46 55 7A lC9WHljEQifhmFUz 02AFB660 76 54 56 74 6A 43 6F 64 52 73 58 51 51 30 73 31 vTVtjCodRsXQQ0s1 02AFB670 72 76 69 30 4D 5F 32 42 53 57 70 41 6D 70 41 4C rvi0M_2BSWpAmpAL 02AFB680 75 75 54 78 38 70 78 79 69 49 67 49 48 32 7A 47 uuTx8pxyiIgIH2zG 02AFB690 68 59 6C 43 6F 5F 32 42 31 66 36 4A 43 37 74 45 hYlCo_2B1f6JC7tE 02AFB6A0 65 51 39 66 6E 78 33 67 55 4F 54 41 6D 6C 64 64 eQ9fnx3gUOTAmldd 02AFB6B0 4A 6A 48 33 4D 36 53 64 6F 78 39 66 34 74 63 49 JjH3M6Sdox9f4tcI 02AFB6C0 5F 32 42 35 79 6A 5F 32 46 51 31 4C 69 65 68 70 _2B5yj_2FQ1Liehp
拼接HTTP数据结构:
02AFADB8 63 6F 6E 66 69 67 2E 65 64 67 65 2E 73 6B 79 70 config.edge.skyp 02AFADC8 65 2E 63 6F 6D 2F 70 68 70 61 64 6D 69 6E 2F 48 e.com/phpadmin/H 02AFADD8 38 6C 4E 67 30 71 31 32 74 4D 37 6D 48 73 32 67 8lNg0q12tM7mHs2g 02AFADE8 2F 75 6D 61 79 7A 41 76 30 31 39 7A 5A 2F 33 48 /umayzAv019zZ/3H 02AFADF8 33 39 59 6B 79 47 46 6F 78 2F 4D 41 69 4A 4E 76 39YkyGFox/MAiJNv 02AFAE08 4C 52 6B 65 68 62 7A 78 2F 6B 50 43 4D 36 66 41 LRkehbzy/kPCM6fA 02AFAE18 70 6F 4B 66 75 61 30 46 63 44 78 78 53 5F 2F 32 poKfua0FcDxxS_/2 02AFAE28 42 68 7A 76 79 73 69 5F 32 42 43 6C 5F 32 42 2F Bhzvysi_2BCl_2B/ 02AFAE38 50 41 75 41 32 32 6F 52 70 76 4B 6D 4B 56 44 2F PAuA22oRpvKmKVD/ 02AFAE48 75 44 55 69 51 56 59 51 6F 69 49 4B 41 4D 4D 35 uDUiQVYQoiIKAMM5 02AFAE58 37 4A 2F 56 38 68 45 69 6F 71 6F 53 2F 34 42 4D 7J/V8hEioqoS/4BM 02AFAE68 59 37 4A 57 30 5F 32 42 6C 43 39 57 48 6C 6A 45 Y7JW0_2BlC9WHljE 02AFAE78 51 2F 69 66 68 6D 46 55 7A 76 54 56 74 6A 43 6F Q/ifhmFUzvTVtjCo 02AFAE88 64 52 73 58 51 2F 51 30 73 31 72 76 69 30 4D 5F dRsXQ/Q0s1rvi0M_ 02AFAE98 32 42 53 57 70 41 6D 70 41 4C 75 75 2F 54 78 38 2BSWpAmpALuu/Tx8 02AFAEA8 70 78 79 69 49 67 49 48 32 7A 2F 47 68 59 6C 43 pxyiIgIH2z/GhYlC 02AFAEB8 6F 5F 32 2F 42 31 66 36 4A 43 37 74 45 65 51 39 o_2/B1f6JC7tEeQ9 02AFAEC8 66 6E 78 33 67 55 4F 54 41 6D 6C 2F 64 64 4A 6A fnx3gUOTAml/ddJj 02AFAED8 48 33 4D 36 53 64 2F 6F 78 39 66 34 74 63 49 5F H3M6Sd/ox9f4tcI_ 02AFAEE8 32 42 35 79 6A 5F 32 46 2F 51 31 4C 69 65 68 70 2B5yj_2F/Q1Liehp 02AFAEF8 2E 73 72 63 00 00 00 00 00 00 00 00 00 00 00 00 .src............
6. 总结
ProcessHollowing技术属于当前黑客惯用技术,相比较传统的注入技术最大的不同点为创建新的白名单进程进行恶意代码注入并执行对应的恶意功能。针对此类技术在调试对抗方面本文也给出了详细的逆向调试操作流程,调试操作重点也在于入口点的定位与修改调试。今后在遇到使用ProcessHollowing技术的木马样本可以参考本文对黑客组织样本进行对抗分析。
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://www.hqyman.cn/post/6994.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~