前一段时间一直在关注RPC和SMB的相关知识,现在总结出来共享给大家。
基础知识
提到SMB原理,不得不提到资源定位器、网络提供者、重定向器三个概念。应用程序向远程服务器发送一个I/O请求,由于被请求的对象不在本地而在远程服务器上,因此交给资源定位器。资源定位器的作用是从上层的应用程序中接受到请求数据,然后将请求转发给下层中合适的网络提供者。网络提供者使用重定向器将请求转发给远端的重定向器服务器,在这个过程中,它需要格式化服务请求消息,再将其发给远程计算机的重定向器服务器服务。最后远程机器的重定向器服务器服务收到这个请求之后,会以发出本地I/O请求的方式,来满足这一请求。整个过程如下图:
资源定位器(MUP)负责选择具体的网络提供者,来满足UNC连接请求。
那么我们通过一个例子来完整的描述一下整个过程,假定一个应用程序要通过网络打开\\Myserver\Myshare\Sample.mp3,那么各组件的通信如下所示:
1)使用CreateFile这个API函数,应用程序向本地操作系统提交一个请求,要求打开\\Myserver\Myshare\Sample.mp3。
2)根据从UNC路径描述中获得的信息,本地(本机)操作系统的文件系统判断出该I/O(输入/输出)请求的目的地是一台远程机器,名为\\Myserver,所以将此请求传递给MUP。
3)MUP调查出该I/O请求发给的是一个MSNP提供者,因为网上的\\Myserver机器正在使用NetBIOS名字解析机制。
4)I/O请求随即传给MSNP提供者的重定向器。
5)重定向器将此请求格式化成一条SMB消息,要求打开包含在远程\Myshare目录下的Sample.mp3文件。
6)格式化好的SMB消息终于通过一种网络传送协议,正式送入网络。
7)名为\\Myserver的服务器从网上接收到这个SMB请求,并将请求传给服务器的MSNP重定向器服务器服务。
8)服务器的重定向器服务提交一个本地I/O请求,希望打开位于\Myshare这个共享位置处的Sample.mp3文件。
9)服务器的重定向器服务格式化好一条SMB响应消息,指出本地打开文件的I/O请求是成功,还是失败。
10)通过一种网络传送协议,服务器的这条SMB响应消息返回客户机。
11)MSNP重定向器收到服务器的这条SMP响应消息,并向本机操作系统传递一个返回代码。
12)本机操作系统再将该代码返回给当初应用程序的CreateFileAPI请求。从中可以看出,MSNP重定向器必须经历大量步骤,才能让一个应用程序访问到远程资源。
当然,MSNP重定向器也需要对网络资源提供访问控制服务。这其实正是“网络安全”机制的一部分。
SMB原理
SMB协议最早是由微软及Intel于80年代末期联合开发成功的。当时的设计宗旨是让远程的文件系统能由MS-DOS程序进行“透明”的访问。现在作用是让WindowsMSNP重定向器与远程工作站的MSNP服务器服务进行通信。
SMB一种客户机/服务器、请求/响应协议。通过SMB协议,客户端应用程序可以在各种网络环境下读、写服务器上的文件,以及对服务器程序提出服务请求。此外通过SMB协议,应用程序可以访问远程服务器端的文件、以及打印机、邮件槽(mailslot)、命名管道(namedpipe)等资源。
命名管道
“命名管道”或“命名管线”(NamedPipes)是一种简单的进程间通信(IPC)机制。命名管道可在同一台计算机的不同进程之间,或在跨越一个网络的不同计算机的不同进程之间,支持可靠的、单向或双向的数据通信。命名管道是用“通用命名规范”(UNC)来标识的,因此命名管道底层也是使用(MSNP)重定向器作为中介来进行通信。
计算机管理窗口中,存在很多共享,比方说:ADMIN$、C$、D$、E$、IPC$。前4个都是文件夹共享,IPC$是命名管道共享。如果是将IPC$删除,那么命名管道机制将不能使用,例如类似/pipe/epmapper的命名管道将不能使用。而删除前4项文件夹共享,将不会影响命名管道的使用。
命名管道由一个文件系统驱动来实现,该文件驱动是npfs.sys。管道列表工具被用于枚举npfs命名空间,来显示本地打开了哪些命名管道。依靠在驱动列表中选择命名管道,文件监视工具同样可以监控命名管道文件系统的活动状态。
在windows系统中,命名管道是IPC(进程间通信)机制的一种。可以用于本地通信,也可以用于远程通信。访问远端的命名管道(包含在IPC$共享中)要使用SMB协议。
实验
如上图所示,进行了远程rpc调用实验,该rpc是通过命名管道来进行远程调用,命名管道的名称为\\IP\\pipe\\{8dd50205-3108-498f-96e8-dbc4ec074cf9}。调用成功后,在IPC$一行上的#客户重定向栏上会显示1。经过测试发现,如果打开IPC$共享的话,那么所有的命名管道将能被使用。如果关闭IPC$共享的话(删除上图中的IPC$),那么所有的命名管道将不能被远程机器使用。
注:IPC$也是一个命名管道,命名管道名和guid可以使任意值。
RPC原理下面的图是一个RPC网络通信的逻辑图
RPC:远程过程调用,是一种允许分布式应用程序调用网络上不同计算机的可用服务的机制。RPC服务会在注册表中给自己注册一个UUID,称为通用唯一标识符,这个UUID针对每一项服务都是一个唯一的值,且在所有的平台上通用。RPC通信会使用两种机制,一种是基于命名管道的方式,一种是基于TCP/IP的方式。当使用命名管道的方式进行通信时,将使用固定的139或445端口,当使用TCP/IP的方式进行通信时,将使用固定端口或动态分配端口。
但在服务的生存期内,端口的分配是静态的,当一个客户端要与特定的RPC服务通讯的时候,它无法事先知道该服务在哪一个端口上运行。因此该客户端会先建立一个到服务器端口映射器服务,在135端口,并使用其请求的服务的UUID向服务器端口映射器服务查询该端口号,端口映射器会将相应的端口号返回给客户端,然后关闭连接。
WindowsRPC服务
某个windowsservice服务(计算机管理中看到的)可能提供多个RPC服务,window服务和RPC服务可能是一对多的关系,也可能是多对多的关系。每个RPC服务对应一个uuid,该端点有可能是命名管道,也有可能是TCP/IP端口。但是一个通信端点有可能对应多个RPC服务或接口,也就是说RPC服务或接口可能存在多个共享一个通信端点的情况。每一个RPC服务又对应了多个Operationname,每个Operationname相当于一个函数。Operationnumber在有些情况下会使用。如下图所示:
RPCSS.EXE中存在了多个RPC服务,也就对应了多个uuid。这多个RPC服务都使用同一个端口135,并且是用同一个命名管道\\pipe\epmapper。但是使用命名管道时,可能就要走445端口。其实这些RPC服务中最重要的是EPM服务(服务端口映射查询服务,uuid为
e1af8308-5d1f-11c9-91a4-08002b14a0fa)。
Portmapper服务(EPM)是一个RPC服务,该RPC服务能够使用下面的通信端点:
ncalrpc:epmapperLPCport ncacn_np:epmappernamedpipe ncacn_ip_tcp:135/tcp ncadg_ip_udp:135/udp ncacn_http:593/tcp
Metasploit与RPC
在metasploit中,使用rpc进行远程过程调用时,可以使用namedpipe作为端点,也可以使用TCP/IP作为端点。
当使用namedpipe时,
handle=dcerpc_handle(4b324fc8-1670-01d3-1278-5a47bf6ee188,3.0,ncacn_np, [\\#{datastore[SMBPIPE]}])
当使用tcp时
handle = dcerpc_handle(fdb3a030-065f-11d1-bb9b-00a024ea5525, 1.0, ncacn_ip_tcp,[datastore[RPORT]])
程序中使用倒了NDR,NDR是RPC层进行数据编码的协议。远程过程调用NDR(网络数据表示)引擎是RPC和DCOM组件的编码引擎。NDR引擎处理远程调用中所有的stub相关的事情。NDR编码过程是被来自于MIDL生成的stubs中的c代码来驱动。
整个代码的开头之所以要引入Exploit::Remote::SMB,是因为用到了smb_login()。如果bind操作中使用的不是命名管道,使用的是tcp网络端口的话,那么就不需要有smb_login()连接函数了。
利用IPC$,连接者甚至可以与目标主机建立一个空的连接而无需用户名与密码(当然,对方机器必须开了ipc$共享,否则你是连接不上的),而利用这个空的连接,连接者还可以得到目标主机上的用户列表(不过负责的管理员会禁止导出用户列表的)。
RPC漏洞挖掘
MetaSploit中存在一些rpc应用漏洞挖掘的工具。当然我们如果能够了解原理,那么可以直接手工编写一些自己的漏洞挖掘工具。
相关工具
PipeList、FileMon、135dump.exe、ifids.exe、rpcdump等工具
PipeList和FileMon能够枚举系统上出现的命名管道。
rpcdump是一个在windows环境下查看远程主机rpc服务信息的工具,通过EPM服务进行信息的查询。
mida插件是IDA上的一个插件,用于逆向出RPC调用,获得函数和对应的码号ifids.exe的功能是查看某个端点上绑定了哪些RPC应用,该端点既可以是命名管道,也可以是端口号。
IEen工具是一个专业远程控制工具,通过通过目标主机的135端口查询目标主机中开放了哪些RPC服务,并和这些开放的RPC服务进行通信。可以监控用户使用浏览器、Excel等。
但是必须知道目标主机的IP地址、系统登录名和密码。
135dump.exe我没有用过,其作用可能是查询系统中注册的RPC服务的信息,类似于rpcdump。
基于命名管道的RPC
在基于命名管道的RPC协议中,由管道名、UUID、子过程号(函数号)来唯一确定一个远程函数调用,由此,可以利用这三个要素来实现对远程RPC漏洞的FUZZ测试。对于基于管道进行的RPC通信,我们最好事先能够知道该RPC服务对应的UUID、命名管道名和子过程号,如果不知道,那么采用下面的方法:
(1)首先通过sysinternal公司发布的PipeList工具枚举出系统上所有管道名。
(2)通过IFIDS工具获得每一个管道对应的UUID列表及其版本号,同时要注意的是某些管道名无法通过IFIDS获得其对应的UUID。
netuse//10.10.7.44/ipc$/user: Thecommandcompletedsuccessfully. ifids.exe-pncacn_np-e/pipe/epmapper-t10.10.7.44 Interfaces[3]: InterfaceUUID:e1af8308-5d1f-11c9-91a4-08002b14a0faversion3.0 InterfaceUUID:0b0a6584-9e0f-11cf-a3cf-00805f68cb1bversion1.1 InterfaceUUID:975201b0-59ca-11d0-a8d5-00a0c90d8051version1.0 ifids-pncalrpc-entsvcsserveur Interfaces:7 [...] 8d9f4e40-a03d-11ce-8f69-08003e30051bv1.0
注意:
建立空会话是必要步骤。有人什么也没得到,最大可能是忘记或不清楚需要提前建立SMB会话才能访问远程命名管道。访问本地命名管道时无需提前建立SMB会话。
基于TCP/IP的RPC
ifids.exe-pncacn_ip_tcp-e135-t10.10.7.44 Interfaces[11]: InterfaceUUID:e1af8308-5d1f-11c9-91a4-08002b14a0faversion3.0!!! InterfaceUUID:0b0a6584-9e0f-11cf-a3cf-00805f68cb1bversion1.1 InterfaceUUID:975201b0-59ca-11d0-a8d5-00a0c90d8051version1.0 InterfaceUUID:e60c73e6-88f9-11cf-9af1-0020af6e72f4version2.0 InterfaceUUID:99fcfec4-5260-101b-bbcb-00aa0021347aversion0.0
总结
进行漏洞挖掘最好的方法还是自己编写漏洞挖掘软件,使用类似于sulley这样的第三方开源框架,通过PAIMEI中的工具监控被测软件的代码覆盖率,使用逆向分析将rpc传输过程中的数据加密进行绕过处理。总而言之,漏洞挖掘者需要发挥想象就是了。
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。作者不鼓励或支持任何形式的非法破解行为。