ruby_smb 1.1.0 → 2.0.4

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.
Files changed (163) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.travis.yml +3 -5
  5. data/Gemfile +6 -2
  6. data/examples/anonymous_auth.rb +3 -3
  7. data/examples/append_file.rb +10 -8
  8. data/examples/authenticate.rb +9 -5
  9. data/examples/delete_file.rb +8 -6
  10. data/examples/enum_registry_key.rb +5 -4
  11. data/examples/enum_registry_values.rb +5 -4
  12. data/examples/list_directory.rb +8 -6
  13. data/examples/negotiate.rb +51 -8
  14. data/examples/negotiate_with_netbios_service.rb +9 -5
  15. data/examples/net_share_enum_all.rb +6 -4
  16. data/examples/pipes.rb +11 -12
  17. data/examples/query_service_status.rb +64 -0
  18. data/examples/read_file.rb +8 -6
  19. data/examples/read_file_encryption.rb +56 -0
  20. data/examples/read_registry_key_value.rb +6 -5
  21. data/examples/rename_file.rb +9 -7
  22. data/examples/tree_connect.rb +7 -5
  23. data/examples/write_file.rb +9 -7
  24. data/lib/ruby_smb.rb +4 -0
  25. data/lib/ruby_smb/client.rb +246 -26
  26. data/lib/ruby_smb/client/authentication.rb +32 -18
  27. data/lib/ruby_smb/client/echo.rb +2 -4
  28. data/lib/ruby_smb/client/encryption.rb +62 -0
  29. data/lib/ruby_smb/client/negotiation.rb +156 -16
  30. data/lib/ruby_smb/client/signing.rb +19 -0
  31. data/lib/ruby_smb/client/tree_connect.rb +6 -8
  32. data/lib/ruby_smb/client/utils.rb +24 -17
  33. data/lib/ruby_smb/client/winreg.rb +1 -1
  34. data/lib/ruby_smb/crypto.rb +30 -0
  35. data/lib/ruby_smb/dcerpc.rb +2 -0
  36. data/lib/ruby_smb/dcerpc/error.rb +3 -0
  37. data/lib/ruby_smb/dcerpc/ndr.rb +209 -44
  38. data/lib/ruby_smb/dcerpc/request.rb +13 -0
  39. data/lib/ruby_smb/dcerpc/rpc_security_attributes.rb +34 -0
  40. data/lib/ruby_smb/dcerpc/rrp_unicode_string.rb +9 -6
  41. data/lib/ruby_smb/dcerpc/svcctl.rb +479 -0
  42. data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request.rb +48 -0
  43. data/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response.rb +26 -0
  44. data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_request.rb +25 -0
  45. data/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response.rb +26 -0
  46. data/lib/ruby_smb/dcerpc/svcctl/control_service_request.rb +26 -0
  47. data/lib/ruby_smb/dcerpc/svcctl/control_service_response.rb +26 -0
  48. data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request.rb +35 -0
  49. data/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response.rb +23 -0
  50. data/lib/ruby_smb/dcerpc/svcctl/open_service_w_request.rb +31 -0
  51. data/lib/ruby_smb/dcerpc/svcctl/open_service_w_response.rb +23 -0
  52. data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request.rb +25 -0
  53. data/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response.rb +44 -0
  54. data/lib/ruby_smb/dcerpc/svcctl/query_service_status_request.rb +23 -0
  55. data/lib/ruby_smb/dcerpc/svcctl/query_service_status_response.rb +27 -0
  56. data/lib/ruby_smb/dcerpc/svcctl/service_status.rb +25 -0
  57. data/lib/ruby_smb/dcerpc/svcctl/start_service_w_request.rb +27 -0
  58. data/lib/ruby_smb/dcerpc/svcctl/start_service_w_response.rb +25 -0
  59. data/lib/ruby_smb/dcerpc/winreg.rb +98 -17
  60. data/lib/ruby_smb/dcerpc/winreg/create_key_request.rb +73 -0
  61. data/lib/ruby_smb/dcerpc/winreg/create_key_response.rb +36 -0
  62. data/lib/ruby_smb/dcerpc/winreg/enum_key_request.rb +1 -1
  63. data/lib/ruby_smb/dcerpc/winreg/enum_value_request.rb +1 -1
  64. data/lib/ruby_smb/dcerpc/winreg/enum_value_response.rb +1 -1
  65. data/lib/ruby_smb/dcerpc/winreg/open_root_key_request.rb +4 -4
  66. data/lib/ruby_smb/dcerpc/winreg/query_info_key_request.rb +1 -1
  67. data/lib/ruby_smb/dcerpc/winreg/query_value_request.rb +7 -6
  68. data/lib/ruby_smb/dcerpc/winreg/query_value_response.rb +10 -10
  69. data/lib/ruby_smb/dcerpc/winreg/save_key_request.rb +37 -0
  70. data/lib/ruby_smb/dcerpc/winreg/save_key_response.rb +23 -0
  71. data/lib/ruby_smb/dispatcher/base.rb +1 -1
  72. data/lib/ruby_smb/dispatcher/socket.rb +5 -4
  73. data/lib/ruby_smb/error.rb +49 -6
  74. data/lib/ruby_smb/field/stringz16.rb +17 -1
  75. data/lib/ruby_smb/generic_packet.rb +11 -1
  76. data/lib/ruby_smb/nbss/session_header.rb +4 -4
  77. data/lib/ruby_smb/smb1/commands.rb +1 -1
  78. data/lib/ruby_smb/smb1/file.rb +13 -28
  79. data/lib/ruby_smb/smb1/packet/session_setup_legacy_request.rb +1 -1
  80. data/lib/ruby_smb/smb1/packet/session_setup_legacy_response.rb +2 -2
  81. data/lib/ruby_smb/smb1/packet/session_setup_request.rb +1 -1
  82. data/lib/ruby_smb/smb1/packet/session_setup_response.rb +2 -2
  83. data/lib/ruby_smb/smb1/packet/write_andx_request.rb +1 -1
  84. data/lib/ruby_smb/smb1/pipe.rb +8 -8
  85. data/lib/ruby_smb/smb1/tree.rb +25 -12
  86. data/lib/ruby_smb/smb2/bit_field/session_flags.rb +2 -1
  87. data/lib/ruby_smb/smb2/bit_field/share_flags.rb +6 -4
  88. data/lib/ruby_smb/smb2/file.rb +59 -77
  89. data/lib/ruby_smb/smb2/negotiate_context.rb +108 -0
  90. data/lib/ruby_smb/smb2/packet.rb +2 -0
  91. data/lib/ruby_smb/smb2/packet/compression_transform_header.rb +41 -0
  92. data/lib/ruby_smb/smb2/packet/negotiate_request.rb +51 -14
  93. data/lib/ruby_smb/smb2/packet/negotiate_response.rb +50 -4
  94. data/lib/ruby_smb/smb2/packet/transform_header.rb +84 -0
  95. data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +92 -6
  96. data/lib/ruby_smb/smb2/packet/tree_connect_response.rb +8 -26
  97. data/lib/ruby_smb/smb2/pipe.rb +8 -20
  98. data/lib/ruby_smb/smb2/smb2_header.rb +1 -1
  99. data/lib/ruby_smb/smb2/tree.rb +44 -28
  100. data/lib/ruby_smb/version.rb +1 -1
  101. data/ruby_smb.gemspec +3 -1
  102. data/spec/lib/ruby_smb/client_spec.rb +1408 -70
  103. data/spec/lib/ruby_smb/crypto_spec.rb +25 -0
  104. data/spec/lib/ruby_smb/dcerpc/ndr_spec.rb +1396 -77
  105. data/spec/lib/ruby_smb/dcerpc/rpc_security_attributes_spec.rb +161 -0
  106. data/spec/lib/ruby_smb/dcerpc/rrp_unicode_string_spec.rb +49 -12
  107. data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_request_spec.rb +191 -0
  108. data/spec/lib/ruby_smb/dcerpc/svcctl/change_service_config_w_response_spec.rb +38 -0
  109. data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_request_spec.rb +30 -0
  110. data/spec/lib/ruby_smb/dcerpc/svcctl/close_service_handle_response_spec.rb +38 -0
  111. data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_request_spec.rb +39 -0
  112. data/spec/lib/ruby_smb/dcerpc/svcctl/control_service_response_spec.rb +38 -0
  113. data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_request_spec.rb +78 -0
  114. data/spec/lib/ruby_smb/dcerpc/svcctl/open_sc_manager_w_response_spec.rb +38 -0
  115. data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_request_spec.rb +59 -0
  116. data/spec/lib/ruby_smb/dcerpc/svcctl/open_service_w_response_spec.rb +38 -0
  117. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_request_spec.rb +38 -0
  118. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_config_w_response_spec.rb +152 -0
  119. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_request_spec.rb +30 -0
  120. data/spec/lib/ruby_smb/dcerpc/svcctl/query_service_status_response_spec.rb +38 -0
  121. data/spec/lib/ruby_smb/dcerpc/svcctl/service_status_spec.rb +72 -0
  122. data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_request_spec.rb +46 -0
  123. data/spec/lib/ruby_smb/dcerpc/svcctl/start_service_w_response_spec.rb +30 -0
  124. data/spec/lib/ruby_smb/dcerpc/svcctl_spec.rb +512 -0
  125. data/spec/lib/ruby_smb/dcerpc/winreg/create_key_request_spec.rb +110 -0
  126. data/spec/lib/ruby_smb/dcerpc/winreg/create_key_response_spec.rb +44 -0
  127. data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_request_spec.rb +0 -4
  128. data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_request_spec.rb +2 -2
  129. data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_response_spec.rb +2 -2
  130. data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_request_spec.rb +9 -4
  131. data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_request_spec.rb +0 -4
  132. data/spec/lib/ruby_smb/dcerpc/winreg/query_value_request_spec.rb +17 -17
  133. data/spec/lib/ruby_smb/dcerpc/winreg/query_value_response_spec.rb +11 -23
  134. data/spec/lib/ruby_smb/dcerpc/winreg/save_key_request_spec.rb +57 -0
  135. data/spec/lib/ruby_smb/dcerpc/winreg/save_key_response_spec.rb +22 -0
  136. data/spec/lib/ruby_smb/dcerpc/winreg_spec.rb +227 -41
  137. data/spec/lib/ruby_smb/dispatcher/socket_spec.rb +12 -12
  138. data/spec/lib/ruby_smb/error_spec.rb +88 -0
  139. data/spec/lib/ruby_smb/field/stringz16_spec.rb +12 -0
  140. data/spec/lib/ruby_smb/generic_packet_spec.rb +7 -0
  141. data/spec/lib/ruby_smb/nbss/session_header_spec.rb +4 -11
  142. data/spec/lib/ruby_smb/smb1/file_spec.rb +1 -3
  143. data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_request_spec.rb +2 -2
  144. data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_response_spec.rb +2 -2
  145. data/spec/lib/ruby_smb/smb1/packet/session_setup_request_spec.rb +2 -2
  146. data/spec/lib/ruby_smb/smb1/packet/session_setup_response_spec.rb +1 -1
  147. data/spec/lib/ruby_smb/smb1/pipe_spec.rb +30 -5
  148. data/spec/lib/ruby_smb/smb1/tree_spec.rb +22 -0
  149. data/spec/lib/ruby_smb/smb2/bit_field/session_flags_spec.rb +9 -0
  150. data/spec/lib/ruby_smb/smb2/bit_field/share_flags_spec.rb +27 -0
  151. data/spec/lib/ruby_smb/smb2/file_spec.rb +147 -71
  152. data/spec/lib/ruby_smb/smb2/negotiate_context_spec.rb +332 -0
  153. data/spec/lib/ruby_smb/smb2/packet/compression_transform_header_spec.rb +108 -0
  154. data/spec/lib/ruby_smb/smb2/packet/negotiate_request_spec.rb +138 -3
  155. data/spec/lib/ruby_smb/smb2/packet/negotiate_response_spec.rb +120 -2
  156. data/spec/lib/ruby_smb/smb2/packet/transform_header_spec.rb +220 -0
  157. data/spec/lib/ruby_smb/smb2/packet/tree_connect_request_spec.rb +339 -9
  158. data/spec/lib/ruby_smb/smb2/packet/tree_connect_response_spec.rb +3 -30
  159. data/spec/lib/ruby_smb/smb2/pipe_spec.rb +9 -45
  160. data/spec/lib/ruby_smb/smb2/smb2_header_spec.rb +2 -2
  161. data/spec/lib/ruby_smb/smb2/tree_spec.rb +111 -9
  162. metadata +194 -75
  163. metadata.gz.sig +2 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3fe1b1b7bdd2516bd388f86c020a9fa99b70faa0
