-
Notifications
You must be signed in to change notification settings - Fork 0
/
client.py
143 lines (119 loc) · 4.53 KB
/
client.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import sys
import re
import socket
import random
import getMac
import DHCP
# intake argument and verify that they are correct
Arguments = sys.argv[1:]
## Check for -m flag
if len(Arguments) > 0 and (Arguments[0] == '-m' or Arguments[0] == '-M') :
Mflag = True
else :
Mflag = False
## If Mflag is true check for the passed Mac Address
if Mflag :
MacAddress = Arguments[1]
pattern = re.compile('^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$')
if not pattern.match(MacAddress) :
print "In-valid Mac Address."
sys.exit(0)
### Conver from current format to bytes
MacAddress = getMac.ConvertToBytes(MacAddress)
else :
## Find the Mac address of the client
MacAddress = getMac.getMacInBytes()
MAX_BYTES = 65535
Src = '0.0.0.0'
Dest = '255.255.255.255'
ClientPort = 12345
ServerPort = 12346
dest = (Dest, ClientPort)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
sock.bind((Src, ServerPort))
# DHCP Discover
## make a transcation ID
TransactionId = [ hex(random.choice(range(256))) for i in range(4) ]
package = DHCP.DhcpDiscover(MacAddress,TransactionId)
sock.sendto(package, dest)
print("Client sent DHCPDISCOVER : Transaction Id " + str(TransactionId))
# DHCP Offer
OfferRecieved = False
while not OfferRecieved :
try :
sock.settimeout(5)
data, address = sock.recvfrom(MAX_BYTES)
## Extract offered Ip and TransactionId
TransactionId_recieved = data[4:8]
TransactionId_recieved = DHCP.bytestring2hex(TransactionId_recieved,4)
if TransactionId != TransactionId_recieved :
print("Recieved Unknow message")
continue
MsgOptions = DHCP.ExtractOption(data)
if hex(56) in MsgOptions and MsgOptions[hex(56)][0] == hex(0) :
print("New Ip not available")
sys.exit(0)
if (not hex(53) in MsgOptions) or MsgOptions[hex(53)][0] != hex(2) :
print("Msg type not offer")
continue
OfferedIp = DHCP.bytestring2hex(data[16:20],4)
ServerIp = DHCP.bytestring2hex(data[20:24],4)
print("Client Recieved OfferedIp " + str(OfferedIp))
OfferRecieved = True
except socket.timeout :
sock.sendto(package, dest)
print("Client sent DHCPDISCOVER : Transaction Id " + str(TransactionId))
# DHCP Request - CLient
package = DHCP.DhcpRequest(MacAddress,TransactionId,ServerIp,OfferedIp)
sock.sendto(package,dest)
print("Client sent DHCPREQUEST : Transaction Id " + str(TransactionId))
# DHCP Acknowledgement - Server
AckRecieved = False
while not AckRecieved :
try :
sock.settimeout(5)
data ,address = sock.recvfrom(MAX_BYTES)
TransactionId_recieved = data[4:8]
TransactionId_recieved = DHCP.bytestring2hex(TransactionId_recieved,4)
if TransactionId != TransactionId_recieved :
print("Recieved Unknow message")
continue
MsgOptions = DHCP.ExtractOption(data)
if (not hex(53) in MsgOptions) or MsgOptions[hex(53)][0] != hex(5) :
print("Msg type not Ack")
continue
MyIp = DHCP.bytestring2hex(data[16:20],4)
SubnetMask = MsgOptions[hex(1)]
GateWayIp = MsgOptions[hex(3)]
LeaseTime = MsgOptions[hex(51)]
DNSIp = MsgOptions[hex(6)]
print("Client Recieved Ack Client Ip " + str(MyIp))
AckRecieved = True
except socket.timeout :
sock.sendto(package, dest)
print("Client sent DHCPREQUEST : Transaction Id " + str(TransactionId))
MyIp = [ int(MyIp[i],16) for i in range(4)]
SubnetMask = [ int(SubnetMask[i],16) for i in range(4)]
GateWayIp = [ int(GateWayIp[i],16) for i in range(4)]
DNSIp = [ int(DNSIp[i],16) for i in range(4)]
NetworkIp = [ MyIp[i] & SubnetMask[i] for i in range(4)]
Cidr = sum([bin(SubnetMask[i]).count('1') for i in range(4)])
def getbcast(ipaddr, nmask): # Get broadcast address from ip and mask
net = [0 for i in range(4)]
for i in range(4):
net[i] = int(ipaddr[i]) | 255 - int(nmask[i]) # octet or wildcard mask
return net
BroadcastIp = getbcast(NetworkIp,SubnetMask)
MyIp = '.'.join([str(MyIp[i]) for i in range(4)])
NetworkIp = '.'.join([str(NetworkIp[i]) for i in range(4)])
BroadcastIp = '.'.join([str(BroadcastIp[i]) for i in range(4)])
GateWayIp = '.'.join([str(GateWayIp[i]) for i in range(4)])
DNSIp = '.'.join([str(DNSIp[i]) for i in range(4)])
MyIp = MyIp + '/' + str(Cidr)
print MyIp
print NetworkIp
print BroadcastIp
print GateWayIp
print DNSIp