diff --git a/lib/rex/socket/comm/local.rb b/lib/rex/socket/comm/local.rb index dd8485d..64886a3 100644 --- a/lib/rex/socket/comm/local.rb +++ b/lib/rex/socket/comm/local.rb @@ -177,7 +177,15 @@ def self.create_by_type(param, type, proto = 0) sock.setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_REUSEADDR, true) end - sock.bind(Rex::Socket.to_sockaddr(param.localhost, param.localport)) + if Rex::Socket.is_ip_addr?(param.localhost) + ip = param.localhost + elsif param.v6 + ip = Rex::Socket.getaddresses(param.localhost, true).select { |address| Rex::Socket.is_ipv6?(address) }.sample + else + ip = Rex::Socket.getaddresses(param.localhost, false).select { |address| Rex::Socket.is_ipv4?(address) }.sample + end + + sock.bind(Rex::Socket.to_sockaddr(ip, param.localport)) rescue ::Errno::EADDRNOTAVAIL,::Errno::EADDRINUSE sock.close @@ -256,7 +264,13 @@ def self.create_by_type(param, type, proto = 0) ip = param.proxies.first.host port = param.proxies.first.port else - ip = Rex::Socket.getaddress(param.peerhost) + if Rex::Socket.is_ip_addr?(param.peerhost) + ip = param.peerhost + elsif param.v6 + ip = Rex::Socket.getaddresses(param.peerhost, true).select { |address| Rex::Socket.is_ipv6?(address) }.sample + else + ip = Rex::Socket.getaddresses(param.peerhost, false).select { |address| Rex::Socket.is_ipv4?(address) }.sample + end port = param.peerport end