滲透測試重新打底(10)--Active Directory攻擊簡介


Posted by kahatrix on 2023-09-22

AD

OSCP考試已經把AD列為一個必考的選項,我有看人家的分享,它的模式大概是這樣: 它會先給你一個內網,給你一個Web server作為一個進入點,比如說用RCE或是怎麼樣的方法拿到一個Shell,然後你提權之後你可以針對Active Directory的Enumeration,進而橫向移動,然後到最後的目標,也就是Domain Controller,這大概是它的考法。OSCP它裡面會講Empire,這個我是不會提到,因為我個人覺得是不太會用到,不是很實用。我們會用這個Impacket的工具,也非常的好用,我們講到的東西基本上都可以用Impacket來做到。

AD全名叫Active Directory,是Windows方便管理企業內網的功能,要學AD要怎麼攻擊,必須要先了解一下它的概念是怎麼樣子。

那這AD是什麼東西呢? 比如說像我們公司它的內網有很多台電腦,或是Server或是Printer,那Windows它想要把這些東西全部都連上自己內部的網路,來方便MIS來進行操控;或者是我們想要列印東西,我們就可以直接說,因為我在同一個AD底下,所以我可以很順利的找到Printer並且去把資料印出來。所以每一台主機使用者、Server、Printer都是Domain的一員。比如說公司名字叫Microsoft.com那它的Domain可能就叫Microsoft.com,那這一個Domain不只會連著所有主機使用者、Server或Printer,微軟也把比如說像Office 365登入的時候,它也會是透過AD的形式。所以這個AD你可以把它想成是一個授權的重要方法,簡單來說就是拿來授權,讓你說確保說我可以進入哪一個Resource,比如說進入哪一個Web Server,或者是來定義我的Access Level。我這個使用者可以進去哪些資源、哪些資源我進不去。所以基本上你看到AD它就是這麼幾件事情: 第一個是Authentication,第二個就是Authorization。Authentication是做登入用的,那可以把Authorization想成是Access Control,規範說我可以存取跟不能存取的資源有哪些。微軟在這個AD裡面有幾個重要的概念,來幫助我們了解AD的角色。第一個是Domain Controller,它是在一個Domain裡面擁有最大權限的一台機器;第二個是Forest Tree還有Domain,我們先來提Domain Controller。剛剛我稍微簡短的提到Domain Controller它是在整個AD裡面權力最大的Server。這一台Server它裝了一個Service: Active Directory Domain Service,那你可以在裡面看到所有AD裡面的情況,基本上只有Domain Controller可以裝這個AD Service,而且它可以定義所有的內部詳細的東西:

Domain Service負責管理的服務包括Data Store,可以把它想成是一個Database的概念,就是所有的重要資料都會儲存在這個Domain Controller裡面,所以這也是為什麼在打AD的時候,這個Domain Controller永遠是最大的一個目標。那第二個就是剛剛有提到,整個AD的最重要的功能就是授權跟Access Control。第三個是Forest的概念,可以跟其他Domain Controller溝通。

第四個是讓Domain Admin來存取。Domain Admin是什麼? 可以把它想成是Domain底下的Administrator,所以他是一個權力幾乎可以說是快要是最大的一個管理者,可以是Domain的管理者,可以管理Domain的幾乎所有事情。那基本上只有Domain Admin能夠存取Domain Controller。這件事情蠻重要的,因為在AD底下,攻擊AD中很長時間是會攻擊這個Authorization,就是Access Control的部分。Authentication不常被拿來做AD的攻擊,通常都是密碼被洩露出來或是Hash被洩露出來的時候,才會拿來做Authentication的橫向移動。那這個Domain Controller可以定義許多規定,讓Domain User還有Domain Service知道如何溝通。Domain User就是一般的使用者,比如說一間公司有許多員工,那員工的帳號就是一個Domain User。Domain Service的話,比如說內網裡面可能會有一些網站(就是一個Web Service)是只有內部的人才能夠進去的,你可以把它想成他是一個Domain Service。那如果說你今天是用VPN連到了企業內網裡面,那你可能會需要內部的DNS才知道說我的這個內網的網址是什麼,那這個時候的DNS也是一個Domain Service。

再來我們介紹什麼是Forest跟Domains,這個就直接拿微軟的圖來做範例:

這一整張圖是一整個Forest,Forest是最大的一個AD的一個單位,他包含了一些特性。第一個,Forest裡面可以有很多個Domain,所以你可以看到他的最Root(叫Root Domain)是tailspintoys.com。Root Domain會有子Domain,所以看到他這邊寫了一個Parent-Child Trust。我們先看這個Parent-Child,可以看到下面他的子Domain可能是Europe,然後也是tailspintoys這個Domain,然後.com。在亞洲也可以有個點,就asia,然後tailspintoys.com,這個是子Domain的概念。

那Root Domain跟child Domain,中間可以互相信任。假設今天我有一個使用者,在這個Root Domain裡面想要存取子Domain的東西時,可以透過這個Trust來做存取。再說一次,今天使用者A想要存取使用Web Server B的時候,他可以透過Trust這個概念,讓A可以存取到B Server的東西。

一個Forest底下可以有很多個Domain,每一個Domain都會有自己的Domain Name。再來,每一個Domain都會有自己的Domain Controller,再來是剛剛提到Trust的概念。那我這邊有寫就是Domain跟Domain之間的信任機制,就是Domain A的使用者可以到Domain B去存取他的資源。那剛剛提到的這個Trust他有兩種,一個是單向一個是雙向。比如說我這個Root Domain可以單向的Trust這個子domain,母Domain我相信他,可是子domain不相信母Domain。也可以反過來,子domain完全相信母Domain,但是母Domain不會相信子domain,通常看到的比較多是互相Trust,雙方都Trust。

