使用LDAP查詢快速提升域許可權

wyzsk發表於2020-08-19
作者: DM_ · 2014/05/31 15:54

from:https://www.netspi.com/blog/entryid/214/faster-domain-escalation-using-ldap

0x00 背景


如果你是一個滲透測試師,那麼你大概早都清楚從一個本地管理員許可權提升至域管理員許可權只需要幾步就可以,這些步驟通常是透過不同的方法來偷取域管理密碼,密碼hash,或者是認證token,如果你不幸遇到沒有域管登陸的系統然後就只能放棄,然後再去找有域管登陸的機器。一段時間前我寫了一篇文章 “5 Ways to Find Systems Running Domain Admin Processes” 其中列出了一些常見的方法,但是最近我又發現了另外一種方法,所以在這篇文章裡我會介紹透過LDAP查詢” ServicePrincipleName”屬性來找到域管可能登陸的機器的方法。同樣也會給出一些Powershell模組來自動化完成,希望這對滲透測試師和想知道域管理賬號在哪裡登陸的管理員們起到幫助。

0x01 LDAP概述


對於那些並不熟悉Lightwieght Directory Access Protocol (LDAP)人來講,它大概像是一個目錄資訊。雖然LDAP在很多平臺被使用,但在windows的域環境中它卻是 Active Directory Services (ADS)的核心,ADS負責windows域的認證和授權,但也儲存了大量的資訊,這些資訊包括但不限於域使用者,計算機使用者,域使用者組,安全策略和軟體更新。每一個物件都有多種屬性與之關聯,並且其中大部分的屬性都可以透過LDAP查詢。比如每一個使用者都有一個”Created”的屬性包含了賬號建立時間。同樣的每一個賬戶都有一個” ServicePrincipleName”屬性,這也是本文接下來的重點。

0x02 ServicePrincipleName 概述


微軟的文件中是這樣陳述的:”ServicePrincipleName(SPN)是客戶端用來唯一標識一個服務例項的名稱”,在略讀後發現這大概為了便利widnows域中的Kerberos 認證,但我們可以用它來做一些其他的事,對於我們來說,多值的ServicePrincipleName是很方便的。因為在Active Directory中任何一個使用者和計算機物件都儲存了賬戶在域中的執行的服務資訊。所以這就可以很方便的定位像IIS、SQL Server,及LDAP。同樣也可以很方便的查詢到對應的使用者在哪裡登陸(比如域管理員)。這相對來說要簡單些,因為SPN有一個標準化的命令約定。SPN格式為SERVICE/HOST,但有時也會包含埠像 SERVICE/HOST:PORT。 比如,如果一個域使用者曾在acme.com域中執行DNS和SQL Server服務,那麼SPN項看起來就像是這樣:

DNS/Server1.acme.com
MSSQLSvc/Server2.acme.com:1433

在LDAP中可以非常直截了當的查詢基礎的SPN資訊,比如一個經過認證的使用者就可以用adfind.exe (www.joeware.net) 與下面的命令來列出域中註冊的所有的SQL Server例項:

C: >Adfind.exe -f "ServicePrincipalName=MSSQLSvc*"

同樣windows server 2008中的”setspn.exe”工具也可以針對某個使用者快速查詢SPN:

C: >setspn.exe –l user1

在以前的滲透測試中,我發現企業通常都存在域管理員執行服務的現象,結果是在提權階段簡單的在LDAP中查詢域管使用者的資訊然後檢查SPN項大概就可以找到其登陸過的伺服器。然而adfind和setspn都缺少預設選項來快速查詢SPN,所以我寫了一個Powershell模組”Get-SPN”來簡化這一步驟。

0x03 Get-SPN PowerShell Module


Get-SPN這個模組提供了一種簡單的方法在LDAP中快速查詢符合指定的使用者、組、或者SPN服務名稱。對於那些有興趣的人可以在我的Github上下載here。請注意需要在powershell v3.0版本下執行。這個模組可以手工安裝,透過下載Get-SPN.psm1檔案到下面兩個目錄中任意一處:

%USERPROFILE%DocumentsWindowsPowerShellModules
%WINDIR%System32WindowsPowerShellv1.0Modules

可以這樣匯入模組:

Import-Module .Get-SPN.psm1

安裝後,下面是在我的測試環境下的幾個示例,來幫助你理解使用,更多的示例你可以透過使用help來發現。

Get-Help Get-SPN -full

查詢所有域管理員執行的服務 如果你在一個域機器上以域使用者或者本地system許可權執行那麼參照下面的命令:

Get-SPN -type group -search "Domain Admins" -List yes | Format-Table –Autosize

這一命令也可以使用-list引數以獲取更多詳細的輸出,比如:

Get-SPN -type group -search "Domain Admins"

如果你在一個非域系統上以域憑證執行那麼可以使用下面的命令,“DomainController”和 “Credential”選項也可以用來在Get-SPN中查詢.

Get-SPN  -type group -search "Domain Admins" -List yes -DomainController 192.168.1.100 -Credential domainuser | Format-Table –Autosize

查詢所有域中所有的SQL Server服務 如果你在一個域機器上以域使用者或者本地system許可權執行那麼參照下面的命令:

Get-SPN  -type service -search "MSSQLSvc*" -List yes | Format-Table –Autosize

針對那些對除SQL server以外的服務感興趣的人,下面列出一些SPN服務名稱.

alerter,appmgmt,browser,cifs,cisvc,clipsrv,dcom,dhcp,dmserver,dns,dnscache,eventlog,eventsystem,fax, http,ias,iisadmin,messenger,msiserver,mcsvc,netdde,netddedsm,netlogon,netman,nmagent,oakley,plugplay,policyagent, protectedstorage,rasman,remoteaccess,replicator,rpc,rpclocator,rpcss,rsvp,samss,scardsvr,scesrv,schedule,scm,seclogon, snmp,spooler,tapisrv,time,trksvr,trkwks,ups,w3svc,wins,www

查詢域使用者名稱匹配關鍵詞的ServicePrincipalName項 如果你在一個域機器上以域使用者或者本地system許可權執行那麼參照下面的命令:

Get-SPN  -type user -search "*svc*" -List yes

0x04 小結


在你打算用SPN找到域管理賬戶登入過的系統時,我要告訴你幾點限制。 1,並不是所有的域管理賬戶都會執行服務。 2,SPN在應用程式安裝後自動註冊,但是賬戶在程式安裝後發現改變,如果不是人為新增那麼在SPN中將不會表現。 最後,大多數情況下,SPN對於查詢域管理賬戶非常有用,但是在一些環境下它卻毫無作為。 無論如何,利用它找到域管登陸過的系統,意味著你不需要執行任何掃描工作,或者擴充shell,這是非常好的。這樣有助於減少在滲透測試中的攻擊指紋識別和檢測。最後不要忘記ServicePrincpleNames可以用來定位重要的目標,比如SQL Server,Web Server,及其他域中的服務。 Good hunting. Have fun and hack responsibly. :)

0x05 參考


http://technet.microsoft.com/en-us/library/cc731241.aspx

http://msdn.microsoft.com/en-us/library/dd878324(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/ms677949(v=vs.85).aspx

http://go.microsoft.com/fwlink/?LinkId=198395

http://www.microsoft.com/en-us/download/details.aspx?id=15326

http://technet.microsoft.com/en-us/library/aa996205%28v=exchg.65%29.aspx

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章