Chercher :
Newsletter :  


Revues :
- Presse
- Presse FR
- Vidéos
- Twitter
- Secuobs





Sommaires :
- Tendances
- Failles
- Virus
- Concours
- Reportages
- Acteurs
- Outils
- Breves
- Infrastructures
- Livres
- Tutoriels
- Interviews
- Podcasts
- Communiques
- USBsploit
- Commentaires


Revue Presse:
- Tous
- Francophone
- Par mot clé
- Par site
- Le tagwall


Top bi-hebdo:
- Ensemble
- Articles
- Revue
- Videos
- Twitter
- Auteurs


Articles :
- Par mot clé
- Par auteur
- Par organisme
- Le tagwall


Videos :
- Toutes
- Par mot clé
- Par site
- Le tagwall


Twitter :
- Tous
- Par mot clé
- Par compte
- Le tagwall


Commentaires :
- Breves
- Virus
- Failles
- Outils
- Tutoriels
- Tendances
- Acteurs
- Reportages
- Infrastructures
- Interviews
- Concours
- Livres
- Communiques


RSS/XML :
- Articles
- Commentaires
- Revue
- Revue FR
- Videos
- Twitter


RSS SecuObs :
- sécurité
- exploit
- windows
- attaque
- outil
- réseau


RSS Revue :
- security
- microsoft
- windows
- hacker
- attack
- network


RSS Videos :
- curit
- security
- biomet
- metasploit
- biometric
- cking


RSS Twitter :
- security
- linux
- botnet
- attack
- metasploit
- cisco


RSS Comments :
- Breves
- Virus
- Failles
- Outils
- Tutoriels
- Tendances
- Acteurs
- Reportages
- Infrastructures
- Interviews
- Concours
- Livres
- Communiques


RSS OPML :
- Français
- International











Revue de presse francophone :
- Drupal, une faille World Wide sur le web
- La fillière du hack des magasins Target est Russe
- Le premier G-man des USA fustige la crypto
- LPM cybersécurité des OIV quel bilan 10 mois après
- Vigilance - IBM WebSphere MQ non filtrage de CHLAUTH, analysé le 09 10 2014
- Jean-Pierre Carlin, LogRhythm Le SIEM, premier rempart pour limiter les pertes liées aux cyberattaques
- Vigilance - OpenBSD déni de service via le lancement d'un programme avec un en-tête ELF incohérent, analysé le 20 10 2014
- Hurricane Electric développe sa présence dans le monde au sein des datacenters d'Equinix
- Vigilance - HP Data Protector multiples vulnérabilités de crs.exe, analysé le 24 07 2014
- Vigilance - Apple QuickTime corruption de mémoire via MVHD, analysé le 24 07 2014
- Vigilance - Drupal Nodeaccess élévation de privilèges, analysé le 09 10 2014
- Vigilance - Drupal OAuth2 Client Cross Site Scripting, analysé le 09 10 2014
- Pitié.
- Jared Mauch, fondateur du projet Open DNS Resolver, reçoit le prix J.D. Falk du M3AAWG pour l'identification de systèmes à risque
- Le dialogue public privé dans la lutte contre la cybercriminalité doit se renforcer

Dernier articles de SecuObs :
- Renaud Bidou (Deny All): "L'innovation dans le domaine des WAFs s'oriente vers plus de bon sens et d'intelligence, plus de flexibilité et plus d'ergonomie"
- Mises à jour en perspective pour le système Vigik
- Les russes ont-ils pwn le système AEGIS ?
- Le ministère de l'intérieur censure une conférence au Canada
- Saut d'air gap, audit de firmware et (in)sécurité mobile au programme de Cansecwest 2014
- GCHQ: Le JTRIG torpille Anonymous qui torpille le JTRIG (ou pas)
- #FIC2014: Entrée en territoire inconnu
- Le Sénat investit dans les monnaies virtuelles
- #LPM2013: Un nouvel espoir ?
- L'ANSSI durcit le ton

Revue de presse internationale :
- Think community financial institutions aren t in the crosshairs for account takeover Think again.
- Take care if using Ubuntu 12.04 as a client TLS 1.2 is not enabled by default
- Cyberespionage Phishing Attack, Backoff Malware Spreads, Retail Breach and more TWIC October 24, 2014
- When Did You Last Look Into a Crystal Ball Announcing our 2014 Predictions Accuracy Report
- Researcher Finds Tor Exit Node Adding Malware To Downloads
- Pirate Bay Sends 100,000 New Users to Free VPN
- Community Corner October 24, 2014 The Featured Projects from this Week
- ToyCollect A Mobile Robot which Collects Toys from Unaccessible Places Raspberry_Pi piday raspberrypi
- New Tor routers seeking crowdfunding appear as Anonabox is pulled by Kickstarter
- Enterprise security What s new for the week of October 20 2014
- Lots and Lots of Weekend Reading with Free MS Press eBooks from MVA
- 2015 A Cloud Odyssey
- Bulgarian Hacker Gets 30-Month Jail Term in US
- T2'14 Conference Slides Blind Code Coverage Fuzzing
- Raspberry Pi powered time lapse dolly RasPiLapse piday raspberrypi Raspberry_Pi

