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

您的支持將鼓勵我們繼續創作!

[微信] 掃描二維碼打賞

[支付寶] 掃描二維碼打賞