4
- data.tar.gz: aa11ed030f543c0d83b61929d10c35eea20a8455
2
+ SHA256:
3
+ metadata.gz: 43f9f98936e870ad767348eb90c66f17eaf5e56c62b7792e13502c860bf8c4f1
4
+ data.tar.gz: b57d0bdee72f2fde7ee700771f85cd0f442f3ca5be70b4564b1598df05474860
5
5
  SHA512:
6
- metadata.gz: 92cc9708588a610104f8bacc8430fedd537f2ba283bb323b791ff45005a43417cf9570ce63f658b7a38c566570c2b651adb17b6750b3b117279552efaf138cab
7
- data.tar.gz: 071db1651283d080b2adc728cd1f2225e051d52f86608f9f54dd6d79d39330127c3b5179d143ec9e5e155d132af1e128c4c9ca42744264caec8b249e0b0c86ec
6
+ metadata.gz: '08c1bea7f46add92b4bf6746ec3794a7845a0d0dccb8a8d338d7b3fd07133b670b5509bfd1a71fa10dcc11059bcd01b38a0da664c9fe7b86aa8d58738d0215e8'
7
+ data.tar.gz: 69efcb218b522cd233a593ccd281786732f76c717349f44c776a1a7f9790a697b46ccc63b60ab01b31b58ab38487c2d0c3ff3db7c99f55dd7fda469c1ecc5d90
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,8 +1,6 @@
1
1
  language: ruby