Annuaire des videos
- FUZZING ON LINE PART THREE
- Official Maltego tutorial 5 Writing your own transforms
- Official Maltego tutorial 6 Integrating with SQL DBs
- Official Maltego tutorial 3 Importing CSVs spreadsheets
- install zeus botnet
- Eloy Magalhaes
- Official Maltego tutorial 1 Google s websites
- Official Maltego tutorial 4 Social Networks
- Blind String SQL Injection
- backdoor linux root from r57 php shell VPS khg crew redc00de
- How To Attaque Pc With Back Track 5 In Arabique
- RSA Todd Schomburg talks about Roundup Ready lines available in 2013
- Nessus Diagnostics Troubleshooting
- Panda Security Vidcast Panda GateDefender Performa Parte 2 de 2
- MultiPyInjector Shellcode Injection

Revue Twitter
- RT @fpalumbo: Cisco consistently leading the way ? buys vCider to boost its distributed cloud vision #CiscoONE
- @mckeay Looks odd... not much to go on (prob some slideshow/vid app under Linux)
- [SuggestedReading] Using the HTML5 Fullscreen API for Phishing Attacks
- RT @BrianHonan: Our problems are not technical but cultural. OWASP top 10 has not changed over the years @joshcorman #RSAC
- RT @mikko: Wow. Apple kernels actually have a function called PE_i_can_has_debugger:
- [Blog Spam] Metasploit and PowerShell payloads
- PinkiePie Strikes Again, Compromises Google Chrome in Pwnium Contest at Hack in the Box: For the second time thi...
- @mikko @fslabs y'all wldn't happen to have lat/long data sets for other botnets, wld you? Doing some research (free/open info rls when done)
- RT @nickhacks: Want to crash a remote host running Snow Leopard? Just use: nmap -P0 -6 --script=targets-ipv6-multicast-mld #wishiwaskidding
- An inexpensive proxy service called is actually a front for #malware distribution -

Mini-Tagwall
Revue de presse : security, microsoft, windows, hacker, attack, network, vulnerability, google, exploit, malware, internet, remote, iphone

+ de mots clés pour la revue de presse

Annuaires des videos : curit, security, biomet, metasploit, biometric, cking, password, windows, botnet, defcon, tutorial, crypt, xploit

+ de mots clés pour les videos

Revue Twitter : security, linux, botnet, attack, metasploit, cisco, defcon, phish, exploit, google, inject, server, firewall

+ de mots clés pour la revue Twitter

Top bi-hebdo des articles de SecuObs
- Le ministère de l'intérieur censure une conférence au Canada
- OSSTMM une méthodologie Open Source pour les audits de sécurité
- [Ettercap – Partie 2] Ettercap par l'exemple - Man In the Middle et SSL sniffing
- Une faille critique de Firefox expose les utilisateurs de Tor Browser Bundle
- [Ettercap – Partie 3] Ettercap par l'exemple - Affaiblissement de protocoles et attaque par injection
- EFIPW récupère automatiquement le mot de passe BIOS EFI des Macbook Pro avec processeurs Intel
- [Trames et paquets de données avec Scapy – Partie 1] Présentation
- Mises à jour en perspective pour le système Vigik
- La sécurité des clés USB mise à mal par USBDUMPER
- [(in)Sécurité du protocole HTTPS par Sysun Technologies – partie 1] Introduction à HTTPS

Top bi-hebdo de la revue de presse

Top bi-hebdo de l'annuaire des videos
- Comment creer un server botnet!!!!(Réseau de pc zombies)
- Meterpreter encode pivot
- Metasploit Client Side Meterpreter with Pivot Demo

Top bi-hebdo de la revue Twitter

