119 lines
4.4 KiB
Python
Executable File
119 lines
4.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import socket, sys
|
|
|
|
MAX_BYTES = 1024
|
|
ServerPort = 67
|
|
ClientPort = 68
|
|
|
|
class DHCPClient():
|
|
def client(self):
|
|
print("DHCP client is starting...\n")
|
|
dest = ('<broadcast>', ServerPort)
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
|
s.bind(('0.0.0.0', ServerPort))
|
|
|
|
print("Sending Juniper DHCP discovery.")
|
|
packet = DHCPClient.mock_juniper_packet()
|
|
s.sendto(packet, dest)
|
|
|
|
def mock_juniper_packet():
|
|
return b'\x01\x01\x06\x01O\x00\xe0\xa1\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\x00\x00\x00\x94\xbf\x94\xb3n\x0e\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\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\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\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\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\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\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\x00c\x82Sc5\x01\x013\x04\x00\x01Q\x80\x0c\nLAB-SRX300\xff\x00'
|
|
|
|
def craft_discover_packet():
|
|
OP = bytes([0x01])
|
|
HTYPE = bytes([0x01])
|
|
HLEN = bytes([0x06])
|
|
HOPS = bytes([0x00])
|
|
XID = bytes([0x39, 0x03, 0xF3, 0x26])
|
|
SECS = bytes([0x00, 0x00])
|
|
FLAGS = bytes([0x00, 0x00])
|
|
CIADDR = bytes([0x00, 0x00, 0x00, 0x00])
|
|
YIADDR = bytes([0x00, 0x00, 0x00, 0x00])
|
|
SIADDR = bytes([0x00, 0x00, 0x00, 0x00])
|
|
GIADDR = bytes([0x00, 0x00, 0x00, 0x00])
|
|
CHADDR1 = bytes([0x00, 0x05, 0x3C, 0x04])
|
|
CHADDR2 = bytes([0x8D, 0x59, 0x00, 0x00])
|
|
CHADDR3 = bytes([0x00, 0x00, 0x00, 0x00])
|
|
CHADDR4 = bytes([0x00, 0x00, 0x00, 0x00])
|
|
CHADDR5 = bytes(192)
|
|
Magiccookie = bytes([0x63, 0x82, 0x53, 0x63])
|
|
DHCPOptions1 = bytes([53, 1, 1]) #DHCP Discover (value = 1)
|
|
DHCPOptions2 = bytes([50, 4, 0xC0, 0xA8, 0x01, 0x64])
|
|
|
|
packet = (
|
|
OP
|
|
+ HTYPE
|
|
+ HLEN
|
|
+ HOPS
|
|
+ XID
|
|
+ SECS
|
|
+ FLAGS
|
|
+ CIADDR
|
|
+ YIADDR
|
|
+ SIADDR
|
|
+ GIADDR
|
|
+ CHADDR1
|
|
+ CHADDR2
|
|
+ CHADDR3
|
|
+ CHADDR4
|
|
+ CHADDR5
|
|
+ Magiccookie
|
|
+ DHCPOptions1
|
|
+ DHCPOptions2
|
|
)
|
|
|
|
return packet
|
|
|
|
def craft_request_packet():
|
|
OP = bytes([0x01])
|
|
HTYPE = bytes([0x01])
|
|
HLEN = bytes([0x06])
|
|
HOPS = bytes([0x00])
|
|
XID = bytes([0x39, 0x03, 0xF3, 0x26])
|
|
SECS = bytes([0x00, 0x00])
|
|
FLAGS = bytes([0x00, 0x00])
|
|
CIADDR = bytes([0x00, 0x00, 0x00, 0x00])
|
|
YIADDR = bytes([0x00, 0x00, 0x00, 0x00])
|
|
SIADDR = bytes([0x00, 0x00, 0x00, 0x00])
|
|
GIADDR = bytes([0x00, 0x00, 0x00, 0x00])
|
|
CHADDR1 = bytes([0x00, 0x0C, 0x29, 0xDD])
|
|
CHADDR2 = bytes([0x5C, 0xA7, 0x00, 0x00])
|
|
CHADDR3 = bytes([0x00, 0x00, 0x00, 0x00])
|
|
CHADDR4 = bytes([0x00, 0x00, 0x00, 0x00])
|
|
CHADDR5 = bytes(192)
|
|
Magiccookie = bytes([0x63, 0x82, 0x53, 0x63])
|
|
DHCPOptions1 = bytes([53, 1, 3]) #DHCP Discover (value = 3)
|
|
DHCPOptions2 = bytes([50, 4, 0xC0, 0xA8, 0x01, 0x64])
|
|
DHCPOptions3 = bytes([54, 4, 0xC0, 0xA8, 0x01, 0x01])
|
|
|
|
packet = (
|
|
OP
|
|
+ HTYPE
|
|
+ HLEN
|
|
+ HOPS
|
|
+ XID
|
|
+ SECS
|
|
+ FLAGS
|
|
+ CIADDR
|
|
+ YIADDR
|
|
+ SIADDR
|
|
+ GIADDR
|
|
+ CHADDR1
|
|
+ CHADDR2
|
|
+ CHADDR3
|
|
+ CHADDR4
|
|
+ CHADDR5
|
|
+ Magiccookie
|
|
+ DHCPOptions1
|
|
+ DHCPOptions2
|
|
+ DHCPOptions3
|
|
)
|
|
|
|
return packet
|
|
|
|
if __name__ == '__main__':
|
|
dhcp_client = DHCPClient()
|
|
dhcp_client.client() |