2
2
  sudo: false
3
3
  rvm:
4
- - '2.3.8'
5
- - '2.4.5'
6
- - '2.5.3'
7
- - '2.6.1'
8
- - 'jruby-9000'
4
+ - '2.5.8'
5
+ - '2.6.6'
6
+ - '2.7.0'
data/Gemfile CHANGED
@@ -1,11 +1,15 @@
1
1
  source 'https://rubygems.org'
2
2
  gemspec
3
3
 
4
- gem 'pry'
4
+ group :development do
5
+ # for development and testing purposes
6
+ gem 'pry-byebug'
7
+ gem 'pry-rescue'
8
+ end
5
9
 
6
10
  group :test do
7
11
  # simplecov test formatter and uploader for Coveralls.io
8
- gem 'coveralls', require: false
12
+ gem "coveralls", '~>0.8.23', :require => false
9
13
  # Testing
10
14
  gem 'rspec'
11
15
  # Coverage reports
@@ -6,12 +6,12 @@
6
6
  require 'bundler/setup'
7
7
  require 'ruby_smb'
8
8
 
9
- def run_authentication(address, smb1, smb2, username, password)
9
+ def run_authentication(address, smb1, smb2, smb3, username, password)
10
10
  # Create our socket and add it to the dispatcher
11
11
  sock = TCPSocket.new address, 445
