详细介绍分析了Mitre ATT&CK矩阵中的三种进程注入手法:经典的进程注入、Process Hollowing和Process Doppelgänging。并对相应的手法趋势作出总结。
恶意软件使用进程注入的主要目的大致是为了躲避杀软的检测或者进行提权操作。这里我们将主要针对第一种情况下的3种手段进行详细的讨论。
这是最为经典的手段,流程也十分简洁明了即:
OpenProcess -> VirtualAllocEx -> WriteProcessMemory -> CreateRemoteThread
第二曲:经典老歌--Process Hollowing
这是一种相当古老的手段了,中文一般译为"创建傀儡进程",使用该手法创建的进程可以伪装为任意的合法进程,比如伪装为IE,在内存中使用process hacker查看时其图标资源、描述、数字签名均为IE的值。这样应急响应人员在进行排查的时候可能难以发现。
用简洁的语言概括该手法,即恶意进程首先创建一个挂起状态的进程,然后取消其原先的内存映射并替换成事先准备的恶意代码,在对修改后的映像文件进行重定向后再恢复该进程的运行状态。
1. 通过CreateProcess创建目标进程,传入参数CREATE_SUSPENDED使进程挂起
2. 通过NtQueryProcessInformation获取目标进程内存中映像文件的基地址。(PEB块数据结构)
3. 通过NtUnmapViewOfSection清空目标进程的内存数据(section),传入参数为进程句柄和映像文件的基地址
4. 通过VirtualAllocEx申请新的内存(起始地址为之前映像文件的基地址,大小则为payload的大小)
5. 通过WriteProcessMemory向内存写入payload
6. 将写入内存中的payload进行基址重定向
7. 通过GetThreadContext获取目标线程的上下文,将上下文的eax寄存器修改为正确的代码入口点
8. 通过SetThreadContext设置入口点
9. 通过ResumeThread唤醒进程,执行payload
从实现思路中可以看出,步骤1、4、5、6、7、8、9是常规的创建一个进程然后自己注入的手段。只有步骤2、3是比较特殊的。用常规的检测手段如Hook关键函数进行判断即可检测。
第三曲:锐利电音--Process Doppelgänging
这是一种比较新的注入手段,首次提出于2017年的欧洲black hat大会。该手段在原理及表现上与Process Hollowing是类似的,利用Process Doppelgänging创建的进程在内存中使用process hacker查看时其图标资源、描述、数字签名均为指定的目标程序。
该手法利用了windows事务(TxF)的特性,在事务中使用恶意文件覆盖合法文件,此时不提交事务(即覆盖不会在磁盘上发生),然后创建一个section(当前事务的拷贝)。在获得了section的句柄后,就将事务回滚,防止恶意文件在磁盘上真正地覆盖合法文件。之后就使用内存中section的句柄进行进程创建操作。而创建的进程是拥有合法可执行文件的信息的。
可以看到,由于需要在事务中覆盖文件,所以该手法需要对目标文件有写权限。
1. 创建一个TxF事务对象(NtCreateTransaction)
2. 以事务API打开合法可执行文件,即在事务对象中加入文件(CreateFileTransacted)
3. 打开恶意文件并为其分配内存空间(CreateFile、GetFileSizeEx -> NtAllocateVirtualMemory -> ReadFile)