rex-socket 0.1.52 → 0.1.54
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.github/workflows/verify.yml +7 -10
- data/lib/rex/socket/version.rb +1 -1
- data/lib/rex/socket.rb +142 -23
- data.tar.gz.sig +3 -1
- 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: 0d6178ec17a488e30e67e5f38c47a37ef101779a01819acc9fe5f0e77e21137a
|
4
|
+
data.tar.gz: 850e34b302ac851ef01ed341fdb361e60c6256a3be7ebec6f52398046884b041
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0e6be5fbc26e756be673e373c521ddac5b1b98a999ee5c78d9d9d009a68d9de1d5a40f2915ebb226a0349c4dd097d76779c2181396be31756f2a95c77f0fabff
|
7
|
+
data.tar.gz: 9bcd47ba675dd95f6eb4d5164e94ed5c82d1ac0f36513a20b2c77a37089f6a3cbe0705027ad363e153a700e45e9493b449e6659dc73e6256d20e83188e15c089
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
@@ -30,7 +30,7 @@ jobs:
|
|
30
30
|
timeout-minutes: 40
|
31
31
|
|
32
32
|
strategy:
|
33
|
-
fail-fast:
|
33
|
+
fail-fast: false
|
34
34
|
matrix:
|
35
35
|
ruby:
|
36
36
|
- '2.7'
|
@@ -39,20 +39,20 @@ jobs:
|
|
39
39
|
- '3.2'
|
40
40
|
os:
|
41
41
|
- ubuntu-20.04
|
42
|
+
- windows-2019
|
43
|
+
- macos-11
|
42
44
|
- ubuntu-latest
|
43
45
|
exclude:
|
44
46
|
- { os: ubuntu-latest, ruby: '2.7' }
|
45
47
|
- { os: ubuntu-latest, ruby: '3.0' }
|
46
|
-
test_cmd:
|
47
|
-
- bundle exec rspec
|
48
48
|
|
49
49
|
env:
|
50
50
|
RAILS_ENV: test
|
51
51
|
|
52
|
-
name: ${{ matrix.os }} - Ruby ${{ matrix.ruby }}
|
52
|
+
name: ${{ matrix.os }} - Ruby ${{ matrix.ruby }}
|
53
53
|
steps:
|
54
54
|
- name: Checkout code
|
55
|
-
uses: actions/checkout@
|
55
|
+
uses: actions/checkout@v4
|
56
56
|
|
57
57
|
- name: Setup Ruby
|
58
58
|
uses: ruby/setup-ruby@v1
|
@@ -60,9 +60,6 @@ jobs:
|
|
60
60
|
ruby-version: ${{ matrix.ruby }}
|
61
61
|
bundler-cache: true
|
62
62
|
|
63
|
-
- name:
|
63
|
+
- name: rspec
|
64
64
|
run: |
|
65
|
-
|
66
|
-
bash -c "${CMD}"
|
67
|
-
env:
|
68
|
-
CMD: ${{ matrix.test_cmd }}
|
65
|
+
bundle exec rspec
|
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
|
#
|
@@ -665,37 +672,57 @@ module Socket
|
|
665
672
|
# is no concurrent use of the same locals and this is safe.
|
666
673
|
def self.tcp_socket_pair
|
667
674
|
lsock = nil
|
675
|
+
last_child_error = nil
|
676
|
+
accept_timeout = 10
|
668
677
|
rsock = nil
|
669
678
|
laddr = '127.0.0.1'
|
670
679
|
lport = 0
|
671
680
|
threads = []
|
672
681
|
mutex = ::Mutex.new
|
673
682
|
|
674
|
-
threads << Rex::ThreadFactory.spawn('TcpSocketPair', false)
|
683
|
+
threads << Rex::ThreadFactory.spawn('TcpSocketPair', false) do
|
675
684
|
server = nil
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
685
|
+
begin
|
686
|
+
mutex.synchronize do
|
687
|
+
threads << Rex::ThreadFactory.spawn('TcpSocketPairClient', false) do
|
688
|
+
mutex.synchronize do
|
689
|
+
begin
|
690
|
+
rsock = ::TCPSocket.new( laddr, lport )
|
691
|
+
rescue => e
|
692
|
+
last_child_error = "#{e.class} - #{e.message}"
|
693
|
+
raise
|
694
|
+
end
|
695
|
+
end
|
696
|
+
end
|
697
|
+
server = ::TCPServer.new(laddr, 0)
|
698
|
+
if (server.getsockname =~ /127\.0\.0\.1:/)
|
699
|
+
# JRuby ridiculousness
|
700
|
+
caddr, lport = server.getsockname.split(":")
|
701
|
+
caddr = caddr[1,caddr.length]
|
702
|
+
lport = lport.to_i
|
703
|
+
else
|
704
|
+
# Sane implementations where Socket#getsockname returns a
|
705
|
+
# sockaddr
|
706
|
+
lport, caddr = ::Socket.unpack_sockaddr_in( server.getsockname )
|
707
|
+
end
|
708
|
+
end
|
709
|
+
|
710
|
+
readable, _writable, _errors = ::IO.select([server], nil, nil, accept_timeout)
|
711
|
+
if readable && readable.any?
|
712
|
+
lsock, _ = server.accept_nonblock
|
688
713
|
else
|
689
|
-
|
690
|
-
# sockaddr
|
691
|
-
lport, caddr = ::Socket.unpack_sockaddr_in( server.getsockname )
|
714
|
+
raise RuntimeError, "rsock didn't connect in #{accept_timeout} seconds"
|
692
715
|
end
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
716
|
+
ensure
|
717
|
+
server.close if server
|
718
|
+
end
|
719
|
+
end
|
697
720
|
|
698
|
-
threads.each
|
721
|
+
threads.each.with_index do |thread, i|
|
722
|
+
thread.join
|
723
|
+
rescue => e
|
724
|
+
raise "Thread #{i} - error #{e} - last child error: #{last_child_error}"
|
725
|
+
end
|
699
726
|
|
700
727
|
return [lsock, rsock]
|
701
728
|
end
|
@@ -719,6 +746,15 @@ module Socket
|
|
719
746
|
return [lsock, rsock]
|
720
747
|
end
|
721
748
|
|
749
|
+
#
|
750
|
+
# Install Rex::Proto::DNS::CachedResolver, or similar, to pivot DNS
|
751
|
+
#
|
752
|
+
# @param res [Rex::Proto::DNS::CachedResolver] Resolver object to handle DNS requests
|
753
|
+
# @return [Rex::Proto::DNS::CachedResolver] The installed resolver
|
754
|
+
def self._install_global_resolver(res)
|
755
|
+
@@resolver = res
|
756
|
+
end
|
757
|
+
|
722
758
|
|
723
759
|
##
|
724
760
|
#
|
@@ -844,6 +880,89 @@ protected
|
|
844
880
|
attr_writer :context # :nodoc:
|
845
881
|
attr_writer :ipv # :nodoc:
|
846
882
|
|
883
|
+
#
|
884
|
+
# @param name [String] The hostname to lookup via the resolver
|
885
|
+
# @param resolver [Rex::Proto::DNS::CachedResolver] Resolver to query for the name
|
886
|
+
# @return [Array] Array mimicking the native gethostbyname return type
|
887
|
+
def self.rex_gethostbyname(name, resolver: @@resolver)
|
888
|
+
v4, v6 = self.rex_resolve_hostname(name, resolver: resolver)
|
889
|
+
# Build response array
|
890
|
+
hostbyname = [name, []]
|
891
|
+
unless v4.empty?
|
892
|
+
hostbyname << ::Socket::AF_INET
|
893
|
+
hostbyname += v4.map(&:address).map(&:address)
|
894
|
+
hostbyname << v6[0].address.address unless v6.empty?
|
895
|
+
else
|
896
|
+
hostbyname << ::Socket::AF_INET6
|
897
|
+
hostbyname += v6.map(&:address).map(&:address)
|
898
|
+
end
|
899
|
+
return hostbyname
|
900
|
+
end
|
901
|
+
|
902
|
+
#
|
903
|
+
# @param name [String] The hostname to lookup via the resolver
|
904
|
+
# @param resolver [Rex::Proto::DNS::CachedResolver] Resolver to query for the name
|
905
|
+
# @return [Array] Array mimicking the native getaddrinfo return type
|
906
|
+
def self.rex_getaddrinfo(name, resolver: @@resolver)
|
907
|
+
v4, v6 = self.rex_resolve_hostname(name, resolver: resolver)
|
908
|
+
# Build response array
|
909
|
+
getaddrinfo = []
|
910
|
+
v4.each do |a4|
|
911
|
+
getaddrinfo << Addrinfo.new(
|
912
|
+
self.to_sockaddr(a4.address.to_s, 0),
|
913
|
+
::Socket::AF_INET,
|
914
|
+
::Socket::SOCK_STREAM,
|
915
|
+
::Socket::IPPROTO_TCP,
|
916
|
+
) unless v4.empty?
|
917
|
+
end
|
918
|
+
v6.each do |a6|
|
919
|
+
getaddrinfo << Addrinfo.new(
|
920
|
+
self.to_sockaddr(a6.address.to_s, 0),
|
921
|
+
::Socket::AF_INET6,
|
922
|
+
::Socket::SOCK_STREAM,
|
923
|
+
::Socket::IPPROTO_TCP,
|
924
|
+
) unless v6.empty?
|
925
|
+
end
|
926
|
+
return getaddrinfo
|
927
|
+
end
|
928
|
+
|
929
|
+
|
930
|
+
# @param name [String] The hostname to lookup via the resolver
|
931
|
+
# @param resolver [Rex::Proto::DNS::CachedResolver] Resolver to query for the name
|
932
|
+
# @return [Array] Array of Dnsruby::Message responses for consumers to reformat
|
933
|
+
def self.rex_resolve_hostname(name, resolver: @@resolver)
|
934
|
+
raise ::SocketError.new(
|
935
|
+
"Rex::Socket internal DNS resolution requires passing/setting a resolver"
|
936
|
+
) unless resolver
|
937
|
+
raise ::SocketError.new(
|
938
|
+
"Rex::Socket internal DNS resolution requires passing a String name to resolve"
|
939
|
+
) unless name.is_a?(String)
|
940
|
+
# Pull both record types
|
941
|
+
v4 = begin
|
942
|
+
resolver.send(name, ::Net::DNS::A).answer.select do |a|
|
943
|
+
a.type == Dnsruby::Types::A
|
944
|
+
end.sort_by do |a|
|
945
|
+
self.addr_ntoi(a.address.address)
|
946
|
+
end
|
947
|
+
rescue
|
948
|
+
[]
|
949
|
+
end
|
950
|
+
v6 = begin
|
951
|
+
resolver.send(name, ::Net::DNS::AAAA).answer.select do |a|
|
952
|
+
a.type == Dnsruby::Types::AAAA
|
953
|
+
end.sort_by do |a|
|
954
|
+
self.addr_ntoi(a.address.address)
|
955
|
+
end
|
956
|
+
rescue
|
957
|
+
[]
|
958
|
+
end
|
959
|
+
# Emulate ::Socket's error if no responses found
|
960
|
+
if v4.empty? and v6.empty?
|
961
|
+
raise ::SocketError.new('getaddrinfo: Name or service not known')
|
962
|
+
end
|
963
|
+
# Ensure response types (depending on underlying library used) provide required methods
|
964
|
+
return v4, v6
|
965
|
+
end
|
847
966
|
end
|
848
967
|
|
849
968
|
end
|
data.tar.gz.sig
CHANGED
@@ -1 +1,3 @@
|
|
1
|
-
|
1
|
+
|
|
2
|
+
�$�I(��p�x�Z��}����=;;�7���6pdN؊���m��sJ���3���!Aʊ!�Lo
|
3
|
+
��U#&ܮ��}�a<M�5)1]#��G����M��>�ʹA��2v(�j��^��κ�����C��H)ު������l�`Vy���u�������"fӉwFQ�Yߒ�F�z��̆�T�|�9���`�H̒��(��Jע
|
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.54
|
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-13 00:00:00.000000000 Z
|
97
97
|
dependencies:
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
99
|
name: rake
|
metadata.gz.sig
CHANGED
Binary file
|