關於 Rid Brute 的一些説明

​​image​​

0x0 很多情況下,通過RPC枚舉用戶并不是那麽的順利。

image

這個時候可以利用windows的rid特徵來枚舉用戶(如果可以的話),如果不行,才會使用kerbrute。

0x1 RID 和 SID 的區別

在linux系統中,判斷你是不是root權限相當於當前用戶的uid是不是等於0,而Linux系統中只識別uid = 0代表root,而不會識別你是不是root用戶。

在windows的情況下類似,系統識別你是不是管理權限,看的是用戶sid,而不是名字。

儅在linux系統中,創建普通user一般是從1000開始,也就是説 少於1000 的則是系統服務的用戶。

1
2
3
4
5
6
7
8
9
┌──(mane㉿manepc)-[~/Heist]
└─$ cat /etc/passwd
root:x:0:0:root:/root:/usr/bin/zsh
...
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
mane:x:1000:1000:mane,,,:/home/mane:/usr/bin/zsh
smbuser:x:1001:1001:,,,:/home/smbuser:/bin/bash

在windows也是如此,新建的用戶rid也是從1000開始,爲了不和build in用戶重合,build in 用戶會從500開始,一些buildin組也會有rid(比如:521​ 代表 Read-only Domain Controllers )administrator 的rid通常是500。

爲了解決在多個DC中不同子域的rid重合問題,windows 默認會給每個DC安排一個domain sid,然後把DC下的用戶合成新的SID,以識別用戶來自哪裏。

image

例如:

  1. 儅 domain 的sid 為 4254423774-1266059056-3197185112
  2. 默認的users通常以 S-1-5-21​開頭 ,合起來就是 S-1-5-21-4254423774-1266059056-3197185112
  3. 因爲administrator的rid是500,在後面加上500就變成了 S-1-5-21-4254423774-1266059056-3197185112-500

那麽,如果對後面的rid進行爆破呢? 比如從500開始到1000,會是怎樣的?

image

是不是和crackmapexec​的結果一樣?

注意:如果DC允許你用anonymous權限去執行lookupsids​ 則可以直接使用crackmapexec​來枚舉,如果連lookupsid​都用不了,crackmapexec​同樣也無法使用,在滲透的時候通常都會隨手敲一下,看看會不會有用戶返回,如果有的話就直接crackmapexec​。

0x2 如何獲得domain的sid,以便我可以手動列舉呢?

當我們知道domain是什麽的時候,可以通過 lookupnames <domain_name>​ 找到該sid。

image

0x3 默認的SID群組

image

而默認的用戶組也有sid,比如(Anonymous、Authenticated Users、Domain Admins)等。通常,這些群組是屬於domain的話,那麽sid就會加上domain的sid,如果是通用的群組,就不會。

image

這些值可以在這裏 找到。

這些群組通常以 S-1-5-32​ 開頭,個別組是和用戶一樣。

可以使用 lsaenumsid​ 來查看。

image

同樣的,我們也可以通過枚舉來猜一下裏面有什麽。

image

在實戰中其實可以使用這樣的技術來猜測安裝了什麽服務。

0x4 後續

如果這時候,了解了上面的原理,其實可以自製一個脚本來實現crackmapexec​的 rid brute功能,kali工具箱也有一個類似的工具,如果要看源碼​的話,你會發現和上面差不多原理。

關於Windows 帐户的 RID Hijacking可以參考這篇文章