Trust是可以被繼承的,比如說這邊他列出了一個這兩階段的Domain: 首先是Root Domain跟第一個子domain,第一個子domain下面還有第二個子domain。如果Root Domain跟第一個子Domain互相Trust,第一個子Domain跟第二個子Domain又是互相Trust的話,那Root Domain跟第二個子Domain也是互相Trust的。也就是說這個母Domain跟第二個子Domain可以互相存取對方的資源,那Trust大概就是這樣的概念。

再來是這個Domain Schema比較特別一點,Domain Schema是Forest裡面的一個特性,通常是拿來規範要創造一個Object時候的規則。那Object是什麼? 比如說User是一個Object、Group是一個Object、Printer也是一個Object,所以幾乎每一個東西都是Object。透過Domain Schema,我們可以來規範或是設一些規則,也就是說我在Create這個Object出來的時候,我有哪些事情是一定要遵守的。比如說我在Create一個User的時候,我可以定這個User所存在的Domain內是什麼,比如說是這個Azure.TailspinToy.com,都可以透過這個Domain Schema來做規範。

那下一個我們要提的是Organization Unit。為了方便IT管理,他會來借用這個Organization Unit,我們叫OU,來把使用者跟電腦做一個分群,裡面的成員我們就稱為Object。    

那我們來看一個小例子:

比如說在這個Domain底下有User的Organization Unit,那一個OU底下可以包含子OU,所以可以看到要對User做分類的話,他可能是Marketing的使用者、可能是IT使用者、也可能是Research使用者。所以他就是可以透過這個Organization Unit,來把Object做分類做歸類。

那再來我們要談的是User。當然在AD中,我們攻擊或是我們要做Enumeration最重要的事情就是使用者。那微軟在AD中有提供了幾個類別,第一個是Domain Admin就是剛剛提到的權力最大的User Account,也是預設唯一能夠Access這個Domain Controller的使用者。第二個是Service Account,他是專門給Server使用的帳號。比如說你今天有個Web Service,他可能會有一個Database,你有Database的這個Service Account才能進入比如說SQL Service。所以SQL Service他會有一個SQL Service Account,Web Server可能會有一個Web Service Account。那這個概念還蠻重要的,所以可能要記一下。Microsoft就是給Service給了他一個Account,他就是專門存取Server所用的一個帳號。那再來是Local Administrator,他是針對單一主機。比如說我是一個員工,然後我配了一台電腦,這個電腦他會有一個Local Administrator,他就是針對單一主機擁有最高的控制權。但要注意這個Local Administrator被屏除在Domain以外,他不能夠存取Domain Controller。你拿到Local Administrator,只代表你算是攻破了那一台主機,並不代表進AD。

最後一個User的概念就是Domain User,他可以根據規則(比如說我們等一下要講的Group)來決定他能夠存取哪些Object。那這個Object可能就是其他的User或者是一個其他的Group。那這是一個蠻大的概念,也是整個AD攻擊的一個蠻大的重點。他會根據規則或者是所存在的Group來決定他能夠有哪些比較有趣的Access Control。

再來我們要講的是Group,這個概念非常重要。我們有Group的原因是為了要決定說我能夠存取哪些資源。一定有人會問說那Group跟OU(Organization Unit)的差別,那Group是「You put a user in a group to control user access to resources」,也就是說你把一個使用者放到一個Group裡面(比如說Domain Admins就是一個Group),來決定這個Group裡面的User能夠存取哪些資源。

OU的話剛好相反,你可以把User或者是你的Object放到一個OU裡面,來決定說誰可以透過這個Group來存取我這個OU。再一次,OU跟Group的區別,Group的話是你把使用者放到這個Group裡面,來決定這個Group裡面的成員能夠Access哪些Resource(Printer、其他外部Domain的Server);那OU重要性可能會比Group低了一點,因為你是把資源放到這個OU底下,來決定說誰可以存取我這個OU裡面的東西。

那我們來看一下有哪些常見的Group。比如說Domain Controllers或者是Domain Users,這都是Group,記得後面有個S,跟剛剛提到的這個Users不一樣。Domain Controllers, Domain Users, Domain Admins,Domain Controllers指的是主機、Domain Users就指的是一般使用者、Domain Admins就是這個Domain底下最高權限的Account。

還有一個Enterprise Admin,他是真正整個Forest整個最大的Boss,他的權限會比Domain Admins還要強。Domain Admins他只是在目前所在的Domain能夠有最高的管理權限,但是Enterprise Admin可以控制所有的Domain,也就是整個Forest,他就是整個Forest的Admin,所以他是一個權力最大的人。這大概是Group的概念,所以如果在打AD的話,通常除了Domain Admins之外,也會想辦法看看能不能成為Enterprise Admin。如果能夠成為Enterprise Admin,就是把所有東西全部都打下來了。

那這邊接下來是講Policy。Domain Policy的話你可以把它想成放大版的Group的概念。Group你是把資源放到一個Group,那Policy不是把人放到一個Group,不是,他就是只是一個規則。舉個例子,比如說我這邊列了一個Disable Windows Defender。假設你今天有這個Policy的存在並且執行他的話,那他就是可以關閉Domain內所有的Windows Defender。那這個就是一個給大家的概念,可能不太會那麼常用到這個Policy的概念。

接下來要講的是Active Directory Domain Store(ADDS),你可以把它想成是一個Database的概念,那這個東西通常是存在在Domain Controller裡面,那這個Database他存有使用者Domain User或是Group、Domain Service所有的資料,其中最重要的是這個叫ntds.dit,他儲存了所有Domain User的Password Hash,所以是一個相當重要的事情。

