Skip to content

Commit 093bc53

Browse files
committed
Land rapid7#8875, Fix UDP scanner mixin with multicast addresses
2 parents bd94a46 + 41eba74 commit 093bc53

File tree

1 file changed

+22
-15
lines changed

1 file changed

+22
-15
lines changed

lib/msf/core/auxiliary/udp_scanner.rb

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,20 @@ def run_batch_size
4343
datastore['BATCHSIZE'].to_i
4444
end
4545

46-
def udp_socket(ip, port)
46+
def udp_socket(ip, port, bind_peer: true)
47+
key = "#{ip}:#{port}:#{bind_peer ? 'bound' : 'unbound'}"
4748
@udp_sockets_mutex.synchronize do
48-
key = "#{ip}:#{port}"
4949
unless @udp_sockets.key?(key)
50-
@udp_sockets[key] =
51-
Rex::Socket::Udp.create({
52-
'LocalHost' => datastore['CHOST'] || nil,
53-
'LocalPort' => datastore['CPORT'] || 0,
54-
'PeerHost' => ip,
55-
'PeerPort' => port,
56-
'Context' => { 'Msf' => framework, 'MsfExploit' => self }
57-
})
50+
sock_info = {
51+
'LocalHost' => datastore['CHOST'] || nil,
52+
'LocalPort' => datastore['CPORT'] || 0,
53+
'Context' => { 'Msf' => framework, 'MsfExploit' => self }
54+
}
55+
if bind_peer
56+
sock_info['PeerHost'] = ip
57+
sock_info['PeerPort'] = port
58+
end
59+
@udp_sockets[key] = Rex::Socket::Udp.create(sock_info)
5860
add_socket(@udp_sockets[key])
5961
end
6062
return @udp_sockets[key]
@@ -123,10 +125,16 @@ def scanner_send(data, ip, port)
123125
data = data.to_binary_s if data.respond_to?('to_binary_s')
124126

125127
resend_count = 0
126-
sock = nil
128+
127129
begin
128-
sock = udp_socket(ip, port)
129-
sock.send(data, 0)
130+
addrinfo = Addrinfo.ip(ip)
131+
unless addrinfo.ipv4_multicast? || addrinfo.ipv6_multicast?
132+
sock = udp_socket(ip, port, bind_peer: true)
133+
sock.send(data, 0)
134+
else
135+
sock = udp_socket(ip, port, bind_peer: false)
136+
sock.sendto(data, ip, port, 0)
137+
end
130138

131139
rescue ::Errno::ENOBUFS
132140
resend_count += 1
@@ -136,8 +144,7 @@ def scanner_send(data, ip, port)
136144
end
137145

138146
scanner_recv(0.1)
139-
140-
::IO.select(nil, nil, nil, 0.25)
147+
sleep(0.25)
141148

142149
retry
143150

0 commit comments

Comments
 (0)