查看原文
其他

九维团队-青队(处置)| 代码注入和钩子(三)

pwnda 安恒信息安全服务 2022-11-05


写在前边
1.本文原文为K A, Monnappa. 2018年发表的《Learning Malware Analysis》,本文的相关内容均为笔者对相关内容的翻译及实践记录,仅供各位学术交流使用。另出于易读性考虑,对部分字句有所删改。 2.如各位需要引用,请做原文引用,格式如下所示: [序号]K A, Monnappa. LearningMalware Analysis[M]. 2018.06. Published by Packt Publishing Ltd. Livery Place 35 Livery Street Birmingham B3 2PB, UK. 3.因文章整体内容较长,完整内容将会在本公众号拆分为多篇内容分别发出。本文为该系列的第三篇。

往期内容请参见合集《Learning Malware Analysis》


代码注入技术


如前所述,代码注入技术的目的是将代码注入远程进程的内存,并在远程进程的上下文中执行注入的代码。注入的代码可以是一个模块,如可执行文件,DLL,甚至是shellcode。


代码注入技术为攻击者提供了许多好处;一旦代码被注入到远程进程中,攻击者可以做以下事情:

1.迫使远程进程执行注入的代码以进行恶意操作(如下载额外的文件或窃取键盘按键信息)。


2.注入一个恶意模块(如DLL),并将远程进程的API调用重定向到注入模块中的一个恶意函数。然后,该恶意函数可以拦截API调用的输入参数,也可以过滤输出参数。


例如,Internet Explorer使用HttpSendRequest()向Web服务器发送一个包含可选POST有效载荷的请求,它使用InternetReadFile()从服务器的响应中获取字节,并在浏览器中显示它。攻击者可以在Internet Explorer的进程内存中注入一个模块,并将HttpSendRequest()重定向到被注入模块中的恶意函数,以便从POST有效载荷中提取证书。


以同样的方式,它可以拦截从InternetReadFile()API收到的数据,读取数据或修改从网络服务器收到的数据。这使攻击者能够在数据到达网络服务器之前拦截数据(如银行凭证),也使攻击者能够在数据到达受害者的浏览器之前替换或插入额外的数据到服务器的响应中(如在HTML内容中插入一个额外的字段)。


3.将代码注入到已经运行的进程中,允许攻击者实现持久性。


4.将代码注入到受信任的进程中,允许攻击者绕过安全产品(如白名单软件)并躲避用户。


在本节中,我们将主要关注用户空间中的代码注入技术。我们将研究攻击者用来对远程进程进行代码注入的各种方法。


在以下代码注入技术中,有一个注入代码的恶意软件进程(启动器或加载器)和一个合法进程(如explorer.exe),代码将被注入其中。


在执行代码注入之前,启动器需要首先确定要注入代码的进程。这通常是通过列举系统上运行的进程来完成的,它使用三个API调用:CreateToolhelp32Snapshot(), Process32First(), 和Process32Next()。

CreateToolhelp32Snapshot() :用于获取所有正在运行的进程的快照。

Process32First() :获取快照中第一个进程的信息。

Process32Next() :在一个循环中用于遍历所有进程。

Process32First()和Process32Next()API获得有关进程的信息,如可执行名称、进程ID和父进程ID;这些信息可以被恶意软件用来确定它是否是目标进程。


有时,恶意程序不是将代码注入已经运行的进程,而是启动一个新的进程(如notepad.exe),然后向其中注入代码。


无论恶意软件是向已经运行的进程注入代码,还是启动一个新的进程来注入代码,所有代码注入技术(接下来会介绍)的目标都是向目标(合法)进程的地址空间注入恶意代码(无论是DLL、可执行代码,还是Shellcode),并迫使合法进程执行注入的代码。


根据代码注入技术的不同,要注入的恶意组件可以驻留在磁盘或内存中。下图应该能让各位读者对用户空间的代码注入技术有一个高层次的了解。



3.1 远程DLL注入



在这种技术中,目标(远程)进程被强迫通过LoadLibrary()API将一个恶意的DLL加载到其进程内存空间。kernel32.dll输出LoadLibrary(),该函数接受一个参数,即磁盘上DLL的路径,并将该DLL加载到调用进程的地址空间。


在这种注入技术中,恶意软件进程在目标进程中创建了一个线程,该线程通过传递恶意DLL路径作为参数来调用LoadLibrary()。由于线程在目标进程中被创建,目标进程将恶意DLL加载到其地址空间。一旦目标进程加载了恶意DLL,操作系统就会自动调用DLL的DllMain()函数,从而执行恶意代码。


