2016-09-29 3 views
1

Angenommen, ich habe es geschafft, mitten in der Kommunikation zwischen einem Client und einem Server zu sein (sagen wir, dass ich einen Hotspot öffne und den Client nur über den Server mit dem Server verbinden) meine Maschine).Ändern von Paketen im laufenden Betrieb mit scapy als MITM

Wie kann ich Pakete ändern, die mein Client sendet und empfängt, ohne meine eigene Kommunikation mit anderen Diensten zu unterbrechen? Es muss eine Möglichkeit geben, alle Pakete zu routen, die der Client sowohl sendet als auch empfängt (bevor er sie an ihn weiterleitet) über mein Skript.

Ich denke, dass die richtige Richtung, um dies zu erreichen ist mit iptables, aber nicht sicher, genau, welche Argumente passen würde, um dies zu arbeiten. Ich habe bereits das folgende einfache Skript:

hotspotd start #a script that runs dnsmasq as both a DNS and DHCP server, configures and starts a hotspot 
iptables -P FORWARD ACCEPT 
iptables --append FORWARD --in-interface wlan0 -j ACCEPT 
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE 
#wlan0 is the interface on which the hotspot is. 
#eth0 is the interface that is connected to the internet 

Nun, dies funktioniert perfekt für eine passive MITM - ich alles sehen kann, dass der Client sendet und empfängt. Aber jetzt möchte ich es verstärken und jede Nachricht umleiten, die er durch mich sendet und empfängt.

Mein schließliche Zweck ist auf ein Niveau zu bekommen, wo ich das folgende Skript ausführen kann:

from scapy.all import * 
from scapy_http.http import * 

def callback(pkt): 
    #Process the packet here, see source and destination addresses, ports, data 
    send(pkt) 

sniff(filter='port 666', prn=callback) #Assuming all relevant packets are redirected to port 666 

Wie kann ich accomplish Umleiten jedes Paket sendet der Client und-über-zu-erhalten?

Antwort

1

Sie können verwenden, die python bindings hat.

NFQUEUE ist eine Userspace-Warteschlange, die ein gültiges iptables-Ziel ist. Sie können einige Besucher auf der NFQUQUE umleiten:

iptables -I INPUT -d 192.168.0.0/24 -j NFQUEUE --queue-num 1

zugreifen dann die Pakete aus dem Code:

from netfilterqueue import NetfilterQueue 

def print_and_accept(pkt): 
    print(pkt) 
    pkt.accept() 

nfqueue = NetfilterQueue() 
nfqueue.bind(1, print_and_accept) 
try: 
    nfqueue.run() 
except KeyboardInterrupt: 
    print('') 

nfqueue.unbind() 

Notiere die pkt.accept() Anruf. Dies bringt eine verdict an die nfqueue zurück und teilt ihr mit, dass sie das Paket akzeptieren soll - d. H. Es ihr erlauben soll, entlang ihrer normalen Route im Kernel fortzufahren. Um ein Paket anstelle von accept zu ändern, müssen Sie es kopieren, ein drop Urteil zurückgeben und es schließlich mit den enthaltenen Änderungen erneut senden.

+0

Scheint zu arbeiten. Aber wie erkenne ich, welche Pakete vom Gerät kommen und welche von meinem Rechner? –

+0

Sie können entweder iptables oder Ihre App dafür verwenden. 1. Unter Verwendung von IP-Tabellen können Sie Pakete nach ihrer Quelle filtern und nur die relevanten in die nfqueue senden (oder sie an zwei separate NFQUEUES senden, abhängig von der Quelle). 2. Da Ihre Anwendung das gesamte Paket von NFQUEUE empfängt, können Sie einfach die IP-Adresse jedes empfangenen Pakets überprüfen. – Malt

+0

aber ist es nicht in einer späteren Phase bestimmt? Ich meine, Pakete stammen von einer lokalen Adresse, die ich vermute, sind okay und leicht zu bestimmen, aber was ist mit Paketen **, die an die IP-Adresse des Geräts gerichtet sind? Sie kommen zu meiner externen IP, wird so ein Kunststück funktionieren? –

Verwandte Themen