由psexec远控的实现原理到windows命名管道

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

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
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shanfenglan7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值