内网渗透瑞士军刀-impacket工具解析(五)
字数 1862 2025-08-23 18:31:17

Impacket工具解析:Psexec.py 深度剖析

一、Psexec工具概述

Psexec是一款经典的Windows远程命令执行工具,最初由Mark Russinovich开发,属于Sysinternals工具集的一部分。Impacket项目中的psexec.py是基于开源项目RemCom重新实现的Python版本。

主要特点

  • 仅需SMB服务即可运行(无需安装额外服务)
  • 体积小巧(约700KB)
  • 支持交互式命令执行
  • 基于DCERPC和SMB协议实现

二、技术实现原理

1. 整体架构

Psexec采用客户端-服务端架构:

  • 客户端:psexec.py脚本
  • 服务端:RemComSVC服务程序(嵌入在Python代码中)

2. 工作流程

  1. 通过SMB连接将RemComSVC程序上传到目标服务器
  2. 使用SCMR(服务控制管理器RPC)创建并启动服务
  3. 通过命名管道进行客户端与服务端的通信
  4. 执行命令并将结果返回给客户端

三、RemComSVC服务端深度解析

1. 服务入口点

  • _ServiceMain函数是服务的主入口点
  • 主要功能:
    • 启动CommunicationPoolThread线程处理客户端请求
    • 监听服务退出事件
    • 服务退出时执行自删除