12
12
  dispatcher = RubySMB::Dispatcher::Socket.new(sock)
13
13
 
14
- client = RubySMB::Client.new(dispatcher, smb1: smb1, smb2: smb2, username: username, password: password)
14
+ client = RubySMB::Client.new(dispatcher, smb1: smb1, smb2: smb2, smb3: smb3, username: username, password: password)
15
15
  protocol = client.negotiate
16
16
  status = client.authenticate
17
17
  puts "#{protocol} : #{status}"
@@ -27,4 +27,4 @@ username = ''
27
27
  password = ''
28
28
 
29
29
  # Negotiate with only SMB1 enabled
30
- run_authentication(address, true, false, username, password)
30
+ run_authentication(address, true, false, false, username, password)
@@ -9,18 +9,20 @@
9
9
  require 'bundler/setup'
10
10
  require 'ruby_smb'
11
11
 
12
- address = ARGV[0]
13
- username = ARGV[1]
14
- password = ARGV[2]
15
- share = ARGV[3]
16
- file = ARGV[4]
17
- data = ARGV[5]
18
- path = "\\\\#{address}\\#{share}"
12
+ address = ARGV[0]
13
+ username = ARGV[1]
14
+ password = ARGV[2]
15
+ share = ARGV[3]
16
+ file = ARGV[4]
17
+ data = ARGV[5]
18
+ smb_versions = ARGV[6]&.split(',') || ['1','2','3']
19
+
20
+ path = "\\\\#{address}\\#{share}"
19
21
 
