05
2024
07
12:03:53

追踪黑客脚步:实战Process Hollowing调试揭示攻击手法

1.背景知识

ProcessHollowing技术又叫进程镂空/进程掏空技术,属于进程注入的一种。主要目的是将恶意代码注入到合法(一般为windows系统自带的)的进程,从而实现合法的进程执行恶意代码从而躲过安全软件的检测与查杀。

但是与普通的注入不同的是,ProcessHollowing是创建新的进程而不是对现有的进程进行操作,且不需要调用CreateRemoteThread这个杀软主要检测的API。

该技术在当前的APT组织/其他黑客组织中利用的相当频繁且活跃,使用的APT组织包括但不限于Kimsuky、Patchwork、APT32,其他恶意软件家族包括但不限于Agent Tesla、Cobalt Strike、Lokibot、QakBot、TrickBot、Ursnif等。

2.技术原理

  1. CreateProcess,以挂起的形式创建要hollowing的进程。

  2. ZwUnmapViewOfSection or NtUnmapViewOfSection ,使用此api将目标进程进行内存数据“挖空”。用于下一步写入指定的shellcode。

  3. VirtualAllocEx,根据指定进程句柄来申请内存空间,用于写入shellcode

  4. WriteProcessMemory,根据申请的内存空间地址,将目标shellcode写入。

  5. VirtualProtectEx,修改申请的内存空间的权限,更改为可执行,用于执行shellcode

  6. SetThreadContext,设置注入进程的新的入口点,这里要注意,新的入口点从数据结构角度具体偏移为参数2+0xb0。注意小端排序。

  7. ResumeThread,恢复线程,挂起的进程将会被恢复执行,并且会直接执行第六步的入口点。

3. 技术步骤图

ProcessHollowing技术基本的流程图如下所示,以挂起的形式创建一个合法进程,随后将合法的进程内存掏空,随后注入恶意代码至其内部,设置恶意代码入口点,恢复线程执行入口点函数,执行恶意代码。

4.Att&ck

使用ProcessHollowing技术的组织和家族,其中APT组织运用此技术及为频繁。

ProcessHollowing技术在Att&ck矩阵中的具体展示,位于进程注入的子技术。

5. 实战调试

5.1实战样本信息

实操家族:Gozi/Ursnif

惯用技术:ProcessHollowing

MD5

136837b24eb33a39fbb5d1b62ab167a5(最终执行注入的exe文件)、49605df8d511a988e22ba2b383cac7b7(母体文件)

5.2原理与步骤(排除动态加载API情况)

  1. 在病毒调试阶段确定以挂起形式创建进程的进程名。

  2. 在病毒调试阶段跟踪内存映射卸载函数,确保卸载的内存所属进程与第一步的进程一致。

  3. 在病毒调试阶段跟踪申请内存空间函数,记录申请后的内存空间地址以及参数中的对应的进程句柄。

  4. 在病毒调试阶段跟踪写内存函数(WriteProcessMemory),记录写入内存的地址以及大小。

  5. 在病毒调试阶段跟踪设置线程上下文函数,跟踪记录新的入口点。

  6. ProcessHacker定位病毒创建的进程并打开内存,定位入口点(入口点地址为第5步的)

  7. ProcessHacker打开病毒创建的进程内存入口点反汇编修改,无限循环跳转至当前汇编代码,达到附加调试下断条件。

  8. 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技术的木马样本可以参考本文对黑客组织样本进行对抗分析。




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://www.hqyman.cn/post/6994.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: