Shellcode Presentation

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 35

SHELLCODES

How to basically learn a very useful tool for pentesting.


INTRODUCTION
Un shellcode est une chaine de
caractère (souvent en format ASCiI) qui
représente un code binaire exécutable
(.bin) permettant de lancer un
programme shell (/bin/sh) sous linux ou
un programme cmd sous Windows
“If you spend more on coffee than
on IT security, you will be hacked.
What's more, you deserve to be
hacked”

—Richard Clarke
01
Shellcode injection example
ABOUT THIS
TOPIC
Nous allons explorer le domaine des
shellcodes en réalisant la
démonstration d’un shellcode
injection, pour ce faire, nous
prendrons un serveur de
démonstration (vulnserver) qui
tourne sous windows 7.
DID YOU KNOW THIS?
Un scénario de shellcode peut être divisé en 3
parties :

1)-Fuzzing

2)-RIP control

3)-Shellcode generation and injection


02
Initialisation du scénario
Scenario
Allumer le serveur côté machine victime (démarrer vulnserver)
Scenario
Contacter le serveur victime à partir de la machine d’attaque
03
Fuzzing
Fuzzing
Fuzzing : consiste à envoyer suffisamment de caractères pour
provoquer un stack overflow et insérer du junk dans la pile

Cela nous permettra de récupérer l’adresse du RIP (instruction


pointer) qui sera très utile par la suite.

On commence par envoyer un buffer de faible taille (A * 50) au


service TRUN.
Fuzzing
Fuzzing.py (ou tout autre nom) est un simple script python qui sert
à ouvrir un socket pour se connecter au serveur distant, et lui
envoyer un paquet de données.

Le fichier est disponible dans ce cours avec des commentaires


pour vous aider à vous orienter.

Résultat : aucun crash, on va augmenter la taille du buffer


Fuzzing
Envoi de 5000 caractères pour tester la limite du serveur
Fuzzing
Le serveur a planté : stack overflow(Buffer overflow attack)

De plus, le RIP(ici EIP car le serveur est en x86) est égal à


41414141, qui correspond aux caractères envoyés.

Nous savons maintenant que le RIP est accessible, l’étape du


fuzzing est donc un succès.

Maintenant, nous devons contrôler le RIP pour le faire pointer


ou nous voulons.
04
Contrôle du RIP
Contrôle du RIP
Nous allons nous servir de metasploit pour générer un pattern
de 5000 caractères

Nous utilisons pattern_create.rb pour générer une chaine de


5000 caractères

Nous injecterons cette chaîne mais avant, passons côté victime


Contrôle du RIP
Nous allons maintenant exécuter Immunity debugger du côté
victime pour regarder l’évolution du RIP
Contrôle du RIP

Attacher Immunity debugger au serveur en cours


Contrôle du RIP

Exécuter le script de fuzzing avec le pattern inséré, puis


observer les registres dans le débugger.
Contrôle du RIP
Le RIP est désormais connu (RIP = 396F4338) Nous calculons
le décalage (offset) avec le pattern d’origine.

Résultat : il suffit d’injecter 2006 caractères avant d’avoir accès


au RIP.
Contrôle du RIP
Voilà donc à quoi ressemblera notre payload
-Octets de bourrage
-Une adresse RIP
-Le shellcode à exécuter

Bourrage RIP adresse Shellcode

2006 4 2990
05
Injection du shellcode
Injection du shellcode
La dernière étape pour injecter le shellcode
consiste en 2 parties :

1- Localiser une adresse RIP qui nous permet de


sauter vers la pile.

2- Générer un shellcode qui permet d’exécuter un


reverse-tcp bind
Injection du shellcode
Ouvrir Immunity debugger, attacher le serveur en
cours d’exécution et le run (la flèche rouge)
Injection du shellcode
Clic droit → Search for → All commands in all
modules

Cherchez pour toute instruction qui saute vers la


pile (ESP = RSP Stack Pointer)
Injection du shellcode
Injection du shellcode
Ok, maintenant l’adresse RIP que nous allons charger va mener
l’exécution du programme directement vers la pile.

Maintenant, nous allons générer un shellcode qui correspond à


un reverse-tcp bind.

Msfvenom est un logiciel qui permet de générer un shellcode


correspondant aux failles les plus connues pour tout OS.
Injection du shellcode

-a : type de processeur (x86, x64,ARM...etc)


--platform : Système d’exploitation
-p : le payload, la charge utile, le fichier binaire qui sera traduit en shellcode.
(dans cet exemple il s’agit du shell_reverse_tcp et non shell_reverse_t cp

LHOST : correspond à l’adresse IP de l’attaquant (hôte d’écoute).

LPORT : Port d’écoute qui sera ouvert dans la machine de l’assaillant.

-b : retirer tous les mauvais caractères du shellcode

-f : le format de la chaine de caractère (python, C, C#...etc)


Time for the hacking (to the gate)
Injection du shellcode
Nous sommes prêts à passer à l’attaque : injecter le shellcode
ainsi généré qui prendra la forme suivante :

2006*A + RIP adresse + \x90 *64 + reverse-tcp bind

(les NOP servent à orienter le code vers le shellcode)

Activation du port d’écoute dans la machine d’attaque :


nc -lp port d’écoute

Et on exécute le code d’injection


Injection du shellcode
Résultat : nous avons désormais accès au shell du serveur
victime.

Nous avons désormais le contrôle de la machine, et nous


pouvons faire ce que l’on veut avec… comme par exemple
exécuter la commande remove...
Pour résumer

Step 1 Step 2 Step 3


Fuzzing Contrôler le RIP Trouver un jump
vers la pile

Step 4 Step 5 Step 6


Générer un Injecter le Prendre le contrôle
shellcode (ex : shellcode du shell
reverse-tcp bind)
How to pwn a
server using
shellcodes
THANKS!
To our sponsors, RAID ;
SHADOW LEGENDS and
NORD VPN for their
collaboration !

CREDITS: This presentation template was


created by Slidesgo, incluiding icons by
Flaticon, and infographics & images by
Freepik.

Please, keep this slide for


attribution.

Vous aimerez peut-être aussi