0x0 很多情況下,通過RPC枚舉用戶并不是那麽的順利。
這個時候可以利用windows的rid特徵來枚舉用戶(如果可以的話),如果不行,才會使用kerbrute。
0x1 RID 和 SID 的區別
在linux系統中,判斷你是不是root權限相當於當前用戶的uid是不是等於0,而Linux系統中只識別uid = 0代表root,而不會識別你是不是root用戶。
在windows的情況下類似,系統識別你是不是管理權限,看的是用戶sid,而不是名字。
儅在linux系統中,創建普通user一般是從1000開始,也就是説 少於1000 的則是系統服務的用戶。
1 | ┌──(mane㉿manepc)-[~/Heist] |
在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,以識別用戶來自哪裏。
例如:
- 儅 domain 的sid 為
4254423774-1266059056-3197185112
- 默認的users通常以
S-1-5-21
開頭 ,合起來就是S-1-5-21-4254423774-1266059056-3197185112
- 因爲administrator的rid是500,在後面加上500就變成了
S-1-5-21-4254423774-1266059056-3197185112-500
那麽,如果對後面的rid進行爆破呢? 比如從500開始到1000,會是怎樣的?
是不是和crackmapexec
的結果一樣?
注意:如果DC允許你用anonymous權限去執行lookupsids
則可以直接使用crackmapexec
來枚舉,如果連lookupsid
都用不了,crackmapexec
同樣也無法使用,在滲透的時候通常都會隨手敲一下,看看會不會有用戶返回,如果有的話就直接crackmapexec
。
0x2 如何獲得domain的sid,以便我可以手動列舉呢?
當我們知道domain是什麽的時候,可以通過 lookupnames <domain_name>
找到該sid。
0x3 默認的SID群組
而默認的用戶組也有sid,比如(Anonymous、Authenticated Users、Domain Admins)等。通常,這些群組是屬於domain的話,那麽sid就會加上domain的sid,如果是通用的群組,就不會。
這些值可以在這裏 找到。
這些群組通常以 S-1-5-32
開頭,個別組是和用戶一樣。
可以使用 lsaenumsid
來查看。
同樣的,我們也可以通過枚舉來猜一下裏面有什麽。
在實戰中其實可以使用這樣的技術來猜測安裝了什麽服務。
0x4 後續
如果這時候,了解了上面的原理,其實可以自製一個脚本來實現crackmapexec
的 rid brute功能,kali工具箱也有一個類似的工具,如果要看源碼的話,你會發現和上面差不多原理。
關於Windows 帐户的 RID Hijacking可以參考這篇文章。