下面的步骤详细描述了这种技术是如何进行的。


以一个名为nps.exe(加载器或启动器)的恶意软件为例,它通过LoadLibrary()向合法的explorer.exe进程注入一个DLL。在注入恶意的DLL组件之前,它被投放到磁盘上,然后执行以下步骤。


步骤1:

恶意软件进程(nps.exe)识别目标进程(explorer.exe,在这种情况下)并获得其进程ID(pid)(获取pid的目的是为目标进程打开一个句柄,以便恶意软件进程能够与之互动)。


要打开一个句柄,需要使用OpenProcess()API,它接受的参数之一是进程的pid。在下面的截图中,恶意软件通过传递explorer.exe的pid(0x624,即1572)作为第三个参数调用OpenProcess()。OpenProcess()的返回值是对explorer.exe进程的句柄。



步骤2:

恶意软件进程在目标进程中使用VirutualAllocEx()API分配内存。


在下面的截图中,第1个参数(0x30)是explorer.exe(目标进程)的句柄,它从上一步获得。第3个参数,0x27(39),代表目标进程中要分配的字节数,第5个参数(0x4)是一个常量值,代表PAGE_READWRITE的内存保护。VirtualAllocEx()的返回值是explorer.exe中分配的内存地址。




步骤3:

在目标进程中分配内存的原因是为了复制一个字符串,以确定磁盘上恶意DLL的完整路径。恶意软件使用WriteProcessMemory()将DLL路径名复制到目标进程的分配内存中。


在下面的截图中,第2个参数0x01E30000是目标进程中分配的内存地址,第3个参数是DLL的完整路径,将被写入explorer.exe中分配的内存地址0x01E30000。



步骤4:

将DLL路径名复制到目标进程内存的想法是,以后在目标进程中创建远程线程以及通过远程线程调用LoadLibrary()时,DLL路径将作为参数传递给LoadLibrary()。


在创建远程线程之前,恶意软件必须确定LoadLibrary()在kernel32.dll中的地址;为此,它调用GetModuleHandleA()API并传递kernel32.dll作为参数,这将返回Kernel32.dll的基地址。一旦得到kernel32.dll的基地址,它就通过调用GetProcessAddress()来确定LoadLibrary()的地址。



步骤5:

在这一点上,恶意软件已经复制了目标进程内存中的DLL路径名,并确定了LoadLibrary()的地址。现在,恶意软件需要在目标进程(explorer.exe)中创建一个线程,这个线程必须通过传递复制的DLL路径名来执行LoadLibrary(),这样恶意的DLL就会被explorer.exe加载。


要做到这一点,恶意软件调用CreateRemoteThread()(或未记录的API NtCreateThreadEx()),这在目标进程中创建一个线程。


在下面的截图中,CreateRemoteThread()的第一个参数0x30是explorer.exe进程的句柄,该线程将在其中创建。第4个参数是目标进程内存中线程将开始执行的地址,也就是LoadLibrary()的地址,第5个参数是目标进程内存中包含DLL完整路径的地址。


在调用CreateRemoteThread()后,explorer.exe中创建的线程调用LoadLibrary(),它将从磁盘上加载DLL到explorer.exe进程内存空间。作为加载恶意DLL的结果,其DLLMain()函数被自动调用,从而在explorer.exe的上下文中执行恶意代码。




步骤6:

一旦注入完成,恶意软件调用VirtualFree()API释放包含DLL路径的内存,并通过使用CloseHandle()API关闭目标进程(explorer.exe)的句柄。


一个恶意进程可以将代码注入到以相同或更低的完整性级别运行的其他进程。例如,一个以中等完整性运行的恶意软件进程可以将代码注入explorer.exe进程(它也以中等完整性级别运行)。


为了操纵系统级进程,恶意进程需要通过调用AdjustTokenPrivileges()来启用

SE_DEBUG_PRIVILEGE(这需要管理员权限);这允许它读取、写入或注入代码到另一个进程的内存。


(未完待续)




—  往期回顾  —




关于安恒信息安全服务团队安恒信息安全服务团队由九维安全能力专家构成,其职责分别为:红队持续突破、橙队擅于赋能、黄队致力建设、绿队跟踪改进、青队快速处置、蓝队实时防御,紫队不断优化、暗队专注情报和研究、白队运营管理,以体系化的安全人才及技术为客户赋能。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存