CATALOG
psexec部分
psexec一般会被用来做横移,只要我们拥有对方主机的账号密码就可以做到远程控制对方主机,我们首先看看但我们执行psexec这个程序的时候,到底发生了什么。
已有资产
| 用户 | ip | 主机名 |
|---|---|---|
| zhangsan | 192.168.23.23 | red |
| lisi | 192.168.23.99 | blue |
这个实验实现的是从zhangsan的主机执行psexec使用lisi的账号连接lisi的主机
从被连接主机(lisi)的事件来看psexec到底做了什么
这个是事件组的开头,我们可以看到有两个logon类型的日志

点开第一个日志可以发现是我们从zhangsan主机对lisi的电脑的一个登陆请求,且登陆成功,且认证方式为ntlm


打开第二个时间会发现,是申请在lisi主机上登陆zhangsan的账号,显示失败。

这四个日志内容是记录了zhangsan的主机向lisi的主机写psexsvc.exe这个文件到lisi主机的c:\windows\目录下:


紧接着使用ipc通道并调用svcctl这个服务,这个服务能使我们开启指定的远程服务

紧接着就是一大堆的文件操作,因为安装了360我发现这几乎都是360在搞事情

上图中最后有四个detailed file share。分别是




这个相当于建立了四个管道,一个用于服务本身,另外的管道用于重定向进程的 stdin、stdout、stderr。用pipelist工具查询管道列表也应征了我们的推断:

再接下来就是psexesvc来显式的登陆lisi的账号了,以下两个事件一个表示试图登陆,第二个表示登陆成功:


到这里就全部结束了,我们会使用创建出来的命名管道来进行通信远程控制对方电脑。我的理解最后一步创建命名管道很像linux上的反弹shell,具体原理可以参照我的这篇文章:linux反弹shell原理
上述实现描述了psexec所做的事情:
1.登陆远程主机
2.连接admin$共享
3.写入psexesvc.exe文件到共享目录下也就是c:\windows下
4.利用ipc命名管道调用svcctl服务
5.利用svcctl服务开启psexesvc服务
6.生成4个命名管道以供使用
从攻击机的流量上来看psexec命令背后做了什么

上图中描述的已经足够清楚,刚开始做了三件事,tcp3次握手连接目标445端口,协商使用何种smb协议,然后进行ntlm认证。

接下来首先尝试连接IPC$管道,然后再尝试连接admin$,如上图所示。

接下来就会出现上图所示的数据包,上图表示将向目标的admin$共享目录下写入psexec.exe文件。

紧接着就是写入文件了,可以看到后续的tcp数据包的内容,里面含有4d5a的数据这个是pe文件的mz头如上图所示。

到这一步就已经代表完全写完了psexesvc这个文件,如上图所示。
接着调用svcctl并开启psexec服务

可以看到下列数据包就是svcctl协议了,

查看info为openservicew request的数据包发现,他就是在打开psexesvc服务。

可以看到系统关闭了svcctl服务的请求,并去请求psexesvc服务并创建第一个psexecsvc命名管道

下面就会创建剩余三个命名管道命名管道

到此结束了。
整体流程跟从被连接主机的事件看到的流程基本一致。基本都是ntlm认证、连接共享目录admin$、写文件psexesvc到共享目录、调用svcctl服务来间接调用psexesvc服务、创建四个命名管道。
我们发现了psexec最终会建立命名管道,那到底什么是命名管道呢?为什么要用命名管道?而且ipc$连接的原理其实也与命名管道有关,因此接下来我们就谈谈命名管道的那些事。
命名管道
我理解的命名管道
首先我们需要明确的一点,命名管道基于smb协议通信,smb,smb,不是tcp。重要的事情说三遍。它是用来让两个进程间进行通信的,这两个进程可以是本地进程,也可以是远程进程。命名管道有点类似于socket连接,是用来传输数据的,可以设置具体的权限让指定权限的进程才能连接命名管道,理论上每个程序都能连接命名管道,只是连接之后能做的事情不同,具体能做什么事跟服务端的配置有关系。
下面总结几点:
1.命名管道是C/S架构,必须让服务端某个进程先创建命名管道。
2.命名管道可以背任何符合权限的进程去访问,且何种权限可以访问是可以自定义的。
3.客户端可以是本地的某个进程或者远程的某个进程,本地进程访问命名管道方式为\.\pipe\pipename,远程进程访问命名管道方法为\ip\pipe\pipename。
利用
可以写一个服务端,把接收到的数据当作命令去执行,然后将结果返回给客户端,这个就像是linux中的管道了但是windows中的管道要复杂的多。
当系统限制了其他tcp端口出站的时候,可以使用命名管道这种技术创建一个c2服务器,因为其走的是smb协议445端口,这个端口一般都是默认放行的不会被禁止。最终就可以实现反弹shell。实现效果如下:

具体代码实现
代码地址:https://github.com/malcomvetter/NamedPipes
服务端代码
using System;
using System.Diagnostics;
using System.IO;
using System.IO.Pipes;
using System

本文详细解析PsExec工具的工作原理,包括远程主机登录、文件传输、命名管道通信及服务控制,展示了如何利用命名管道实现远程命令执行。
最低0.47元/天 解锁文章
1062

被折叠的 条评论
为什么被折叠?