接下來要講的是Domain Authentication。我們剛剛提到說在一個Domain之內你要做可以做Authentication跟Authorization,我們要怎麼做Authentication? 在以前通常是用NTLM,就是拿著自己的自己的Hash去做認證;另外一種比較新的叫Kerberos。我們先來講比較傳統這個NTLM。NTLM我們知道他是一個Hash,那他也是比較古早的Windows認證的方式。NTLM他會有三個步驟,第一個是Negotiation--從Client到Server,第二個是Challenge Message from Server,第三個是Authentication Message from Client。我們不需要去詳細了解說他是在做些什麼,簡單來說就是我這個Client他會發一個叫Negotiation的Message給Server說好我今天要來認證了,接下來這個Server就會發一個Challenge Message返回給這個Client,說喔好就挑戰你這個Client,看說是不是你是不是真的Client,你能不能成功認證我。正常情況下如果你是真正的Client,你有正確的Password Hash的話,你可以利用這個Password Hash做Authentication,所以這邊寫了一個Authentication Message from Client。

NTLM比較少用,使用的情境上,第一個我們是使用IP而不是Host name做Authentication的時候,我們就會用這個NTLM。第二個,既然已經知道跟Host name沒關係的話,我們可以推斷說他並沒有在DNS Server底下,沒有被DNS管理起來的目標的話,就會使用這個NTLM。這邊給了一個例子,比如說一些第三方的軟體(也有可能是個Web Server或者是什麼都好)並沒有被AD所管轄,因為不在這個AD的範圍內,這個時候他會用NTLM進行認證。不過因為NTLM比較古老,而且又有像是Pass the Hash這種攻擊方式,所以現在的AD環境比較傾向使用新的認證方法,就是Kerberos。

既然Client要對Server在NTLM的Authentication的方法,那要把這個Client的Hash放在Server,這樣子Server才知道說我要怎麼做認證。這是一件不好的事情,因為等於說你Hash就一直被放在Server,你有幾個Server就有幾個地方有你的Hash,只要一個Server被攻破了,攻擊者就可以知道說每一個想要存取或曾經存取過我這個Server的Account的Hash是什麼。那微軟為了不要這件事情,所以他引進了這個Kerberos。

Kerberos是利用Domain Controller做認證。ADDS會儲存Domain User Password Hash的目的其實就是為了讓Kerberos做第三方的認證。跟Domain Controller認證完之後你會拿到一個Ticket,你拿著這個Ticket去跟你的目標,可能是Web Server,來做連線的時候,你就拿出這個Ticket,說你看,我跟Domain Controller做認證了。他說OK,那現在我來找你。

我們接下來就來介紹Kerberos詳細的運作方式:

文字敘述:

那第一個我們叫AS REQ,AS是Authentication Service,REQ是Request。這件事情基本上就是Client發給Domain Controller一個Request,這時候你要提供自己的NTLM Hash,就是User Name Password跟Domain Controller做認證,去請求一個TGT,全名叫Ticket Granting Ticket,我們就叫一個Ticket。基本上你可以想像成: 我要來跟你做認證了,你可以給我一個TGT嗎? 這時候如果你的User Name Password是正確的,那你會收到一個AS REP,就是Authentication Service的Reply。就是DC會回傳一個Ticket Granting Ticket。那這一個TGT是一個加密的東西,他會使用這個Domain User的Hash來做加密,讓TGT能夠足夠安全。

到目前為止經過了這兩個步驟,我拿到了一個屬於我自己這個Domain User的TGT,也就是我跟Domain Controller認證了。接下來我要做的是跟這一個繼續跟Domain Controller說,好你看我現在認證成功了,我拿著這個認證成功的TGT,請求一個Ticket Granting Service(TGS),所以這邊可以看到這邊寫TGS REQ,就是TGS的Request。那這一個TGS Request就是要跟Domain Controller說,好你看我現在認證成功,那我現在跟你要一個新的Ticket,這個Ticket叫TGS。這個TGS如果認證成功了,那Domain Controller就會給你一個TGS。TGS可以拿去Access比如說Application Servers、Web、Database之類的。

簡單來說,第三步是我拿著我的TGT來索取TGS,第四步是Domain Controller給你這個TGS。注意的是這一個TGS是用Application Service Account的Hash來做加密。那跟剛剛不一樣的是,TGT是拿Domain User Account Hash做加密,TGS是用Application Service Account Hash做加密。

第五個步驟,我現在拿了這個TGS,TGS代表的含義就是Domain Controller授權我來進入你這一個Service,所以第五個步驟就是AP Request,我會拿著TGS傳給目標的Application Server比如說Web或SQL,那Application會用自己的Account Hash來驗證這個TGS。那這件事情合理嗎? 因為你在第四步的時候,你會收到一個由Application Server Account Hash做加密的TGS,所以你在下一個步驟傳TGS的時候,Application就會嘗試用自己的Account Hash做解密。你只有成功的解密才能得到原本的這個Plain Text的TGS。那如果驗證成功了,就會回傳成功或者是失敗,這個步驟就是AP Request。

我們Admin有很多地方有什麼區別,Domain Admin你可以把它想成是一個Group的概念,比如說回到剛剛這一個Domain的圖,他每一個這個三角形就是一個Domain,那每一個Domain都會有一個Domain Admin,但是他們的權限基本上都一樣,都是他們能管理屬於自己的Domain。比如說這邊的Domain Admin,他就是管理這個三角形,那這邊的Domain Admin就是管理另一個三角形,就是其實沒有什麼差別。你在打這個lab的時候,你可能會遇到多個Domain,假設你今天拿到了小三角形的Domain Admin,那只是代表拿到了這個Domain的權限,並不代表能直接存取這個大三角形的Domain的資源。

TryHackMe的Post-Exploitation Basic來實踐剛剛的教學內容。

先介紹PowerView。我們必須要自己開啟PowerShell,才能執行我們的PowerView,那這邊把他的那個執行方法列在這裡:

powershell -ep bypass
cd Downloads
Import-Module .\PowerView.ps1

