PsExec原理及防御
介绍
PsExec是Sysinternals Suite中的一个工具,原本是方便管理员在远程主机上执行命令所用,后来许多攻击者使用此工具进行横向移动。
使用方法:
PsExec.exe [\\computername] [-u user] [-p password] cmd
已经建立IPC连接的情况下可以直接执行命令。
使用条件:
- 目标机器的139或445端口开放
- 具有目标用户的明文密码或NTLM hash
- 共享文件夹的写入权限
- 服务的创建和启动权限(一般是特权账号才具有)
- 工作组环境必须使用
administrator
用户;域环境连接域控制器必须使用域管理员用户
原理
先来看看整体的流量过程,PsExec是基于SMB协议的,那么最开始会有协商认证的过程。
- 客户端首先发送
SMB_COM_NEGOTIATE
请求,请求中包含了所支持的协议版本
- 服务端响应,表明希望使用的协议版本,如果没有则返回
0XFFFFH
,结束通信
- 确定协议版本之后,客户端发送
SMB_COM_SESSION_SETUP_ANDX
,包含认证相关的信息
- 服务端接受请求并验证,验证通过后响应包中会存在有效的UID,否则返回错误代码,到此验证环节结束
- 客户端通过
SMB_COM_TREE_CONNECT_ANDX
访问共享文件夹,请求中包含UNC格式的共享路径
- 如果允许访问,服务端返回对应的
Tree Id
,否则返回错误代码并拒绝访问
- 如果能够访问默认共享文件夹
ADMIN$
,便会上传PSEXESVC.exe
,上传成功后进行响应
- 通过命名管道
svcctl
连接SCM(服务控制管理器)
,之后通过对SVCCTL
服务的DCE/RPC
调用启动其他服务
- 以
PSEXESVC.exe
为二进制文件创建服务,使用的是CreateService
函数,wireshark显示有问题
- 之后使用
StartService
函数启动PSEXESVC
服务
- 执行命令的输入输出都是通过命名管道实现的,总共创建了四个命名管道,分别是服务本身、stdin、stdout、stderr
上面就是整体的流程,可以看到核心步骤就是上传二进制文件以及启动服务。
防御
PsExec虽好,但特征也是非常明显的,可以从下面几个点考虑防御。
- 机器之间产生大量的SMB流量
- 在远程机器上会产生特定的事件日志,有系统事件ID:7045(服务已启动)、安全事件ID:4672(特权登录)、4624(登录)、4634(注销)等。
PsExec也可以用来直接执行payload,如使用msiexec.exe
,但杀软会直接报毒。