Sysinternals Suite;分为 32 位 (ps*.exe)、64 位 (ps*64.exe) 版本。 公共底层: 远程全部依赖 SMB‑RPC / IPC$ 命名管道 ;本地调用 Win32 Native API;远程场景需要目标开启 `Admin$、IPC$共享,管理员权限,防火墙放行SMB(445)。

 

Sysinternals Ps 工具集(PsFile / PsExec / PsService / PsPasswd / PsPing / PsShutdown / PsSuspend)完整解构

作者:Mark Russinovich;套件属于 Sysinternals Suite;分为 32 位 (ps*.exe)、64 位 (ps*64.exe) 版本。 公共底层: 远程全部依赖 SMB‑RPC / IPC$ 命名管道 ;本地调用 Win32 Native API;远程场景需要目标开启 `Admin$、IPC$共享,管理员权限,防火墙放行SMB(445)。 公共前置依赖:目标计算机**Server服务必须运行**;远程访问需要账户具有Administrators组权限;UAC远程限制:非域环境本地账户需要修改LocalAccountTokenFilterPolicy` 注册表绕过 UAC 远程过滤。

公共底层原理

Ps 系列工具远程工作统一模型(PsExec 最典型,其余 Ps 工具复用该远程传输模型)

  1. 本地端:使用提供的‑u / ‑p凭据,通过 SMB IPC$ 命名管道建立 RPC 会话,身份认证。
  2. PsExec 独有:把自身二进制上传到目标Admin$\System32,生成临时服务二进制PSEXESVC.exe;在远程系统注册临时 Windows 服务;启动服务;
  3. 远程PSEXESVC.exe(服务端)运行在内核会话 0,执行目标命令;通过命名管道把 stdout/stderr 回传给本地客户端;
  4. 执行结束:停止并删除临时服务、删除上传的二进制文件;
  5. 其余 PsFile/PsService/PsPasswd/PsShutdown/PsSuspend:不上传二进制,直接调用远程 RPC、Win32 远程 API 完成查询 / 控制。

安全关键点:PsExec 网络传输命令与密码会加密;但 IPC$ /445 端口是攻击面,红蓝对抗高频工具。

公共依赖文件

文件 角色
ps*.exe / ps*64.exe 客户端主程序
PSEXESVC.exe PsExec 远程临时服务二进制(自动上传,磁盘不永久留存)
advapi32.dll 服务控制 API、账户管理、密码修改 API
netapi32.dll NetSession、NetFile API(PsFile 核心)、SMB 会话管理
kernel32.dll / kernelbase.dll 进程、线程、暂停恢复、电源控制 API
rpcrt4.dll RPC 运行时库,远程过程调用
mpr.dll 网络共享、IPC$ 命名管道解析
secur32.dll NTLM/Kerberos 身份认证

内核侧依赖:

  • srv.sys(SMB 服务器驱动,目标机器)
  • svchost.exe承载Server服务;RPC 服务rpcss

注册表关键: HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy

DWORD=1:关闭 UAC 远程本地账户过滤;工作组环境 PsExec 远程本地管理员必须此项,否则访问拒绝。

公共依赖关系

  1. 远程必达条件
    • 目标:Server服务已启动;445 端口开放;IPC\(、Admin\)共享可用;
    • 凭据:管理员权限;工作组需要LocalAccountTokenFilterPolicy=1;域环境 Kerberos/NTLM 认证。
  2. 链路优先级: 域环境优先 Kerberos 认证;工作组回退 NTLM;
  3. 本地模式:不经过 SMB/RPC,直接调用本机 Win32 API。
  4. PsExec 特殊:需要目标机器服务控制管理器 SCM 可用,创建临时服务。

分工具拆解

1. PsFile v1.04 查看 / 关闭远程打开文件

命令:psfile64 [\\Remote] [-u user -p pass] [Id|path] [-c]

底层原理

调用 netapi32.dllNetFileEnumNetFileClose Windows LAN Manager API。

  • NetFileEnum:枚举 SMB 会话上远程客户端打开的文件句柄,返回 FileId、路径、会话信息;
  • NetFileClose(FileId):强制关闭远程打开的文件;直接关闭 SMB 文件句柄,不会通知远端应用程序,暴力关闭,可能造成远端数据损坏。

只看SMB 共享打开的文件;不能看本机本地进程打开的文件,只针对网络打开句柄。

逻辑链路

psfile64.exe → netapi32!NetFileEnum → RPC over IPC$ → 目标srv.sys SMB服务 → 返回远程打开文件列表
指定‑c + Id → NetFileClose → 关闭远端SMB文件句柄

边界

  1. 只能操作SMB 网络打开的文件;本机进程本地打开文件看不到;
  2. -c强制关闭句柄,远端程序不会收到优雅通知,存在文件损坏风险;
  3. 需要目标管理员权限;Server 服务必须开启。

自动化流水线示例

# 查询远程主机打开文件,关闭banner
.\PsFile64.exe \\192.168.1.100 -nobanner
# 根据FileId关闭远程打开文件
.\PsFile64.exe \\192.168.1.100 5 -c

2. PsExec v2.43 远程执行进程(最复杂)

核心:临时服务模型 PSEXESVC.exe

底层原理

  1. 客户端通过 IPC$ 认证;
  2. -c参数:复制 psexec 二进制副本到\\host\Admin$\PSEXESVC.exe;不使用‑c 则目标本地存在程序;
  3. 调用 SCM 远程 API,注册并启动临时服务PSEXESVC
  4. 远程服务运行在Session 0(服务会话);创建目标进程;
  5. 使用命名管道双向转发 stdin/stdout/stderr;实现远程交互式输出;
  6. -d:不等待进程返回,立刻返回;
  7. -s:以NT AUTHORITY\SYSTEM账号运行远程进程;
  8. -i N:把进程投递到指定桌面会话,实现 GUI 交互;
  9. 会话结束:停止服务,删除服务,删除 Admin$ 下 PSEXESVC.exe。

重点:返回的 ExitCode 是被执行程序退出码,不是 PsExec 自身

关键参数链路

  • -h:使用提升令牌;UAC 完整权限;
  • -l:受限低完整性,剥离管理员权限;
  • -e:不加载用户配置文件,加快执行;
  • -u/-p:提供替代凭据;
  • @file:读取文本内计算机列表批量执行;
  • *:域内全部计算机广播执行。

边界 & 坑点

  1. 防火墙 445 拦截直接失败;
  2. 工作组本地账户,必须开启 LocalAccountTokenFilterPolicy=1,否则拒绝访问;
  3. -iGUI 交互:远程机器必须存在对应登录会话;Session 0 不能直接显示 GUI;
  4. 目标机器杀毒 / EDR 经常拦截 PSEXESVC 临时服务上传与创建;红蓝对抗高频 IOC;
  5. 命令、密码在传输通道加密;但是 445 流量会被安全设备审计。

自动化示例

#远程system执行ipconfig,不等待返回(-d)
.\PsExec64.exe \\192.168.1.100 -s -d ipconfig /all -nobanner -accepteula
#读取计算机列表批量执行
.\PsExec64.exe @computers.txt -u admin -p "P@ssw0rd" hostname

3. PsService v2.26 本地 / 远程服务管理

命令:psservice64 [\\host -u -p] query|config|start|stop|restart|pause|cont|depend|find|security

底层原理

封装 advapi32.dll SCM 服务控制管理器远程 API:OpenSCManager、EnumServicesStatus、StartService、ControlService、QueryServiceConfig。 无二进制上传;全部 RPC 调用 SCM。

逻辑链路

psservice64 → advapi32 SCM API → RPC IPC$ → 目标机器svchost(SCM) → 返回服务状态/执行控制

边界

  • find:网络扫描,在局域网搜索指定服务实例,依赖浏览器服务;现代网络很少使用;
  • security:查询服务对象 DACL 安全权限;可发现服务权限漏洞;
  • 远程需要管理员权限;目标 SCM 可用。

自动化示例

#查询远程全部服务状态
.\PsService64.exe \\192.168.1.100 query -nobanner
#重启目标服务
.\PsService64.exe \\192.168.1.100 restart wuauserv

4. PsPasswd v1.25 修改本地 / 远程账户密码

支持:远程本地账户、域账户密码修改

底层原理

  • 本地 / 远程本地账户:调用 netapi32.dll NetUserSetInfo API,通过 RPC 设置 SAM 账户密码;
  • 域账户:直接调用 AD API 修改域控账户,不需要 SMB 到目标工作站。

逻辑链路

  1. 远程本地账户:PsPasswd → NetUserSetInfo → IPC$ RPC → 目标机器 SAM 数据库修改密码;
  2. 域账号:Domain\user,直接联系域控制器 LDAP,不需要访问工作站 445 端口

边界

  1. 密码需要符合目标系统密码策略;不符合直接报错;
  2. 域账户模式不访问目标主机 SMB,直连 DC;
  3. 需要账户密码重置权限;
  4. 不支持交互式复杂密码输入之外的密码策略绕过。

自动化示例

#修改远程主机本地管理员密码
.\PsPasswd64.exe \\192.168.1.100 Administrator "NewPass123!" -nobanner
#域账户修改
.\PsPasswd64.exe CONTOSO\user01 "NewPass123!"

5. PsPing v2.12 ICMP‑Ping / TCP‑Ping / 延迟 / 带宽测试

4 个子模式:ICMP (-? i);TCP ping (-? t);延迟测试 (-? l);带宽 (-? b)

底层原理

  • ICMP 模式:内部调用iphlpapi.dll IcmpSendEcho2,和系统 ping.exe 同源 API;
  • TCP Ping:用户态 socket,建立 TCP 三次握手,不发送业务数据,统计握手 RTT;不受 ICMP 防火墙拦截影响
  • Latency / 带宽:大量循环发送 TCP/UDP 载荷,统计往返延迟、吞吐量。

依赖文件

iphlpapi.dll、ws2_32.dll,不需要 SMB,PsPing 本身不具备远程机器执行能力,仅做本机向外网络探测。

边界

  1. TCP‑ping 优势:防火墙拦截 ICMP 也可以探测端口连通与 RTT;
  2. 带宽测试会产生大量流量,谨慎在生产网络运行。

自动化示例

#TCP ping 443端口
.\PsPing64.exe -t 4 www.microsoft.com:443

6. PsShutdown v2.6 远程关机 / 重启 / 休眠 / 注销 / 锁定

操作:关机‑s / 重启‑r / 休眠‑h / 注销‑o / 锁定‑l / 中止关机‑a

底层原理

远程调用 advapi32.dll InitiateSystemShutdownEx Win32 API,RPC over IPC$。

  • 远程发送关机请求;目标机器本地系统执行电源操作;
  • -e:写入系统关机原因代码,记录事件日志。

逻辑链路

psshutdown64 → InitiateSystemShutdownEx API → RPC IPC$ → 目标系统执行电源控制;弹窗倒计时通知登录用户

边界

  1. -a中止关机,只在倒计时窗口有效;倒计时结束后无法撤销;
  2. -f强制杀死应用程序,丢失未保存数据;
  3. 远程需要 SeRemoteShutdownPrivilege 权限。

自动化示例

#远程重启,倒计时10秒,强制程序关闭
.\PsShutdown64.exe \\192.168.1.100 -r -f -t 10 -nobanner

7. PsSuspend v1.08 暂停 / 恢复进程(本地 / 远程)

参数:‑r 恢复;PID / 进程名;远程主机、凭据

底层原理

远程通过 RPC 获取目标机器进程句柄;调用 NtSuspendProcess / NtResumeProcess Native API。

Windows Suspend:线程挂起,进程内存保留,不再调度 CPU;恢复后继续运行。

逻辑链路

pssuspend64 → RPC IPC$ → 远程获取进程句柄 → NtSuspendProcess 内核API挂起全部线程
‑r → NtResumeProcess恢复调度

边界

  1. 挂起进程不会释放内存;恶意软件经常利用挂起,休眠内存;
  2. 需要目标机器高权限,获取进程句柄权限;
  3. 部分受保护系统进程拒绝挂起。

自动化示例

#远程挂起notepad.exe
.\PsSuspend64.exe \\192.168.1.100 notepad.exe -nobanner
#恢复进程
.\PsSuspend64.exe \\192.168.1.100 -r notepad.exe -nobanner

配套链

  1. 配套工具:Sysinternals 全部套件(Autoruns、Process Explorer);
  2. 网络排查:net use 手动建立 IPC$ 会话;sc.exe原生服务控制;shutdown.exe系统自带关机;
  3. 安全检测:EDR/SIOC:检测 PSEXESVC.exe 上传、临时服务创建、IPC$ 大量登录事件;
  4. 注册表关键:LocalAccountTokenFilterPolicy控制工作组远程 UAC 限制。

全局边界总览

  1. 远程通信全部依赖 445 端口 SMB/IPC$ 命名管道,除 PsPing、域账户 PsPasswd
  2. 工作组本地管理员账户远程访问,默认 UAC 过滤拦截,必须修改注册表;域环境不受该限制;
  3. PsExec 是唯一会上传二进制、创建临时服务的工具;其余 Ps 工具纯 RPC API 调用;
  4. 所有 Ps 远程工具需要目标机器开启Server服务;
  5. 安全风险:该套件是红蓝对抗核心工具,生产环境 EDR 会监控 IOC;
  6. 权限模型:远程操作需要目标机器对应特权(SeRemoteShutdownPrivilege、SCM 访问权限、进程句柄权限)。

统一自动化流水线模板(批量远程执行通用框架)

# 批量计算机列表文件 computers.txt,一行一个主机名/IP
$computers = Get‑Content computers.txt
$credUser = "Administrator"
$credPass = "P@ssw0rd"

foreach($pc in $computers){
    Write‑Host "Processing $pc"
    # PsExec执行示例
    .\PsExec64.exe \\$pc -u $credUser -p $credPass -nobanner -accepteula hostname
}

对比简表

工具 是否上传二进制 通信端口 核心 API 主要风险点
PsFile 445 IPC$ NetFileEnum / NetFileClose 暴力关闭 SMB 文件句柄,数据损坏
PsExec ✅(PSEXESVC.exe) 445 IPC$ SCM 服务控制 API EDR 重点 IOC,远程代码执行
PsService 445 IPC$ SCM 服务 API 修改远程服务配置
PsPasswd ❌(本地账户 445;域账户 LDAP) 445 / LDAP NetUserSetInfo 批量修改账户密码
PsPing 任意出站,无 SMB IcmpSendEcho2 / winsock 产生大量测试流量
PsShutdown 445 IPC$ InitiateSystemShutdownEx 强制远程断电重启业务中断
PsSuspend 445 IPC$ NtSuspendProcess 进程挂起,业务冻结

 


PsFile v1.04 - 列出远程打开的文件和目录
版权所有 (C) 2001-2023 Mark Russinovich
Sysinternals

PsFile 用于列出或关闭远程打开的文件。

用法: psfile64 [\RemoteComputer [-u Username [-p Password]]] [[Id | path] [-c]]
-u        指定远程计算机登录的可选用户名。
-p        指定用户的密码。
Id        要打印信息或关闭的文件的ID。
Path      要匹配的文件的完整或部分路径。
-c        关闭由文件ID标识的文件。
-nobanner 不显示启动横幅和版权信息。
如果省略文件标识符,PsFile将列出所有远程打开的文件。

------------


PsExec v2.43 - 远程执行进程
版权所有 (C) 2001-2023 Mark Russinovich
Sysinternals - www.sysinternals.com

PsExec 在远程系统上执行程序,其中远程执行的控制台应用程序以交互方式执行。

用法: psexec [\computer[,computer2[,...] | @file]][-u user [-p psswd]][-n s][-r servicename][-h][-l][-s|-e][-x][-i [session]][-c [-f|-v]][-w directory][-d][-<priority>][-g n][-a n,n,...][-verbose] cmd [arguments]
-a         按逗号分隔,指定应用程序可以在哪些处理器上运行,其中 1 是最低编号的 CPU。例如,要在 CPU 2 和 CPU 4 上运行应用程序,请输入:
"-a 2,4"
-c         将指定的程序复制到远程系统上执行。如果省略此选项,则应用程序必须在远程系统的系统路径中。
-d         不等待进程终止(非交互式)。
-e         不加载指定帐户的配置文件。
-f         即使远程系统上已存在该文件,也复制指定的程序。
-g         将主线程的处理器组设置为指定的处理器组(仅适用于具有 64 个以上处理器的系统)。
-i         让程序与远程系统上指定会话的桌面交互。如果未指定会话,则该进程在控制台会话中运行。
-h         如果目标系统是 Vista 或更高版本,则在可用的情况下使用帐户的提升令牌运行进程。
-l         以受限用户身份运行进程(剥离管理员组并仅允许分配给 Users 组的权限)。在 Windows Vista 上,进程以低完整性级别运行。
-n         指定连接到远程计算机的超时时间(秒)。
-p         指定用户名称的可选密码。如果省略此选项,将提示输入隐藏的密码。
-r         指定要创建或与其交互的远程服务的名称。
-s         在系统帐户中运行远程进程。
-u         指定用于登录远程计算机的可选用户名。
-v         仅在指定文件具有更高版本号或更新的情况下复制该文件到远程系统上。
-w         设置该进程的工作目录(相对于远程计算机)。
-x         在 Winlogon 安全桌面上显示 UI(仅适用于本地系统)。
-arm       指定远程计算机为 ARM 架构。
-priority  指定-low、-belownormal、-abovenormal、-high 或 -realtime,以在不同优先级下运行该进程。在 Vista 上使用 -background 以低内存和 I/O 优先级运行。
computer   直接将 PsExec 指定的应用程序运行在远程计算机或指定的多台计算机上。如果省略计算机名称,则 PsExec 在本地系统上运行该应用程序,并且如果指定通配符(\*),则 PsExec 在当前域中的所有计算机上运行该命令。
@file      PsExec 将在文件中列出的每台计算机上执行该命令。
cmd            要执行的应用程序的名称。
arguments  要传递的参数(请注意,文件路径必须是目标系统上的绝对路径)。
-accepteula 此标志抑制许可证对话框的显示。
-nobanner   不显示启动横幅和版权消息。

您可以用引号括起具有空格的应用程序名称,例如 psexec \marklap "c:\long name app.exe"。
仅当按下 Enter 键时,输入才会传递到远程系统,并且键入 Ctrl-C 将终止远程进程。

如果省略用户名,该进程将在远程系统上以您的帐户上下文中运行,但不会访问网络资源(因为它正在模拟)。如果远程进程需要访问网络资源或在不同的帐户中运行,请以 Domain\User 语法指定有效的用户名称。请注意,在传输到远程系统时,密码和命令是加密的。

由 PsExec 返回的错误代码特定于您执行的应用程序,而不是 PsExec。

------------


PsService v2.26 - 服务信息和配置实用程序
版权所有 (C) 2001-2023 Mark Russinovich
Sysinternals - www.sysinternals.com

PsService 列出或控制本地或远程系统上的服务。

用法: psservice64 [\计算机名 [-u 用户名 [-p 密码]]] <命令> <选项>
命令可以是以下之一:
query       查询服务的状态
config      查询配置
setconfig   设置配置
start       启动服务
stop        停止服务
restart     停止并重新启动服务
pause       暂停服务
cont        继续暂停的服务
depend      枚举依赖于指定服务的服务
find        在网络中搜索服务的实例
security    报告分配给服务的安全权限
在您的帐户没有执行指定操作的权限的情况下,使用用户名和密码登录到远程计算机。

省略命令会查询指定计算机上的活动服务。
输入 -?以获取特定命令的帮助。
使用选项 -nobanner 可以忽略启动横幅和版权消息。

------------
PsPasswd v1.25 - 本地和远程密码更改工具
版权所有 (C) 2003-2023 Mark Russinovich
Sysinternals - www.sysinternals.com

PsPasswd 可以更改本地或远程系统上的密码。

本地帐户用法:
pspasswd [\[计算机名[,计算机名,[,...]]|@文件] [-u 用户名 [-p 密码]]] <帐户> [新密码]
域帐户用法:
pspasswd <域名\帐户> [新密码]

 计算机名    存在本地帐户的计算机或计算机列表。如果省略计算机名,则假定为本地计算机。
             如果指定通配符(\\*),则 PsPasswd 在当前域或工作组中的所有计算机上运行该命令。
 @文件       PsPasswd 将更改列在文件中的计算机上的密码。
 -u          指定用于登录到远程计算机的可选用户名。
 -p          指定可选用户名的密码。如果省略此密码,将提示您输入隐藏密码。
 -nobanner   不显示启动横幅和版权消息。
 域名        指定目标帐户所在的域名。
 帐户         指定要更改密码的帐户名称。
 新密码      新密码。如果省略,则应用空密码。
 
 

------------
PsPing v2.12 - 测量 ping、延迟和带宽的实用工具
版权所有 (C) 2012-2023 Mark Russinovich
Sysinternals - www.sysinternals.com

PsPing 实现了 Ping 功能、TCP ping、UDP/TCP 延迟以及 UDP/TCP 带宽测量。

帮助用法:psping -? [i|t|l|b]
-? i   ICMP ping 的用法。
-? t   TCP ping 的用法。
-? l   延迟测试的用法。
-? b   带宽测试的用法。
-nobanner 不显示启动横幅和版权消息。


------------
PsShutdown v2.6 - 关闭、注销和管理本地和远程系统的电源
版权所有 (C) 1999-2023 Mark Russinovich
Sysinternals - www.sysinternals.com

用法:
psshutdown -s|-r|-h|-d|-k|-a|-l|-o|-x [-f] [-c] [-t [nn|h:m]] [-v nn] [-e [u|p]:xx:yy] [-m "message"] [-u Username [-p password]] [-n s] [\computer[,computer[,...]|@file]
-a          中止关机(只有在倒计时进行中时才能进行)
-c          允许交互式用户中止关机
-d          暂停计算机
-e          关机原因代码(仅适用于 Windows XP 及更高版本)。
指定 "u" 表示未计划的关机原因代码,指定 "p" 表示计划的
关机原因代码。xx 是主要原因代码(必须小于 256),yy 是
次要原因代码(必须小于 65536)。
-f          强制关闭正在运行的应用程序
-h          休眠计算机
-k          关闭计算机电源(如果不支持电源关闭,则重新启动)
-l          锁定计算机
-m          向已登录用户显示的消息
-n          指定连接到远程计算机的超时时间(以秒为单位)
-o          注销控制台用户
-p          为用户名指定可选密码。如果省略此项,则将提示您输入隐藏的密码。
-r          关机后重新启动计算机
-s          在不关闭电源的情况下关机
-t          指定关机倒计时的秒数(默认为 20)或关机时间(以 24 小时制表示)
-u          为登录远程计算机指定可选用户名。
-v          为指定秒数显示消息,然后进行关机。如果省略此参数,则显示关机通知对话框,指定值为 0 则省略对话框。
-x          关闭显示器(如果支持现代待机,则系统将启动现代待机功能)
-nobanner   不显示启动横幅和版权消息。
computer    关机指定的计算机或计算机。
@file       关机列在指定文件中的计算机。


------------
PsSuspend v1.08 - 进程暂停器
版权所有 (C) 2001-2023 Mark Russinovich
Sysinternals

PsSuspend 在本地或远程 NT 系统上暂停或恢复进程。

用法:pssuspend [-r] [\RemoteComputer [-u Username [-p Password]]] <进程 ID 或名称>
-r    恢复进程。
-u    为登录到远程计算机指定可选用户名。
-p    为用户名指定可选密码。如果省略此项,则将提示您输入隐藏的密码。
-nobanner 不显示启动横幅和版权消息。

------------

posted @ 2023-06-21 01:29  suv789  阅读(436)  评论(0)    收藏  举报