Top des articles les plus commentés
- [Metasploit 2.x – Partie 1] Introduction et présentation
- Microsoft !Exploitable un nouvel outil gratuit pour aider les développeurs à évaluer automatiquement les risques
- Webshag, un outil d'audit de serveur web
- Les navigateurs internet, des mini-systèmes d’exploitation hors de contrôle ?
- Yellowsn0w un utilitaire de déblocage SIM pour le firmware 2.2 des Iphone 3G
- CAINE un Live[CD|USB] pour faciliter la recherche légale de preuves numériques de compromission
- Nessus 4.0 placé sous le signe de la performance, de l'unification et de la personnalisation
- [Renforcement des fonctions de sécurité du noyau Linux – Partie 1] Présentation
- [IDS Snort Windows – Partie 1] Introduction aux IDS et à SNORT
- Origami pour forger, analyser et manipuler des fichiers PDF malicieux

Tutoriels

English version with Google Translate

[WiShMaster - Partie 1] Introduction à l'écriture de shellcodes en C

Par Benjamin Caillat, Mastère Spécialisé Sécurité ESIEA
Le 16/09/2006


Résumé : Les ressources pour les shellcodes, en assembleur, sont légions sur le net ; l’objectif est içi de montrer les problématiques liées à l'écriture de code en C et leur compilation dans le but d'en extraire un shellcode (complexe) depuis le binaire généré. - Lire l'article



Le web recèle maintenant de nombreuses ressources permettant d’obtenir assez rapidement un shellcode.

L’outil Metasploit ( lien ), par exemple, contient une base impressionnante de 75 shellcodes pour différentes plateformes directement utilisables. Une simple recherche sur google permet également de récupérer une liste conséquente de documents, d’articles et de codes commentés offrant une bonne base à la création d’un shellcode.

Ces différents éléments sont généralement orientés vers l’écriture en assembleur de shellcodes de taille très réduite exécutant des opérations relativement simples : ajout d’un utilisateur, écoute sur un port, reverse connect, …

Cependant, il existe de nombreux cas nécessitant des shellcodes effectuant des opérations beaucoup plus complexes. Par exemple, lors d’une exploitation entièrement en mémoire, un premier shellcode de taille très réduite exécuté via une faille pourra effectuer le téléchargement en mémoire d’un second shellcode offrant des fonctionnalités avancées.

Ou encore, lors du développement d’une application utilisant des techniques d’injection de thread.
La question se pose alors : comment obtenir de tels shellcodes ? Du fait de leur complexité, leur écriture directement en assembleur peut s’avérer relativement longue et fastidieuse.

Il serait beaucoup plus pratique d’écrire un code en C, de le compiler et d’extraire le shellcode du binaire généré. L’objectif de ce dossier est de montrer les problématiques liées à cette approche, d’introduire un exemple de solution, puis de présenter un développement personnel générant des shellcodes à partir de code source C. Par la suite, nous nous placerons dans le cas de Windows.


Principe de l’écriture de shellcodes en C


Analyse du code assembleur généré par les compilateurs


Analysons dans un premier temps le binaire généré par la compilation d’un programme basique affichant le message « Hello world » dans une boite de message et appelant une fonction interne « MyFunc » :


void MyFunc(int a)
{
printf("%d", a);
}

int _tmain(int argc, _TCHAR* argv[])
{
MessageBox(NULL, "Hello world", "Hello world", MB_OK);
MyFunc(7);

return 0;
}



La compilation sous Windows conduit à la génération d’un exécutable au format PE constitué de quelques entêtes contenant des informations sur le fichier et de plusieurs sections contenant le code à exécuter, les données initialisées et celles non-initialisées – désignées dans la suite par données (non) initialisées – et d’autres informations utilisées par Windows lors du chargement de l’exécutable (table d’importation, …)

De manière très schématique, l’exécutable produit a la structure suivante :






La section « .text » contiendra notamment le code des fonctions « main » et « MyFunc », la section « .rdata » la chaîne « Hello world » et la table d’importation. Le compilateur utilisé est celui fourni en standard dans la suite Visual Studio, en activant l’optimisation de taille (option /O1).

Analysons maintenant le code assembleur généré.


MessageBox(NULL, "Hello world", "Hello world", MB_OK);
00401012 6A 00 push 0
00401014 B8 00614000 mov eax,offset string "Hello world" (406100h)
00401019 50 push eax
0040101A 50 push eax
0040101B 6A 00 push 0
0040101D FF15 D4604000 call dword ptr [__imp__MessageBoxA@16 (4060D4h)]
MyFunc(7);
00401023 6A 07 push 7
00401025 E8 D6FFFFFF call MyFunc (401000h)
0040102A 59 pop ecx



Plusieurs remarques peuvent être faites sur ce code :

- Dans la deuxième instruction, nous trouvons la valeur 406100h qui correspond à l’adresse de la chaîne « Hello world », codée « en dur »,

- L’appel à MessageBoxA utilise un call à l’adresse contenue dans l’entrée « __imp__MessageBoxA » de la table d’importation, une table de pointeurs de fonctions remplie par le loader de Windows lors de la création du processus :