-ep是Execution Policy,然後Bypass,如果你不這樣做的話,他有時候會不讓你執行一些Script,或是其他的就是他的限制比較多。所以通常你在開PowerShell的時候,最好就是開一個這個ep Bypass會比較好一點。我們可以通過這種Import Module的方式,把這個PowerView當成是一個Library來執行。

第一件事情是我們要知道我們的Domain的名稱:

Get-NetDomain

輸出如下:

可以看到我們的Forest,就是我們這整個最大的Domain,叫做CONTROLLER.local。那這邊也會有一些名稱,你不需要這麼多東西的話,你可以透過像是Linux grep的概念,但是在PowerShell上面是Select,Select左邊的這些Column,例如:

第二個我們要做的是Get-NetDomainController,我們要來找說在這一個Domain有哪一個是Domain Controller,那這個時候你就可以看到很多他的資訊,比如說這個Forest跟OS Version是Windows Server 2019,也可以看到他的Domain、IP Address,或者是這裡面有很多的Partition,很多很多在這一個裡面的資訊:

比如說這個他的名稱叫Domain-Controller.CONTROLLER.local,就是他的機器名稱。那後面就是接著是他的DomainName是CONTROLLER.local。這個是一個很重要的一個架構,就是機器的名稱然後點你的Domain的名稱。

剛剛有提到的Policy的概念,我們可以用PowerView裡面的Get-DomainPolicy來做Enumeration:

Get-DomainPolicy
(Get-DomainPolicy)."KerberosPolicy"

輸出如下:

那接下來我們比較有趣的是Get-NetUser,那就是你可以看到所有的Domain裡面的user。光是一個user就會有這麼多的Column在裡面,這個時候我們就可以利用剛剛所提的Select的概念,只看Name或者是Description,我們就可以利用這個Pipe然後用Select來選擇我要的Field:

可以看到這樣子的話就清楚許多了,可以看到有這麼多個user,這幾個user的Name跟Description就是分別是這兩欄。可以看到說有Administrator,或者是Admin2、SQL Service。那通常這個Administrator他就會是Domain Admin,通常的情況下,一個Domain裡面一定會有一個Administrator Account。那我們剛剛所介紹的Kerberos認證,他其實也是有一個這個krbtgt在做這件事情,如果你做Kerberos認證,他就會透過這個krbtgt的Service Account來幫你完成這件事情。

我們可以再來看一下有哪些Computer Name:

Get-NetComputer
Get-NetComputer -FullData
Get-NetComputer -FullData | select cn, OperatingSystem

輸出結果:

可以看到這邊有三台,第一台Domain Controller就是剛剛有透過hostname看到的,那還有Desktop-2.Controller.Local還有Desktop-1.Controller.Local,那當然這個特別的Function可以有比較多的東西,你可以透過FullData去查看他所有的詳細內容,這個時候也跟剛剛的Net User一樣有很多資訊。雖然只有三台,但是光是這樣子看起來其實東西就很雜亂,所以通常有幾個東西可以看。比如說是CN(Computer Name)或者是Operating System。

那接下來這一個比較特別一點,叫Net Session。可以看到說目前有哪些使用者是登入這台電腦的情況:

可以看到說目前應該就只有我這個Administrator登入這台,所以他就是只有一個。這個Net Session有時候是可以作為橫向移動一個很好的手段,因為有時候一台電腦裡面不只我一個人登入,可能會有其他Account的人登入。那如果有其他Account登入,而且剛好提權成功的話,那我就可以透過一些像是Mimikatz擷取其他使用者的密碼。為什麼會這樣? 他是這樣: 你這個一個使用者在登入的時候,你登入成功了,你的密碼或是你的密碼的Hash會存在在這一台電腦裡面。所以才可以透過Mimikatz這樣的工具去把密碼給擷取出來。

那再來我們可以看一下Group的部分,指令是Get-NetGroup:

Get-NetGroup
Get-NetGroup -GroupName *admin*

輸出結果:

可以看到光是三台這種小小的Domain他就會有這麼多個Group,那我們通常會有興趣的話,我們可以用的這一個像是GroupName,那記得這邊也可以接受Wildcard,還可以透過像這樣子Sorting的方式,找出說我們可能會比較有興趣的的Group有哪些。比如說這種Administrator Group、Hyper-V Administrator,就是一個搜尋的方法。

再來是我們要來看一下,我們剛剛列出了這麼多Group,那我們要來看一下其中一個Group,比如說叫做DomainAdmin,這一個Group他裡面有哪些內容。

Get-NetGroupMember -GroupName "Domain Admins"

我們也可以來看一下,可以看到說這一個DomainAdmin Group,他的內容大概是長這個樣子。那這個時候我們要看的有什麼東西呢? 我們可以看到說有哪些MemberName是屬於這個Group,我們也可以使用像是Select只想要MemberName,我們就可以很清楚的看到說這三個Account是我們的DomainAdmin。

使用select概念:

到這裡我們算是介紹完了Active Directory的一些基本的概念。

還有一些認證的方式,包含NTLM跟Kerberos。那在講Kerberos的時候,乍看之下有個Domain Controller幫你認證很安全,不會有存這些Password Hash,但其實不是這樣。所以接下來我們就會介紹一些針對Kerberos攻擊的方式。

這邊要記得的是,這整個Initialization都是針對目前所在的Domain。假設你今天在這個子Domain做一個Enumeration,你是一般的Account或是在一般的電腦裡面,你沒有在任何的DC、你也不是任何的Domain Admin,你所做這種Enumeration,你基本上看到的都是你自己的Domain的所有資訊。如果你今天拿到了Domain Admin,然後進了Domain Controller的話,你可以用我們接下來會提到的BloodHound去做更好的Enumeration,你可以看到跟你有Bidirectional Trust的Domain裡的資訊。

