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 (( Hier weitere Informationen zu Wireshark )) für das Entschlüsseln von Paketen, GnuPlot ((Hier weitere Informationen zur GnuPlot integration in Scapy https://scapy.readthedocs.io/en/latest/usage.html?highlight=gnuplot)) für die Bereitstellung von Graphen, Graphviz ((Hier kann man weitere Informationen zur Nutzung von Scapy und Graphviz https://scapy.readthedocs.io/en/latest/installation.html )) oder VPython ((Hier findet ihr weitere Informationen zu Scapy und VPython https://scapy.readthedocs.io/en/latest/installation.html)) 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 ((Beispiel kann hier abgerufen werden https://www.python-forum.de/viewtopic.php?f=3&t=43536)) 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'
Neueste Kommentare