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

admin 2023年1月30日00:44:07评论23 views字数 6461阅读21分32秒阅读模式

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

写在前边

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》






3.4.3 攻击者如何使用垫片

下面的步骤描述了攻击者可能以何种方式将一个应用程序进行修饰并安装在受害者系统上。

1. 攻击者为目标应用程序(如notepad.exe,或受害者经常使用的任何合法第三方应用程序)创建一个应用程序兼容性数据库(shim数据库)。攻击者可以选择一个垫片(如InjectDll)或多个垫片。

2. 攻击者保存为目标应用程序创建的shim数据库(.sdb文件)。

3. .sdb文件被传递并丢在受害者系统上(主要是通过恶意软件)并被安装,通常使用sdbinst工具。

4. 攻击者调用目标应用程序或等待用户执行目标应用程序。

5. 攻击者也可能删除安装shim数据库的恶意软件。在这种情况下,就只剩下.sdb文件了。攻击者只需将.sdb文件放到文件系统的某个位置,并修改最小的注册表项集,就可以安装一个shim数据库。这种技术避免了使用sdbinst工具。


注:shim_persist是一个由安全研究员Hasherezade编写的POC。它将一个DLL并安装一个垫片,而不使用sdbinst工具将所丢的DLL注入explorer.exe进程。


shim_persist项目查看网址:https://github.com/hasherezade/persistence_demos/tree/master/shim_persist

*左右滑动查看更多


恶意软件作者出于不同的目的滥用了垫片,如实现持久性、代码注入、禁用安全功能、以高权限执行代码和绕过用户账户控制(UAC)提示。下表概述了一些有趣的垫片和它们的描述。


Shim名称

描述

RedirectEXE

重定向执行

InjectDll

将DLL注入到应用程序中

DisableNXShowUI

禁用数据执行预防(DEP)

CorrectFilePaths

重定向文件系统路径

VirtualRegistry

注册表重定向

RelaunchElevated

以较高的权限启动应用程序

TerminateExe

在启动时终止可执行程序

DisableWindowsDefender

禁用应用程序的Windows Defender服务

RunAsAdmin

标记一个应用程序以管理员权限运行


*关于在攻击中如何使用垫片的更多信息,请参阅安全研究人员在各种会议上发表的谈话,可在该网址内查阅:

https://sdb.tools/talks.html








3.4.4 分析Shim数据库

为了对一个应用程序进行垫片,攻击者会安装垫片数据库(.sdb),该数据库驻留在受害者的文件系统的某个地方。假设你已经确定了恶意活动中使用的.sdb文件,你可以通过使用诸如sdb-explorer或python-sdb的工具来调查.sdb文件。

sdb-explorer项目网址:https://github.com/evil-e/sdb-explorerpython-sdb项目网址:https://github.com/williballenthin/python-sdb

*左右滑动查看更多


在下面的例子中,python-sdb工具被用来调查我们先前创建的shim数据库(.sdb)文件。在shim数据库上运行python-sdb显示其元素,如下所示。

$ python sdb_dump_database.py notepad.sdb <DATABASE><TIME type='integer'>0x1d3928964805b25</TIME> <COMPILER_VERSION type='stringref'>2.1.0.3</COMPILER_VERSION> <NAME type='stringref'>notepad</NAME><OS_PLATFORM type='integer'>0x1</OS_PLATFORM><DATABASE_ID type='guid'>ed41a297-9606-4f22-93f5-b37a9817a735</DATABASE_ID> <LIBRARY>   </LIBRARY>      <EXE><NAME type='stringref'>notepad.exe</NAME><APP_NAME type='stringref'>notepad</APP_NAME><VENDOR type='stringref'>&lt;Unknown&gt;</VENDOR><EXE_ID type='hex'>a65e89a9-1862-4886-b882-cb9b888b943c</EXE_ID> <MATCHING_FILE>          <NAME type='stringref'>*</NAME>        </MATCHING_FILE>        <SHIM_REF><NAME type='stringref'>InjectDll</NAME><COMMAND_LINE type='stringref'>c:testabcd.dll</COMMAND_LINE> </SHIM_REF>      </EXE>   </DATABASE>

*左右滑动查看更多


在其中一次攻击中,RedirectEXE shim被dridex恶意软件用来绕过UAC。它安装了shim数据库,并在提升权限后立即将其删除。

