AD域安全协议(四)RPC

 

如驾驶需要遵守交通规则一般,在网络中活动的事务,也需要遵守相应的规则,这套“规则”的具体实现,则通过网络上的“协议”,并且,在不同的应用环境下,有不同的协议规范。

AD域中特色功能的实现,主要依赖的协议有Kerberos、ntlm、ldap、rpc、smb,本次科普系列,我们为大家详细介绍这几项协议,帮助大家梳理。

RPC协议主要用来进行远程过程调用,用一句话来概括,就是允许用户程序调用服务器上的函数进行计算,由此实现两者交互。

早先的企业环境中,所有的服务都在一台主机上,就会导致服务器负荷过重,无法保证业务的正常运作。正因如此,后来企业就更换了一种思路,将不同服务分开,分别存放在不同主机上,暂时解决了负荷问题。但是久而久之,这样的方式也开始显现弊端,比如当用户需要使用不同服务器上的服务协作来完成任务时,服务与服务之间该如何交互?

这就是RPC要解决的问题,简言之,RPC可以允许一台机器上的程序调用另一台机器上的函数,通过各计算机协作进行计算,以保证用户任务顺利完成

接下来我们详细说说RPC的原理。

 

RPC原理

同AD域内的大多数协议一样,RPC也采用的是请求响应模式。通常的请求响应,只需要客户端和服务器直接做交互就行了,但在RPC中,增加了两个处理过程,即客户端存根和服务器存根。

此存根的作用为:当客户端想调用服务器上的某函数时,需要把客户端的参数提供给服务器。而为了保证参数的保密、完整、可用和响应的高效性,客户端需要对传输过程做些特殊处理,包括将数据序列化、封装数据、寻址、传递数据等。

如果这一系列复杂行为都由客户端来操作,将会耗时耗力,所以RPC就建立了一个存根,让它来协调管理这些过程,减轻客户端负担。

在存根的作用下,客户端将参数递交给它,后续只需要等待接收服务器返回的数据就行了。因此,用户其实是感受不到这个跟服务器交互的过程的,这一切似乎都像在本机上完成的一样。

以上内容,我们提到存根的一个重要作用——序列化。

所以,什么是序列化?

客户端把参数交给存根后,如果存根直接将参数交给服务器,当服务器的系统与客户端不一样时,服务器就不能解析该参数,也无法调用相应函数,等于客户端也就得不到正确的返回结果。

为了让服务器能正确解析客户端的参数,我们就需要将参数转化成服务器能理解的方式。

在RPC中,客户端存根就把要传递的数据信息序列化成二进制,以方便服务器识别并处理。

这里的数据信息不单包括参数,还有要调用的函数ID。客户端存根将它们统一序列化成二进制后,打包递交给传输层。

传输层使用TCP协议,所以RPC中,上层传递下来的二进制信息需要进一步封装在TCP包中,寻址后发送给相应的服务器。

可都封装好了,为什么要有寻址这一步骤呢?

简而言之,寻址的重要作用就是找到该函数对应的服务器地址。但是企业环境中,各服务分散在不同的服务器上,如果都由客户端来“记忆”,将导致巨大的资源浪费。为了方便查询分散的服务地址,RPC中会将所有服务和对应地址都集中在一起,这个集中了所有服务地址的机器就是注册中心。

通过注册中心,客户端和服务器可以更方便地交互。

对服务器来说,它每增加或注销一项服务就通知注册中心进行更改,而不必一一告知客户端。对客户端来说,它也不必记住每一项服务所在地址,也不用管服务地址是否有变化。只需要在申请服务时,从注册中心查找到服务地址,向该地址发送数据包就行了。也就是说服务端的变化对客户端几乎没有影响。

数据包传递到服务器后,先由传输层对其解析,得到序列化过的二进制包。

要把这个二进制包转化成服务器能理解的数据格式,就需要与序列化相对的反序列化。

通常在服务器上,同样拥有一个服务端存根,它和客户端存根的作用一样,用来管理RPC过程中的大部分事务,反序列化也由它来完成。

在这里,服务端存根对二进制包反序列化,得到参数和要调用的函数ID,然后递交给服务器。服务器计算后得到结果,返回给客户端。

RPC中,结果返回时,同样需要服务端存根来对其进行序列化后传输,客户端收到响应数据包后由客户端存根再次对其反序列化,得到结果。

这样,在RPC协议规范下,客户端就成功调用了服务端的函数来完成计算。

 

结语

相比于HTTP等传输协议,RPC将数据序列化成二进制,直接在传输层上与服务端交互,极大地提高了传输效率。并且使用存根来管理RPC的底层过程,让客户端和服务端的交互变得透明,从而为用户提供了方便。

不过,抛开传输效率的便利,RPC中同样也存在很多安全威胁,比如Zerologon(CVE-2020-1472)、Printnightmare(CVE-2021-34527)等,攻击者利用这些漏洞,可以直接通过RPC协议连接服务器,并向其发送恶意代码,从而获取控制目标服务器的权限,这也是使用协议时要提防的一个方向。

以上就是RPC协议的全部内容,下一篇文章中,我们将继续为大家介绍SMB协议。

了解更多AD域协议相关,欢迎关注中安网星

(完)