PsExec原理及防御

介绍

PsExec是Sysinternals Suite中的一个工具,原本是方便管理员在远程主机上执行命令所用,后来许多攻击者使用此工具进行横向移动。

使用方法:

PsExec.exe [\\computername] [-u user] [-p password] cmd

20210901003507QQ截图20210901003405
已经建立IPC连接的情况下可以直接执行命令。

使用条件:

  • 目标机器的139或445端口开放
  • 具有目标用户的明文密码或NTLM hash
  • 共享文件夹的写入权限
  • 服务的创建和启动权限(一般是特权账号才具有)
  • 工作组环境必须使用administrator用户;域环境连接域控制器必须使用域管理员用户

原理

先来看看整体的流量过程,PsExec是基于SMB协议的,那么最开始会有协商认证的过程。

  1. 客户端首先发送SMB_COM_NEGOTIATE请求,请求中包含了所支持的协议版本
    20210901222501QQ截图20210901222452
  2. 服务端响应,表明希望使用的协议版本,如果没有则返回0XFFFFH,结束通信
    20210901222749QQ截图20210901222737
  3. 确定协议版本之后,客户端发送SMB_COM_SESSION_SETUP_ANDX,包含认证相关的信息
    20210901225137QQ截图20210901225129
  4. 服务端接受请求并验证,验证通过后响应包中会存在有效的UID,否则返回错误代码,到此验证环节结束
    20210901230146QQ截图20210901230139
  5. 客户端通过SMB_COM_TREE_CONNECT_ANDX访问共享文件夹,请求中包含UNC格式的共享路径
    20210901230350QQ截图20210901230343
  6. 如果允许访问,服务端返回对应的Tree Id,否则返回错误代码并拒绝访问
    20210901230544QQ截图20210901230518
  7. 如果能够访问默认共享文件夹 ADMIN$,便会上传PSEXESVC.exe,上传成功后进行响应
    20210901230904QQ截图20210901230858
  8. 通过命名管道svcctl连接SCM(服务控制管理器),之后通过对SVCCTL服务的DCE/RPC调用启动其他服务
    20210901231418QQ截图20210901231346
  9. PSEXESVC.exe为二进制文件创建服务,使用的是CreateService函数,wireshark显示有问题
    20210901231844QQ截图20210901231838
  10. 之后使用StartService函数启动PSEXESVC服务
    20210901232206QQ截图20210901232200
  11. 执行命令的输入输出都是通过命名管道实现的,总共创建了四个命名管道,分别是服务本身、stdin、stdout、stderr
    20210901232455QQ截图20210901232428

上面就是整体的流程,可以看到核心步骤就是上传二进制文件以及启动服务。

防御

PsExec虽好,但特征也是非常明显的,可以从下面几个点考虑防御。

  • 机器之间产生大量的SMB流量
  • 在远程机器上会产生特定的事件日志,有系统事件ID:7045(服务已启动)、安全事件ID:4672(特权登录)、4624(登录)、4634(注销)等。

PsExec也可以用来直接执行payload,如使用msiexec.exe,但杀软会直接报毒。