2. 通信线程

  • CommunicationPoolThread线程:

    • 创建命名管道(RemCom_communicaton
    • 为每个连接创建CommunicationPipeThreadProc线程
  • CommunicationPipeThreadProc线程:

    • 使用ReadFile读取客户端消息
    • 调用Execute处理命令
    • 将结果写入管道返回给客户端

3. 数据结构

// 客户端请求结构
struct RemComMessage {
    char szCommand[MAX_PATH];
    char szWorkingDir[MAX_PATH];
    DWORD dwPriority;
    DWORD dwProcessId;
    char szMachine[MAX_COMPUTERNAME_LENGTH + 1];
};

// 服务端响应结构
struct RemComResponse {
    DWORD dwErrorCode;
    DWORD dwReturnCode;
};

4. 命令执行过程

  1. 创建三个命名管道用于I/O重定向:

    • RemCom_stdout
    • RemCom_stdin
    • RemCom_stderr
  2. 管道命名规则:

    \\.\pipe\RemCom_stdout_<机器名>_<PID>
    \\.\pipe\RemCom_stdin_<机器名>_<PID>
    \\.\pipe\RemCom_stderr_<机器名>_<PID>
    
  3. 调用CreateProcess创建进程:

    • 命令来自szCommand字段
    • 标准I/O重定向到上述管道

四、psexec.py客户端实现解析

1. 主要执行流程

  1. 初始化RPC连接(端点:\pipe\svcctl
  2. 调用doStuff方法:
    • 建立SMB连接
    • 使用ServiceInstall类安装服务

2. 服务安装细节

  • ServiceInstall类:
    • 自动生成服务名(4字节ASCII字母)
    • 自动生成服务程序名(8字节ASCII字母)
    • 通过RPC寻找可写共享路径
    • 将服务文件复制到目标路径
    • 创建并启动服务

3. 管道通信实现

  1. 连接RemCom_communicaton命名管道
  2. 构造RemComMessage数据包并写入管道
  3. 创建三个线程处理I/O:
    • RemoteStdInPipe
    • RemoteStdOutPipe
    • RemoteStdErrPipe

4. 交互式Shell实现

  • RemoteShell类继承自Cmd
  • 支持的命令:
    • help:显示帮助信息
    • lcd:切换本地工作目录
    • lget:从目标下载文件(使用SMBConnection.getFile
    • shell:在本地执行系统命令
    • 其他命令:写入标准输入管道

五、安全特征分析

1. 可检测特征

  1. 文件特征

    • RemComSVC二进制硬编码内容
    • 服务文件必须落地到目标系统
  2. 服务特征

    • 服务名随机生成(4字节ASCII)
    • 服务程序名随机生成(8字节ASCII)
  3. 网络特征

    • 硬编码命名管道名称RemCom_communicaton
    • 特定模式的管道命名(RemCom_std*前缀)
    • 服务创建和共享访问行为

2. 防御建议

  1. 检测层面

    • 监控异常的服务创建行为
    • 检测对RemCom_*命名管道的访问
    • 分析SMB共享中的可疑文件写入
  2. 防护层面

    • 限制SMB协议的访问权限
    • 实施服务创建白名单
    • 启用高级威胁检测机制

六、技术总结

Psexec.py通过巧妙组合DCERPC和命名管道技术实现了Windows平台的远程交互式Shell,其核心技术要点包括:

  1. 服务部署机制

    • 利用SCMR RPC远程安装服务
    • 自动寻找可写共享路径
  2. 进程交互设计

    • 主通信管道+三个I/O重定向管道
    • 基于机器名和PID的管道隔离
  3. 客户端实现

    • 完整的交互式Shell功能
    • 支持文件下载等扩展功能

尽管该工具存在明显的可检测特征,但其设计思路仍值得安全研究人员深入学习和理解,特别是在Windows内部机制和远程管理技术方面。

Impacket工具解析:Psexec.py 深度剖析 一、Psexec工具概述 Psexec是一款经典的Windows远程命令执行工具,最初由Mark Russinovich开发,属于Sysinternals工具集的一部分。Impacket项目中的psexec.py是基于开源项目RemCom重新实现的Python版本。 主要特点 仅需SMB服务即可运行(无需安装额外服务) 体积小巧(约700KB) 支持交互式命令执行 基于DCERPC和SMB协议实现 二、技术实现原理 1. 整体架构 Psexec采用客户端-服务端架构: 客户端 :psexec.py脚本 服务端 :RemComSVC服务程序(嵌入在Python代码中) 2. 工作流程 通过SMB连接将RemComSVC程序上传到目标服务器 使用SCMR(服务控制管理器RPC)创建并启动服务 通过命名管道进行客户端与服务端的通信 执行命令并将结果返回给客户端 三、RemComSVC服务端深度解析 1. 服务入口点 _ServiceMain 函数是服务的主入口点 主要功能: 启动 CommunicationPoolThread 线程处理客户端请求 监听服务退出事件 服务退出时执行自删除 2. 通信线程 CommunicationPoolThread 线程: 创建命名管道( RemCom_communicaton ) 为每个连接创建 CommunicationPipeThreadProc 线程 CommunicationPipeThreadProc 线程: 使用 ReadFile 读取客户端消息 调用 Execute 处理命令 将结果写入管道返回给客户端 3. 数据结构 4. 命令执行过程 创建三个命名管道用于I/O重定向: RemCom_stdout RemCom_stdin RemCom_stderr 管道命名规则: 调用 CreateProcess 创建进程: 命令来自 szCommand 字段 标准I/O重定向到上述管道 四、psexec.py客户端实现解析 1. 主要执行流程 初始化RPC连接(端点: \pipe\svcctl ) 调用 doStuff 方法: 建立SMB连接 使用 ServiceInstall 类安装服务 2. 服务安装细节 ServiceInstall 类: 自动生成服务名(4字节ASCII字母) 自动生成服务程序名(8字节ASCII字母) 通过RPC寻找可写共享路径 将服务文件复制到目标路径 创建并启动服务 3. 管道通信实现 连接 RemCom_communicaton 命名管道 构造 RemComMessage 数据包并写入管道 创建三个线程处理I/O: RemoteStdInPipe RemoteStdOutPipe RemoteStdErrPipe 4. 交互式Shell实现 RemoteShell 类继承自 Cmd 类 支持的命令: help :显示帮助信息 lcd :切换本地工作目录 lget :从目标下载文件(使用 SMBConnection.getFile ) shell :在本地执行系统命令 其他命令:写入标准输入管道 五、安全特征分析 1. 可检测特征 文件特征 : RemComSVC二进制硬编码内容 服务文件必须落地到目标系统 服务特征 : 服务名随机生成(4字节ASCII) 服务程序名随机生成(8字节ASCII) 网络特征 : 硬编码命名管道名称 RemCom_communicaton 特定模式的管道命名( RemCom_std* 前缀) 服务创建和共享访问行为 2. 防御建议 检测层面 : 监控异常的服务创建行为 检测对 RemCom_* 命名管道的访问 分析SMB共享中的可疑文件写入 防护层面 : 限制SMB协议的访问权限 实施服务创建白名单 启用高级威胁检测机制 六、技术总结 Psexec.py通过巧妙组合DCERPC和命名管道技术实现了Windows平台的远程交互式Shell,其核心技术要点包括: 服务部署机制 : 利用SCMR RPC远程安装服务 自动寻找可写共享路径 进程交互设计 : 主通信管道+三个I/O重定向管道 基于机器名和PID的管道隔离 客户端实现 : 完整的交互式Shell功能 支持文件下载等扩展功能 尽管该工具存在明显的可检测特征,但其设计思路仍值得安全研究人员深入学习和理解,特别是在Windows内部机制和远程管理技术方面。