[web安全]深入理解反射式dll注入技术

本文详细介绍了反射式DLL注入技术,包括常规DLL注入的局限性、反射式DLL注入的工作原理,以及MSF migrate模块的实现。反射式注入通过避免文件落地提高隐蔽性,增加了安全产品的检测难度。此外,文章还探讨了反射式DLL注入的检测方法和攻防对抗策略。
摘要由CSDN通过智能技术生成

一、前言

dll注入技术是让某个进程主动加载指定的dll的技术。恶意软件为了提高隐蔽性,通常会使用dll注入技术将自身的恶意代码以dll的形式注入高可信进程。

常规的dll注入技术使用LoadLibraryA()函数来使被注入进程加载指定的dll。常规dll注入的方式一个致命的缺陷是需要恶意的dll以文件的形式存储在受害者主机上。这样使得常规dll注入技术在受害者主机上留下痕迹较大,很容易被edr等安全产品检测到。为了弥补这个缺陷,stephen fewer提出了反射式dll注入技术并在github开源,反射式dll注入技术的优势在于可以使得恶意的dll通过socket等方式直接传输到目标进程内存并加载,期间无任何文件落地,安全产品的检测难度大大增加。

本文将从dll注入技术简介、msf migrate模块剖析、检测思路和攻防对抗的思考等方向展开说明反射式dll注入技术。

二、dll注入技术简介

2.1 常规dll注入技术

常规dll注入有:

  1. 通过调用CreateRemoteThread()/NtCreateThread()/RtlCreateUserThread()函数在被注入进程创建线程进行dll注入。
  2. 通过调用QueueUserAPC()/SetThreadContext()函数来劫持被注入进程已存在的线程加载dll。
  3. 通过调用SetWindowsHookEx()函数来设置拦截事件,在发生对应的事件时,被注入进程执行拦截事件函数加载dll。

以使用CreateRemoteThread()函数进行dll注入的方式为例,实现思路如下:

  1. 获取被注入进程PID。
  2. 在注入进程的访问令牌中开启SE_DEBUG_NAME权限。
  3. 使用openOpenProcess()函数获取被注入进程句柄。
  4. 使用VirtualAllocEx()函数在被注入进程内开辟缓冲区并使用WriteProcessMemory()函数写入DLL路径的字符串。
  5. 使用GetProcAddress()函数在当前进程加载的kernel32.dll找到LoadLibraryA函数的地址。
  6. 通过CreateRemoteThread()函数来调用LoadLibraryA()函数,在被注入进程新启动一个线程,使得被注入进程进程加载恶意的DLL。

常规dll注入示意图如上图所示。该图直接从步骤3)开始,步骤1)和步骤2)不在赘述。

【→所有资源关注我,私信回复“资料”获取←】
1、网络安全学习路线
2、电子书籍(白帽子)
3、安全大厂内部视频
4、100份src文档
5、常见安全面试题
6、ctf大赛经典题目解析
7、全套工具包
8、应急响应笔记

2.2 反射式dll注入技术

反射式dll注入与常规dll注入类似,而不同的地方在于反射式dll注入技术自己实现了一个reflective loader()函数来代替LoadLibaryA()函数去加载dll,示意图如下图所示。蓝色的线表示与用常规dll注入相同的步骤,红框中的是reflective loader()函数行为,也是下面重点描述的地方。

Reflective loader实现思路如下:

  1. 获得被注入进程未解析的dll的基地址,即下图第7步所指的dll。
  2. 获得必要的dll句柄和函数为修复导入表做准备。
  3. 分配一块新内存去取解析dll,并把pe头复制到新内存中和将各节复制到新内存中。
  4. 修复导入表和重定向表。
  5. 执行DllMain()函数。

三、Msf migrate模块剖析

msf的migrate模块是post阶段的一个模块,其作用是将meterpreter payload从当前进程迁移到指定进程。

在获得meterpreter session后可以直接使用migrate命令迁移进程,其效果如下图所示:

migrate的模块的实现和stephen fewer的ReflectiveDLLInjection项目大致相同,增加了一些细节,其实现原理如下:

  1. 读取metsrv.dll(metpreter payload模板dll)文件到内存中。
  2. 生成最终的payload。a) msf生成一小段汇编migrate stub主要用于建立socket连接。b) 将metsrv.dll的dos头修改为一小段汇编meterpreter_loader主要用于调用reflective loader函数和dllmain函数。在metsrv.dll的config block区填充meterpreter建立session时的配置信息。c) 最后将migrate stub和修改后的metsrv.dll拼接在一起生成最终的payload。
  3. 向msf server发送migrate请求和payload。
  4. msf向迁移目标进程分配一块内存并写入payload。
  5. msf首先会创建的远程线程执行migrate stub,如果失败了,就会尝试用apc注入的方式执行migrate stub。migrate stub会调用meterpreter loader,meterpreter loader才会调用reflective loader。
  6. reflective loader进行反射式dll注入。
  7. 最后msf client和msf server建立一个新的session。

原理图如下所示:

图中红色的线表示与常规反射式dll注入不同的地方。红色的填充表示修改内容,绿色的填充表示增加内容。migrate模块的reflective loader是直接复用了stephen fewer的ReflectiveDLLInjection项目的Reflect

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值