20
22
  sock = TCPSocket.new address, 445
21
23
  dispatcher = RubySMB::Dispatcher::Socket.new(sock)
22
24
 
23
- client = RubySMB::Client.new(dispatcher, smb1: true, smb2: true, username: username, password: password)
25
+ client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
24
26
  protocol = client.negotiate
25
27
  status = client.authenticate
26
28
 
@@ -6,12 +6,12 @@
6
6
  require 'bundler/setup'
7
7
  require 'ruby_smb'
8
8
 
9
- def run_authentication(address, smb1, smb2, username, password)
9
+ def run_authentication(address, smb1, smb2, smb3, username, password)
10
10
  # Create our socket and add it to the dispatcher
11
11
  sock = TCPSocket.new address, 445
12
12
  dispatcher = RubySMB::Dispatcher::Socket.new(sock)
13
13
 
14
- client = RubySMB::Client.new(dispatcher, smb1: smb1, smb2: smb2, username: username, password: password)
14
+ client = RubySMB::Client.new(dispatcher, smb1: smb1, smb2: smb2, smb3: smb3, username: username, password: password)
15
15
  protocol = client.negotiate
16
16
  status = client.authenticate
17
17
  puts "#{protocol} : #{status}"
@@ -32,9 +32,13 @@ address = ARGV[0]
32
32
  username = ARGV[1]
33
33
  password = ARGV[2]
34
34
 
35
+ # Negotiate with SMB1, SMB2 and SMB3 enabled on the client
36
+ run_authentication(address, true, true, true, username, password)
35
37
  # Negotiate with both SMB1 and SMB2 enabled on the client
36
- run_authentication(address, true, true, username, password)
38
+ run_authentication(address, true, true, false, username, password)
37
39
  # Negotiate with only SMB1 enabled
38
- run_authentication(address, true, false, username, password)
40
+ run_authentication(address, true, false, false, username, password)
39
41
  # Negotiate with only SMB2 enabled
40
- run_authentication(address, false, true, username, password)
42
+ run_authentication(address, false, true, false, username, password)
43
+ # Negotiate with only SMB3 enabled
44
+ run_authentication(address, false, false, true, username, password)
@@ -9,17 +9,19 @@
9
9
  require 'bundler/setup'
10
10
  require 'ruby_smb'
11
11
 
12
- address = ARGV[0]
13
- username = ARGV[1]
14
- password = ARGV[2]
15
- share = ARGV[3]
16
- file = ARGV[4]
12
+ address = ARGV[0]
13
+ username = ARGV[1]
14
+ password = ARGV[2]
15
+ share = ARGV[3]
16
+ file = ARGV[4]
17
+ smb_versions = ARGV[5]&.split(',') || ['1','2','3']
18
+
17
19
  path = "\\\\#{address}\\#{share}"
18
20
 
19
21
  sock = TCPSocket.new address, 445
20
22
  dispatcher = RubySMB::Dispatcher::Socket.new(sock)
21
23
 
22
- client = RubySMB::Client.new(dispatcher, smb1: true, smb2: true, username: username, password: password)
24
+ client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
23
25
 
24
26
  protocol = client.negotiate
25
27
  status = client.authenticate
@@ -8,15 +8,16 @@
8
8
  require 'bundler/setup'
9
9
  require 'ruby_smb'
10
10
 
11
- address = ARGV[0]
12
- username = ARGV[1]
13
- password = ARGV[2]
11
+ address = ARGV[0]
12
+ username = ARGV[1]
13
+ password = ARGV[2]
14
14
  registry_key = ARGV[3]
15
+ smb_versions = ARGV[4]&.split(',') || ['1','2','3']
15
16
 
16
17
  sock = TCPSocket.new address, 445
17
18
  dispatcher = RubySMB::Dispatcher::Socket.new(sock, read_timeout: 60)
18
19
 
19
- client = RubySMB::Client.new(dispatcher, smb1: true, smb2: true, username: username, password: password)
20
+ client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
20
21
  protocol = client.negotiate
21
22
  status = client.authenticate
22
23
 
@@ -8,15 +8,16 @@
8
8
  require 'bundler/setup'
9
9
  require 'ruby_smb'
10
10
 
11
- address = ARGV[0]
12
- username = ARGV[1]
13
- password = ARGV[2]
11
+ address = ARGV[0]
12
+ username = ARGV[1]
13
+ password = ARGV[2]
14
14
  registry_key = ARGV[3]
