« Shellcode » : différence entre les versions

Contenu supprimé Contenu ajouté
Xqbot (discuter | contributions)
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. capableÀ del'origine destiné à lancer un [[shell (informatique)|shell]] ('/bin/sh' sous [[Unix]] ou [[command.com]] sous [[DOS]] et [[Microsoft Windows]] par exemple), le mot a évolué pour désigner tout code malveillant qui détourne un programme de son exécution normale. Un shellcode peut être utilisé par un [[Hacker (sécurité informatique)|hacker]] voulant avoir accès à laune [[interface en ligne de commande]].
 
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 situéesituées à l'adresse de retour, exécute le shellcode.
 
== É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 chainechaîne dès qu'elle rencontre cet octet. Un shellcode ne peut donc pas contenir d'[[octet]] 0x00, sinon, il ne sera pas entièrement copié.
 
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 répérerrepérer les séries de ''NOP'' en mémoire pour empêcher d'exécuter le shellcode qui suit les ''NOP''. Cette méthode est cependant relativement coûteuse en temps de calcul.
 
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 crackershackers peuvent outrepasser ces méthodes basiques de détection en chiffrant cette chaîne de caractères, ou même en utilisant du code polymorphe<ref>voir [[Code impénétrable]] et [[Virus polymorphe]]</ref>.
 
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">
char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd\x80\xe8\xdc\xff\xff\xff/bin/sh";
</syntaxhighlight>
"\x80\xe8\xdc\xff\xff\xff/bin/sh";
 
== Notes et références ==
Ligne 38 ⟶ 46 :
* [[Dépassement de tampon]]
* [[Vulnérabilité (informatique)]]
* [[Reverse shell]]
 
== Liens externes ==
{{trop de liens}}
* {{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/archivesissues/49/P49-14.html Smashing the Stack for Fun and Profit] ([https://www.dg-scarsouyes.org/phrack-fr/phrack-frtrad/phrack49-fr/p49frphrack49_0x0e_SlasH.txt traduction]), ''[[Phrack]] volume 49'' - L'introduction historique au dépassement de tampon et à la création de shellcode
* {{en}} [http://www.phrack.org/archives/61/p61-0x0b_Building_IA32_UnicodeProof_Shellcodes.txt Building IA32 'Unicode-Proof' Shellcodes] ([https://www.dg-sc.org/phrack-fr/phrack-fr/phrack61-fr/p61-0x0b.txt traduction]), ''[[Phrack]] volume 61'' - Les shellcodes en environnement Unicode UTF-16
* {{en}} [http://www.phrack.org/archives/57/p57-0x0f Writing ia32 alphanumeric shellcodes] , ''[[Phrack]] volume 57'' - Ecriture de shellcodes avec des caractères "imprimables"
* {{en}} [http://www.chez.com/mvm/RW32GS.txt Real Win32 Generic Shellcode] - Écriture de shellcodes génériques sous Windows en utilisant la technique du PEB
* {{en}} [http://www.shellcode.org/ Exemples de shellcodes]
* {{en}} [http://www.lsd-pl.net/projects/ Unix et Windows assembly components] - kit de construction de shellcodes sur plusieurs architectures.
* {{fr}} [http://packetstormsecurity.org/defcon10/dc10-fozy-shellcodes/dc10-fozy-WritingShellcodes/docs/french/stealth_shellcodes.pdf Le polymorphisme et le camouflage des shellcodes]
* {{fr}} [http://www.ghostsinthestack.org/cat-10-shellcodes.html Section Shellcodes de Ghosts In The Stack] - Articles sur les shellcodes, leur conception, l'élévation des privilèges, les shellcodes polymorphiques , etc.
* {{fr}} [http://www.secdev.org/projects/shellforge/ ShellForge - générateur de shellcodes]
* {{fr}} [http://www.blackclowns.org/articles/SupersonicShellcode1 Supersonic Shellcode 1] & [http://www.blackclowns.org/articles/SupersonicShellcode2 2]
 
{{Portail |sécurité informatique}}
 
[[Catégorie:Exploit (informatique)]]
[[Catégorie:Sécurité du réseau informatique]]
 
[[de:Shellcode]]
[[en:Shellcode]]
[[es:Shellcode]]
[[it:Shellcode]]
[[ja:シェルコード]]
[[ms:Kod cangkerang]]
[[pl:Shellcode]]
[[ru:Шелл-код]]