深入了解 PsExec [知识回顾]

这个[ 知识回顾 ]系列文章,整合记录的是在掌握知识点中,所忽略的点、涉及的原理等;

0x00 前言

这篇文章将解释 PsExec 的使用条件、原理及背景知识。但不包括 PsExec 在通信时主要用到了 SMB 这个应用层协议( SMB协商过程),想了解的请看 参考-1-2。

0x01 什么是 PsExec

PsExec 是由 Mark Russinovich 创建的 Sysinternals Suite 中包含的工具。最初,它旨在作为系统管理员的便利工具,以便他们可以通过在远程主机上运行命令来执行维护任务。PsExec 可以算是一个轻量级的 telnet 替代工具,它使您无需手动安装客户端软件即可执行其他系统上的进程,并且可以获得与命令控制台几乎相同的实时交互性。PsExec最强大的功能就是在远程系统和远程支持工具(如 ipconfig、whoami)中启动交互式命令提示窗口,以便显示无法通过其他方式显示的有关远程系统的信息。

0x02 工作原理

通过提供目标主机的地址,有效用户和密码,就可以远程控制计算机。

它的背后到底发生了些什么,我们来看看:

  • PSEXESVC.exe 上传到 ADMIN$ (指向 /admin$/system32/PSEXESVC.EXE)共享文件夹内;
  • 远程创建用于运行 PSEXESVC.exe 的服务;
  • 远程启动服务。

PSEXESVC 服务充当一个重定向器(包装器)。它在远程系统上运行指定的可执行文件(事例中的是 cmd.exe)。同时,它通过主机之间来重定向进程的输入/输出(利用命名管道)。

0x03 详细过程

  • 使用提供的凭证,通过 SMB 会话 进行身份验证。
  • 通过 SMB 访问默认共享文件夹 ADMIN$,并上载 PSEXESVC.exe
  • 打开 \\RDC\pipe\svcctl 的句柄,与服务控制管理器(SCM)进行通信,这使得我们能够远程创建/启动服务。此时使用的是 SVCCTL 服务,通过对 SVCCTL服务DCE/RPC 调用来启动 PsExec;

  • 使用上传的 PSEXESVC.exe 作为服务二进制文件,调用 CreateService 函数
  • 调用 StartServices 函数
  • 正如下面的 Wireshark 所捕获到的数据,它是创建了命名管道来重定向 stdin(输入)、stdout(输出)、stderr(输出)。

总共创建了4个命名管道,一个用于服务本身,另外的管道用于重定向进程的 stdin、stdout、stderr。

0x04 使用 PsExec 的最低要求

1
2
3
4
5
1、远程机器的 139445 端口需要开启状态,即 SMB;
2、明文密码或者 NTLM 哈希;
3、具备将文件写入共享文件夹的权限;
4、能够在远程机器上创建服务:SC_MANAGER_CREATE_SERVICE (访问掩码:0x0002);
5、能够启动所创建的服务:SERVICE_QUERY_STATUS(访问掩码:0x0004)+ SERVICE_START(访问掩码:0x0010

注意

1
2
3
4
5
NTLM != NTLM v1/v2 ;
NTFS 权限 != 共享权限;
如果使用的是 Sysinternal 的 PsExec,它是会将 PSEXESVC.exe 复制到 ADMIN$,因此是具备访问它的权限;
PSEXESVC 服务将会安装在远程系统中,此时将会生成 Event 469770452种事件日志;
PsExec 2.1版本之后,不再是明文传输。

在多数情况下,即使账号出现泄漏情况,使用 PsExec, 也无法完成第4和第5点的要求,因为账号不是特权账号(RID500、域管理员)。

0x05 其他

日志分析:略

0x06 参考

1、[翻译] 网络安全分析之 SMB 协议
2、[使用Hash直接登录Windows]简单分析
3、[技术分享] 深入分析PsExec执行行为

!坚持技术分享,您的支持将鼓励我继续创作!