#!/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 = ('', 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()