Für diverse Testtätigkeiten nutzt man auch entsprechende Lösungen, in meinem Fall neben Unittest, auch Systemtest die wie in diesem Beispiel über Python und Scapy aufgebaut sind.

Scapy ist ein Manipulationstool für Netzwerke, geschrieben in Python. Es kann Pakete fälschen oder entschlüsseln, man kann damit Auswertungen anfertigen und so von Security bis hin zu Lasttest alles abtesten. Es kann mit einer Reihe anderer Programme kombiniert werden, um Visualisierung einschließlich Wireshark  1 für das Entschlüsseln von Paketen, GnuPlot  2 für die Bereitstellung von Graphen, Graphviz  3  oder VPython 4  für die Visualisierung usw. zu ermöglichen.

 

Scapy und Wireshark

Wie man mit Scapy und Wireshark TCP Pakete analysiert, wird in diesem Beispiel kurz erklärt.

Hier sendet Scapy ein Paket, welches dann in einem weiteren File entsprechend ausgelesen werden kann.

send-packet.py

from scapy.all import *

def main():
    """
    """
    packet = IP(dst="192.168.100.123")/TCP()/"from scapy packet"
    send(packet)


def packet_with_seq_n():
    packet = IP(dst="192.168.100.xxx", src="192.168.100.xxx")/TCP(sport=333, dport=222, seq=112344)/"Sequence number 112344"
    send(packet)
    # we can use sendp to choose different network interface
    sendp(packet, iface="en0")
    # lsc() can see functions descriptions.

if __name__ == "__main__":
    main()
    packet_with_seq_n()

Hier wird ein lesbares Wireshark Paket gebaut:

send.py

import sys
from scapy.all import *
from datetime import datetime

test_content = """HTTP/1.1 200 OK\r\nDate: Wed, 22 Nov 2017 02:13:40 GMT\r\nServer: Apache/2.2.22 (Ubuntu)\r\nLast-Modified: Tue, 21 Nov 2017 04:35:07 GMT\r\nAccept-Ranges: bytes\r\nContent-Length: 177\r\nKeep-Alive: timeout=500, max=100\r\nConnection: Keep-Alive\r\nContent-Type: text/html\r\n\r\n<html><body><h1>It !!!!!!</h1>
<p>This is the default web page for this server.!!!!!</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>""" + datetime.now().strftime("%m/%y %H:%M:%S")

def main():
    """"""
    dst_ip = sys.argv[1]
    dst_port = int(sys.argv[2])

    src_ip = sys.argv[3]
    src_port = int(sys.argv[4])

    seq_n = int(sys.argv[5])
    ack_n = int(sys.argv[6])

    ip_id = int(sys.argv[7])
    ip_flags = int(sys.argv[8])

    # build packet
    ip = IP(src=src_ip, dst=dst_ip, id=ip_id, flags=ip_flags)
    tcp = ip / TCP(sport=src_port, dport=dst_port, flags='PA',
                    seq=seq_n, ack=ack_n) / test_content
    tcp.display()
    print("length of packet {}".format(len(tcp)))
    
    send(tcp)

if __name__ == '__main__':
    main()

Und hier das Wireshark Paket welches wir gerade geschnürt haben.

wireshark-tip.md

using filter:

ip.dst==192.168.100.123

 

Netzwerkpakete fälschen mit Scapy

Hier in diesem Beispiel 5 wird dargestellt wie man Scapy zum fälschen oder verändern von Netzwerkpaketen genutzt werden kann.

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)

Und hier die einzelnen Netzwerkpakete.

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'

  1. Hier weitere Informationen zu Wireshark []
  2. Hier weitere Informationen zur GnuPlot integration in Scapy https://scapy.readthedocs.io/en/latest/usage.html?highlight=gnuplot[]
  3. Hier kann man weitere Informationen zur Nutzung von Scapy und Graphviz https://scapy.readthedocs.io/en/latest/installation.html []
  4. Hier findet ihr weitere Informationen zu Scapy und VPython https://scapy.readthedocs.io/en/latest/installation.html[]
  5. Beispiel kann hier abgerufen werden https://www.python-forum.de/viewtopic.php?f=3&t=43536[]