Exploiting Tools
Metasploit
Shellcodes
GDB
Instalación
Parámetros
Instrucciones
Opcionalmente podrías usar este fork de GEF que contiene instrucciones más interesantes.
Trucos
Mismas direcciones en GDB
Mientras se depura, GDB tendrá direcciones ligeramente diferentes a las utilizadas por el binario al ejecutarse. Puedes hacer que GDB tenga las mismas direcciones haciendo lo siguiente:
unset env LINES
unset env COLUMNS
set env _=<ruta>
Coloca la ruta absoluta al binarioExplota el binario utilizando la misma ruta absoluta
PWD
yOLDPWD
deben ser iguales al utilizar GDB y al explotar el binario
Rastrear para encontrar funciones llamadas
Cuando tienes un binario enlazado estáticamente, todas las funciones pertenecerán al binario (y no a bibliotecas externas). En este caso, será difícil identificar el flujo que sigue el binario para, por ejemplo, solicitar entrada de usuario.
Puedes identificar fácilmente este flujo ejecutando el binario con gdb hasta que se te solicite la entrada. Luego, detenlo con CTRL+C y utiliza el comando bt
(backtrace) para ver las funciones llamadas:
Servidor GDB
gdbserver --multi 0.0.0.0:23947
(en IDA tienes que completar la ruta absoluta del ejecutable en la máquina Linux y en la máquina Windows)
Ghidra
Encontrar el desplazamiento de la pila
Ghidra es muy útil para encontrar el desplazamiento para una sobrecarga de búfer gracias a la información sobre la posición de las variables locales.
Por ejemplo, en el ejemplo a continuación, un desbordamiento de búfer en local_bc
indica que necesitas un desplazamiento de 0xbc
. Además, si local_10
es una cookie canary, indica que para sobrescribirla desde local_bc
hay un desplazamiento de 0xac
.
Recuerda que los primeros 0x08 donde se guarda el RIP pertenecen al RBP.
qtool
Obtener cada opcode ejecutado en el programa.
GCC
gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2 --> Compilar sin protecciones -o --> Salida -g --> Guardar código (GDB podrá verlo) echo 0 > /proc/sys/kernel/randomize_va_space --> Desactivar ASLR en Linux
Para compilar un shellcode: nasm -f elf assembly.asm --> devuelve un ".o" ld assembly.o -o shellcodeout --> Ejecutable
Objdump
-d --> Desensamblar secciones ejecutables (ver opcodes de un shellcode compilado, encontrar ROP Gadgets, encontrar dirección de función...) -Mintel --> Sintaxis Intel -t --> Tabla de símbolos -D --> Desensamblar todo (dirección de variable estática) -s -j .dtors --> sección dtors -s -j .got --> sección got -D -s -j .plt --> sección plt descompilada -TR --> Relocalizaciones ojdump -t --dynamic-relo ./exec | grep puts --> Dirección de "puts" a modificar en GOT objdump -D ./exec | grep "VAR_NAME" --> Dirección de una variable estática (almacenadas en la sección DATA).
Volcados de núcleo
Ejecutar
ulimit -c unlimited
antes de iniciar mi programaEjecutar
sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t
sudo gdb --core=<path/core> --quiet
Más
ldd ejecutable | grep libc.so.6 --> Dirección (si hay ASLR, esto cambia cada vez) for i in `seq 0 20`; do ldd <Ejecutable> | grep libc; done --> Bucle para ver si la dirección cambia mucho readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system --> Desplazamiento de "system" strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh --> Desplazamiento de "/bin/sh"
strace ejecutable --> Funciones llamadas por el ejecutable rabin2 -i ejecutable --> Dirección de todas las funciones
Inmunity debugger
IDA
Depuración en Linux remoto
Dentro de la carpeta de IDA puedes encontrar binarios que se pueden utilizar para depurar un binario en un sistema Linux. Para hacerlo, mueve el binario linux_server
o linux_server64
dentro del servidor Linux y ejecútalo dentro de la carpeta que contiene el binario:
Luego, configura el depurador: Depurador (remoto de Linux) --> Opciones del proceso...:
Last updated