« Shellcode » : différence entre les versions
Contenu supprimé Contenu ajouté
m robot Modifie: ru:Шелл-код; changement de type cosmétique |
→Détection de shellcodes : quelques coquilles |
||
(35 versions intermédiaires par 27 utilisateurs non affichées) | |||
Ligne 1 :
Un '''shellcode''' est une [[chaîne de caractères]] qui représente un code binaire exécutable.
Historiquement, les shellcodes ont été développés dans le cadre de la recherche en sécurité informatique pour démontrer les vulnérabilités des systèmes. Par exemple, ils ont été utilisés dans des attaques célèbres telles que le ver [[Morris (ver informatique)|Morris en 1988.]]
== Fonctionnement d'un shellcode ==
Pour mieux comprendre le fonctionnement des shellcodes, il est utile de connaître les bases de l'architecture des systèmes informatiques, notamment la [[gestion de la mémoire]] et le [https://www.journaldunet.fr/web-tech/dictionnaire-du-webmastering/1445278-buffer-definition-et-fonctionnement-pratique/#:~:text=Qu'est%2Dce%20que%20le,sein%20d'un%20ordinateur%20moderne fonctionnement des buffers].
Généralement, les shellcodes sont injectés dans la mémoire de l'ordinateur grâce à l'exploitation d'un [[dépassement de tampon]]. Dans ce cas, l'exécution du shellcode peut être déclenchée par le remplacement dans la [[Pile (informatique)|pile]] (''stack'' en anglais) de l'adresse normale de retour par l'adresse du shellcode injecté. Ainsi, lorsque la routine est terminée, le [[microprocesseur]], qui doit normalement exécuter les instructions située à l'adresse de retour, exécute le shellcode.▼
▲Généralement, les shellcodes sont injectés dans la mémoire de l'ordinateur grâce à l'exploitation d'un [[dépassement de tampon]]. Dans ce cas, l'exécution du shellcode peut être déclenchée par le remplacement dans la [[Pile (informatique)|pile]] (''stack'' en anglais) de l'adresse normale de retour par l'adresse du shellcode injecté. Ainsi, lorsque la routine est terminée, le [[microprocesseur]], qui doit normalement exécuter les instructions
== Écriture de shellcodes ==
L'écriture de shellcodes est soumise à des contraintes. En effet, un shellcode est une chaîne de caractères qui va être injectée en [[mémoire informatique|mémoire]] car elle sera en dehors de l'espace normalement alloué. Or les chaînes de caractères, dans la plupart des langages de programmation, ont l'octet nul (0x00) comme marqueur de fin. Par exemple la fonction strcpy<ref>{{lien web |titre=Strcpy |url=https://pubs.opengroup.org/onlinepubs/9699919799/functions/strcpy.html |site=opengroup.org |consulté le=19-11-2023}}.</ref> en [[C (langage)|C]] arrête la copie de
L'écriture d'un shellcode demande alors de n'avoir recours à aucune instruction [[assembleur]] contenant un octet nul (à l'exception du dernier). La tâche étant ardue, les concepteurs de shellcodes importants écrivent initialement un « chargeur » de shellcode servant à transformer un code assembleur (pouvant contenir des octets nuls) en un code ne contenant pas d'octet nul (le code du chargeur devant à son tour être écrit sans [[caractère nul]]). Une technique classique consiste à transformer chaque octet du code par une opération « ou exclusif » ([[XOR]]) : cette opération est simple, réversible, et on peut généralement (quoique pas à coup sûr) trouver une « clé » à appliquer au « ou exclusif » permettant d'éviter les caractères nuls.
Dans certains contextes, les contraintes sont encore plus sévères : le jeu d'octets autorisés peut être encore plus réduit. Il est possible que la chaîne envoyée au programme vulnérable ait précédemment été filtrée pour ne faire passer que des caractères [[alphanumérique]]s (ayant un code ASCII compris entre 32 et 127 par exemple). On trouve un autre exemple classique sur certains systèmes fonctionnant en interne en [[UTF-16]] (cf [[Unicode]]) : il arrive qu'une chaîne de caractères codée sur 8 bits soit d'abord « étendue » en UTF-16 (en ajoutant un 0 un octet sur deux généralement) puis traitée. Dans ce cas, les instructions qui pourront être exécutées par l'attaquant seront forcément de la forme '''XX00''' (en [[hexadécimal]]), ce qui complique énormément la tâche du concepteur de shellcode.
Dans ces deux cas, la technique est la même que précédemment : écrire un « décodeur » avec ces contraintes qui transforme (en mémoire) le véritable code malveillant encodé précédemment. L'écriture du cœur du code malveillant (on parle de ''payload'') est alors plus facile et indépendante du type de contraintes de la cible. Ainsi, il existe actuellement de véritables [[bibliothèque logicielle|bibliothèques]] de construction de shellcodes permettant de l'assembler par type de fonction à réaliser et par contraintes (par "codeur" à intégrer).
Ligne 17 ⟶ 21 :
== Détection de shellcodes ==
L'exploitant agissant généralement avec une certaine marge d'erreur lors de l'exploitation d'une faille dans la découverte de la bonne [[Adressage mémoire|adresse mémoire]] (voir [[Dépassement de tampon]]), le shellcode est préfixé d'un maximum d'instructions nulpotentes ([[Langage machine|opcode]] [[NOP]], codé 0x90 sur architecture 80x86) pour optimiser les chances d'exécution du shellcode. Ainsi, la première méthode de détection de shellcodes a été de
D'autres méthodes se basent sur le fait qu'un shellcode contient souvent certaines chaînes de caractères spécifiques servant à ouvrir un shell comme ''/bin/sh''. Un programme faisant référence à cette chaîne de caractères est donc suspect et il est alors possible d'empêcher son exécution.
Cependant, les
Un autre moyen de détection est de regarder si le programme essaye d'accéder à une zone mémoire qui n'est pas attribuée au programme en cours.
Néanmoins, les techniques de prévention modernes incluent l'utilisation de solutions de sécurité avancées comme l'[[ASLR]] (Address Space Layout Randomization) et les [[Data Execution Prevention|DEP]] (Data Execution Prevention), qui compliquent l'exécution de shellcodes.
== Exemple de shellcode ==
Ligne 27 ⟶ 35 :
Exemple de shellcode, largement publié (voir liens externes), d'une cinquantaine d'octets permettant d'exécuter (via un appel à l'interruption 0x80) le programme ''/bin/sh''. Ce shellcode est programmé avec des instructions ne contenant aucun caractère nul. Il ne fonctionne que sur architecture [[X86|80x86]], sous Linux.
<syntaxhighlight lang="c">
</syntaxhighlight>
== Notes et références ==
Ligne 38 ⟶ 46 :
* [[Dépassement de tampon]]
* [[Vulnérabilité (informatique)]]
* [[Reverse shell]]
== Liens externes ==
* {{en}} [http://www.shell-storm.org/shellcode/ Shell-Storm] Bases de données sur le développement des shellcodes
* {{mul|en|fr}} [http://www.phrack.org/
{{Portail
[[Catégorie:Exploit (informatique)]]
[[Catégorie:Sécurité du réseau informatique]]
|