基于PSexec的一些原理分析

0x01 PSexec

PsExec可以算是一个轻量级的 telnet 替代工具,无需手动安装客户端软件即可执行其他系统上的进程,并且可以获得与命令控制台几乎相同的实时交互性。PsExec最强大的功能就是在远程系统和远程支持工具(如 ipconfig)中启动交互式命令提示窗口,以便显示无法通过其他方式显示的有关远程系统的信息。

一般使用psexec用来横向移动,可以用来控制主机,条件是拥有被控主机的账户和密码.

psexec工具的使用:

1
psexec.exe \\目标IP –u administrator –p password

建立PSexec的过程:

1
2
3
4
5
6
1.通过ipc$连接,释放psexecsvc.exe到目标
2.通过服务管理SCManager远程创建psexecsvc服务,并启动服务
3.客户端连接执行命令,服务端启动相应的程序并执行回显数据
4.运行完后删除服务
!!!会产生大量日志,很容易被溯源
5.在域环境测试时发现,⾮域⽤户⽆法利⽤内存中的票据使⽤ PSexec 功能,只能依靠账号和密码进⾏传递

登录认证方式是 NTLM 认证,通过ipc(进程间通信)连接后,登录目标主机,连接admin$通道,向目标主机写入 psexecsvc.exe 文件到C:\Windows\AppendData(或者WirteData 目录下 ,接着使用IPC命名管道调用svcctl接口,用于开启远程服务psexecsvc.exe( 用于在其他系统中远程执行命令), 最终创建服务后会建立4个命名管道。

因此,在使⽤ Metasploit 对⽬标进⾏ Psexec 的时候, payload ⼀定要使⽤正向 bind连接 ,因为目标是服务端,我们是客户端主动去连接服务端

而命名管道又是什么?

0x02 命名管道

管道: 管道是一个共享内存块,可用于通信和数据交换。管道是一个有两端的对象,一个进程向管道写入信息,另一个进程从管道读取信息。创建管道的进程称为管道服务端(只能在本地创建),连接管道的进程称为管道客户端。

特点:

基于smb协议通信,用于在两个进程之间传输数据,包括本地进程和远程进程,其客户端既可以接收数据也可以发送数据,服务器端也是可以接收数据,又可以发送数据。支持单向、双向通信。可以被任意符合权限要求的进程访问,

命名管道可以由 CreateNamedPipeA创建,接着客户端连接,然后实现读写操作

可以参考以下文档

创建命名网络功能 (winbase.h) - win32 应用程序|微软文档 (microsoft.com)

为什么要使用命名管道来建立网络通信呢?

1
因为他走的是smb协议,也是tcp的一种。在Windows中,当尝试绑定一个tcp socket端口建立通信时,defender防火墙会警报,需要用户确认放行才可以,这没有高权限不就直接寄了。而命名管道利用了未加密的smb协议(445端口),在Windows中,通常是默认允许smb协议出入站的,所以命名管道经常被使用来绕过防火墙

利用:

1
2
3
利用模拟客户端功能获取system权限,eg:msf的getsystem功能
作为c2通信
本地权限提升

msf中getsystem原理:

1
2
3
4
官方回答:
creates a named pipe from Meterpreter. It also creates and runs a service that runs cmd.exe /c echo “some data” >\.\pipe[random pipe here]. When the spawned cmd.exe connects to Meterpreter’s named pipe, Meterpreter has the opportunity to impersonate that security context. Impersonation of clients is a named pipes feature. The context of the service is SYSTEM, so when you impersonate it, you become SYSTEM.

msf 会创建一个命名管道,然后创建一个服务去运行cmd.exe /c echo “some data” >\\.\pipe\[random pipe here],当 cmd 连接到 Meterpreter 的命名管道的时候,因为服务是 system 权限,msf 也就得到了一个 system 的 shell

C2通信:

image-20211110105758482

1
2
3
每个终端将为每个直接连接的子终端提供一个命名管道服务器和一个命名管道客户端。服务器监听管道名称,并等待客户端的连接。客户端连接到特定主机名和管道名称的服务器,从而创建命名管道。管道的每一个终端都有从另一个终端读取和写入的能力,即,将 Payload 运行(注入)后,创建了自定义命名管道(作服务端),等待连接即可,这一过程被称为Bind连接。

这种连接方式很常见,如 Metasploit 和 Cobalt Strike 都有类似功能。

0x03 复现

首先建立下ipc连接

image-20211110120312544

image-20211110115836196

1
2
3
PsExec.exe -accepteula \\10.10.10.10 -s cmd.exe
# -accepteula 第⼀次运⾏ PsExec 会弹出确认框,使⽤该参数就不会弹出确认框
# -s以System权限运⾏远程进程,获得⼀个System权限的交互式Shell,如果不⽤这个参数,那么会获得⼀个administrator权限的shell

system权限

image-20211110115854129

administrator权限

image-20211110120524480

在不建立ipc连接的前提下

1
PsExec.exe \\10.10.10.11 -u redteam\administrator -p admin!@#456 -s cmd.exe

image-20211110224732770

在不想获得交互式shell的情况下,可以直接执行命令

1
PsExec.exe \\10.10.10.11 -u redteam\administrator -p admin!@#456 -s cmd /c "ipconfig"

image-20211110224130243

Peace.