**郑重声明:**本文所涉安全技术仅限用于合法研究与学习目的,严禁任何形式的非法利用。因不当使用所导致的一切法律与经济责任,本人概不负责。任何形式的转载均须明确标注原文出处,且不得用于商业目的。
🔋 点赞 | 能量注入 ❤️ 关注 | 信号锁定 🔔 收藏 | 数据归档 ⭐️ 评论| 保持连接💬
🌌 立即前往 👉晖度丨安全视界🚀
▶ 信息收集
▶ 漏洞检测
▶ 初始立足点▶ 权限提升 ➢ Windows权限提升 ➢ 动态链接库(dll)文件劫持(上) 🔥🔥🔥
▶ 横向移动▶ 报告/分析
▶ 教训/修复
目录
[1.1 Windows服务DLL劫持攻击](#1.1 Windows服务DLL劫持攻击)
[1.1.1 DLL基础概念](#1.1.1 DLL基础概念)
[1.1.2 DLL劫持攻击方式](#1.1.2 DLL劫持攻击方式)
[1.1.2.1 DLL搜索顺序](#1.1.2.1 DLL搜索顺序)
[1.1.2.2 利用"缺失DLL"场景攻击](#1.1.2.2 利用"缺失DLL"场景攻击)
[1.1.2.3 防御建议](#1.1.2.3 防御建议)
[1.1.3 利用缺失DLL的服务劫持攻击实践](#1.1.3 利用缺失DLL的服务劫持攻击实践)
[1.1.3.1 枚举运行中的服务并检查服务二进制文件的权限(无写入权限)](#1.1.3.1 枚举运行中的服务并检查服务二进制文件的权限(无写入权限))
[1.1.3.2 使用进程监视器查看服务的进程调用dll情况](#1.1.3.2 使用进程监视器查看服务的进程调用dll情况)
[2.Process Monitor分析DLL加载](#2.Process Monitor分析DLL加载)
[欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论](#欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论)
1.Windows权限提升
在渗透测试中,我们通常以非特权用户 身份获得初始立足点。但为了深入探测(如搜索敏感信息、提取密码哈希等),往往需要提升至管理员权限( 比如:使用Mimikatz提取密码哈希**),** 这个过程就是特权提升。
📊 权限提升三大路径: 本文开始介绍:++动态链接库(dll)文件劫持++。
| 阶段 | 目标 | 关键方法 |
|---|---|---|
| 1. 枚举Windows | 获取系统情报 | 手动搜索 + 自动化工具 |
| 2. 滥用Windows服务 | 攻击服务漏洞 | 服务配置缺陷、权限滥用 |
| 3. 利用其他组件 | 扩大攻击面 | 计划任务、系统漏洞利用 |
1.1 Windows服务DLL劫持攻击
"替换服务的二进制文件 "是尝试在Windows系统上提升权限的一种非常有效的方法。然而,由于普通用户通常没有权限替换这些二进制文件时,需要采用更高级的方式来利用Windows服务。
1.1.1 DLL基础概念
**动态链接库(DLL)**是Windows系统中的共享功能库,允许多个程序复用同一代码资源,避免重复开发。
| 特性 | 描述 |
|---|---|
| 功能 | 提供可复用的代码和资源(如图标、函数) |
| 类比 | Unix/Linux中的共享对象(.so文件) |
| 优势 | 节省资源,提高开发效率 |
1.1.2 DLL劫持攻击方式
两种DLL劫持攻击方式:
| 攻击类型 | 原理 | 潜在影响 |
|---|---|---|
| 🔧 直接覆盖DLL | 替换服务使用的合法DLL文件 | 服务功能可能异常,但恶意代码已执行 |
| 🗺️ 劫持搜索顺序 | 利用DLL加载优先级放置恶意DLL | 更隐蔽,可保持原功能 |
1.1.2.1 DLL搜索顺序
⚠️ 关键安全发现
-
上图中:在 安全模式下,当前目录仅排搜索顺序的第5位,降低了劫持风险
-
但禁用安全模式 时,当前目录升至第2位,风险显著增加
-
应用程序目录 始终是第一搜索位置,这是攻击重点
1.1.2.2 利用"缺失DLL"场景攻击
🚨 攻击前提
当服务尝试加载系统中不存在的DLL 时,攻击者++放置同名恶意DLL在搜索路径中++,然后:
🔄 攻击流程
bash
服务启动 → 查找缺失DLL → 按搜索顺序扫描 → 加载恶意DLL → 执行恶意代码
💡 攻击优势
-
无需替换原DLL:不会破坏服务原有功能
-
利用安装缺陷:不完整的安装或更新常导致DLL缺失
-
隐蔽性较高:服务可能正常运作,仅部分功能受限
****【思路】****为了利用这种情况,尝试将一个恶意DLL(与缺少的DLL同名)放置在DLL搜索顺序的路径中,以便在启动二进制文件时执行。
1.1.2.3 防御建议
| 防御措施 | 实施方法 |
|---|---|
| 启用安全DLL搜索 | 确保注册表项HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode设置为1 |
| 签名验证 | 对关键DLL实施数字签名验证 |
| 权限控制 | 严格限制对应用程序目录的写入权限 |
| 完整性检查 | 定期校验系统DLL的完整性 |
| 最小权限原则 | 服务账户仅授予必要目录的读取权限 |
💎 根本教训:任何以高权限加载外部代码的机制,都必须严格控制加载源和完整性验证。
1.1.3 利用缺失DLL的服务劫持攻击实践
1.1.3.1 枚举运行中的服务并检查服务二进制文件的权限(无写入权限)
通过RDP连接到CLIENTWK220, 并使用用户名steve和密码securityIsNotAnOption++++++登录。启动PowerShell,然后枚举服务。我们跳过服务发现步骤,发现BetaService服务。

检查服务的二进制文件的权限: 显示用户steve没有替换二进制文件的权限 ,因为权限是RX。因此,需要进一步调查枚举。

1.1.3.2 使用进程监视器查看服务的进程调用dll情况
1.攻击发现流程

我们使用进程监视器(Process Monitor) 来显示任何**++进程、线程、文件系统++** ++或++ **++注册表++**相关活动的实时信息。
注意: 需要**++管理员权限++**才能启动Process Monitor并收集这些数据。
🎯 核心分析目标与策略:
| 分析方向 | 具体目标 | 攻击策略 |
|---|---|---|
| 🔍 现有DLL分析 | 识别服务加载的所有DLL | 检查权限,寻找可替换的合法DLL |
| ⚠️ 缺失DLL检测 | 发现NAME NOT FOUND状态的DLL调用 |
按搜索顺序在优先路径放置恶意DLL |
💡 攻击决策矩阵:
| 发现情况 | 攻击可行性 | 所需条件 | 风险级别 |
|---|---|---|---|
| 可写现有DLL | 🟢 高 | 对DLL文件有写入权限 | 🟡 中等 |
| 缺失DLL+优先路径可写 | 🟢 高 | 对搜索顺序靠前目录有写入权 | 🟢 较低 |
| 缺失DLL+路径不可写 | 🔴 低 | 需要其他权限提升方法 | 🔴 高 |
不幸的是,用户steve没有管理员权限。然而在渗透测试中,将服务二进制文件BetaServ.exe复制到本地自己的windows机器。在这个系统上,我们可以在本地安装服务(BetaServ.exe),并使用具有管理员权限的Process Monitor列出所有DLL活动。
2.Process Monitor分析DLL加载
我们把BetaServ.exe文件移植到具有管理员权限的Process Monitor的主机上进行检查。
📋 操作步骤:
| 步骤 | 具体操作 | 目的 |
|---|---|---|
| 1. 权限启动 | 以backupadmin管理员身份运行Procmon64.exe | 获取必要的监控权限 |
| 2. 精准过滤 | 创建进程名=BetaServ的过滤器 | 聚焦目标服务,排除无关干扰 |
| 3. 触发监控 | 重启BetaService服务 | 激活服务的DLL加载行为 |
| 4. 关键发现 | 观察CreateFile调用,发现myDLL.dll的NAME NOT FOUND状态 | 确认存在缺失DLL漏洞 |
①以backupadmin身份启动Process Monitor

②创建服务进程BetaServ的过滤器
创建一个过滤器,只包括目标服务的进程BetaServ相关的事件。为此,我们将点击**Filter菜单 > Filter...**进入过滤器配置。
我们的目标是:Process Monitor只显示与BetaServ进程相关的事件。过滤器由四个条件组成。按照下图红框进行配置,输入后将点击添加:

应用过滤器后,列表为空。为了分析服务二进制文件,我们尝试重新启动服务,因为二进制文件将尝试加载DLL。
③重新启动BetaService服务
在PowerShell中,重新启动BetaService服务,同时在后台运行Process Monitor。

3.查看BetaService服务的进程的dll搜索顺序
检查Process Monitor,注意到出现了许多事件。在列表中向下滚动,可找到各种CreateFile调用在操作列中。
CreateFile函数用于创建或打开文件。注意到,CreateFile调用试图在几个路径中打开名为myDLL.dll 的文件。详细列中显示这些调用的状态为NAME NOT FOUND。
这意味着:在这些路径中找不到具有该名称的DLL。

🔍 DLL搜索路径顺序:
上图显示,连续的函数调用按照"DLL搜索顺序 "进行,从应用程序所在的目录开始,以PATH环境变量中的目录结束。我们可通过在PowerShell中显示此环境变量的内容来确认这一点,使用**$env:path**命令。
1️⃣ c:\Users\steve\Documents\ ← 应用程序目录(当前)
2️⃣ C:\Windows\System32\
3️⃣ C:\Windows\System\
4️⃣ C:\Windows\
5️⃣ 当前工作目录
6️⃣ PATH环境变量目录


⚠️ 安全漏洞确认:
-
目标DLL :
myDLL.dll在系统中不存在 -
加载尝试:服务按标准搜索顺序连续查找该文件
-
全部失败 :所有路径均返回
NAME NOT FOUND
4.攻击机会
为了利用这一点,尝试将恶意DLL命名为myDLL.dll ,并写入DLL搜索顺序使用的第一个路径:++++应用程序加载路径++++ 。这里是c:\Users\steve\Documents。恰好它是steve的主目录,因此我们有权限把恶意dll文件写入这个文件夹,然后重新启动服务来加载它。
服务加载缺失DLL + 用户对优先搜索路径有写入权限 = DLL劫持攻击可行
欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论
每一份支持,都是我持续输出的光。
