Class: PacketFu::HSRPPacket

Inherits:
Packet
  • Object
show all
Defined in:
lib/packetfu/protos/hsrp.rb

Overview

HSRPPacket is used to construct HSRP Packets. They contain an EthHeader, an IPHeader, and a UDPHeader.

Example

hsrp_pkt.new
hsrp_pkt.hsrp_opcode = 0
hsrp_pkt.hsrp_state = 16
hsrp_pkt.hsrp_priority = 254
hsrp_pkt.hsrp_group = 1
hsrp_pkt.hsrp_vip = 10.100.100.254
hsrp_pkt.recalc
hsrp_pkt.to_f('/tmp/hsrp.pcap')

Parameters

:eth
 A pre-generated EthHeader object.
:ip
 A pre-generated IPHeader object.
:udp
 A pre-generated UDPHeader object.
:flavor
 TODO: HSRP packets don't tend have any flavor.
:config
 A hash of return address details, often the output of Utils.whoami?

Instance Attribute Summary collapse

Attributes inherited from Packet

#flavor, #headers, #iface, #inspect_style

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Packet

#==, #clone, #dissect, #dissection_table, force_binary, #handle_is_identity, #hexify, inherited, #inspect, #inspect_hex, #kind_of?, layer, #layer, #layer_symbol, layer_symbol, #method_missing, #orig_kind_of?, parse, #payload, #payload=, #peek, #proto, #recalc, #respond_to?, #size, #to_f, #to_pcap, #to_s, #to_w, #write

Constructor Details

#initialize(args = {}) ⇒ HSRPPacket

Returns a new instance of HSRPPacket.



178
179
180
181
182
183
184
185
186
187
188
189
# File 'lib/packetfu/protos/hsrp.rb', line 178

def initialize(args={})
  @eth_header = EthHeader.new(args).read(args[:eth])
  @ip_header = IPHeader.new(args).read(args[:ip])
  @ip_header.ip_proto = 0x11
  @udp_header = UDPHeader.new(args).read(args[:udp])
  @hsrp_header = HSRPHeader.new(args).read(args[:hsrp])
  @udp_header.body = @hsrp_header
  @ip_header.body = @udp_header
  @eth_header.body = @ip_header
  @headers = [@eth_header, @ip_header, @udp_header, @hsrp_header]
  super
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class PacketFu::Packet

Instance Attribute Details

#eth_headerObject

Returns the value of attribute eth_header.



149
150
151
# File 'lib/packetfu/protos/hsrp.rb', line 149

def eth_header
  @eth_header
end

#hsrp_headerObject

Returns the value of attribute hsrp_header.



149
150
151
# File 'lib/packetfu/protos/hsrp.rb', line 149

def hsrp_header
  @hsrp_header
end

#ip_headerObject

Returns the value of attribute ip_header.



149
150
151
# File 'lib/packetfu/protos/hsrp.rb', line 149

def ip_header
  @ip_header
end

#udp_headerObject

Returns the value of attribute udp_header.



149
150
151
# File 'lib/packetfu/protos/hsrp.rb', line 149

def udp_header
  @udp_header
end

Class Method Details

.can_parse?(str) ⇒ Boolean

Returns:

  • (Boolean)


151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/packetfu/protos/hsrp.rb', line 151

def self.can_parse?(str)
  return false unless str.size >= 54
  return false unless EthPacket.can_parse? str
  return false unless IPPacket.can_parse? str
  return false unless UDPPacket.can_parse? str
  temp_packet = UDPPacket.new
  temp_packet.read(str)
  if temp_packet.ip_ttl == 1 and [temp_packet.udp_sport,temp_packet.udp_dport] == [1985,1985] 
    return true
  else 
    return false
  end
end

Instance Method Details

#peek_formatObject

Peek provides summary data on packet contents.



192
193
194
195
196
197
198
199
200
# File 'lib/packetfu/protos/hsrp.rb', line 192

def peek_format
  peek_data = ["UH "]
  peek_data << "%-5d" % self.to_s.size
  peek_data << "%-16s" % self.hsrp_addr
  peek_data << "%-4d" % self.hsrp_group
  peek_data << "%-35s" % self.hsrp_password_readable
  peek_data << "%-15s" % self.ip_saddr
  peek_data.join
end

#read(str = nil, args = {}) ⇒ Object



165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/packetfu/protos/hsrp.rb', line 165

def read(str=nil, args={})
  raise "Cannot parse `#{str}'" unless self.class.can_parse?(str)
  @eth_header.read(str)
  @ip_header.read(str[14,str.size])
  @eth_header.body = @ip_header
  @udp_header.read(str[14+(@ip_header.ip_hlen),str.size])
  @ip_header.body = @udp_header
  @hsrp_header.read(str[14+(@ip_header.ip_hlen)+8,str.size])
  @udp_header.body = @hsrp_header
  super(args)
  self
end