windows安全初探之命名管道
参考文章
https://cloud.tencent.com/developer/article/1625924
https://www.freebuf.com/articles/web/283359.html
关于命名管道的概念啥的我这里就不写了 参考文章中写的挺详细的 直接去看就行了
关于IPC
的话 这个就是进程之间通信的方法 我们在共享目录也能看到
远程管理:
- 管理员通过
IPC$
共享来执行远程管理任务,比如远程执行命令、查看和修改系统配置等。
网络登录和身份验证:
- 在用户通过网络尝试访问共享资源时,系统会使用
IPC$
共享来进行身份验证。
远程服务和进程间通信:
- 某些服务和应用程序使用
IPC$
共享来进行远程通信和数据交换。
作用
绕过防火墙
这里说的防火墙,是指 windows 系统自带的防火墙,类似于 UAC,需要用户点击允许访问才可放行。
当尝试使用 Bind()
绑定一个 TCP Socket 时,Defender 就会自动弹窗提示是否允许此程序进行网络连接,在高权限下,通过修改防火墙规则,可以轻松的绕过这一限制,但是,当权限不足时,就需要另外想办法了。
这个时候我们还有另外的办法就是利用命名管道,命名管道网络通信使用了未加密的 SMB 协议(端口 445)或 DCE\RPC(端口 135)。在 Windows 中,通常默认允许 SMB 协议出入站(如果当年没有因为 WannaCry 主动做策略限制的情况下),因此,如果有什么功能或机制可以用于与外部机器进行通信的,SMB 协议无疑是一种很好的选择。所以我们可以基于命名管道与外部机器进行通信,从而建立控制通道。
(本地进行通信的话是不需要进行身份认证 访问远程的命名管道的话 是需要进行身份认证的)
模拟令牌(token)
这也是命名管道中常见的一种方法,一般可以用来提权操作,c2和msf等等工具的getsystem都是用这个方法(进程注入也是用的该原理)
Administrator
———>system
就是来实现这个权限提升
本地创建一个管道(里面加上复制token的函数) 然后开启监听
本地创建一个服务 内容是
cmd.exe /c echo “some data” >\.\pipe[random pipe here]
- 然后运行该服务就行了
这里用到的其实是SeImpersonatePrivilege
这个特权 运行该服务的账户必须有这个特权
impersonateNamedPipeClient命名管道允许服务端进程模拟已连接的客户端进程,调用此函数,命名管道文件系统会更改调用进程的线程,开始模拟从管道读取的最后一条消息的安全内容 如当目标用户的进程连接并写入输入攻击者的命名管道,则攻击者能够调用ImpersonateNamedPipeClient模拟目标的令牌,从而模拟用户,进程必须拥有SeImpersonatePrivilege权限(身份证验证后模拟客户端,否则可能无法提权成功),常规情况下该权限一般是系统使用在本地服务账号或者网络账号的,所以当通过服务账户启动的服务漏洞后就可获取相关权限,如-local service或network service,权限可能较低,但可以用他来进行权限提升至system
查看该新建的服务运行权限确实是system
c2通信
如图所示,每个终端将为每个直接连接的子终端提供一个命名管道服务器和一个命名管道客户端。服务器监听管道名称,并等待客户端的连接。客户端连接到特定主机名和管道名称的服务器,从而创建命名管道。管道的每一个终端都有从另一个终端读取和写入的能力,即,将 Payload
运行(注入)后,创建了自定义命名管道(作服务端),等待连接即可,这一过程被称为 “ 绑定 “(Bind)连接。
这种连接方式很常见,如 Metasploit 和 Cobalt Strike 都有类似功能。
可以进行读写和执行命令的操作
- 靶机作为服务端
- c2作为客户端