再一次,你一定要透過拿到Domain Admin進Domain的Domain Controller,才能夠針對其他跟你有互相Trust的Domain做Enumeration。Enumeration的方法可以透過像BloodHound這樣的工具來做偵查。假設你今天是一個普通的Account,在一個普通的Workstation,就是普通的電腦,是沒有辦法去Enumeration其他Domain的。所以也自然不太有辦法去看到Enterprise Admin這樣的帳號存在的。實作上大概是這樣,就是你一定要先打完一個DC,然後你才能在那個DC去做更深的Enumeration,然後去看到其他Domain

實作環節

TryHackMe的Attacking Kerberos

再開始Lab之前,有幾個工具是需要安裝來幫助攻擊AD環境:

impacket:

sudo git clone https://github.com/SecureAuthCorp/impacket.git /opt/impacket
sudo pip3 install -r /opt/impacket/requirements.txt
cd /opt/impacket/ 
sudo pip3 install .
sudo python3 setup.py install

Bloodhound & neo4j

省略如何設定,有需要再google。

使用kerbrute執行brute-force username discovery,他是一個Lab,所以他會給你一個user.txt讓你來做暴力的枚舉:

./kerbrute_linux_amd64 userenum -d  CONTROLLER.local --dc  CONTROLLER.local User.txt

結果可以看到kerbrute找出許多帳號:

存成valid_users.txt:

administrator@CONTROLLER.local
admin1@CONTROLLER.local
admin2@CONTROLLER.local
httpservice@CONTROLLER.local
machine2@CONTROLLER.local
machine1@CONTROLLER.local
user3@CONTROLLER.local
sqlservice@CONTROLLER.local
user2@CONTROLLER.local
user1@CONTROLLER.local

我們什麼時候會用到kerbrute? 就是我們還沒有進入這個 domain,沒有拿到任何一台 shell 的時候,比較有可能會用這個這個工具。如果我們一進入了拿到一個 low shell,我們也可以使用剛剛提到的 SharpHound然後結合 bloodhound 來看他的圖形介面。因為 SharpHound不是只有高權限 account可以看到所有的東西,不管是高權限或是低權限的 account 你都可以使用SharpHound 然後來針對AD做枚舉。

所以kerbrute使用的情境會比較少一點,他只是針對使用者名稱做枚舉,那當然你真實世界這樣做的話可能會被 ban 掉,因為 traffic 一看就知道不是正常的。這邊給一個小概念,你寧願去brute-force Domain Controller,也不要去 brute-force Application Server。

因為 Application Server 特別是這種 web有各種的 firewall,或者是MITM,Man in the Middle,他會有更多的protection 機制在。特別是因為web比較容易被當成目標,所以你如果今天選擇的話,我會選擇直接對Domain Controller 去做 BlueForce。

那我們接下來要講的是AS-REP Roasting。我們在提Kerberos Authentication 的時候,我們講到要拿 TGT 的時候,client 會用他的 account hash加密 TGT。微軟他在這個步驟一跟步驟二的時候,他有功能可以關閉 Kerberos 的Pre-authentication。那這件事情是發生在第一個步驟,我要請求一個 TGT 的時候,如果這一個 user關閉了 Pre-authentication,在我的第一步的 request 的時候我可以不需要提供我自己的NTLM hash,直接拿到一個 TGT。

那這邊注意,TGT 是使用 domain user account password的 hash 做加密,那這件事情代表什麼? TGT 他有一個固定的格式,我們可以已知解密後的情況,然後搭配密碼字典檔做暴力破解,來嘗試復原這個client account password。

好,再一次。我們提到Kerberos 的認證的時候,特別在 TGT 的地方我們說了,你要拿 TGT,你要先拿自己的 account password。那如果今天這一個user 他關閉了Pre-authentication,我可以不需要這個 user 的 password,我也可以拿到TGT。我拿了 TGT 之後,發現這個 TGT 居然是用這個 domain user account password的 hash做加密,那因為 TGT 格式固定,我們可以使用像是 hashcat這樣的工具搭配字典檔做暴力破解,來復原client account password。

那他有兩種方法,第一個你可以用 impacket,你可以在 platform 上面看到他這邊:

就有don't require pre-auth(上圖紅線括號處),這個 pre-auth 就是 pre-authentication。可能我這個 lab 之中沒有 所以他會說no data return from query,我們也可以使用 impacket 的這個get no pre-authentication user,來這一整串做 query。剛剛valid_user.txt抓到了這麼多個valid 使用者名稱,那我就可以用指令get np user,然後我的目標是controller.local那他的 format 是 hashcat,user 名稱就是 user 的字典檔,然後再給上這個 DC 的 ip:

impacket-GetNPUsers CONTROLLER.local/ -format hashcat -users valid_user.txt -no-pass -dc-ip CONTROLLER.local

然後因為我們只是要看看有沒有人拿到 tgt 嘛,所以我們就不需要 password,就算是印證了這個 no pre-authentication:

我們看到了幾件事情,第一個,我們看到這個 admin2@controller.local,他後面這樣接著一串就是tgt。第二個這個 user3@controller.local,他也拿到了一串這個 tgt。如果沒有的話,他這邊會告訴你他不需要 pre-auth,也就是說他需要 pre-auth,所以他這邊就是失敗了。比如說這個 SQL service,他是需要 pre-authentication,那當然不是每個帳戶都這麼好,不需要 pre-auth。所以我們目前有 admin2 跟 user3,都開啟了這個不需要 pre-authentication,所以我們可以拿到一組 hash。

那接下來就是使用 hashcat做破解,hash.txt只是把剛剛的那一串把它複製下來而已,沒有什麼特別的。那有時候你在複製這個 hash的時候要記得,你在比如說windows terminal你複製起來他的行數會自動換,記得要把它截掉:

hashcat -m 18200 -a 0 hash.txt Pass.txt

