Psexec是怎么工作的?Psexec与官方服务端组件PsexeSvc.exe的交互
字数 3008
更新时间 2026-04-24 12:05:22

PsExec 工作原理与交互流程详解

1. 概述

PsExec 是一款功能强大的 Windows 远程命令执行工具,主要用于在远程主机上执行命令行程序。其核心工作原理是通过网络与远程主机上运行的官方服务端组件 PsexeSvc.exe 进行交互,从而实现对远程主机的控制。

2. 核心组件

  • 客户端 (PsExec.exe):运行在控制端(攻击者或管理员)的机器上,用于发起远程执行命令的请求。
  • 服务端 (PsexeSvc.exe):一个由客户端上传并安装在目标主机上的服务程序,负责接收并执行远程命令。

3. 工作流程

3.1 连接与身份认证

  1. 建立连接:客户端首先与远程主机的 445 端口(SMB 服务端口)建立连接。
  2. 身份验证:客户端通过 SMB 协议,使用提供的凭据(用户名和密码)向远程主机进行身份验证。
  3. **IPC\( 共享访问**:验证成功后,客户端连接到远程主机的 `IPC\)` 管理共享,为后续的远程操作建立通道。

3.2 服务端组件部署与启动

  1. 上传 PsexeSvc.exe
    • 客户端通过已建立的 SMB 连接,将 PsexeSvc.exe 可执行文件上传到远程主机的 ADMIN$ 共享(通常映射为 C:\Windows 目录)或其他可写共享目录中。
  2. 创建并启动服务
    • 客户端通过远程服务管理器(Service Control Manager, SCM)在目标主机上创建一个新的 Windows 服务。这个服务被配置为自动启动 PsexeSvc.exe
    • 服务启动后,PsexeSvc.exe 在远程主机上以 SYSTEM 权限或指定用户的权限运行。

3.3 进程间通信管道的建立

这是 PsExec 运行的核心机制,确保了客户端与服务端之间的交互。

  1. 命名管道创建PsexeSvc.exe 启动后,会在远程主机上创建一个命名管道(Named Pipe)。默认的管道名称通常为 \\.\pipe\psexesvc,但可以自定义。
  2. 管道连接:客户端的 PsExec.exe 通过网络连接到远程主机上由 PsexeSvc.exe 创建的命名管道。这个连接是通过 SMB 协议在 445 端口上建立的,但实际数据传输是在这个专用管道中进行,从而绕过了标准输入/输出的限制。

3.4 远程命令执行与会话交互

  1. 命令传递:客户端将要执行的命令(例如 cmd.exe 或任何其他命令行指令)通过建立的命名管道发送给 PsexeSvc.exe
  2. 进程创建PsexeSvc.exe 在远程主机上以指定权限创建子进程来运行接收到的命令。
  3. 输入/输出/错误重定向
    • 标准输入 (stdin):客户端发送的输入数据通过管道传递给远程进程。
    • 标准输出 (stdout) 和标准错误 (stderr):远程进程的输出和错误信息通过管道回传给客户端。
  4. 交互式会话:通过这种双向管道通信,用户可以像在本地一样与远程命令行进行交互。

3.5 会话结束与清理

  1. 命令执行完成:远程进程结束后,PsexeSvc.exe 会通过管道将进程退出代码返回给客户端。
  2. 服务停止与删除:默认情况下,PsExec 会在命令执行完成后,通过 SCM 停止并删除它创建的临时服务。
  3. 文件清理:客户端可能会尝试删除之前上传的 PsexeSvc.exe 可执行文件,但这取决于具体参数和权限设置。

4. 交互协议的 Python 模拟实现

文档中提供了交互关键步骤的 Python 代码逻辑,用于理解协议细节:

  1. 建立 SMB 连接与认证

    • 使用 impacket 库的 SMBConnection 类与目标主机的 445 端口建立连接并进行 NTLM 身份验证。
  2. 文件上传

    • 通过 putFile() 方法,将本地的 PsexeSvc.exe 文件上传到远程主机的 ADMIN$ 共享(即 C:\Windows 目录)。
  3. 远程服务操作

    • 通过 svcctl 协议(MS-RPC)连接到远程服务管理器(SCM)。
    • 使用 OpenSCManagerW 打开 SCM 句柄。
    • 使用 CreateServiceW 创建一个新的服务,其可执行文件路径指向刚刚上传的 PsexeSvc.exe
    • 使用 StartServiceW 启动该服务,触发 PsexeSvc.exe 运行。
  4. 连接到命名管道

    • 服务启动后,使用 SMB 连接的 connectTree() 方法连接到 IPC$ 共享。
    • 使用 openFile() 方法打开由 PsexeSvc.exe 创建的命名管道(如 \pipe\psexesvc)。
  5. 通过管道进行数据交换

    • 通过管道的句柄,使用 read(), write(), transactNamedPipe() 等方法与 PsexeSvc.exe 进行双向通信,发送命令并接收输出。
  6. 清理

    • 命令执行完毕后,通过 SCM 的 ControlService() 停止服务,并使用 DeleteService() 删除服务。
    • 最后,关闭所有打开的句柄和连接。

5. 防御与检测技巧

基于其工作原理,可以采取以下方法进行防御和检测:

5.1 防御措施

  1. 网络层防护
    • 在防火墙或主机防火墙上,严格控制 445 端口(SMB)的入站访问,仅允许来自可信管理网络的连接。
  2. 共享权限加固
    • 严格限制 ADMIN$C$ 等管理共享的访问权限,仅允许必要的管理账户访问。
    • 在非服务器的客户端系统上,可以考虑禁用不必要的网络共享。
  3. 凭据保护
    • 避免在所有主机上使用相同的高权限账户密码,防止凭据在单台主机失陷后横向移动。
    • 使用强密码并定期更换。
  4. 服务创建限制
    • 通过组策略(GPO)或本地安全策略,限制非管理员用户创建或修改服务的能力。
  5. 端点检测与响应 (EDR)
    • 部署 EDR 安全产品,监控并告警可疑的服务创建行为(尤其是在临时目录或非标准路径下创建服务)和命名管道的创建与通信。

5.2 检测方法

  1. 进程监控
    • 监控系统上 PsexeSvc.exe 或名称类似的可疑进程的启动。注意攻击者可能对文件进行重命名。
  2. 服务监控
    • 监控短时间内创建和删除的 Windows 服务,特别是由网络连接触发的服务创建。
  3. 网络流量分析
    • 检测来自非管理网段、针对 445 端口的异常 SMB 连接,特别是连接成功后紧接着出现的命名管道(\pipe\psexesvc 或变体)访问流量。
  4. 文件系统监控
    • 监控 C:\WindowsADMIN$ 共享目录下突然出现的、非系统自带的 .exe 文件(如 PsexeSvc.exe)。
  5. 日志审计
    • 启用并集中审计 Windows 安全日志(事件 ID 4688:进程创建,事件 ID 7045:服务创建)和 Sysmon 日志(如果能部署),分析相关事件。

(注:本文档是基于奇安信攻防社区分享的《Psexec是怎么工作的?Psexec与官方服务端组件PsexeSvc.exe的交互》文章核心内容整理而成,涵盖了连接建立、服务部署、管道通信、命令执行及防御检测等关键技术环节。)

相似文章
相似文章
 全屏