AD 侦查-MSRPC
本文通過 Google 翻譯 AD Recon – MSRPC (135/539) 這篇文章所產生,本人僅是對機器翻譯中部分表達別扭的字詞進行了校正及個別注釋補充。
導航
- 0 前言
- 1 MSRPC(遠程過程調用)– Port 135
- 2 初始枚舉 – Nmap 掃描
- 3 枚舉 RPC 端點 – rpcdump.py
- 3.1 查找有趣的服務
- 4 映射 RPC 端點 – rpcmap.py
- 4.1 通過 MSRPC 檢索網絡接口的 IPs 地址
- 4.1.1 枚舉 IPv6 地址
- 4.1 通過 MSRPC 檢索網絡接口的 IPs 地址
- 5 使用 Metasploit 枚舉 RPC
- 5.1 auxiliary/scanner/dcerpc/endpoint_mapper
- 5.2 auxiliary/scanner/dcerpc/hidden
- 5.3 auxiliary/scanner/dcerpc/management
- 5.4 auxiliary/scanner/dcerpc/tcp_dcerpc_auditor
- 6 最后的想法
0、前言
在這篇文章中,我們將介紹幾種不同的工具,用來枚舉運行在 TCP/UDP 135 端口上的 MSRPC 服務。
首先,我們會簡要介紹 MSRPC 并概述其工作原理;其次,在 Windows 10 主機上執行 nmap 掃描并發現 MSRPC 服務正在運行;然后,使用 rpcdump.py 工具枚舉 RPC 端點,同時了解如何查找特定的服務;接著,使用 rpcmap.py 工具映射 RPC 端點。(遺憾的是,Windows 10 主機不允許匿名訪問。于是,我們把精力集中在了 DC 上,這樣運氣可能會好一些。)
在映射 RPC 端點之后,我們發現了一個有趣的 RPC 服務正在運行且可以被利用。于是,利用公開的漏洞,我們提取到了 DC 自身的一些網絡接口及其對應的 IP 地址。
在提取到 IP 地址列表之后,我們對其進行逐一檢查,于是再次得到了一個可訪問的 IPv6 地址。這意味著,枚舉范圍將再次擴大。于此同時,我們也將了解一些可以用來枚舉 IPv6 地址的工具用法。
最后,我們將探索可用于枚舉 MSRPC 的四個不同的 Metasploit 模塊。
1、MSRPC(遠程過程調用)– Port 135
微軟遠程過程調用 (MSRPC) 是一種通信協議,它用于向網絡中另一臺計算機上的程序請求服務。換句話說,MSRPC 調用遠程系統上的其它進程,就像是在本地系統中調用它們一樣。這是通過“客戶端-服務器”或“請求-響應”模型實現的。
如果想更詳細地了解 RPC 的工作原理,請查看維基百科。
RPC 端點映射器可通過 TCP 和 UDP 135 端口、使用空會話或驗證會話(TCP 139 和 445)的 SMB (管道)以及監聽 TCP 593 端口的 web 服務進行訪問。此外,在 49xxx 上打開 RPC 端口也很常見,而這些端口又被稱為“隨機分配的高 TCP 端口”。
注:TCP端口 593 是 RPC over HTTP(通常叫 RPC over HTTP v1/v2,后來也叫 RPC over HTTPS)使用的標準端口。
MSRPC 服務使用 IPC 機制(如 命名管道、NetBIOS、Winsock)在客戶端和服務器之間建立通信,協議 IPC$、TCP、UDP、HTTP 用于提供對服務的訪問,了解這一點對于理解基于 SMB 進行的 MSRPC 訪問至關重要。
注:(1)IPC 機制(Inter-Process Communication,進程間通信)是一種在不同進程之間交換數據或信號的機制。(2)
IPC$是 Windows 電腦都會打開的默認共享,同時它也是 SMB 管道協議提供訪問 RPC 服務的一個代表。
然而,在這篇文章中,我們會將注意力盡可能多地集中在對 135 端口的枚舉上,而關于 SMB 的 RPC 則會在下一篇文章中再詳細介紹。
此外,由于 RPC 是用于從網絡中的另一臺主機請求遠程服務的服務,因此,作為攻擊者我們應該考慮如何將特制的輸入傳遞給應用程序以在目標系統上執行任意代碼。
2、初始枚舉 – Nmap 掃描
首先,假設我們有一臺 Windows 10 的目標機器,其 IP 地址為 172.16.1.200,然后使用 nmap 對其進行 TCP 掃描。
nmap -A -sV -sC -T4 172.16.1.200 -p- -oN tcp_full.nmap
從上面的輸出中可以看到,端口 135 以及高 RPC 端口是開放的,那么接下來就讓我們開始 RPC 服務的枚舉吧。
3、枚舉 RPC 端點 – rpcdump.py
我們可以與 135 端口交互,以查詢 RPC 定位器服務和各個 RPC 端點。這樣,我們就能對通過 TCP、UDP、HTTP 和 SMB 命名管道運行的有趣服務進行分類。
RPC 定位器服務能被訪問主要是通過以下五種協議綁定類型:
- ncacn_ip_tcp — TCP 端口 135
- ncadg_ip_udp — UDP 端口 135
- ncacn_http — RPC over HTTP 通過 TCP 端口 80、593 或其它端口
- ncacn_np — SMB 命名管道
\pipe\epmapper - ncalrpc — 基于本機的本地 RPC 通信協議(不走網絡,以上 4 種是通過網絡進行的)
ncacn_ip_tcp 和 ncacn_np 是我們在枚舉過程中最常見的協議綁定,但理解其它綁定也很重要。
可以用來遠程查詢 RPC 定位器服務的最佳工具是 rpcdump.py,它是Impacket 腳本集合的一個腳本。
該腳本會轉儲目標上注冊的 RPC 端點和協議綁定列表。此外,它還會嘗試將轉儲的列表與已知端點列表進行匹配。
注:端點在 rpcdump 的結果中是指“Protocol、Provider、UUID、Bindings”的綜合,但實際上只是“UUID、Bindings”的綜合,而協議綁定列表僅指 Bindings 中的值。工具 rpcdump.py 轉儲讀到的信息應該只有 UUID、Bindings 有值,至于說 Protocol、Provider 中也會出現的值,應該是工具匹配已知 RPC UUID 列表并處理之后的結果。
rpcdump.py 172.16.1.200 -p 135
從上面可以看到,rpcdump.py 能夠收集目標機器上所有的端點,即目標系統上運行的服務及其綁定的協議列表??偣厕D儲了 334 個使用端點映射器分配了 RPC 端口號的端點(334 個正在運行的且注冊了 RPC 的服務)。
RPC 端點映射器允許 RPC 客戶端讀取以確定當前分配給特定 RPC 服務的端口號??蛻舳酥挥兄懒颂囟ǚ諏膮f議綁定列表,然后才能去和該服務進行通信。
3.1、查找有趣的服務
在上面的 334 個服務中,我們看到的大多都是一些僅在主機內部運行的服務,因此我們應該查找一些可以為我們提供潛在攻擊的特定遠程服務。例如,可以檢查 Print Spooler 打印服務是否在運行,如果在運行,我們就可以遠程利用 PrintNightmare 并獲得 SYSTEM shell。
rpcdump.py 172.16.1.200 -p 135 | egrep 'MS-RPRN|MS-PAR'
有返回值,則表明該主機很可能會受到 PrintNightmare 的攻擊!
有關 PrintNightmare 漏洞的更多信息,可查看該帖子。
現在我們已經了解了如何遠程轉儲目標主機上的端點列表,那么接下來就可以更進一步,以嘗試發現一些有趣的端點映射。
4、映射 RPC 端點 – rpcmap.py
可以用來枚舉 MSRPC 的另一個工具是 rpcmap.py,它也來自 Impacket 腳本集合。
Rpcmap.py 會掃描正在監聽的 DCE/RPC 接口,并綁定到 MGMT 接口以獲取接口 UUID 列表。如果 MGMT 接口不可用,它就會使用已知的外部接口 UUID 列表,并嘗試綁定到每個接口。因此,該工具將識別目標系統上開放的 DCE/RPC 接口。
注:rpcmap.py 首先嘗試遠程綁定到 RPC 的 MGMT 接口,成功的話就能獲取到目標機器上的大量的 UUID 接口,然后再逐一對這些接口發起遠程綁定請求,請求成功的則記錄下來。如果綁定 MGMT 接口失敗,那么它就使用一份已知的 UUID 列表,然后去逐一嘗試去發起綁定請求,同樣也是成功的記錄下來?!娟P于 MGMT 的概念可查看本文 5.3 小節處的注釋】
因此,這種方式很像是一種 UUID 爆破,它和 rpcdump.py 的端點轉儲還不太一樣。但這種方式的好處就是:(1)隱藏的 UUID 通過轉儲無法發現,但它能爆破出來。(2)最終記錄出來的 UUID 基本都是 ncacn_ip_tcp 這樣的可以通過網絡遠程通信的。
注:DCE/RPC 即 Distributed Computing Environment / Remote Procedure Calls,分布式計算環境 / 遠程過程調用,它們都屬于 RPC 的稱呼。
通俗來講,rpcdump.py 能夠轉儲端點和綁定,而 rpcmap.py 可以用來確定端點映射是否可以通過遠程綁定。
接下來,我們從枚舉綁定在 ncacn_ip_tcp(TCP port 135)上的映射開始。
rpcmap.py 'ncacn_ip_tcp:172.16.1.200'
不幸的是,在默認情況下,我們無法以匿名身份枚舉加入了域的 Windows 10 機器。
然而,Windows Server 計算機并非總是如此。通常情況下,它們默認允許我們在 MSRPC 級別進行匿名訪問。
因此,我們將把重點轉移到域控制器上,看看通過匿名會話可以找到些什么。
rpcmap.py 'ncacn_ip_tcp:172.16.1.5'
Amazing!我們能夠匿名轉儲端點映射,在獲得這些端點的服務信息后,我們可以在線搜索,看看其中是否有任何服務容易受到遠程溢出攻擊。
遠程溢出漏洞在舊版 Windows 中更為常見。話雖如此,但最近有一個值得關注的漏洞:CVE-2022-26809
在這個網站中,我們可以用它來引用 UUID 值來確定它們的分配情況。具體來說,我們應該特別關注的是 IObjectExporter 的 RPC 接口的 UUID,也就是 IOXIDResolver(在土豆攻擊中使用過)。
IObjectExporter – {99fcfec4-5260-101b-bbcb-00aa0021347a}
4.1、通過 MSRPC 檢索網絡接口的 IPs 地址
發現 IObjectExporter 服務正在運行后,我們可以使用一個很酷的技巧來提取目標主機上所有網絡接口的 IP 地址。然后根據提取到的網絡接口,我們很可能會發現另外一種可以轉移到其它網絡的方式,也可能會提供 IPv6 地址。
如果發現 IPv6 地址,就可以使用它來嘗試在主機上找到要枚舉/利用的其它服務。此時,需要使用此腳本進行。
./IOXIDResolver.py -t 172.16.1.5
BOOM!通過腳本,我們成功發現了另一個網絡的 IP 地址 10.0.3.15。這可能是在后滲透階段一個潛在的突破機會,但在此時它基本不會有什么作用。還是把目光看向對應 172.16.1.5 接口的 IPv6 地址吧。
令人驚訝的是,這在 Windows 10 主機上也能正常工作,盡管我們使用 rpcmap.py 時被拒絕訪問。
4.1.1、枚舉 IPv6 地址
首先,通過 ping IPv6 地址以確保我們可以與其進行通信。
ping -c 3 2607:fea8:9961:d700:7d6d:b8f1:231e:c614
Perfect!ping 是成功的。
然后,我們使用 nmap 查找任何以前未被發現的開放端口,選項 -6 表示支持 IPv6 地址。
nmap -6 -A -sV -sC -T4 2607:fea8:9961:d700:7d6d:b8f1:231e:c614 -p- -oN tcp_ipv6.nmap
我們希望可以找到一個只在 IPv6 上運行不在 IPv4 上運行的新的有趣的服務,但經過掃描我們并沒有發現這個服務。
例如,如果我們發現 445 端口在 IPv6 上開放,而在 IPv4 上未開放,那我們仍然可以使用許多用于攻擊 IPv4 的工具去攻擊 IPv6。這是因為許多工具基本都添加了對 IPv6 的支持,因為 IPv6 在當今的現代網絡中是至關重要的。
下面僅舉幾個工具,以展示在面對 IPv6 地址時它們是如何使用的。
smbclient -L 2607:fea8:9961:d700:7d6d:b8f1:231e:c614 -N
crackmapexec smb 2607:fea8:9961:d700:7d6d:b8f1:231e:c614 --shares -u '' -p ''
好了,讓我們回到正文。
除了上面介紹的 Impacket 工具 rpcdump.py 和 rpcmap.py 之外,可以用來枚舉端口 135 上的 MSRPC 的另一個好工具是 Metasploit。
5、使用 Metasploit 枚舉 RPC
Metasploit 有一些非常好的模塊,可以完成我們用 rpcdump.py 和 rpcmap.py 所能完成的大量工作,甚至更多。
首先,讓我們使用以下命令啟動 Metasploit:
msfconsole -q
然后使用以下命令來查看所有 RPC 枚舉腳本:
search auxiliary/scanner/dcerpc
通過搜索,我們找到了 8 個輔助模塊,然而,并非所有這些模塊都對我們的枚舉有用。
對于我們當前的枚舉,我們將把重點放在使用端口 135 的四個模塊上,它們分別是:
- auxiliary/scanner/dcerpc/endpoint_mapper
- auxiliary/scanner/dcerpc/hidden
- auxiliary/scanner/dcerpc/management
- auxiliary/scanner/dcerpc/tcp_dcerpc_auditor
接下來,讓我們看看每個模塊的實際示例!
5.1、auxiliary/scanner/dcerpc/endpoint_mapper
Endpoint_mapper 模塊會查詢遠程系統的 EndPoint Mapper 服務,以確定哪些服務可用。其功能與 rpcdump.py 類似。
use auxiliary/scanner/dcerpc/endpoint_mapper
show options
set RHOSTS 172.16.1.200
exploit
5.2、auxiliary/scanner/dcerpc/hidden
該模塊將查詢端點映射器并列出所有 ncacn_tcp RPC 服務的列表。然后,它將連接到每個服務,并使用管理 API 列出該端口上可訪問的所有其他 RPC 服務。
注:正?;?RPC 的服務會把自己的接口信息注冊到 135 端口上的端點映射器上,但一些 RPC 服務(為測試接口、故意隱藏管理接口、廠商私有擴展)不走標準注冊流程導致普通掃描器就掃不出來。這時客戶端可以根據一些已知的隱藏接口的 UUID 強行與其發起綁定請求,若回復則標識接口存在,反之接口不存在。
端口 135處運行的服務是 RPC 端點映射器服務,而那些注冊了 RPC 的服務則可以稱為 RPC 服務。
任何被發現連接到 TCP 端口但未在端點映射器中列出的 RPC 服務都將被顯示和分析,以確定是否允許匿名訪問。
use auxiliary/scanner/dcerpc/hidden
show options
set RHOSTS 172.16.1.200
exploit
從上面可以看到,在針對 Windows 10 機器進行測試時,所有接口的匿名訪問都被拒絕。
然而,當瞄準 DC 時,會發現一些隱藏的服務。
這很酷,因為它為我們提供了額外的 UUID,而這些 UUID 是我們從轉儲端點中無法獲得的。希望這些隱藏的服務能映射到存在漏洞的服務。
5.3、auxiliary/scanner/dcerpc/management
該模塊可用于從遠程管理接口 DCERPC 服務獲取信息。
注:
MGMT(RPC management):管理所有注冊到 RPC 的服務的 UUID,相當于一個檔案管理員。
EPM(RPC endpoint_mapper):根據客戶端提供的接口UUID,告訴客戶端這個 UUID 接口在什么地方監聽。相當于一個指路人。
MGMT 接口是列出/管理所有注冊的 RPC 接口信息;EPM 是幫助客戶端根據 UUID 找到 RPC 服務位置的訪問端口。
use auxiliary/scanner/dcerpc/management
show options
set RHOSTS 172.16.1.200
exploit
再次,當面向 Windows 10 主機時,匿名訪問會被拒絕。
而當面向 DC 時,我們的運氣會更好一些,并且匿名訪問是可以接受的。
5.4、auxiliary/scanner/dcerpc/tcp_dcerpc_auditor
該模塊允許我們確定哪些 DCERPC 服務可通過 TCP 端口訪問。
注:該模塊會爆破一份內置的 UUID 列表(里面是常見的、危險的、敏感的DCE/RPC接口UUID,比如MS-SAMR、MS-LSAD、MS-DRSR),然后對每一個 UUID 嘗試進行 Bind 請求操作,若成功則記錄該 UUID,從而找出暴露的 RPC 接口。
use auxiliary/scanner/dcerpc/tcp_dcerpc_auditor
show options
set RHOSTS 172.16.1.200
exploit
有趣的是,它連接到 IObjectExporter,這正是我們之前使用 rpcmap.py 在 DC 上找到的。然后我們利用它來提取所有適配器 IP。
此外,當使用 rpcmap.py 拒絕訪問時,可以用它來確認該服務是否正在運行。
6、最后的想法
如您所見,在端口 135 上可以進行一些相當不錯的枚舉,它提供給了我們很多東西,因此絕對是一個不應該被忽視的端口。
作為攻擊者,我們應該始終嘗試以匿名的方式在任何可能的地方進行枚舉。像如 MSRPC 這樣的服務,當它允許匿名訪問時,它會提供大量的信息,而這些信息可能有助于我們找到憑據,甚至在系統上獲得立足點。
總結
以上是生活随笔為你收集整理的AD 侦查-MSRPC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6.4K star!轻松搞定专业领域大模
- 下一篇: Linux操作系统(下)