86890704fd
todo: add documentation & wireshark dissector
242 lines
12 KiB
Text
Executable file
242 lines
12 KiB
Text
Executable file
+ RTR Serial Notify
|
|
|
|
from scapy.consts import WINDOWS
|
|
if WINDOWS:
|
|
route_add_loopback()
|
|
|
|
= default instantiation
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRSerialNotify()
|
|
raw(pkt) == b'E\x00\x004\x00\x01\x00\x00@\x06|\xc1\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90q\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00'
|
|
|
|
= default values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRSerialNotify()
|
|
RTRSerialNotify in pkt and pkt.rtr_version == 0 and pkt.pdu_type == 0 and pkt.session_id == 0 and pkt.length == 12 and pkt.serial_number == 0
|
|
|
|
|
|
= filled values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRSerialNotify(session_id=12345, length=12, serial_number=789)
|
|
raw(pkt) == b'E\x00\x004\x00\x01\x00\x00@\x06|\xc1\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00]#\x00\x00\x00\x0009\x00\x00\x00\x0c\x00\x00\x03\x15'
|
|
|
|
= dissection
|
|
|
|
pkt = Ether(b'\x00\x16>\xa9\x04\x1a\x84x\xac[\x82\xc2\x08\x00E\x00\x16\xd4\xb9\xa5@\x005\x06\x93\xd5\x8d\x16\x1c\xdc\xb9\x1a~\x9c Z\xcb\xa2\nF2`J\xe2\x8c\xc0\x80\x10\x00\xe3\xf8o\x00\x00\x01\x01\x08\n\xeaX\x9f\x82\x81\xfb\xc4\n\x00\x00\x00\x00\x00\x00\xcc!\x00\x04\x00\x00')
|
|
pkt.session_id == 0 and pkt.length == 52257 and pkt.serial_number == 262144
|
|
|
|
+ RTR Serial Query
|
|
|
|
= default instantiation
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRSerialQuery()
|
|
raw(pkt) == b'E\x00\x004\x00\x01\x00\x00@\x06|\xc1\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90p\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00'
|
|
|
|
|
|
= default values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRSerialQuery()
|
|
RTRSerialQuery in pkt and pkt.rtr_version == 0 and pkt.pdu_type == 1 and pkt.session_id == 0 and pkt.length == 12 and pkt.serial_number == 0
|
|
|
|
|
|
= filled values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRSerialQuery(session_id=17, length=12, serial_number=55463)
|
|
raw(pkt) == b'E\x00\x004\x00\x01\x00\x00@\x06|\xc1\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xb7\xb7\x00\x00\x00\x01\x00\x11\x00\x00\x00\x0c\x00\x00\xd8\xa7'
|
|
|
|
= dissection
|
|
|
|
pkt = Ether(b'\x00\x07\xb4\x00+\x02\x00\x16>\xa9\x04\x1a\x08\x00E\x00\x00@I2@\x00@\x06\x0f\xdd\xb9\x1a~\x9c\x8d\x16\x1c\xdc\xcb\xa2 ZJ\xe2\x8c\xc0\nR\xdbD\x80\x18\x05#\xe1\xdb\x00\x00\x01\x01\x08\n\x81\xfb\xcf\xca\xeaX\xcd\x92\x00\x01\x13/\x00\x00\x00\x0c\x00\x00\x81\x7f')
|
|
pkt.session_id == 4911 and pkt.length == 12 and pkt.serial_number == 33151
|
|
|
|
+ RTR Reset Query
|
|
|
|
= default instantiation
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRResetQuery()
|
|
raw(pkt) == b'E\x00\x000\x00\x01\x00\x00@\x06|\xc5\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90w\x00\x00\x00\x02\x00\x00\x00\x00\x00\x08'
|
|
|
|
= default values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRResetQuery()
|
|
RTRResetQuery in pkt and pkt.reserved == 0 and pkt.length == 8
|
|
|
|
#= filled values build - nonsense test
|
|
|
|
= dissection
|
|
|
|
pkt = Ether(b"\x00\x07\xb4\x00+\x02\x00\x16>\xa9\x04\x1a\x08\x00E\x00\x00<H\xb8@\x00@\x06\x10[\xb9\x1a~\x9c\x8d\x16\x1c\xdc\xcb\xa2 ZJ\xe2\x8c\xb8\nF'\x10\x80\x18\x00\xe5\xe1\xd7\x00\x00\x01\x01\x08\n\x81\xfb\xc4\n\xeaX\x9e\x91\x00\x02\x00\x00\x00\x00\x00\x08")
|
|
pkt.reserved == 0 and pkt.length == 8
|
|
|
|
+ RTR Cache Response
|
|
|
|
= default instantiation
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheResponse()
|
|
raw(pkt) == b'E\x00\x000\x00\x01\x00\x00@\x06|\xc5\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90v\x00\x00\x00\x03\x00\x00\x00\x00\x00\x08'
|
|
|
|
= default values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheResponse()
|
|
RTRCacheResponse in pkt and pkt.session_id == 0 and pkt.length == 8
|
|
|
|
= filled values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheResponse(session_id=12345)
|
|
raw(pkt) == b'E\x00\x000\x00\x01\x00\x00@\x06|\xc5\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00`=\x00\x00\x00\x0309\x00\x00\x00\x08'
|
|
|
|
= dissection
|
|
|
|
pkt = Ether(b"\x00\x16>\xa9\x04\x1a\x84x\xac[\x82\xc2\x08\x00E\x00\x0b\x84\xb9\xa3@\x005\x06\x9f'\x8d\x16\x1c\xdc\xb9\x1a~\x9c Z\xcb\xa2\nF'\x10J\xe2\x8c\xc0\x80\x10\x00\xe3\xed\x1f\x00\x00\x01\x01\x08\n\xeaX\x9f\x82\x81\xfb\xc4\n\x00\x03\x13/\x00\x00\x00\x08")
|
|
pkt.session_id == 4911 and pkt.length == 8
|
|
|
|
+ RTR IPv4 Prefix
|
|
|
|
= default instantiation
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTRIPv4Prefix()
|
|
raw(pkt) == b'E\x00\x00D\x00\x01\x00\x00@\x06|\xb1\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90J\x00\x00\x00\x03\x00\x00\x00\x00\x00\x08\x00\x04\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
|
|
|
|
= default values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTRIPv4Prefix()
|
|
RTRIPv4Prefix in pkt and pkt.shortest_length == 0 and pkt.longest_length == 0 and pkt.prefix == "0.0.0.0" and pkt.asn == 0
|
|
|
|
= filled values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTRIPv4Prefix(prefix="192.0.2.0", asn=45000, shortest_length=20, longest_length=20)
|
|
raw(pkt) == b'E\x00\x00D\x00\x01\x00\x00@\x06|\xb1\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\nm\x00\x00\x00\x03\x00\x00\x00\x00\x00\x08\x00\x04\x00\x00\x00\x00\x00\x14\x00\x14\x14\x00\xc0\x00\x02\x00\x00\x00\xaf\xc8'
|
|
|
|
= dissection
|
|
|
|
pkt = Ether(b"\x00\x16>\xa9\x04\x1a\x84x\xac[\x82\xc2\x08\x00E\x00\x0b\x84\xb9\xa3@\x005\x06\x9f'\x8d\x16\x1c\xdc\xb9\x1a~\x9c Z\xcb\xa2\nF'\x10J\xe2\x8c\xc0\x80\x10\x00\xe3\xed\x1f\x00\x00\x01\x01\x08\n\xeaX\x9f\x82\x81\xfb\xc4\n\x00\x03\x13/\x00\x00\x00\x08\x00\x04\x00\x00\x00\x00\x00\x14\x01\x13\x13\x00Y\xb9\xe0\x00\x00\x00a\x8b")
|
|
pkt.asn == 24971 and pkt.prefix == "89.185.224.0"and pkt.shortest_length == 19 and pkt.longest_length == 19
|
|
|
|
|
|
+ RTR IPv6 Prefix
|
|
|
|
= default instantiation
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTRIPv6Prefix()
|
|
raw(pkt) == b'E\x00\x00P\x00\x01\x00\x00@\x06|\xa5\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x900\x00\x00\x00\x03\x00\x00\x00\x00\x00\x08\x00\x06\x00\x00\x00\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
|
|
|
|
= default value build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTRIPv6Prefix()
|
|
RTRIPv6Prefix in pkt and pkt.shortest_length == 0 and pkt.longest_length == 0 and pkt.prefix == "::" and pkt.asn == 0
|
|
|
|
= filled values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTRIPv6Prefix(prefix="2001:db8::", asn=45000, shortest_length=32, longest_length=32)
|
|
pkt.prefix == "2001:db8::" and pkt.asn == 45000 and pkt.shortest_length == 32 and pkt.longest_length == 32
|
|
|
|
= dissection
|
|
|
|
pkt = Ether(b"\x00\x16>\xa9\x04\x1a\x84x\xac[\x82\xc2\x08\x00E\x00\x0b\x84\xb9\xa3@\x005\x06\x9f'\x8d\x16\x1c\xdc\xb9\x1a~\x9c Z\xcb\xa2\nF'\x10J\xe2\x8c\xc0\x80\x10\x00\xe3\xed\x1f\x00\x00\x01\x01\x08\n\xeaX\x9f\x82\x81\xfb\xc4\n\x00\x03\x13/\x00\x00\x00\x08\x00\x06\x00\x00\x00\x00\x00 \x01 \x00*\x03\xcd\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\xe2")
|
|
pkt.prefix == "2a03:cd80::" and pkt.asn == 16354 and pkt.shortest_length == 32 and pkt.longest_length == 32
|
|
|
|
+ RTR End of Data version 0
|
|
|
|
= default instantiation
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTREndofDatav0()
|
|
raw(pkt) == b'E\x00\x00<\x00\x01\x00\x00@\x06|\xb9\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90W\x00\x00\x00\x03\x00\x00\x00\x00\x00\x08\x00\x07\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00'
|
|
|
|
= default values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTREndofDatav0()
|
|
RTREndofDatav0 in pkt and pkt.session_id == 0 and pkt.serial_number == 0
|
|
|
|
= filled values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheResponse(session_id=12345)/RTREndofDatav0(session_id=12345, serial_number=17)
|
|
pkt.serial_number == 17 and pkt.session_id == 12345
|
|
|
|
= dissection
|
|
|
|
pkt = IP(b'E\x00\x00<\x00\x01\x00\x00@\x06|\xb9\x7f\x00\x00\x01\x7f\x00\x00\x01 Z\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x0f\x8e\x00\x00\x00\x0309\x00\x00\x00\x08\x00\x0709\x00\x00\x00\x0c\x00\x00\x00\x11')
|
|
RTREndofDatav0 in pkt and pkt.serial_number == 17 and pkt.session_id == 12345
|
|
|
|
+ RTR End of Data version 1
|
|
|
|
= default instantiation
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTREndofDatav1()
|
|
raw(pkt) == b'E\x00\x00H\x00\x01\x00\x00@\x06|\xad\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x8f?\x00\x00\x00\x03\x00\x00\x00\x00\x00\x08\x01\x07\x00\x00\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
|
|
|
|
= default values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheResponse()/RTREndofDatav1()
|
|
RTREndofDatav1 in pkt and pkt.session_id == 0 and pkt.serial_number == 0 and pkt.refresh_interval == 0 and pkt.retry_interval == 0 and pkt.expire_interval == 0
|
|
|
|
= filled values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheResponse(session_id=12345)/RTREndofDatav1(session_id=12345, serial_number=17, refresh_interval=500 , retry_interval=200, expire_interval=1800)
|
|
pkt.serial_number == 17 and pkt.session_id == 12345
|
|
|
|
= dissection
|
|
|
|
pkt = IP(b'E\x00\x00H\x00\x01\x00\x00@\x06|\xad\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00$\xf8\x00\x00\x00\x0309\x00\x00\x00\x08\x01\x0709\x00\x00\x00\x18\x00\x00\x00\x11\x00\x00\x01\xf4\x00\x00\x00\xc8\x00\x00\x07\x08')
|
|
RTREndofDatav1 in pkt and pkt.serial_number == 17 and pkt.session_id == 12345
|
|
|
|
+ RTR Cache Reset
|
|
|
|
= default instantiation
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheReset()
|
|
raw(pkt) == b'E\x00\x000\x00\x01\x00\x00@\x06|\xc5\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90q\x00\x00\x00\x08\x00\x00\x00\x00\x00\x08'
|
|
|
|
= default values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRCacheReset()
|
|
RTRCacheReset in pkt and pkt.reserved == 0
|
|
|
|
#= filled values build - nonsense test
|
|
|
|
= dissection
|
|
|
|
pkt = Ether(b'\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x08\x00E\x00\x000\x00\x01\x00\x00@\x06|\xc5\x7f\x00\x00\x01\x7f\x00\x00\x01 Z\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00p+\x00\x00\x00\x08\x00\x00\x00\x00\x00\x08')
|
|
RTRCacheReset in pkt and pkt.reserved == 0
|
|
|
|
+ RTR Router Key
|
|
|
|
= default instantiation
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRRouterKey()
|
|
raw(pkt) == b'E\x00\x00H\x00\x01\x00\x00@\x06|\xad\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x8f>\x00\x00\x01\t\x00\x00\x00"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
|
|
|
|
= default values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRRouterKey()
|
|
RTRRouterKey in pkt and pkt.zeros == 0 and pkt.subject_key_identifier == b'' and pkt.asn == 0 and pkt.subject_PKI == b''
|
|
|
|
= filled values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRRouterKey(subject_key_identifier='7dd65f58882efc148edd', asn=45000, subject_PKI='Scapy ROA')
|
|
pkt.asn == 45000 and pkt.subject_PKI == b'Scapy ROA' and pkt.subject_key_identifier == b'7dd65f58882efc148edd'
|
|
|
|
= dissection
|
|
pkt = IP(b'E\x00\x00Q\x00\x01\x00\x00@\x06|\xa4\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00x\xe8\x00\x00\x01\t\x00\x00\x00+\x00\x007dd65f58882efc148edd\x00\x00\xaf\xc8Scapy ROA')
|
|
RTRRouterKey in pkt #and pkt.asn == 45000 and pkt.subject_PKI == b'Scapy ROA' and pkt.zeros == 0 and pkt.subject_key_identifier == b'7dd65f58882efc148edd'
|
|
|
|
+ RTR Error Report
|
|
|
|
= default instantiation
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRErrorReport()
|
|
raw(pkt) == b'E\x00\x008\x00\x01\x00\x00@\x06|\xbd\x7f\x00\x00\x01\x7f\x00\x00\x01\x00\x14\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\x90]\x00\x00\x00\n\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
|
|
|
|
= default values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRErrorReport()
|
|
RTRErrorReport in pkt and pkt.error_code == 0 and pkt.erroneous_PDU == b'' and pkt.error_text == b''
|
|
|
|
= filled values build
|
|
|
|
pkt = IP()/TCP(dport=323)/RTRErrorReport(error_code=1, error_text='Internal Error')
|
|
RTRErrorReport in pkt and pkt.error_code == 1and pkt.error_text == b'Internal Error'
|
|
|
|
= dissection
|
|
|
|
pkt = IP(b'E\x00\x00F\x00\x01\x00\x00@\x06|\xaf\x7f\x00\x00\x01\x7f\x00\x00\x01 Z\x01C\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00\xdc\x15\x00\x00\x00\n\x00\x01\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x00\x00\x0eInternal Error')
|
|
RTRErrorReport in pkt and pkt.error_code == 1and pkt.error_text == b'Internal Error'
|