15
+ smb_versions = ARGV[4]&.split(',') || ['1','2','3']
15
16
 
16
17
  sock = TCPSocket.new address, 445
17
18
  dispatcher = RubySMB::Dispatcher::Socket.new(sock, read_timeout: 60)
18
19
 
19
- client = RubySMB::Client.new(dispatcher, smb1: true, smb2: true, username: username, password: password)
20
+ client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
20
21
  protocol = client.negotiate
21
22
  status = client.authenticate
22
23
 
@@ -10,17 +10,19 @@
10
10
  require 'bundler/setup'
11
11
  require 'ruby_smb'
12
12
 
13
- address = ARGV[0]
14
- username = ARGV[1]
15
- password = ARGV[2]
16
- share = ARGV[3]
17
- dir = ARGV[4]
13
+ address = ARGV[0]
14
+ username = ARGV[1]
15
+ password = ARGV[2]
16
+ share = ARGV[3]
17
+ dir = ARGV[4]
18
+ smb_versions = ARGV[5]&.split(',') || ['1','2','3']
19
+
18
20
  path = "\\\\#{address}\\#{share}"
19
21
 
20
22
  sock = TCPSocket.new address, 445
21
23
  dispatcher = RubySMB::Dispatcher::Socket.new(sock)
22
24
 
23
- client = RubySMB::Client.new(dispatcher, smb1: true, smb2: true, username: username, password: password)
25
+ client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
24
26
  protocol = client.negotiate
25
27
  status = client.authenticate
26
28
 
@@ -7,18 +7,61 @@
7
7
  require 'bundler/setup'
8
8
  require 'ruby_smb'
9
9
 
10
- def run_negotiation(address, smb1, smb2)
10
+ def run_negotiation(address, smb1, smb2, smb3, opts = {})
11
11
  # Create our socket and add it to the dispatcher
12
12
  sock = TCPSocket.new address, 445
13
13
  dispatcher = RubySMB::Dispatcher::Socket.new(sock)
14
14
 
15
- client = RubySMB::Client.new(dispatcher, smb1: smb1, smb2: smb2, username: 'msfadmin', password: 'msfadmin')
15
+ client = RubySMB::Client.new(dispatcher, smb1: smb1, smb2: smb2, smb3: smb3, username: 'msfadmin', password: 'msfadmin')
16
16
  client.negotiate
17
17
  end
18
18
 
19
- # Negotiate with both SMB1 and SMB2 enabled on the client
20
- run_negotiation(ARGV[0], true, true)
21
- # Negotiate with only SMB1 enabled
22
- run_negotiation(ARGV[0], true, false)
23
- # Negotiate with only SMB2 enabled
24
- run_negotiation(ARGV[0], false, true)
19
+ begin
20
+ puts "Negotiate with only SMB1 enabled..."
21
+ puts " Negotiated version: #{run_negotiation(ARGV[0], true, false, false)}"
22
+ rescue RubySMB::Error::RubySMBError => e
23
+ puts "Error: #{e.message}"
24
+ end
25
+
26
+ begin
27
+ puts "Negotiate with only SMB2 enabled..."
28
+ puts " Negotiated version: #{run_negotiation(ARGV[0], false, true, false)}"
29
+ rescue RubySMB::Error::RubySMBError => e
30
+ puts "Error: #{e.message}"
31
+ end
32
+
33
+ begin
34
+ puts "Negotiate with only SMB3 enabled..."
35
+ puts " Negotiated version: #{run_negotiation(ARGV[0], false, false, true)}"
36
+ rescue RubySMB::Error::RubySMBError => e
37
+ puts "Error: #{e.message}"
38
+ end
39
+
40
+ begin
41
+ puts "Negotiate with both SMB1 and SMB2 enabled on the client..."
42
+ puts " Negotiated version: #{run_negotiation(ARGV[0], true, true, false)}"
43
+ rescue RubySMB::Error::RubySMBError => e
44
+ puts "Error: #{e.message}"
45
+ end
46
+
47
+ begin
48
+ puts "Negotiate with both SMB2 and SMB3 enabled on the client..."
49
+ puts " Negotiated version: #{run_negotiation(ARGV[0], false, true, true)}"
50
+ rescue RubySMB::Error::RubySMBError => e
51
+ puts "Error: #{e.message}"
52
+ end
53
+
54
+ begin
55
+ puts "Negotiate with both SMB1 and SMB3 enabled on the client..."
56
+ puts " Negotiated version: #{run_negotiation(ARGV[0], true, false, true)}"
57
+ rescue RubySMB::Error::RubySMBError => e
58
+ puts "Error: #{e.message}"
59
+ end
60
+
61
+ begin
62
+ puts "Negotiate with SMB1, SMB2 and SMB3 enabled on the client..."
63
+ puts " Negotiated version: #{run_negotiation(ARGV[0], true, true, true)}"
64
+ rescue RubySMB::Error::RubySMBError => e
65
+ puts "Error: #{e.message}"
66
+ end
67
+
@@ -9,11 +9,11 @@
9
9
  require 'bundler/setup'