004060D4 77D504EA 00000000 00000000 00000000
004060E4 44FFD423 00000000 00000002 00000082



La fonction MessageBoxA se trouve réellement en 0x77D504EA :


77D504EA 8BFF mov edi,edi
77D504EC 55 push ebp
77D504ED 8BEC mov ebp,esp
77D504EF 833D BC04D777 cmp dword ptr ds:[77d704bc],0



- L’appel à la fonction MyFunc est basé sur un adressage relatif : La valeur 0xFFFFFFD6 représente la différence entre l’adresse de la fonction appelée (401000h) et l’adresse de la prochaine instruction (40102Ah) : 401000h-40102Ah = 0xFFFFFFD6.


Premier essai de shellcode

Imaginons que nous formions un buffer constitué du code de la fonction « main » suivi de celui de « MyFunc » :







Supposons maintenant que nous injections ce bloc dans un processus quelconque à une adresse quelconque et que nous transférions l’exécution dessus.

Dans l’espace mémoire de ce processus, l’adresse 406100h correspondra à des données tout autres que la chaîne « Hello world » ou même à une zone mémoire non allouée.

De même, l’adresse 4060D4h ne contiendra sûrement pas l’adresse de MessageBoxA ; le call conduira donc à une adresse arbitraire.






Il faut de plus noter qu’il est tout à fait possible que la librairie partagée user32.dll, contenant la fonction MessagBoxA, ne soit pas chargée dans ce processus.

Au niveau de l’appel de la fonction interne, la situation n’est guère meilleure. En effet la valeur de l’adressage relatif a été calculée par le compilateur pour un agencement très précis des fonctions.

Lors de l’exécution du programme d’origine, l’espace mémoire a l’allure suivante :






Cet agencement a cependant été modifié lors de la formation de notre « shellcode ». Le saut relatif conduira alors lui aussi à des instructions inconnues :






Une telle exécution conduira par conséquent à un résultat indéterminé ou à un plantage du processus.

Le code binaire généré par la compilation d’un code C « normal » ne peut donc être directement extrait et utilisé comme shellcode.


Ecriture de code C produisant un shellcode

Trois types d’opérations conduisent à la génération d’un code binaire non relocalisable et non autonome :

- Les références aux données (non)initialisées qui contiennent une adresse en « dur »,
- Les appels de fonctions internes, qui contiennent une adresse relative,
- Les appels aux fonctions importées, qui contiennent une adresse absolue représentant le pointeur de fonction dans la table d’importation.

Une solution possible pour éviter ces valeurs fixes est d’utiliser une structure contenant des pointeurs vers les fonctions internes/importées et toutes les données (non)initialisées. Cette structure, appelée dans la suite GLOBAL_DATA, serait par exemple ajoutée à la fin du shellcode.

Les appels de fonctions seraient alors effectués via les pointeurs de fonctions et les références aux données (non) initialisées porteraient sur les champs de cette structure.

En reprenant notre exemple de code, la structure GLOBAL_DATA serait typiquement :






Au niveau du code la déclaration peut être par exemple :


typedef INT (*MessageBoxATypeDef) (HWND, CHAR *, CHAR *, UINT);
typedef INT (*printfTypeDef) (CHAR *, ...);
typedef VOID (*MyFuncTypeDef) (INT);

typedef struct __GLOBAL_DATA
{
MessageBoxATypeDef MessageBoxA;
printfTypeDef printf;
MyFuncTypeDef MyFunc;
CHAR szMsg[12];
} GLOBAL_DATA, * LPGLOBAL_DATA;



Le code :


MessageBox(NULL, "Hello world", "Hello world", MB_OK);
MyFunc(7);



Devient alors :


pGlobalData->MessageBoxA(NULL, pGlobalData->szMsg, pGlobalData->szMsg, MB_OK);
pGlobalData->MyFunc(7);



Après compilation, nous obtenons :


pGlobalData->MessageBoxA(NULL, pGlobalData->szMsg, pGlobalData->szMsg, MB_OK);
00401001 A1 C0864000 mov eax,dword ptr [pGlobalData (4086C0h)]
00401006 8D48 0C lea ecx,[eax+0Ch]
00401009 6A 00 push 0
0040100B 51 push ecx
0040100C 51 push ecx
0040100D 6A 00 push 0
0040100F FF10 call dword ptr [eax]
pGlobalData->MyFunc(7);
00401011 A1 C0864000 mov eax,dword ptr [pGlobalData (4086C0h)]
00401016 6A 07 push 7
00401018 FF50 08 call dword ptr [eax+8]
0040101B 83C4 14 add esp,14h



