Input Injection 2 writeup

Descripción
This program greets you and then runs a command. But can you take control of what command it executes?
Input Injection 2 solución
Lanzamos la instancia para obtener el programa, el código fuente, y un servidor y un puerto al que conectarnos con netcat.
Examinaremos en primer lugar el código fuente del archivo para ver si existe en él alguna vulnerabilidad.
codium vuln.c

A diferencia del CTF anterior, Input Injection 1, en este caso las variables se están almacenando de forma dinámica con ‘malloc‘.
char* username = malloc(28);
char* shell = malloc(28);
De nuevo, volvemos a tener el error de que, al introducir información por consola, no se comprueba el tamaño de la cadena introducida al enviarla a una variable:
scanf("%s", username);
Al tratarse de memoria dinámica, en este caso nos encontramos ante un heap overflow. De nuevo, como la variable ‘shell‘ se encuentra declarada al lado de ‘username‘, a la cual tenemos acceso con ‘scanf‘, podemos intentar sobreescribir su contenido. Para ello, dado que nos proporciona la dirección de memoria de ambas variables, introduciremos tantos bytes de información como sean necesarios, seguidos del comando que queramos que ‘system(shell);‘ ejecute. Todo este vector de ataque es posible debido a varios factores:
- Shell y username han sido declarados en posiciones de memoria adyacentes y el compilador no ha reorganizado la posición de las variables.
- La variable shell, pese a tomar valor en la línea 15, puede ser sobrescrita en la línea 19, si ambas líneas estuvieran intercambiadas no se podría realizar el heap overflow.
- System() ejecuta el contenido de la variable shell.
Al conectarnos al servidor recibiremos las direcciones de memoria de ambas variables:

La dirección de las variables está en formato hexadecimal, usaremos python para realizar la resta y ver cuántos bytes debemos introducir:
python3 -c 'print(0x403c42d0 - 0x403c42a0)'
El resultado de esta resta serán 48, por lo que introducimos 48 caracteres seguidos del comando que queramos que ejecute system(), en este caso, ‘ls’:

Sin embargo, en este caso no podremos utilizar AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcat flag.txt, dado que no aceptará espacios. Lanzaremos en su lugar una consola para poder acceder a ella e introducir espacios correctamente.
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/bin/bash

Obteniendo así la flag y completando el CTF.
Consultor de ciberseguridad especializado en continuidad de negocio y respuesta ante incidentes. Interesado en analizar tecnologías desde una perspectiva de seguridad y descubrir su comportamiento real.