sdbinst.exe /q /u "C:Usersuser_nameAppDataLocalLow$$$.sdb"

*左右滑动查看更多


*更多细节,可参考网址:

https://blogs.jpcert.or.jp/en/2015/02/a-new-uac-bypass-method-that-dridex-uses.html

*左右滑动查看更多


3.5 远程可执行程序/外壳代码注入



在这种技术中,恶意代码被直接注入到目标进程的内存中,而不在磁盘上丢弃组件。恶意代码可以是一个shellcode或一个可执行文件,其导入地址表是为目标进程配置的。注入的恶意代码通过CreateRemoteThread()创建一个远程线程来强制执行,并使该线程的起点指向注入的代码块中的代码/函数。


这种方法的优点是,恶意软件进程不必在磁盘上投放恶意DLL;它可以从二进制文件的资源部分提取要注入的代码,或者通过网络获取,直接进行代码注入。


下面的步骤描述了这种技术的执行方式,以一个名为nsasr.exe(W32/Fujack)的恶意软件样本为例,它将可执行文件注入Internet Explorer(iexplorer.exe)进程。


步骤1:

恶意软件进程(nsasr.exe)使用OpenProcess()API打开Internet Explorer进程(iexplore.exe)的一个句柄。


步骤2:

它在目标进程(iexplore.exe)中分配内存的一个特定地址 0x13150000。地址 0x13150000 使用带有PAGE_EXECUTE_READWRITE保护的VirutualAllocEx(),而不是PAGE_READWRITE(与远程DLL注入技术相比)。


PAGE_EXECUTE_READWRITE保护允许恶意软件进程(nsasr.exe)将代码写入目标进程,在写入代码后,这种保护允许目标进程(iexplore.exe)从该内存读取和执行代码。


步骤3:

它使用WriteProcessMemory()将恶意的可执行内容写入上一步分配的内存中。在下面的截图中,第一个参数 0xD4 是iexplore.exe的句柄。第二个参数 0x13150000 是目标进程(iexplore.exe)中的地址。内存中的地址,内容将被写入其中。第三个参数 0x13150000 是恶意软件(nsasr.exe)进程内存中的缓冲区;这个缓冲区包含可执行内容,它将被写入目标进程内存。

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


步骤4:

恶意可执行内容被写入(地址为0x13150000)iexplore.exe进程内存后,它调用CreateRemoteThread()API来创建一个远程线程,并使线程的起始地址指向注入的可执行文件的入口地址。


在下面的截图中,第四个参数 0x13152500 指定了目标进程(iexplore.exe)内存中线程开始执行的地址;这是注入的可执行文件的入口地址。在这一点上,注入已经完成,iexplore.exe进程中的线程开始执行恶意代码。

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


反射性DLL注入是一种类似于远程可执行文件/ShellCode注入的技术。在这种方法中,包含反射式加载器组件的DLL被直接注入,而目标进程则要调用反射式加载器组件,该组件负责解决导入问题,将其重新定位到一个合适的内存位置,并调用DllMain()函数。


这种技术的优点是它不依赖于LoadLibrary()函数来加载DLL。由于LoadLibrary()只能从磁盘上加载库,注入的DLL不需要驻留在磁盘上。


*关于这项技术的更多信息,请参考Stephen Fewer的Reflective DLL Injection。

项目网址:https://github.com/stephenfewer/ReflectiveDLLInjection

*左右滑动查看更多


3.6 hollow进程注入

(进程hollowing中空)



进程空洞化,或空洞进程注入,是一种代码注入技术。其中合法进程在内存中的可执行部分,被替换为恶意的可执行文件。这种技术允许攻击者将其恶意软件伪装成合法进程并执行恶意代码。


这种技术的好处是被掏空的进程的路径仍然会指向合法的路径,而且通过在合法进程的上下文中执行,恶意软件可以绕过防火墙和主机入侵防御系统。


例如如果svchost.exe进程被掏空,其路径仍将指向合法的可执行路径(C:Windowssystem32svchost

.exe),但是只有在内存中,svchost.exe的可执行部分被替换为恶意代码;这使得攻击者可以不被现场取证工具检测到。


下面的步骤描述了恶意软件样本(Skeeyah)执行的空心程序注入。在下面的描述中,恶意软件进程在执行这些步骤之前,从其资源部分提取要注入的恶意可执行文件。