10
10
  require 'ruby_smb'
11
11
 
12
- def run_negotiation(address, smb1, smb2, netbios_name)
12
+ def run_negotiation(address, smb1, smb2, smb3, netbios_name)
13
13
  sock = TCPSocket.new address, 139
14
14
  dispatcher = RubySMB::Dispatcher::Socket.new(sock)
15
15
 
16
- client = RubySMB::Client.new(dispatcher, smb1: smb1, smb2: smb2, username: 'msfadmin', password: 'msfadmin')
16
+ client = RubySMB::Client.new(dispatcher, smb1: smb1, smb2: smb2, smb3: smb3, username: 'msfadmin', password: 'msfadmin')
17
17
  begin
18
18
  client.session_request(netbios_name)
19
19
  rescue RubySMB::Error::NetBiosSessionService => e
@@ -28,9 +28,13 @@ end
28
28
  address = ARGV[0]
29
29
  netbios_name = ARGV[1] || '*SMBSERVER'
30
30
 
31
+ # Negotiate with SMB1, SMB2 and SMB3 enabled on the client
32
+ run_negotiation(ARGV[0], true, true, true, netbios_name)
31
33
  # Negotiate with both SMB1 and SMB2 enabled on the client
32
- run_negotiation(ARGV[0], true, true, netbios_name)
34
+ run_negotiation(ARGV[0], true, true, false, netbios_name)
33
35
  # Negotiate with only SMB1 enabled
34
- run_negotiation(ARGV[0], true, false, netbios_name)
36
+ run_negotiation(ARGV[0], true, false, false, netbios_name)
35
37
  # Negotiate with only SMB2 enabled
36
- run_negotiation(ARGV[0], false, true, netbios_name)
38
+ run_negotiation(ARGV[0], false, true, false, netbios_name)
39
+ # Negotiate with only SMB3 enabled
40
+ run_negotiation(ARGV[0], false, false, true, netbios_name)
@@ -8,15 +8,17 @@
8
8
  require 'bundler/setup'
9
9
  require 'ruby_smb'
10
10
 
11
- address = ARGV[0]
12
- username = ARGV[1]
13
- password = ARGV[2]
11
+ address = ARGV[0]
12
+ username = ARGV[1]
13
+ password = ARGV[2]
14
+ smb_versions = ARGV[3]&.split(',') || ['1','2','3']
15
+
14
16
  path = "\\\\#{address}\\IPC$"
15
17
 
16
18
  sock = TCPSocket.new address, 445
17
19
  dispatcher = RubySMB::Dispatcher::Socket.new(sock, read_timeout: 60)
18
20
 
19
- client = RubySMB::Client.new(dispatcher, smb1: true, smb2: true, username: username, password: password)
21
+ client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
20
22
  protocol = client.negotiate
21
23
  status = client.authenticate
22
24
 
@@ -10,25 +10,24 @@
10
10
  require 'bundler/setup'
11
11
  require 'ruby_smb'
12
12
 
13
- address = ARGV[0]
14
- pipename = ARGV[1]
15
- username = ARGV[2]
16
- password = ARGV[3]
17
- smbver = ARGV[4].to_i
13
+ address = ARGV[0]
14
+ pipename = ARGV[1]
15
+ username = ARGV[2]
16
+ password = ARGV[3]
17
+ smb_versions = ARGV[4]&.split(',') || ['1','2','3']
18
18
 
19
19
  sock = TCPSocket.new(address, 445)
