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