Skip to content

Commit e5ac4f8

Browse files
author
Jochen Bartl
committed
Added RIPv2 authentication header
1 parent 31675bd commit e5ac4f8

File tree

1 file changed

+47
-13
lines changed

1 file changed

+47
-13
lines changed

scapy/layers/rip.py

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,61 @@
1414
class RIP(Packet):
1515
name = "RIP header"
1616
fields_desc = [
17-
ByteEnumField("cmd",1,{1:"req",2:"resp",3:"traceOn",4:"traceOff",5:"sun",
18-
6:"trigReq",7:"trigResp",8:"trigAck",9:"updateReq",
19-
10:"updateResp",11:"updateAck"}),
20-
ByteField("version",1),
21-
ShortField("null",0),
17+
ByteEnumField("cmd", 1, {1:"req", 2:"resp", 3:"traceOn", 4:"traceOff",
18+
5:"sun", 6:"trigReq", 7:"trigResp", 8:"trigAck",
19+
9:"updateReq", 10:"updateResp", 11:"updateAck"}),
20+
ByteField("version", 1),
21+
ShortField("null", 0),
2222
]
2323

24-
class RIPEntry(Packet):
24+
def guess_payload_class(self, payload):
25+
if payload[:2] == "\xff\xff":
26+
return RIPAuth
27+
else:
28+
return Packet.guess_payload_class(self, payload)
29+
30+
class RIPEntry(RIP):
2531
name = "RIP entry"
2632
fields_desc = [
27-
ShortEnumField("AF",2,{2:"IP"}),
28-
ShortField("RouteTag",0),
29-
IPField("addr","0.0.0.0"),
30-
IPField("mask","0.0.0.0"),
31-
IPField("nextHop","0.0.0.0"),
32-
IntEnumField("metric",1,{16:"Unreach"}),
33+
ShortEnumField("AF", 2, {2:"IP"}),
34+
ShortField("RouteTag", 0),
35+
IPField("addr", "0.0.0.0"),
36+
IPField("mask", "0.0.0.0"),
37+
IPField("nextHop", "0.0.0.0"),
38+
IntEnumField("metric", 1, {16:"Unreach"}),
39+
]
40+
41+
class RIPAuth(Packet):
42+
name = "RIP authentication"
43+
fields_desc = [
44+
ShortEnumField("AF", 0xffff, {0xffff:"Auth"}),
45+
ShortEnumField("authtype", 2, {1:"md5authdata", 2:"simple", 3:"md5"}),
46+
ConditionalField(StrFixedLenField("password", None, 16),
47+
lambda pkt: pkt.authtype == 2),
48+
ConditionalField(ShortField("digestoffset", 0),
49+
lambda pkt: pkt.authtype == 3),
50+
ConditionalField(ByteField("keyid", 0),
51+
lambda pkt: pkt.authtype == 3),
52+
ConditionalField(ByteField("authdatalen", 0),
53+
lambda pkt: pkt.authtype == 3),
54+
ConditionalField(IntField("seqnum", 0),
55+
lambda pkt: pkt.authtype == 3),
56+
ConditionalField(StrFixedLenField("zeropad", None, 8),
57+
lambda pkt: pkt.authtype == 3),
58+
ConditionalField(StrLenField("authdata", None,
59+
length_from=lambda pkt: pkt.md5datalen),
60+
lambda pkt: pkt.authtype == 1)
3361
]
34-
62+
63+
def pre_dissect(self, s):
64+
if s[2:4] == "\x00\x01":
65+
self.md5datalen = len(s) - 4
66+
67+
return s
3568

3669

3770
bind_layers( UDP, RIP, sport=520)
3871
bind_layers( UDP, RIP, dport=520)
3972
bind_layers( RIP, RIPEntry, )
4073
bind_layers( RIPEntry, RIPEntry, )
74+
bind_layers( RIPAuth, RIPEntry, )

0 commit comments

Comments
 (0)