20
20
  dispatcher = RubySMB::Dispatcher::Socket.new(sock)
21
21
 
22
- if smbver == 2
23
- client = RubySMB::Client.new(dispatcher, smb1: false, username: username, password: password)
24
- client.negotiate
22
+ client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
23
+ smbver = client.negotiate
24
+
25
+ if smbver == 'SMB1'
26
+ puts "ServerMaxBuffer: #{client.server_max_buffer_size}"
27
+ else
25
28
  puts "ServerMaxRead: #{client.server_max_read_size}"
26
29
  puts "ServerMaxWrite: #{client.server_max_write_size}"
27
30
  puts "ServerMaxTrans: #{client.server_max_transact_size}"
28
- elsif smbver == 1
29
- client = RubySMB::Client.new(dispatcher, smb2: false, username: username, password: password)
30
- client.negotiate
31
- puts "ServerMaxBuffer: #{client.server_max_buffer_size}"
32
31
  end
33
32
 
34
33
  client.authenticate
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/ruby
2
+
3
+ # This example script is used for testing remote service status and start type query.
4
+ # It will attempt to connect to a host and query the status and start type of the provided service.
5
+ # Example usage: ruby query_service_status.rb 192.168.172.138 msfadmin msfadmin "RemoteRegistry"
6
+ # This will try to connect to \\192.168.172.138 with the msfadmin:msfadmin credentialas and get the status and start type of the "RemoteRegistry" service.
7
+
8
+ require 'bundler/setup'
9
+ require 'ruby_smb'
10
+
11
+ address = ARGV[0]
12
+ username = ARGV[1]
13
+ password = ARGV[2]
14
+ service = ARGV[3]
15
+ smb_versions = ARGV[4]&.split(',') || ['1','2','3']
16
+
17
+ sock = TCPSocket.new address, 445
18
+ dispatcher = RubySMB::Dispatcher::Socket.new(sock, read_timeout: 60)
19
+
20
+ client = RubySMB::Client.new(dispatcher, smb1: smb_versions.include?('1'), smb2: smb_versions.include?('2'), smb3: smb_versions.include?('3'), username: username, password: password)
21
+ protocol = client.negotiate
22
+ status = client.authenticate
23
+
24
+ puts "#{protocol} : #{status}"
25
+
26
+ tree = client.tree_connect("\\\\#{address}\\IPC$")
27
+ svcctl = tree.open_file(filename: 'svcctl', write: true, read: true)
28
+
29
+ puts('Binding to \\svcctl...')
30
+ svcctl.bind(endpoint: RubySMB::Dcerpc::Svcctl)
31
+ puts('Bound to \\svcctl')
32
+
33
+ puts('Opening Service Control Manager')
34
+ scm_handle = svcctl.open_sc_manager_w(address)
35
+
36
+ svc_handle = svcctl.open_service_w(scm_handle, service)
37
+ svc_status = svcctl.query_service_status(svc_handle)
38
+
39
+ case svc_status.dw_current_state
40
+ when RubySMB::Dcerpc::Svcctl::SERVICE_RUNNING
41
+ puts("Service #{service} is running")
42
+ when RubySMB::Dcerpc::Svcctl::SERVICE_STOPPED
43
+ puts("Service #{service} is in stopped state")
44
+ end
45
+
46
+ svc_config = svcctl.query_service_config(svc_handle)
47
+ case svc_config.dw_start_type
48
+ when RubySMB::Dcerpc::Svcctl::SERVICE_DISABLED
49
+ puts("Service #{service} is disabled")
50
+ when RubySMB::Dcerpc::Svcctl::SERVICE_BOOT_START, RubySMB::Dcerpc::Svcctl::SERVICE_SYSTEM_START
51
+ puts("Service #{service} starts when the system boots up (driver)")
52
+ when RubySMB::Dcerpc::Svcctl::SERVICE_AUTO_START
53
+ puts("Service #{service} starts automatically during system startup")
54
+ when RubySMB::Dcerpc::Svcctl::SERVICE_DEMAND_START
55
+ puts("Service #{service} starts manually")
56
+ end
57
+
58
+ if svcctl
59
+ svcctl.close_service_handle(svc_handle) if svc_handle
60
+ svcctl.close_service_handle(scm_handle) if scm_handle
61
+ svcctl.close
62
+ end
63
+ client.disconnect!
64
+