【安全科普】AD域安全協議(四)RPC

中安網星發表於2021-11-16

如駕駛需要遵守交通規則一般,在網路中活動的事務,也需要遵守相應的規則,這套“規則”的具體實現,則透過網路上的“協議”,並且,在不同的應用環境下,有不同的協議規範。

AD域中特色功能的實現,主要依賴的協議有Kerberos、ntlm、ldap、rpc、smb,本次科普系列,我們為大家詳細介紹這幾項協議,幫助大家梳理。

【安全科普】AD域安全協議(四)RPC

RPC協議主要用來進行遠端過程呼叫,用一句話來概括,就是允許使用者程式呼叫伺服器上的函式進行計算,由此實現兩者互動。

早先的企業環境中,所有的服務都在一臺主機上,就會導致伺服器負荷過重,無法保證業務的正常運作。正因如此,後來企業就更換了一種思路,將不同服務分開,分別存放在不同主機上,暫時解決了負荷問題。但是久而久之,這樣的方式也開始顯現弊端,比如當使用者需要使用不同伺服器上的服務協作來完成任務時,服務與服務之間該如何互動?

這就是RPC要解決的問題,簡言之,RPC可以允許一臺機器上的程式呼叫另一臺機器上的函式,透過各計算機協作進行計算,以保證使用者任務順利完成

接下來我們詳細說說RPC的原理。

# RPC原理 #

同AD域內的大多數協議一樣,RPC也採用的是請求響應模式。通常的請求響應,只需要客戶端和伺服器直接做互動就行了,但在RPC中,增加了兩個處理過程,即客戶端存根和伺服器存根。

此存根的作用為:當客戶端想呼叫伺服器上的某函式時,需要把客戶端的引數提供給伺服器。而為了保證引數的保密、完整、可用和響應的高效性,客戶端需要對傳輸過程做些特殊處理,包括將資料序列化、封裝資料、定址、傳遞資料等。

如果這一系列複雜行為都由客戶端來操作,將會耗時耗力,所以RPC就建立了一個存根,讓它來協調管理這些過程,減輕客戶端負擔。

在存根的作用下,客戶端將引數遞交給它,後續只需要等待接收伺服器返回的資料就行了。因此,使用者其實是感受不到這個跟伺服器互動的過程的,這一切似乎都像在本機上完成的一樣。

【安全科普】AD域安全協議(四)RPC

以上內容,我們提到存根的一個重要作用——序列化。

所以,什麼是序列化?

客戶端把引數交給存根後,如果存根直接將引數交給伺服器,當伺服器的系統與客戶端不一樣時,伺服器就不能解析該引數,也無法呼叫相應函式,等於客戶端也就得不到正確的返回結果。

為了讓伺服器能正確解析客戶端的引數,我們就需要將引數轉化成伺服器能理解的方式。

在RPC中,客戶端存根就把要傳遞的資料資訊序列化成二進位制,以方便伺服器識別並處理。

這裡的資料資訊不單包括引數,還有要呼叫的函式ID。客戶端存根將它們統一序列化成二進位制後,打包遞交給傳輸層。

【安全科普】AD域安全協議(四)RPC

傳輸層使用TCP協議,所以RPC中,上層傳遞下來的二進位制資訊需要進一步封裝在TCP包中,定址後傳送給相應的伺服器。

可都封裝好了,為什麼要有定址這一步驟呢?

簡而言之,定址的重要作用就是找到該函式對應的伺服器地址。但是企業環境中,各服務分散在不同的伺服器上,如果都由客戶端來“記憶”,將導致巨大的資源浪費。為了方便查詢分散的服務地址,RPC中會將所有服務和對應地址都集中在一起,這個集中了所有服務地址的機器就是註冊中心。

透過註冊中心,客戶端和伺服器可以更方便地互動。

對伺服器來說,它每增加或登出一項服務就通知註冊中心進行更改,而不必一一告知客戶端。對客戶端來說,它也不必記住每一項服務所在地址,也不用管服務地址是否有變化。只需要在申請服務時,從註冊中心查詢到服務地址,向該地址傳送資料包就行了。也就是說服務端的變化對客戶端幾乎沒有影響。

【安全科普】AD域安全協議(四)RPC

資料包傳遞到伺服器後,先由傳輸層對其解析,得到序列化過的二進位制包。

要把這個二進位制包轉化成伺服器能理解的資料格式,就需要與序列化相對的反序列化。

通常在伺服器上,同樣擁有一個服務端存根,它和客戶端存根的作用一樣,用來管理RPC過程中的大部分事務,反序列化也由它來完成。

在這裡,服務端存根對二進位制包反序列化,得到引數和要呼叫的函式ID,然後遞交給伺服器。伺服器計算後得到結果,返回給客戶端。

【安全科普】AD域安全協議(四)RPC

RPC中,結果返回時,同樣需要服務端存根來對其進行序列化後傳輸,客戶端收到響應資料包後由客戶端存根再次對其反序列化,得到結果。

這樣,在RPC協議規範下,客戶端就成功呼叫了服務端的函式來完成計算。

# 結語 #

相比於HTTP等傳輸協議,RPC將資料序列化成二進位制,直接在傳輸層上與服務端互動,極大地提高了傳輸效率。並且使用存根來管理RPC的底層過程,讓客戶端和服務端的互動變得透明,從而為使用者提供了方便。

不過,拋開傳輸效率的便利,RPC中同樣也存在很多安全威脅,比如Zerologon(CVE-2020-1472)、Printnightmare(CVE-2021-34527)等,攻擊者利用這些漏洞,可以直接透過RPC協議連線伺服器,並向其傳送惡意程式碼,從而獲取控制目標伺服器的許可權,這也是使用協議時要提防的一個方向。

以上就是RPC協議的全部內容,下一篇文章中,我們將繼續為大家介紹SMB協議。


瞭解更多AD域協議相關,歡迎關注中安網星


相關文章