Nous constatons que toutes les références sont basées sur pGlobalData. Ce code devient donc relocalisable et sans référence externe (puisque la structure GLOBAL_DATA fait partie du shellcode).

Cette technique impose cependant plusieurs contraintes :

- Tout d’abord, le shellcode doit avant tout pouvoir retrouver l’adresse de la structure GLOBAL_DATA puis initialiser les champs correspondant aux pointeurs de fonctions,

- Ensuite, l’écriture du code s’avère relativement fastidieuse : l’utilisation d’une fonction importée nécessite la déclaration d’un nouveau type, l’ajout du pointeur dans la structure GLOBAL_DATA et la modification du mécanisme d’initialisation pour éventuellement charger la dll et retrouver l’adresse de la fonction réelle,

- L’ajout d’une chaîne de caractères requiert de calculer sa longueur puis de déclarer un tableau de « char » dans la structure GLOBAL_DATA de la taille adéquate. Cette opération devient particulièrement longue lors de l’ajout de traces de debuggage,

- Enfin il est important de noter qu’une ligne de code ne respectant pas ces règles ne produira aucune erreur à la compilation. En revanche le code binaire généré contiendra une référence non relocalisable qui conduira à un plantage lors de l’exécution et à de longues séances de debuggage.

L’écriture de shellcodes pour Windows par cette solution semble donc techniquement possible, mais reste une opération relativement délicate et fastidieuse.

Autres ressources dans ce même dossier :

[WiShMaster - Partie 2] Principe de shellcodisation avec WiShMaster (1) - lien

[WiShMaster - Partie 3] Principe de shellcodisation avec WiShMaster (2) - lien

[WiShMaster - Partie 4] Principe et Fonctionnement - RConnect/WiShMaster Vs firewalls personnels (1) - lien

[WiShMaster - Partie 5] Principe et Fontionnement - RConnect/WiShMaster Vs firewalls personnels (2) - lien

[WiShMaster - Partie 6] Principe et Fonctionnement - RConnect/WiShMaster Vs firewalls personnels (3) - lien

[WiShMaster - Partie 7] Résultat de RConnect avec des firewalls personnels et conclusion - lien




- Article suivant : [WiShMaster - partie 2] Principe de shellcodisation avec WiShMaster (1)
- Article précédent : Axman, un nouveau fuzzer pour les ActiveX
- Article suivant dans la catégorie Tutoriels : [WiShMaster - partie 2] Principe de shellcodisation avec WiShMaster (1)
- Article précédent dans la catégorie Tutoriels : [Blink - partie 5] Scanner de vulnérabilités et conclusions du dossier

Les derniers commentaires publiés pour cet article:
- Post Exploitation Shellbag `ing ...
- simple-shellcode-generator.py ...
- ESRT @xsploitedsec - Learning Assembly Through Writing Shellcode ...
- ESRT @ChrisJohnRiley - Suggested Reading DEP Enforcing Shellcode ...
- ESRT @BorjaMerino @radareorg: Nice talk on analyzing shellcodes with r2 - by @vext01 ...

Les derniers commentaires de la catégorie Tutoriels:
- UPDATE Snort 2.9.1.1 ...
- Apache Issues Patch To Stop Reverse-Proxy Bypass Attack ...
- ESRT @HackerTheDude @r0bertmart1nez @xanda @morenops - Kernel hacking the BSD way, new post ...
- ESRT @room362 - The Dirty Little Secrets They Didn't Teach You In Pentesting Class ...
- ESRT @jcran @dkarg - Metasploit Payloads VS Libemu - Alienvault Labs ...

Les derniers articles de la catégorie Tutoriels :
- PktAnon un framework pour l anonymat des traces PCAP
- [NessusWX – Partie 2] Audits et conclusion
- [NessusWX – Partie 1] Introduction, installation et configuration
- [IDS Snort Windows – Partie 4] Conclusion et webographie
- [IDS Snort Windows – Partie 3] Exemple de fichier de configuration
- [IDS Snort Windows – Partie 2] Installation et configuration
- [IDS Snort Windows – Partie 1] Introduction aux IDS et à SNORT
- [Sécurité et PHP - Partie 5] Astuces
- [Sécurité et PHP - Partie 4] Remote PHP Vulnerabilty Scanner
- [Sécurité et PHP - Partie 3] Les failles PHP




SecuToolBox :

Mini-Tagwall des articles publiés sur SecuObs :

Mini-Tagwall de l'annuaire video :

Mini-Tagwall des articles de la revue de presse :

Mini-Tagwall des Tweets de la revue Twitter :