MS-RPC(Microsoft 远程过程调用)是一种协议,允许在不了解另一台计算机网络细节的情况下,从另一台计算机上的程序请求服务。MS-RPC 服务可以通过不同的传输协议访问,其中主要包括:
RPC 服务通过 SMB 传输(即端口 445/TCP),可以通过“命名管道”(通过 IPC$
共享)进行访问。有许多有趣的命名管道允许从 NULL 会话上下文到本地管理员上下文执行各种操作
\pipe\lsarpc
:通过 LSA(本地安全机构)枚举权限、信任关系、SID、策略等信息。\pipe\samr
通过本地 SAM 数据库枚举域用户、组等信息(仅适用于 Windows 10 周年更新之前的版本)。\pipe\svcctl
远程创建、启动和停止服务以执行命令(被 Impacket 的 psexec.py 和 smbexec.py 利用)。\pipe\atsvc
远程创建计划任务以执行命令(被 Impacket 的 atexec.py 利用)。\pipe\epmapper
被 DCOM(分布式组件对象模型)使用,DCOM 又被 WMI(Windows 管理规范)使用,攻击者常利用其进行命令执行(被 Impacket 的 wmiexec.py 利用)。epmapper(MS-RPC 端点映射器)将服务映射到端口。它使用端口 135/TCP 和/或端口 593/TCP(用于 RPC over HTTP)。通过 epmapper,工具如 Impacket 的 rpcdump.py(Python)或 rpcdump.exe(C)从 rpctools 可以找到暴露的 RPC 服务
# with rpcdump.py (example with target port 135/TCP)
rpcdump.py -port 135 $TARGET_IP
# with rpcdump.exe (example with target port 593/TCP)
rpcdump.exe -p 593 $TARGET_IP
┌──(root㉿kali)-[~/Desktop/tmp]
└─# impacket-rpcdump -port 135 192.168.3.142
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Retrieving endpoint list from 192.168.3.142
Protocol: [MS-RSP]: Remote Shutdown Protocol
Provider: wininit.exe
UUID : D95AFE70-A6D5-4259-822E-2C84DA1DDB0D v1.0
Bindings:
ncacn_ip_tcp:192.168.3.142[6005]
ncalrpc:[WindowsShutdown]
ncacn_np:\\OWA2010SP3[\PIPE\InitShutdown]
ncalrpc:[WMsgKRpc099A50]
Protocol: N/A
Provider: winlogon.exe
UUID : 76F226C3-EC14-4325-8A99-6A46348418AF v1.0
Bindings:
ncalrpc:[WindowsShutdown]
ncacn_np:\\OWA2010SP3[\PIPE\InitShutdown]
ncalrpc:[WMsgKRpc099A50]
ncalrpc:[WMsgKRpc0A1A51]
.....
NULL 会话是不需要身份验证的 SMB 会话,允许攻击者在不先进行身份验证的情况下通过 SMB 命名管道执行 RPC 调用。这允许进行许多侦察技术,如枚举域和本地信息(用户、组、RID、SID、策略等)
可以使用 Enum4linux 来获取空会话用户
enum4linux -A $IP
smbmap -u anonymous -H $domain
Samba 工具 rpcclient 可以用于通过 SMB 命名管道背后的 MS-RPC 服务进行侦察。它提供了多个有用的命令。
lsaquery
: 获取域名和 SID(安全标识符)enumalsgroups builtin
: 列出本地组,返回 RID(相对 ID)lookupsids <SID>
: 将 SID 解析为名称queryaliasmem <RID>
: 列出本地组成员,返回 SIDlookupnames <NAME>
:解析名称到 SIDenumdomusers
列出用户,等同于 net user /domain
enumdomgroups
列出组,等同于 net group /domain
queryuser <rid/name>
获取用户信息,等同于 net user <user> /domain
querygroupmem <rid>
获取组成员,相当于 net group <group> /domain
getdompwinfo
获取密码策略rpcclient -c "command1,command2" $TARGET_IP
#示例 进行rid枚举
┌──(root㉿kali)-[~/Desktop/tmp]
└─# rpcclient -c "enumdomusers" 192.168.3.142 -U administrator --password 'Admin!@#45'
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[SM_32dfa537f3d34e8db] rid:[0x45f]
user:[SM_b9293dd4eb974c39a] rid:[0x460]
user:[SM_a53ca95cbbc2400a8] rid:[0x461]
user:[SM_cabbcb1fa25c4786a] rid:[0x463]
user:[itadmin] rid:[0x465]
user:[antivirus] rid:[0x466]
RID Cycling 是一种攻击方法,攻击者可以通过暴力破解或猜测 RID 和 SID 来枚举域对象,其原理是 RID(相对标识符)是按顺序分配的
# RID枚举
crackmapexec smb 192.168.56.16 -u xxx -p xxxx --rid-brute
nxc smb 192.168.3.142 -d 0day.org -u administrator -p 'Admin!@#45' --rid-brute
rpcclient -c "enumdomusers" 192.168.3.142 -U xxxx --password xxx #不完整
impacket-lookupsid <domain>/<username>:<password>@<target_ip>
DCOM(分布式组件对象模型)是一组微软的程序,允许客户端程序对象在网络上的其他计算机上请求服务。DCOM 基于组件对象模型(COM),后者为客户端和服务器在同一网络内的通信提供了一组接口。
在这些服务中,IObjectExporter(OXIDResolver,GUID=99fcfec4–5260–101b-bbcb-00aa0021347a) 是一个在所有支持 COM+ 的机器上运行的服务。DCE-RPC 请求允许调用 OXIDResolver 服务,随后可以从该服务调用 ServerAlive2()
方法。
ServerAlive2 方法用于获取 DCOM/COM 环境中远程主机可用的网络接口信息,具体来说,它会返回目标主机上所有活动网络接口的绑定(binding)列表。
总结来说,如果 IOXIDResolver 服务在一台 Windows 主机上处于活动状态且可访问,就可以在该主机上发现新的网络端点(如 IPv6 地址),这种发现可以通过匿名连接或凭证认证实现。
目前已经有 Python 脚本可以远程完成这个任务。 GitHub - Anh4ckin3/IOXIDResolver-ng
python IOXIDResolver-ng.py -t $TARGET_IP
# OUTPUT EXEMPLE
[*] Anonymous connection on MSRPC
[+] Retriev Network Interfaces for 192.168.5.20...
[+] ServerAlive2 methode find 3 interface(s)
[+] aNetworkAddr addresse : DC01 (Hostname)
[+] aNetworkAddr addresse : 192.168.5.20 (IPv4)
[+] aNetworkAddr addresse : db69:ecdc:d85:1b54:1676:7fa4:f3fe:4249 (IPv6)
使用 auth-level = 1(无认证)方式,对域控制器上的 MS-NRPC(Netlogon)接口进行操作。该方法在绑定 MS-NRPC 接口后,调用 DsrGetDcNameEx2 函数,无需任何凭证即可检测某个用户或计算机是否存在。
NauthNRPC 工具实现了这种枚举方式
#枚举域内用户 或者机器用户
┌──(root㉿kali)-[~/Desktop/tools/NauthNRPC]
└─# python3 nauth.py -t 192.168.3.142 -u users.txt -c computers.txt
NAuthNRPC Tool By Haidar Kabibo - Kaspersky Security Services 2024
[*] User Accounts Enumeration
------------------------------
#枚举成功的用户
[+] user Administrator exists.
[+] user tadmin exists.
[+] user jack exists.
#只枚举域控信息
┌──(root㉿kali)-[~/Desktop/tools/NauthNRPC]
└─# python3 nauth.py -t 192.168.3.142
NAuthNRPC Tool By Haidar Kabibo - Kaspersky Security Services 2024
[*] Domain Information
------------------------------
[*] DC Name: OWA2010SP3.0day.org
[*] DC IP: 192.168.3.142
[*] Domain GUID: 0A700981-B5A5-4F8C-9E0A-B5C00EA2D8E9
[*] Domain Name: 0day.org
[*] Forest Name: 0day.org
[*] DC Site Name: Default-First-Site-Name
[*] Client Site Name: Default-First-Site-Name
[*] Domain Flags: DS_PDC_FLAG | DS_GC_FLAG | DS_LDAP_FLAG | DS_DS_FLAG | DS_KDC_FLAG | DS_TIMESERV_FLAG | DS_CLOSEST_FLAG | DS_WRITABLE_FLAG | DS_GOOD_TIMESERV_FLAG | DS_FULL_SECRET_DOMAIN_6_FLAG | DS_WS_FLAG | DS_PING_FLAGS | DS_DNS_CONTROLLER_FLAG | DS_DNS_DOMAIN_FLAG | DS_DNS_FOREST_FLAG
[*] Trusted Domains Information
------------------------------
[*] Trusted Domain number 0
• NetBios Domain Name: 0DAY
• DNS Domain Name: 0day.org
• Flags: DS_DOMAIN_IN_FOREST | DS_DOMAIN_TREE_ROOT | DS_DOMAIN_PRIMARY | DS_DOMAIN_NATIVE_MODE
• Parent Index: Not Available
• Trust Type: TRUST_TYPE_UPLEVEL
• Trust Attributes: Not Available
• Domain SID: s-1-5-21-1812960810-2335050734-3517558805
• Domain GUID: 0A700981-B5A5-4F8C-9E0A-B5C00EA2D8E9
这种与 KerberBrute 有点相似,但是这个走的是rpc服务,而那个走的是kerberos协议
而且这个枚举很慢,差不多7、8秒一个用户