我們可以看到這兩個 hash都得到了原本的password,一個是password2一個是password3:

簡單來說這個AS REP-roasting,他就是利用了don't require pre-authentication的這個概念。那記得這是攻擊domain user,那如果聰明一點的人,可能剛剛在講講kerberos authentication的時候有注意到第四步在講tgs的時候,我們會得到一個service account hash加密的tgs,跟剛剛的AS REP-roasting很像。剛剛的AS REP-roasting是攻擊user account的password hash,kerberoasting是攻擊service account hash,兩個概念是非常非常相似的。

我們直接跳到上圖第四個步驟,我們拿tgt去request一個tgs,那如果拿到了tgs之後,記得這個tgs是有service account hash做加密的,我們不要拿去做接下來的第五步驟第六步驟,真的跟application說,好,我要access你這個資源;我們專注在這個tgs這個東西上面,我們只說我們的目的就是拿到一個tgs,然後再把這個tgs做破解,跟剛剛破解tgt很像。那你如果說要拿到一個tgs的話,跟剛剛的tgt不太一樣,因為你要tgs你勢必要有一個tgt,所以這個攻擊,首先你需要一個正常的account,你要真的能夠針對DC去做授權,拿到一個tgt你才能夠去拿tgs。

Bloodhound上面剛剛有ASREP Rostable也有Kerberosable account,所以你也可以用Bloodhound非常方便可以去找哪一個service account可以被我嘗試做Kerberosting。不過比較困難的不一定可以這麼順利做Kerberosting。跟剛剛的ASREP Rosting他需要don't need pre-auth不一樣,Kerberosting沒有這種限制,你通常只要是一個service account,因為他必須要有tgs的支持。你要有tgs,你就是要把自己的service account password hash給搭進去,所以Kerberosting沒有這樣的條件限制。他能不能夠破解單純是取決於你的字典檔有沒有涵蓋到他正確的password。

接下來我們就來試試看,也是用impacket的GetUserSPNs可以得到domain中的Service Principal Name(SPN)。spn通常就是指service,可能是web service或是sql service,他都是一個spn,那這邊spn就是指的是server的名字。既然你需要一個account,那這邊他提供了一個machine1 password1,他就是為了讓你做這個練習所以他給了你一個valid username password,當然你也可以用剛剛在ASREP roasting得到的account password,看你自己要用哪一個都可以。

impacket-GetUserSPNs controller.local/Machine1:Password1 -dc-ip 10.10.33.241 -request

從Output看出,能夠拿到SQLService/HTTPService的TGS:

有了TGS,接下來就是利用hashcat搭配字典檔破解

hashcat -m 13100 -a 0 hash.txt Pass.txt

Hashcat成功破解service account的密碼:

我們回來hashcat的結果,可以看到這個sql service account 他的密碼是MYPassword123#,然後http service破解出來是Summer2020,那我們就成功的破解了service account還有user account。

接下來要介紹的是mimikatz。他是一個後滲透,post exploitation的一個工具。你要先拿到一個assistant shell或是root shell,那你才能夠執行這個mimikatz,讓你順利的進行橫向移動。那這個mimikatz的原理,他是要來解讀在windows有一個叫lsass.exe,那全名就是Local Security Authority Subsystem Service(lsass) process memory。lsass他是負責做登入認證的,做authentication的一個process。那這個process memory他會儲存很多重要的事情,比如說你今天如果是RDP或者是SSH登入的話,那password跟password hash跟ticket都會存在在這個lss的process memory底下。所以我們就可以用mimikatz去讀取這三個很重要的東西。

今天如果我們成功的進入了一台機器,當然這台機器不需要是domain controller,因為lss他是存在在所有的windows軟體裡面,我們進到download底下,來看一下這邊有一個mimikatz.exe。那記得你要run mimikatz的時候,你一定要是administrator的shell,不然你會沒有辦法去執行;第二件事情你要確保你的windows defender是關的,我們就直接用administrator shell把它關掉。

關閉defender:

開啟mimikatz:

cd Downloads
mimikatz.exe

### mimikatz
privilege::debug

之後我們可以用sekurlsa dump出這個我們有登入帳戶的password hash:

sekurlsa::logonpasswords

那真正重點就是像這種ntlm,它如果有值的話你就是要注意一下。首先先看一下它的user name,administrator然後它的ntlm,這就是mimikatz厲害的地方,它可以去針對lsas.exe這個process memory去分析,進而找出administrator的ntlm、account hash:

除了dump它的hash之外,你也可以使用這種token elevate然後直接去抓出它的明文password:

token::elevate
lsadump::secrets

但是這個有時候會失敗,不過在這邊試是可以的,那可以看到我用這個token elevate,然後讓我算是變成impersonate、成為nt system,就是一個system的account,之後我們可以再用lsadump來抓出明文password。那不一定每次都成功。不過就算沒有明文password,它也是會有ntlm,大家要稍微注意一下,看它的名稱對不對,有時候會抓不出來是很正常,那抓到了的話就蠻幸運的。那到這邊是針對密碼password的部分。

那下一個mimikatz的功能是pass the ticket,mimikatz除了dump ntlm hash或者是password之外,我們在拿到tgt的時候,它也會存在lsass process裡面。它的use case大概是這樣: 你今天攻破了一個web server,如果domain admin或是其他privileged account有留它的tgt在這裡的話,那我們就可以拿著這個tgt進行橫向移動。所以這整個攻擊的概念跟精髓,就是說我們要去偷取高權限目標的tgt。那mimikatz它可以把tgt匯出來,它的語法是這樣子:

sekurlsa::tickets /export

可以看到它抓到了好像很多東西,我們可以從explorer上面看一下:

那一定有人會問說我要怎麼樣去利用它,我們盡量要挑選像是administrator@krbtgt這樣名字的ticket會比較有成功的機會。在這個lab因為我們自己就是administrator,所以我們得不到自己的tgt很正常,那在其他的情況下,假設今天是一個web server,那它可能存有很多其他人的tgt,我們能夠拿來做使用的話,等於是我們成功的偷取了人家的tgt,也就是冒名頂替了那一個人的tgt。選好tgt之後用mimikatz來import然後就完成了冒名頂替的流程。import的指令就是:

kerberos::ptt <TICKET_FILE_NAME>

輸出:

因為它已經import,到了我們目前的terminal底下。我們可以直接exit,然後透過像是klist來看:

這邊舉個例子好了,假設我們這邊有一個tgt,我們可以用Impacket getST.py,就是你也可以拿著這一個Kirbi這個檔案,把它轉成像是ccache的extension:

然後你就可以用像是psexec或是smbexec或是wmiexec這樣的工具,直接遠端登入我們的domain controller。你不需要知道它的password,只要知道它的使用者名稱、domain name以及它的IP address就可以了。那這邊記得要有這個K,就是說它是Kirbi。

我們要談的最後一件事情叫Golden Ticket。Golden Ticket算是整個AD之中破壞力最強的一件事情,在Kirbi的authentication我們會跟Domain Controller來拿TGT甚至到後面的TGS的服務。那這整件事情就是我們剛剛在Bloodhound上面一個account叫Kirbi TGT:

那一樣,每一個Domain都會有一個Kirbi TGT account。今天這個Golden Ticket就是建立在我們拿到了這一個Kirbi TGT的account hash,那他會發生什麼事情? 這邊補充一下,這個kirbi TGT他只會出現在Domain Controller,他的名字就是Key Distribution Center(KDC),你可以把它想成是在Domain Controller的其中一個service。

今天假設我們用Mimikatz得到了這個kirbi TGT的account password hash,我們可以看看會發生什麼事情。那答案是我們可以任意產生任何的TGT跟TGS。就意味著我們能夠存取Domain內任意的目標。你要產生Golden TGT,我們也是要用Mimikatz來做這件事情,他會有需要幾個東西,第一個是krbtgt的SID(Object Security ID),那第二件事情我們有提到會需要KRBTGT的Account Password的NTLM,再來我們是要Domain名稱。

那有人可能會問要怎麼得到KRBTGT,假設我們今天已經得到了Domain Admin,利用一個叫dcsync的概念。dcsync的話他概念是這樣,他可以像是一個權限,原本的目的是要讓Domain跟Domain之間互相更新該Domain的Password Hash,他就是Domain Controller Sync,你的dcsSync就是Domain Controller Sync,那他是要同步什麼? 他就要同步在這個Domain內的Password Hash,所以他就只是一個更新的功能。但是今天你進入了Domain Controller或Domain Admin,你就可以用Mimikatz來跟這一台電腦說我要dcsync,麻煩把你所有的Account都把它列出來,那在這個地方我只選擇krbtgt,我只要這個User。如果你不要這個參數的話,他會列出所有的這個Account。

lsadump::dcsync /user:krbtgt /domain:htb.local

那因為我現在是Domain Admin,剛好在Domain Controller底下存著所有該Domain的Account Password Hash,所以我就可以透過這個lsadump然後dcsync這個功能去指定說我要哪一個User的Account的NTLM,或者我不要這個參數也可以:

那如果你加了All這個參數,他會列出在這個Domain內所有的Account的NTLM:

那我們拿到了krbtgt的Account的NTLM,我們就可以拿來做Golden Ticket。我們這邊直接來看他的Command好了,比如說這個Golden Ticket我要給一個User,這個User是一個隨意的使用者,沒有任何限制。你可以假裝說我要給一個叫Fake User都可以,就是不要跟現在User重疊就好。

  • kerberos::golden

  • /user:administrator1 此處可以為一個隨意的使用者,沒有限制

  • /domain:htb.local

  • /sid:S-1–5–21–3072663084–364016917–1341370565

  • /krbtgt:819af826bb148e603acb0f33d17632f8

  • /ptt pass the ticket

    kerberos::golden /user:administrator1 /domain:htb.local /sid:S-1-5-21-3072663輸出: (Output顯示已經創了一個administrator1的Golden Ticket)
    

上面指令需要Domain,然後是krbtgt這個Account的SID。你會問要怎麼找呢? 我們可以在Blood Hound上面看到Object SID就是這一串,把它複製起來貼上來就可以了

再來就是krbtgt的NTLM然後做一個Pass the Ticket。

經過這個Command之後我就會產生Golden Ticket,並且在我這個Terminal裡面Pass the Ticket。那創建完成之後就可以用Mimikatz的misc::cmd開一個新的CMD,這個時候CMD它就可以存取任何Domain的任何目標,或者是你要用剛剛所提到的,先把它Export出來再用PSEXEC這樣偷取Ticket的方法,都是可以的。

基本上Bloodhound你一開進去,他就會先顯示說你要怎麼樣到達domain admin這個group,這是default的用法。所以可以看到這邊都是domain admin,然後你可以這樣子像這樣點進來,看裡面有很多資料:

那blahound他的概念是這樣子: 你今天會用一個工具叫SharpHound.ps1,他的概念是這樣,假設今天成功的攻擊了一台機器,那你可以在你的victim就是你的目標上面,用這個SharpHound.ps1得到一個zip檔案。

那你只要把那個zip檔案直接拖曳到這個bloodhound的interface,他背後的Neo4j就會幫你去parse這個zip檔案裡面的東西。有人可能會問說這個SharpHound會執行什麼東西? 基本上這個SharpHound.ps1就是AD的偵察跟枚舉的一個script。

通常這個database info不會有太多重要的東西:

如果說你要用新的一個domain的話,你要一定要記得要這個clear database,你才能把neo4j database裡面東西給reset。如果不這樣做,有時候東西會錯亂,所以記得如果要用打一個新的lab,一定要去除掉這個東西。那如果你是舊的,比如說你是不同domain,你打了一個domain得到一個新的zip檔,那你可以直接把它拖進來,東西會比較完整,那這個情況下是不需要去clear database的。

那第二個,我們可以看一下在這個analysis的地方有一些preview的query。這個bloodhound非常的佛心,比如說第一個找出所有的domain admin,你可以透過這樣的方法來找出說在這個admin.offshore.com的domain admin的成員: administrator、service technician、member of這個domain admin。bloodhound的拿來做enumeration會比剛剛的powerview這樣一點一點去抓快很多,因為他用這種圖像的方法,等於是都把你給顯示出來。

那剛剛有提到的像domain trust,可以看到一開始我在這個client.offshore.com跟admin.offshore.com他是bi-directional的trust,admin.offshore.com跟這個dev.admin.offshore.com也是互相trust,lab的部分就是說他這四個網域都是互相trust。

有些比較有趣的比如說shortest path to high-value target,那當然會有這麼多東西,是因為我這一個database裡面有三個domain的執行結果:

通常不會這麼多東西。我們可以隨便點一個圓圓的,其實每一個都是一個object,只是他這個object是一個user的形式,或者是這邊有個看起來像電腦的東西,他就是一個machine account。那這邊我點這個人頭,他就是一個domain user account。那也可以看到說這個點個這邊有三個人,這其實是一個group的概念,他的名字可以點一下,可以看到他就是account operator,然後他的domain是client.offshore.com,其他這些相對比較不重要。

你可以在Bloodhound上面看一下,比如說他這邊有first degree object control,他可以有這三種方法,都是可以讓你去擁有這一個叫salvador@corp.local:

我們可以點其中一條線的generic write這條線然後按右鍵,然後點到這個help,那這個Bloodhound就會告訴我們他的info,這一個user PGI BBOMS,他有generic write access to the user,他也會說generic write會讓你有怎麼樣怎麼樣的功能

你可以到這個abuse info的地方,他會告訴你要怎麼樣去實作去擁有salvador@corp.local,那通常他會說你可以用powerview的set domain object跟get domain sdk,那在這個紅色的地方,通常就是你要真正打在你的power shell上面的指令,那當然記得你要先import這個powerview。那你可能這樣打一打,然後這東西打完的話,通常就是代表我可以成功的擁有這個user,可以讓我們橫向移動:

那這邊的話他比較像是直接改密碼,然後你就可以用你新改的密碼登入成為這個Salvador。改密碼也算是一個很常見的攻擊方法。

這個大概就是你通常會在打AD然後看Bloodhound的時候你會做的事情,比如說我今天是這個PiggyBong,我可以去指定我要怎麼樣到Domain Admin,然後是Corp.Local。那這邊可以看到你可以在Bloodhound上面給一個起點跟一個終點,Bloodhound會告訴你說要怎麼樣去一步一步的去達到這件事情。

比如說我們上圖是最左邊的PiggyBong,然後他可以透過這三種方法變成Salvador,可以用右鍵然後去看Help看他怎麼做,那這一個Salvador他又是叫Security Engineers的Group的Member,這邊如果是Member Of的話(上圖紅圈),你基本上不用做任何事情,那大家想一下為什麼? 因為你已經是這一個Group了,當然這邊不需要再去點,你可以看一下Help Message,那基本上他會告訴你No Abuse is Necessary,你可以把這個User視為這個Group一份子,這個Group有的權限你這個User也有。那這個Group可能會有什麼權限呢? 他可能會又是一個Generic Write,到這一個Cyber ADM,這一個Cyber ADM他又有Generic All的權限到這個Operation,所以你又可以這樣點一下然後來看一下Abuse Info。

然後他也會告訴你,怎麼樣去做一個Object Takeover,那基本上也是透過PowerView來執行。執行這樣這一大串的時候,你就可以變成Operation@Group Local,那這個概念是他Cyber ADM想要把自己寫進去這個Operation@Group Local:

假設你今天成功的寫進去這個Operation之後,他又是說他Contain這一個IAMTHE ADMINISTRATOR,那你又可以看一下。通常Contain應該也是No Abuse,最後這個Administrator直接是Member of Domain Admin,所以Path的這個功能是BloodHound裡面非常重要的一個功能,他會告訴你說要如何一步一步的從一個默默無名的小User一路做橫向移動提權,讓你可以控制Domain Admin。

因為剛剛我們有Domain Admin,Enterprise Admin也可以在BloodHound上面就直接去抓出來。比如說我現在點了這個Enterprise Admin,他可以看到他有什麼Session,可以看到說這一台機器DC-02-DevAdmin-Offshore.com,如果我想要成為Enterprise Admin我可能可以去攻擊這一台DC-02-DevAdmin-offshore.com,那我攻進去並且拿到了Local Admin,就是這台機器的最高權限的話,我可能可以透過像是Mimikatz這樣的工具,去把這個人的帳密給Dump出來,所以這邊我這個Session也可以按Help然後這邊按Abuse,這邊就會寫Password Theft,就是竊取Password:

這個Password Theft這邊就跟我剛剛提到一樣,就是用Mimikatz的Credential Dumping,這邊也會告訴你說他有哪些指令可以 做使用,或者你可以用Token Impersonation,應該也會告訴你說要怎麼去使用。實作上你可以用比如說像是Metafritter,裡面也有這種Token Impersonation,也可以用像是Mimikatz把像是TGT的東西給Dump出來,你就可以拿著TGT去胡作非為。










Related Posts

寬 補

寬 補

[0] 寫在一開始,關於這個系列文

[0] 寫在一開始,關於這個系列文

筆記 課程中SQL command 轉SQLite

筆記 課程中SQL command 轉SQLite


Comments