Race Condition

h4nnah4nna
3 min read

Me he clonado un laboratorio de skf-labs, para probar la vulnerabilidad de race condition.

Me abro en mi navegador por el puerto 5000 y veo una web, donde me puedo registrar, en este caso vamos a registrar dos usuarios que en principio no tienen privilegios. Pongo el nombre y me creará una cookie de sesión. Vamos a abusar de esta cookie: en realidad si inspeccionamos el codigo fuente en la pestaña de storage, vemos que nos ha creado una cookie.sid, vemos que se divide en tres segmentos separados por un punto o por un guion bajo (depende del navegador), la parte pricinal es el id de la sesion, la segunda corresponderia al contenido y la tecera es un algoritmo a modo de comprobacion, a veces este ultimo trozo esta vacío y vamos a modificarlo para que dejando el tercer campo vacio, nosotros podamos manipular el id de sesión.

Viendo el código, sabemos que se está aconteciendo una acción pero vemos que nos aplica unas restricciones, unos minutos antes de que se validen este tipo de restricciones es donde queremos inyectar el comando id para que nos lo ejecute a nivel de sistema.

Podríamos lanzar lo que se llama ataque de deserialización que simplemente es crear un bucle infinito para detectar el momento en el que aun no a entrado a validarse esa restricción. En el siguiente código vemos como:

const boot_validate = (person => {
    fs.writeFileSync("hello.sh", 'echo "' +person + '" > hello.txt');
    exec("echo 'hello.sh update -- " + Date.now() + "' > log.txt");
    exec("echo 'hello.sh cleaned -- " + Date.now() + "' >> log.txt");
    exec("bash hello.sh");
    const valid = () => {
        return execSync(
            "sed -n '/^echo \"[A-Za-z0-9 ]*\" > hello.txt$/p' hello.sh"
            ).toString();
    };
    return valid();
};

En el código de arriba vemos como se crea la validacion, esta diciendo que cree un hello.sh más el valor person que hayamos introducido en la web y nos lo redirige a hello .txt y le pide al valor que se actualice tomando como referencia la hora del sistema. y nos crea un archivo de log, que de momento no nos preocupa, ya que esto es el funcionamiento correcto del sistema.

const boot_validate = (person => {
    fs.writeFileSync("hello.sh", 'echo "' +person + '" > hello.txt');
    exec("echo 'hello.sh update -- " + Date.now() + "' > log.txt");

En este punto es donde queremos entrar para ejecutar in id, y que nos muestre el id del sistema. Ya que en la siguiente línea borra este archivo

exec("echo 'hello.sh cleaned -- " + Date.now() + "' >> log.txt");

Y mas abajo vemos como le mete las restriciones que solo perimte el uso de letras y numeros

"sed -n '/^echo \"[A-Za-z0-9 ]*\" > hello.txt$/p' hello.sh"

Lo que vamos a hacer para saltarnos esta regla, va a ser monitorizar la ejecución del sistema, creando un bucle infinito, para ver el comando id ejecutado antes de que entre la restricción que nos impide los caracteres especiales, por lo tanto que nos impide ejecutar el comando id

Lanzamos el comando

while true; do curl -s -X GET 'http://localhost:5000/?person=`id`&action=run'| greep "Check this out" | html2text | xargs | grep -vE "hola"'; done

de bemos de lanzarla y esperar un poco final mente nos mostrara:

Check this out: uid=0(root) guid=0(root) grupos=0(root)
0
Subscribe to my newsletter

Read articles from h4nna directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

h4nna
h4nna

#Telegram t.me/H4nnaHack #hashnode https://h4nna.hashnode.dev/ #Github https://github.com/h4nnahalt/