admin 管理员组

文章数量: 887006

CATALOG

  • 1.前言
  • 2.windows命名管道
  • 3.msf中getsystem原理
  • 4.参考文章

1.前言

之前已经写过了winodws命名管道相关的知识,在我的由psexec远控的实现原理到windows命名管道这篇文章中,最近复习的时候又看到了,同时对其有了新的理解,进而又想起了msf中getsystem的原理发现两者刚好有所关联,于是有了这篇文章。

2.windows命名管道

首先我们需要明确的一点,命名管道基于smb协议通信,smb,smb。重要的事情说三遍。
它是用来让两个进程间进行通信的,这两个进程可以是本地进程,也可以是远程进程。命名管道有点类似于socket连接,是用来传输数据的,可以设置具体的权限让指定权限的进程才能连接命名管道,理论上每个程序都能连接命名管道,只是连接之后能做的事情不同,具体能做什么事跟服务端的配置有关系。
下面总结几点:
1.命名管道是C/S架构,必须让服务端某个进程先创建命名管道。
2.命名管道可以被任何符合权限的进程去访问,且何种权限可以访问是可以自定义的。
3.客户端可以是本地的某个进程或者远程的某个进程,本地进程访问命名管道方式为.\pipe\pipename,远程进程访问命名管道方法为\ip\pipe\pipename。
4.在powershell中使用dir .\pipe\ | select name可以查看当前所有命名管道的名称。
命名管道还有一个特点就是当服务端进程被客户端进程连接的时候,理论上说服务端进程有可能获取到客户端的权限。ImpersonateNamedPipeClient()这个api可以帮助我们进行实现,前提是我们当前用户具有SeImpersontePrivilege权限。

3.msf中getsystem原理

1.创建一个以system权限启动的程序,这个程序的作用是连接指定的命名管道。
2.创建一个进程,并让进程创建命名管道。
3.让之前的以system权限启动的程序启动并连接这个命名管道。
4.利用ImpersonateNamedPipeClient()函数生成system权限的token。
5.利用system权限的token启动cmd.exe。

我们模拟一下这个过程:
在一个拥有SeImpersonatePrivilege权限的用户(User组)启动一个进程,这个进程的作用是创建一个命名管道等待连接,连接成功后模拟客户端的权限,并用这个权限启动一个cmd窗口。

1.查看当前用户权限:


2.启动创建命名管道的脚本:
脚本下载地址:pipeserverimpersonate

3.在administrator组用户的cmd中连接test1用户创建的命名管道:

4.弹出一个新的cmd窗口,查看权限发现是administrator用户的:

4.参考文章

Windows Named Pipes & Impersonation
msf手册

本文标签: 管道 命令 原理 MSF getsystem