1*7dc08ffcSJunyu Lai## This file is part of Scapy 2*7dc08ffcSJunyu Lai## See http://www.secdev.org/projects/scapy for more informations 3*7dc08ffcSJunyu Lai## Copyright (C) Philippe Biondi <[email protected]> 4*7dc08ffcSJunyu Lai## This program is published under a GPLv2 license 5*7dc08ffcSJunyu Lai 6*7dc08ffcSJunyu Lai############################################################################# 7*7dc08ffcSJunyu Lai## ## 8*7dc08ffcSJunyu Lai## hsrp.py --- HSRP protocol support for Scapy ## 9*7dc08ffcSJunyu Lai## ## 10*7dc08ffcSJunyu Lai## Copyright (C) 2010 Mathieu RENARD mathieu.renard(at)gmail.com ## 11*7dc08ffcSJunyu Lai## ## 12*7dc08ffcSJunyu Lai## This program is free software; you can redistribute it and/or modify it ## 13*7dc08ffcSJunyu Lai## under the terms of the GNU General Public License version 2 as ## 14*7dc08ffcSJunyu Lai## published by the Free Software Foundation; version 2. ## 15*7dc08ffcSJunyu Lai## ## 16*7dc08ffcSJunyu Lai## This program is distributed in the hope that it will be useful, but ## 17*7dc08ffcSJunyu Lai## WITHOUT ANY WARRANTY; without even the implied warranty of ## 18*7dc08ffcSJunyu Lai## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## 19*7dc08ffcSJunyu Lai## General Public License for more details. ## 20*7dc08ffcSJunyu Lai## ## 21*7dc08ffcSJunyu Lai############################################################################# 22*7dc08ffcSJunyu Lai## HSRP Version 1 23*7dc08ffcSJunyu Lai## Ref. RFC 2281 24*7dc08ffcSJunyu Lai## HSRP Version 2 25*7dc08ffcSJunyu Lai## Ref. http://www.smartnetworks.jp/2006/02/hsrp_8_hsrp_version_2.html 26*7dc08ffcSJunyu Lai## 27*7dc08ffcSJunyu Lai## $Log: hsrp.py,v $ 28*7dc08ffcSJunyu Lai## Revision 0.2 2011/05/01 15:23:34 mrenard 29*7dc08ffcSJunyu Lai## Cleanup code 30*7dc08ffcSJunyu Lai 31*7dc08ffcSJunyu Lai""" 32*7dc08ffcSJunyu LaiHSRP (Hot Standby Router Protocol): proprietary redundancy protocol for Cisco routers. 33*7dc08ffcSJunyu Lai""" 34*7dc08ffcSJunyu Lai 35*7dc08ffcSJunyu Laifrom scapy.fields import * 36*7dc08ffcSJunyu Laifrom scapy.packet import * 37*7dc08ffcSJunyu Laifrom scapy.layers.inet import DestIPField, UDP 38*7dc08ffcSJunyu Laifrom scapy.layers.inet6 import DestIP6Field 39*7dc08ffcSJunyu Lai 40*7dc08ffcSJunyu Lai 41*7dc08ffcSJunyu Laiclass HSRP(Packet): 42*7dc08ffcSJunyu Lai name = "HSRP" 43*7dc08ffcSJunyu Lai fields_desc = [ 44*7dc08ffcSJunyu Lai ByteField("version", 0), 45*7dc08ffcSJunyu Lai ByteEnumField("opcode", 0, {0: "Hello", 1: "Coup", 2: "Resign", 3: "Advertise"}), 46*7dc08ffcSJunyu Lai ByteEnumField("state", 16, {0: "Initial", 1: "Learn", 2: "Listen", 4: "Speak", 8: "Standby", 16: "Active"}), 47*7dc08ffcSJunyu Lai ByteField("hellotime", 3), 48*7dc08ffcSJunyu Lai ByteField("holdtime", 10), 49*7dc08ffcSJunyu Lai ByteField("priority", 120), 50*7dc08ffcSJunyu Lai ByteField("group", 1), 51*7dc08ffcSJunyu Lai ByteField("reserved", 0), 52*7dc08ffcSJunyu Lai StrFixedLenField("auth", b"cisco" + b"\00" * 3, 8), 53*7dc08ffcSJunyu Lai IPField("virtualIP", "192.168.1.1")] 54*7dc08ffcSJunyu Lai 55*7dc08ffcSJunyu Lai def guess_payload_class(self, payload): 56*7dc08ffcSJunyu Lai if self.underlayer.len > 28: 57*7dc08ffcSJunyu Lai return HSRPmd5 58*7dc08ffcSJunyu Lai else: 59*7dc08ffcSJunyu Lai return Packet.guess_payload_class(self, payload) 60*7dc08ffcSJunyu Lai 61*7dc08ffcSJunyu Lai 62*7dc08ffcSJunyu Laiclass HSRPmd5(Packet): 63*7dc08ffcSJunyu Lai name = "HSRP MD5 Authentication" 64*7dc08ffcSJunyu Lai fields_desc = [ 65*7dc08ffcSJunyu Lai ByteEnumField("type", 4, {4: "MD5 authentication"}), 66*7dc08ffcSJunyu Lai ByteField("len", None), 67*7dc08ffcSJunyu Lai ByteEnumField("algo", 0, {1: "MD5"}), 68*7dc08ffcSJunyu Lai ByteField("padding", 0x00), 69*7dc08ffcSJunyu Lai XShortField("flags", 0x00), 70*7dc08ffcSJunyu Lai SourceIPField("sourceip", None), 71*7dc08ffcSJunyu Lai XIntField("keyid", 0x00), 72*7dc08ffcSJunyu Lai StrFixedLenField("authdigest", b"\00" * 16, 16)] 73*7dc08ffcSJunyu Lai 74*7dc08ffcSJunyu Lai def post_build(self, p, pay): 75*7dc08ffcSJunyu Lai if self.len is None and pay: 76*7dc08ffcSJunyu Lai l = len(pay) 77*7dc08ffcSJunyu Lai p = p[:1] + hex(l)[30:] + p[30:] 78*7dc08ffcSJunyu Lai return p 79*7dc08ffcSJunyu Lai 80*7dc08ffcSJunyu Laibind_layers(UDP, HSRP, dport=1985, sport=1985) 81*7dc08ffcSJunyu Laibind_layers(UDP, HSRP, dport=2029, sport=2029) 82*7dc08ffcSJunyu LaiDestIPField.bind_addr(UDP, "224.0.0.2", dport=1985) 83*7dc08ffcSJunyu LaiDestIP6Field.bind_addr(UDP, "ff02::66", dport=2029) 84