<s> import pcapy <EOL> import socket <EOL> import time <EOL> from random import randint <EOL> from impacket import structure , ImpactDecoder <EOL> class BootpPacket ( structure . Structure ) : <EOL> commonHdr = ( <EOL> ( '<STR_LIT>' , '<STR_LIT:b>' ) , <EOL> ( '<STR_LIT>' , '<STR_LIT>' ) , <EOL> ( '<STR_LIT>' , '<STR_LIT>' ) , <EOL> ( '<STR_LIT>' , '<STR_LIT>' ) , <EOL> ( '<STR_LIT>' , '<STR_LIT>' ) , <EOL> ( '<STR_LIT>' , '<STR_LIT>' ) , <EOL> ( '<STR_LIT>' , '<STR_LIT>' ) , <EOL> ( '<STR_LIT>' , '<STR_LIT>' ) , <EOL> ( '<STR_LIT>' , '<STR_LIT>' ) , <EOL> ( '<STR_LIT>' , '<STR_LIT>' ) , <EOL> ( '<STR_LIT>' , '<STR_LIT>' ) , <EOL> ( '<STR_LIT>' , '<STR_LIT>' ) , <EOL> ( '<STR_LIT>' , '<STR_LIT:_>' , '<STR_LIT>' ) , <EOL> ( '<STR_LIT>' , '<STR_LIT>' ) , <EOL> ( '<STR_LIT:file>' , '<STR_LIT>' ) ) <EOL> class DhcpPacket ( BootpPacket ) : <EOL> BOOTREQUEST = <NUM_LIT:1> <EOL> BOOTREPLY = <NUM_LIT:2> <EOL> DHCPDISCOVER = <NUM_LIT:1> <EOL> DHCPOFFER = <NUM_LIT:2> <EOL> DHCPREQUEST = <NUM_LIT:3> <EOL> DHCPDECLINE = <NUM_LIT:4> <EOL> DHCPACK = <NUM_LIT:5> <EOL> DHCPNAK = <NUM_LIT:6> <EOL> DHCPRELEASE = <NUM_LIT:7> <EOL> DHCPINFORM = <NUM_LIT:8> <EOL> options = { <EOL> '<STR_LIT>' : ( <NUM_LIT:0> , '<STR_LIT:_>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:1> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:2> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:3> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:4> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:5> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:6> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:7> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:8> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:9> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:10> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:11> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:12> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:15> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:16> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:20> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:30> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:32> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:50> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT:message>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT:B>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT> , '<STR_LIT::>' ) , <EOL> '<STR_LIT>' : ( <NUM_LIT:255> , '<STR_LIT:_>' ) , <EOL> } <EOL> structure = ( <EOL> ( '<STR_LIT>' , '<STR_LIT>' ) , <EOL> ( '<STR_LIT>' , '<STR_LIT>' ) , <EOL> ( '<STR_LIT>' , '<STR_LIT:_>' , '<STR_LIT>' ) ) <EOL> def packOptions ( self , options ) : <EOL> answer = '<STR_LIT>' <EOL> for name , value in options : <EOL> code , format = self . options [ name ] <EOL> val = self . pack ( format , value ) <EOL> answer += '<STR_LIT>' % ( code , len ( val ) , val ) <EOL> return answer <EOL> def getOptionNameAndFormat ( self , optionCode ) : <EOL> for k in self . options : <EOL> code , format = self . options [ k ] <EOL> if code == optionCode : return k , format <EOL> return optionCode , '<STR_LIT::>' <EOL> def unpackOptions ( self , options ) : <EOL> answer = [ ] <EOL> i = <NUM_LIT:0> <EOL> while i < len ( options ) - <NUM_LIT:1> : <EOL> name , format = self . getOptionNameAndFormat ( ord ( options [ i ] ) ) <EOL> size = ord ( options [ i + <NUM_LIT:1> ] ) <EOL> value = self . unpack ( format , options [ i + <NUM_LIT:2> : i + <NUM_LIT:2> + size ] ) <EOL> answer . append ( ( name , value ) ) <EOL> i += <NUM_LIT:2> + size <EOL> return answer <EOL> def unpackParameterRequestList ( self , options ) : <EOL> return [ self . getOptionNameAndFormat ( ord ( opt ) ) [ <NUM_LIT:0> ] for opt in options ] <EOL> def isAskingForProxyAutodiscovery ( self ) : <EOL> for opt in self . fields [ '<STR_LIT>' ] : <EOL> if opt [ <NUM_LIT:0> ] == '<STR_LIT>' : <EOL> for optCode in opt [ <NUM_LIT:1> ] : <EOL> if ord ( optCode ) == <NUM_LIT> : <EOL> return True <EOL> return False <EOL> def getOptionValue ( self , name ) : <EOL> for opt in self . fields [ '<STR_LIT>' ] : <EOL> if opt [ <NUM_LIT:0> ] == name : <EOL> return opt [ <NUM_LIT:1> ] <EOL> return None <EOL> class DHCPTool : <EOL> def initialize ( self ) : <EOL> self . pcap = pcapy . open_live ( pcapy . lookupdev ( ) , - <NUM_LIT:1> , <NUM_LIT:1> , <NUM_LIT:1> ) <EOL> self . pcap . setfilter ( "<STR_LIT>" , <NUM_LIT:1> , <NUM_LIT> ) <EOL> self . sock = socket . socket ( socket . AF_INET , socket . SOCK_DGRAM ) <EOL> self . sock . connect ( ( '<STR_LIT>' , <NUM_LIT> ) ) <EOL> self . decoder = ImpactDecoder . EthDecoder ( ) <EOL> def targetRun ( self ) : <EOL> for i in range ( <NUM_LIT:1> , <NUM_LIT> ) : <EOL> self . sendDISCOVER ( '<STR_LIT>' % i , ip = '<STR_LIT>' % i ) <EOL> self . processPacketsForOneSecond ( ) <EOL> def finalize ( self ) : <EOL> self . pcap . close ( ) <EOL> Module . finalize ( self ) <EOL> def processPacketsForOneSecond ( self ) : <EOL> t = time . time ( ) <EOL> while time . time ( ) - t < <NUM_LIT:1> : <EOL> p = self . pcap . next ( ) <EOL> if p [ <NUM_LIT:1> ] [ <NUM_LIT:2> ] : <EOL> pp = self . decoder . decode ( p [ <NUM_LIT:0> ] ) <EOL> print pp <EOL> def sendDHCP ( self , type , chaddr , hostname = None , ip = None , xid = None , opts = [ ] ) : <EOL> p = DhcpPacket ( ) <EOL> opt = [ ( '<STR_LIT>' , type ) ] + list ( opts ) <EOL> if xid is None : <EOL> xid = randint ( <NUM_LIT:0> , <NUM_LIT> ) <EOL> if ip : <EOL> ip = structure . unpack ( '<STR_LIT>' , socket . inet_aton ( ip ) ) [ <NUM_LIT:0> ] <EOL> p [ '<STR_LIT>' ] = ip <EOL> opt . append ( ( '<STR_LIT>' , ip ) ) <EOL> if hostname is not None : <EOL> for i in range ( <NUM_LIT:0> , len ( hostname ) , <NUM_LIT:255> ) : <EOL> opt . append ( ( '<STR_LIT>' , hostname [ i : i + <NUM_LIT:255> ] ) ) <EOL> p [ '<STR_LIT>' ] = p . BOOTREQUEST <EOL> p [ '<STR_LIT>' ] = xid <EOL> p [ '<STR_LIT>' ] = chaddr <EOL> p [ '<STR_LIT>' ] = <NUM_LIT> <EOL> p [ '<STR_LIT>' ] = opt <EOL> self . sock . send ( str ( p ) ) <EOL> def sendDISCOVER ( self , chaddr , hostname = None , ip = None , xid = <NUM_LIT> ) : <EOL> print '<STR_LIT>' % ip <EOL> self . sendDHCP ( DhcpPacket . DHCPDISCOVER , chaddr , hostname , ip , xid ) </s>
