rex-socket 0.1.52 → 0.1.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/rex/socket/version.rb +1 -1
- data/lib/rex/socket.rb +101 -2
- data.tar.gz.sig +0 -0
- metadata +2 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f4e2765900a58243437c2588d16bc2c3fcd65b58f042707a1ebca28d2240786d
|
4
|
+
data.tar.gz: b7e46d8ab59b275872e48c418de39f07c615a2fdc480ad7ce0a8cf033eb5297f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 87cdca34534ff3ba9c085659200b40f71802ea51bc023e82bd918df19c3e5b70b2f9132dd954d121655d21a90e2a32bbea0fbed48543877f22ca404cac4d3ee9
|
7
|
+
data.tar.gz: 3bb326d55b4b6c3f6741df0bcf6073b329bba6934e5a5ac45cae1a6716b53301f1d8b3bebc80d40de0ed1c55a67e5c6fc37846fe5eb9524f294d373b6fc984c8
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/lib/rex/socket/version.rb
CHANGED
data/lib/rex/socket.rb
CHANGED
@@ -122,6 +122,9 @@ module Socket
|
|
122
122
|
end
|
123
123
|
|
124
124
|
#
|
125
|
+
# Cache our resolver
|
126
|
+
@@resolver = nil
|
127
|
+
|
125
128
|
# Determine whether this is an IPv4 address
|
126
129
|
#
|
127
130
|
def self.is_ipv4?(addr)
|
@@ -216,7 +219,11 @@ module Socket
|
|
216
219
|
return [hostname]
|
217
220
|
end
|
218
221
|
|
219
|
-
|
222
|
+
if @@resolver
|
223
|
+
res = self.rex_getaddrinfo(hostname)
|
224
|
+
else
|
225
|
+
res = ::Addrinfo.getaddrinfo(hostname, 0, ::Socket::AF_UNSPEC, ::Socket::SOCK_STREAM)
|
226
|
+
end
|
220
227
|
|
221
228
|
res.map! do |address_info|
|
222
229
|
address_info.ip_address
|
@@ -248,7 +255,7 @@ module Socket
|
|
248
255
|
host, _ = host.split('%', 2)
|
249
256
|
end
|
250
257
|
|
251
|
-
::Socket.gethostbyname(host)
|
258
|
+
@@resolver ? self.rex_gethostbyname(host) : ::Socket.gethostbyname(host)
|
252
259
|
end
|
253
260
|
|
254
261
|
#
|
@@ -719,6 +726,15 @@ module Socket
|
|
719
726
|
return [lsock, rsock]
|
720
727
|
end
|
721
728
|
|
729
|
+
#
|
730
|
+
# Install Rex::Proto::DNS::CachedResolver, or similar, to pivot DNS
|
731
|
+
#
|
732
|
+
# @param res [Rex::Proto::DNS::CachedResolver] Resolver object to handle DNS requests
|
733
|
+
# @return [Rex::Proto::DNS::CachedResolver] The installed resolver
|
734
|
+
def self._install_global_resolver(res)
|
735
|
+
@@resolver = res
|
736
|
+
end
|
737
|
+
|
722
738
|
|
723
739
|
##
|
724
740
|
#
|
@@ -844,6 +860,89 @@ protected
|
|
844
860
|
attr_writer :context # :nodoc:
|
845
861
|
attr_writer :ipv # :nodoc:
|
846
862
|
|
863
|
+
#
|
864
|
+
# @param name [String] The hostname to lookup via the resolver
|
865
|
+
# @param resolver [Rex::Proto::DNS::CachedResolver] Resolver to query for the name
|
866
|
+
# @return [Array] Array mimicking the native gethostbyname return type
|
867
|
+
def self.rex_gethostbyname(name, resolver: @@resolver)
|
868
|
+
v4, v6 = self.rex_resolve_hostname(name, resolver: resolver)
|
869
|
+
# Build response array
|
870
|
+
hostbyname = [name, []]
|
871
|
+
unless v4.empty?
|
872
|
+
hostbyname << ::Socket::AF_INET
|
873
|
+
hostbyname += v4.map(&:address).map(&:address)
|
874
|
+
hostbyname << v6[0].address.address unless v6.empty?
|
875
|
+
else
|
876
|
+
hostbyname << ::Socket::AF_INET6
|
877
|
+
hostbyname += v6.map(&:address).map(&:address)
|
878
|
+
end
|
879
|
+
return hostbyname
|
880
|
+
end
|
881
|
+
|
882
|
+
#
|
883
|
+
# @param name [String] The hostname to lookup via the resolver
|
884
|
+
# @param resolver [Rex::Proto::DNS::CachedResolver] Resolver to query for the name
|
885
|
+
# @return [Array] Array mimicking the native getaddrinfo return type
|
886
|
+
def self.rex_getaddrinfo(name, resolver: @@resolver)
|
887
|
+
v4, v6 = self.rex_resolve_hostname(name, resolver: resolver)
|
888
|
+
# Build response array
|
889
|
+
getaddrinfo = []
|
890
|
+
v4.each do |a4|
|
891
|
+
getaddrinfo << Addrinfo.new(
|
892
|
+
self.to_sockaddr(a4.address.to_s, 0),
|
893
|
+
::Socket::AF_INET,
|
894
|
+
::Socket::SOCK_STREAM,
|
895
|
+
::Socket::IPPROTO_TCP,
|
896
|
+
) unless v4.empty?
|
897
|
+
end
|
898
|
+
v6.each do |a6|
|
899
|
+
getaddrinfo << Addrinfo.new(
|
900
|
+
self.to_sockaddr(a6.address.to_s, 0),
|
901
|
+
::Socket::AF_INET6,
|
902
|
+
::Socket::SOCK_STREAM,
|
903
|
+
::Socket::IPPROTO_TCP,
|
904
|
+
) unless v6.empty?
|
905
|
+
end
|
906
|
+
return getaddrinfo
|
907
|
+
end
|
908
|
+
|
909
|
+
|
910
|
+
# @param name [String] The hostname to lookup via the resolver
|
911
|
+
# @param resolver [Rex::Proto::DNS::CachedResolver] Resolver to query for the name
|
912
|
+
# @return [Array] Array of Dnsruby::Message responses for consumers to reformat
|
913
|
+
def self.rex_resolve_hostname(name, resolver: @@resolver)
|
914
|
+
raise ::SocketError.new(
|
915
|
+
"Rex::Socket internal DNS resolution requires passing/setting a resolver"
|
916
|
+
) unless resolver
|
917
|
+
raise ::SocketError.new(
|
918
|
+
"Rex::Socket internal DNS resolution requires passing a String name to resolve"
|
919
|
+
) unless name.is_a?(String)
|
920
|
+
# Pull both record types
|
921
|
+
v4 = begin
|
922
|
+
resolver.send(name, ::Net::DNS::A).answer.select do |a|
|
923
|
+
a.type == Dnsruby::Types::A
|
924
|
+
end.sort_by do |a|
|
925
|
+
self.addr_ntoi(a.address.address)
|
926
|
+
end
|
927
|
+
rescue
|
928
|
+
[]
|
929
|
+
end
|
930
|
+
v6 = begin
|
931
|
+
resolver.send(name, ::Net::DNS::AAAA).answer.select do |a|
|
932
|
+
a.type == Dnsruby::Types::AAAA
|
933
|
+
end.sort_by do |a|
|
934
|
+
self.addr_ntoi(a.address.address)
|
935
|
+
end
|
936
|
+
rescue
|
937
|
+
[]
|
938
|
+
end
|
939
|
+
# Emulate ::Socket's error if no responses found
|
940
|
+
if v4.empty? and v6.empty?
|
941
|
+
raise ::SocketError.new('getaddrinfo: Name or service not known')
|
942
|
+
end
|
943
|
+
# Ensure response types (depending on underlying library used) provide required methods
|
944
|
+
return v4, v6
|
945
|
+
end
|
847
946
|
end
|
848
947
|
|
849
948
|
end
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rex-socket
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.53
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Metasploit Hackers
|
@@ -93,7 +93,7 @@ cert_chain:
|
|
93
93
|
EknWpNgVhohbot1lfVAMmIhdtOVaRVcQQixWPwprDj/ydB8ryDMDosIMcw+fkoXU
|
94
94
|
9GJsSaSRRYQ9UUkVL27b64okU8D48m8=
|
95
95
|
-----END CERTIFICATE-----
|
96
|
-
date: 2023-
|
96
|
+
date: 2023-09-05 00:00:00.000000000 Z
|
97
97
|
dependencies:
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
99
|
name: rake
|
metadata.gz.sig
CHANGED
Binary file
|