步骤1:

恶意软件进程在暂停模式下启动一个合法进程。因此,合法进程的可执行部分被加载到内存中,内存中的进程环境块(PEB)结构确定了合法进程的完整路径。


PEB的ImageBaseAddress段包含合法进程可执行文件被加载的地址。在下面的截图中,恶意软件以暂停模式启动合法的svchost.exe进程,在这种情况下,svchost.exe被加载到地址0x01000000。

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


步骤2:

恶意软件确定了PEB结构的地址,这样它就可以读取PEB.ImageBaseAddress字段来确定进程可执行文件(svchost.exe)的基本地址。为了确定PEB结构的地址,它调用GetThreadContext()。


GetThreadContext()检索指定线程的上下文,它需要两个参数:第1个参数是线程的句柄,第2个参数是一个指向结构的指针,名为CONTEXT。在这种情况下,恶意软件将悬浮线程的句柄作为GetThreadContext()的第1个参数,并将指向CONTEXT结构的指针作为第2个参数。


在这个API调用后,CONTEXT结构被填充了暂停线程的上下文。该结构包含暂停线程的寄存器状态。然后,恶意软件读取CONTEXT._Ebx字段,它包含指向PEB数据结构的指针。一旦确定了PEB的地址,它就会读取PEB.ImageBaseAddress,以确定进程可执行文件的基础地址(换句话说,0x01000000)。

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


另一种确定指向PEB的指针的方法是使用NtQueryInformationProcess()函数;详情可参见

https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280(v=vs.85).aspx或https://learn.microsoft.com/zh-cn/windows/win32/api/winternl/nf-winternl-ntqueryinformationprocess?redirectedfrom=MSDN

*左右滑动查看更多


步骤3:

一旦确定了目标进程可执行文件在内存中的地址,它就会使用NtUnMapViewofSection()API来取消合法进程(svchost.exe)的可执行部分的分配。


在下面的截图中,第一个参数是svchost.exe进程的句柄(0x34),第二个参数是要取消分配的进程可执行文件的基本地址(0x01000000)。

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


步骤4:

进程可执行部分被掏空后,它在合法进程(svchost.exe)中分配了一个新的内存段,具有读、写和执行权限。新的内存段可以分配在同一地址(空洞化之前进程可执行部分所在的位置)或不同的区域。


在下面的截图中,恶意软件使用VirutalAllocEX()来分配不同区域的内存(在这种情况下,在0x00400000)。

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


步骤5:

它使用WriteProcessMemory()将恶意的可执行文件及其部分复制到新分配的内存地址0x00400000。

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


步骤6:

恶意软件用新分配的地址覆盖了合法进程的PEB.ImageBaseAdress。下面的截图显示了恶意软件用新的地址(0x00400000)覆盖了svchost.exe的PEB.ImageBaseAdress;这改变了svchost.exe在PEB中的基础地址,从0x1000000到0x00400000(这个地址现在包含注入的可执行文件)。

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


步骤7:

恶意软件改变了暂停线程的起始地址,使其指向注入的可执行文件的入口点地址。这是通过设置CONTEXT._Eax值并调用SetThreadContext()。在这一点上,暂停进程的线程指向被注入的代码。然后它使用ResumeThread()恢复被暂停的线程。在这之后,恢复的线程开始执行注入的代码。

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


恶意软件进程可能只是使用NtMapViewSection()来避免使用VirtualAllocEX()和WriteProcessMemory()将恶意可执行文件内容写入目标进程;这使得恶意软件可以将一段内存(包含恶意可执行文件)从自己的地址空间映射到目标进程的地址空间。除了前面描述的技术外,攻击者已经知道使用空心进程注入技术的不同变化。


要了解这一点,请观看作者在黑帽会议上的演讲或阅读相关博文:

https://www.youtube.com/watch?v=9L9I1T5QDg4https://cysinfo.com/detecting-deceptive-hollowing-techniques/

*左右滑动查看更多


(未完待续)




—  往期回顾  —


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

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

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

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

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



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

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


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

原文始发于微信公众号(安恒信息安全服务):九维团队-青队(处置)| 代码注入和钩子(六)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年1月30日00:44:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   九维团队-青队(处置)| 代码注入和钩子(六)https://cn-sec.com/archives/1390563.html

发表评论

匿名网友 填写信息