ruby_smb 1.0.4 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) 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 -2
  5. data/Gemfile +6 -2
  6. data/README.md +35 -47
  7. data/examples/enum_registry_key.rb +28 -0
  8. data/examples/enum_registry_values.rb +30 -0
  9. data/examples/negotiate.rb +51 -8
  10. data/examples/pipes.rb +2 -1
  11. data/examples/read_file_encryption.rb +56 -0
  12. data/examples/read_registry_key_value.rb +32 -0
  13. data/lib/ruby_smb.rb +4 -1
  14. data/lib/ruby_smb/client.rb +207 -18
  15. data/lib/ruby_smb/client/authentication.rb +27 -8
  16. data/lib/ruby_smb/client/encryption.rb +62 -0
  17. data/lib/ruby_smb/client/negotiation.rb +153 -12
  18. data/lib/ruby_smb/client/signing.rb +19 -0
  19. data/lib/ruby_smb/client/tree_connect.rb +4 -4
  20. data/lib/ruby_smb/client/utils.rb +8 -7
  21. data/lib/ruby_smb/client/winreg.rb +46 -0
  22. data/lib/ruby_smb/crypto.rb +30 -0
  23. data/lib/ruby_smb/dcerpc.rb +38 -0
  24. data/lib/ruby_smb/dcerpc/bind.rb +2 -2
  25. data/lib/ruby_smb/dcerpc/bind_ack.rb +2 -2
  26. data/lib/ruby_smb/dcerpc/error.rb +3 -0
  27. data/lib/ruby_smb/dcerpc/ndr.rb +95 -16
  28. data/lib/ruby_smb/dcerpc/pdu_header.rb +1 -1
  29. data/lib/ruby_smb/dcerpc/request.rb +28 -9
  30. data/lib/ruby_smb/dcerpc/rrp_unicode_string.rb +35 -0
  31. data/lib/ruby_smb/dcerpc/srvsvc.rb +10 -0
  32. data/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all.rb +9 -0
  33. data/lib/ruby_smb/dcerpc/winreg.rb +340 -0
  34. data/lib/ruby_smb/dcerpc/winreg/close_key_request.rb +24 -0
  35. data/lib/ruby_smb/dcerpc/winreg/close_key_response.rb +27 -0
  36. data/lib/ruby_smb/dcerpc/winreg/enum_key_request.rb +45 -0
  37. data/lib/ruby_smb/dcerpc/winreg/enum_key_response.rb +42 -0
  38. data/lib/ruby_smb/dcerpc/winreg/enum_value_request.rb +39 -0
  39. data/lib/ruby_smb/dcerpc/winreg/enum_value_response.rb +36 -0
  40. data/lib/ruby_smb/dcerpc/winreg/open_key_request.rb +34 -0
  41. data/lib/ruby_smb/dcerpc/winreg/open_key_response.rb +25 -0
  42. data/lib/ruby_smb/dcerpc/winreg/open_root_key_request.rb +43 -0
  43. data/lib/ruby_smb/dcerpc/winreg/open_root_key_response.rb +35 -0
  44. data/lib/ruby_smb/dcerpc/winreg/query_info_key_request.rb +27 -0
  45. data/lib/ruby_smb/dcerpc/winreg/query_info_key_response.rb +40 -0
  46. data/lib/ruby_smb/dcerpc/winreg/query_value_request.rb +39 -0
  47. data/lib/ruby_smb/dcerpc/winreg/query_value_response.rb +57 -0
  48. data/lib/ruby_smb/dcerpc/winreg/regsam.rb +40 -0
  49. data/lib/ruby_smb/dispatcher/socket.rb +4 -3
  50. data/lib/ruby_smb/error.rb +28 -1
  51. data/lib/ruby_smb/smb1/commands.rb +1 -1
  52. data/lib/ruby_smb/smb1/file.rb +6 -4
  53. data/lib/ruby_smb/smb1/packet/empty_packet.rb +4 -2
  54. data/lib/ruby_smb/smb1/packet/session_setup_legacy_request.rb +1 -1
  55. data/lib/ruby_smb/smb1/packet/session_setup_legacy_response.rb +2 -2
  56. data/lib/ruby_smb/smb1/packet/session_setup_request.rb +1 -1
  57. data/lib/ruby_smb/smb1/packet/session_setup_response.rb +2 -2
  58. data/lib/ruby_smb/smb1/packet/write_andx_request.rb +1 -1
  59. data/lib/ruby_smb/smb1/pipe.rb +79 -3
  60. data/lib/ruby_smb/smb1/tree.rb +12 -3
  61. data/lib/ruby_smb/smb2/bit_field/session_flags.rb +2 -1
  62. data/lib/ruby_smb/smb2/bit_field/share_flags.rb +6 -4
  63. data/lib/ruby_smb/smb2/file.rb +25 -43
  64. data/lib/ruby_smb/smb2/negotiate_context.rb +108 -0
  65. data/lib/ruby_smb/smb2/packet.rb +2 -0
  66. data/lib/ruby_smb/smb2/packet/compression_transform_header.rb +41 -0
  67. data/lib/ruby_smb/smb2/packet/error_packet.rb +9 -4
  68. data/lib/ruby_smb/smb2/packet/negotiate_request.rb +51 -14
  69. data/lib/ruby_smb/smb2/packet/negotiate_response.rb +50 -4
  70. data/lib/ruby_smb/smb2/packet/transform_header.rb +84 -0
  71. data/lib/ruby_smb/smb2/packet/tree_connect_request.rb +92 -6
  72. data/lib/ruby_smb/smb2/packet/tree_connect_response.rb +8 -26
  73. data/lib/ruby_smb/smb2/pipe.rb +77 -3
  74. data/lib/ruby_smb/smb2/smb2_header.rb +1 -1
  75. data/lib/ruby_smb/smb2/tree.rb +23 -17
  76. data/lib/ruby_smb/version.rb +1 -1
  77. data/ruby_smb.gemspec +5 -3
  78. data/spec/lib/ruby_smb/client_spec.rb +1441 -61
  79. data/spec/lib/ruby_smb/crypto_spec.rb +25 -0
  80. data/spec/lib/ruby_smb/dcerpc/bind_ack_spec.rb +2 -2
  81. data/spec/lib/ruby_smb/dcerpc/bind_spec.rb +2 -2
  82. data/spec/lib/ruby_smb/dcerpc/ndr_spec.rb +410 -0
  83. data/spec/lib/ruby_smb/dcerpc/request_spec.rb +50 -7
  84. data/spec/lib/ruby_smb/dcerpc/rrp_unicode_string_spec.rb +98 -0
  85. data/spec/lib/ruby_smb/dcerpc/srvsvc/net_share_enum_all_spec.rb +13 -0
  86. data/spec/lib/ruby_smb/dcerpc/srvsvc_spec.rb +60 -0
  87. data/spec/lib/ruby_smb/dcerpc/winreg/close_key_request_spec.rb +28 -0
  88. data/spec/lib/ruby_smb/dcerpc/winreg/close_key_response_spec.rb +36 -0
  89. data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_request_spec.rb +108 -0
  90. data/spec/lib/ruby_smb/dcerpc/winreg/enum_key_response_spec.rb +97 -0
  91. data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_request_spec.rb +94 -0
  92. data/spec/lib/ruby_smb/dcerpc/winreg/enum_value_response_spec.rb +82 -0
  93. data/spec/lib/ruby_smb/dcerpc/winreg/open_key_request_spec.rb +74 -0
  94. data/spec/lib/ruby_smb/dcerpc/winreg/open_key_response_spec.rb +35 -0
  95. data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_request_spec.rb +90 -0
  96. data/spec/lib/ruby_smb/dcerpc/winreg/open_root_key_response_spec.rb +38 -0
  97. data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_request_spec.rb +39 -0
  98. data/spec/lib/ruby_smb/dcerpc/winreg/query_info_key_response_spec.rb +113 -0
  99. data/spec/lib/ruby_smb/dcerpc/winreg/query_value_request_spec.rb +88 -0
  100. data/spec/lib/ruby_smb/dcerpc/winreg/query_value_response_spec.rb +150 -0
  101. data/spec/lib/ruby_smb/dcerpc/winreg/regsam_spec.rb +32 -0
  102. data/spec/lib/ruby_smb/dcerpc/winreg_spec.rb +710 -0
  103. data/spec/lib/ruby_smb/dcerpc_spec.rb +81 -0
  104. data/spec/lib/ruby_smb/dispatcher/socket_spec.rb +2 -2
  105. data/spec/lib/ruby_smb/error_spec.rb +59 -0
  106. data/spec/lib/ruby_smb/smb1/file_spec.rb +9 -1
  107. data/spec/lib/ruby_smb/smb1/packet/empty_packet_spec.rb +10 -0
  108. data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_request_spec.rb +2 -2
  109. data/spec/lib/ruby_smb/smb1/packet/session_setup_legacy_response_spec.rb +2 -2
  110. data/spec/lib/ruby_smb/smb1/packet/session_setup_request_spec.rb +2 -2
  111. data/spec/lib/ruby_smb/smb1/packet/session_setup_response_spec.rb +1 -1
  112. data/spec/lib/ruby_smb/smb1/pipe_spec.rb +210 -148
  113. data/spec/lib/ruby_smb/smb2/bit_field/session_flags_spec.rb +9 -0
  114. data/spec/lib/ruby_smb/smb2/bit_field/share_flags_spec.rb +27 -0
  115. data/spec/lib/ruby_smb/smb2/file_spec.rb +86 -62
  116. data/spec/lib/ruby_smb/smb2/negotiate_context_spec.rb +332 -0
  117. data/spec/lib/ruby_smb/smb2/packet/compression_transform_header_spec.rb +108 -0
  118. data/spec/lib/ruby_smb/smb2/packet/error_packet_spec.rb +29 -2
  119. data/spec/lib/ruby_smb/smb2/packet/negotiate_request_spec.rb +138 -3
  120. data/spec/lib/ruby_smb/smb2/packet/negotiate_response_spec.rb +120 -2
  121. data/spec/lib/ruby_smb/smb2/packet/transform_header_spec.rb +220 -0
  122. data/spec/lib/ruby_smb/smb2/packet/tree_connect_request_spec.rb +339 -9
  123. data/spec/lib/ruby_smb/smb2/packet/tree_connect_response_spec.rb +3 -30
  124. data/spec/lib/ruby_smb/smb2/pipe_spec.rb +220 -149
  125. data/spec/lib/ruby_smb/smb2/smb2_header_spec.rb +2 -2
  126. data/spec/lib/ruby_smb/smb2/tree_spec.rb +53 -8
  127. metadata +187 -81
  128. metadata.gz.sig +0 -0
  129. data/lib/ruby_smb/smb1/dcerpc.rb +0 -72
  130. data/lib/ruby_smb/smb2/dcerpc.rb +0 -75
metadata.gz.sig CHANGED
Binary file
@@ -1,72 +0,0 @@
1
- module RubySMB
2
- module SMB1
3
- module Dcerpc
4
-
5
- def net_share_enum_all(host)
6
- bind(endpoint: RubySMB::Dcerpc::Srvsvc)
7
-
8
- response = request(RubySMB::Dcerpc::Srvsvc::NET_SHARE_ENUM_ALL, host: host)
9
-
10
- shares = RubySMB::Dcerpc::Srvsvc::NetShareEnumAll.parse_response(response.stub.to_binary_s)
11
- shares.map{|s|{name: s[0], type: s[1], comment: s[2]}}
12
- end
13
-
14
- def bind(options={})
15
- bind_req = RubySMB::Dcerpc::Bind.new(options)
16
- write(data: bind_req.to_binary_s)
17
- @size = 1024
18
- dcerpc_raw_response = read()
19
- begin
20
- dcerpc_response = RubySMB::Dcerpc::BindAck.read(dcerpc_raw_response)
21
- rescue IOError
22
- raise RubySMB::Dcerpc::Error::InvalidPacket, "Error reading the DCERPC response"
23
- end
24
- unless dcerpc_response.pdu_header.ptype == RubySMB::Dcerpc::PTypes::BIND_ACK
25
- raise RubySMB::Dcerpc::Error::BindError, "Not a BindAck packet"
26
- end
27
-
28
- res_list = dcerpc_response.p_result_list
29
- if res_list.n_results == 0 ||
30
- res_list.p_results[0].result != RubySMB::Dcerpc::BindAck::ACCEPTANCE
31
- raise RubySMB::Dcerpc::Error::BindError,
32
- "Bind Failed (Result: #{res_list.p_results[0].result}, Reason: #{res_list.p_results[0].reason})"
33
- end
34
- dcerpc_response
35
- end
36
-
37
- def request(opnum, options={})
38
- dcerpc_request = RubySMB::Dcerpc::Request.new({ :opnum => opnum }, options)
39
- request = RubySMB::SMB1::Packet::Trans::TransactNmpipeRequest.new(options)
40
- @tree.set_header_fields(request)
41
- request.set_fid(@fid)
42
- request.data_block.trans_data.write_data = dcerpc_request.to_binary_s
43
-
44
- trans_nmpipe_raw_response = @tree.client.send_recv(request)
45
- trans_nmpipe_response = RubySMB::SMB1::Packet::Trans::TransactNmpipeResponse.read(trans_nmpipe_raw_response)
46
- unless trans_nmpipe_response.valid?
47
- raise RubySMB::Error::InvalidPacket.new(
48
- expected_proto: RubySMB::SMB1::SMB_PROTOCOL_ID,
49
- expected_cmd: RubySMB::SMB1::Packet::Trans::TransactNmpipeResponse::COMMAND,
50
- received_proto: trans_nmpipe_response.smb_header.protocol,
51
- received_cmd: trans_nmpipe_response.smb_header.command
52
- )
53
- end
54
- unless trans_nmpipe_response.status_code == WindowsError::NTStatus::STATUS_SUCCESS
55
- raise RubySMB::Error::UnexpectedStatusCode, trans_nmpipe_response.status_code.name
56
- end
57
-
58
- begin
59
- dcerpc_response = RubySMB::Dcerpc::Response.read(trans_nmpipe_response.data_block.trans_data.read_data)
60
- rescue IOError
61
- raise RubySMB::Dcerpc::Error::InvalidPacket, "Error reading the DCERPC response"
62
- end
63
- unless dcerpc_response.pdu_header.ptype == RubySMB::Dcerpc::PTypes::RESPONSE
64
- raise RubySMB::Dcerpc::Error::InvalidPacket, "Not a Response packet"
65
- end
66
- dcerpc_response
67
- end
68
-
69
- end
70
- end
71
- end
72
-
@@ -1,75 +0,0 @@
1
- module RubySMB
2
- module SMB2
3
- module Dcerpc
4
-
5
- def net_share_enum_all(host)
6
- bind(endpoint: RubySMB::Dcerpc::Srvsvc)
7
-
8
- response = request(RubySMB::Dcerpc::Srvsvc::NET_SHARE_ENUM_ALL, host: host)
9
-
10
- shares = RubySMB::Dcerpc::Srvsvc::NetShareEnumAll.parse_response(response.stub.to_binary_s)
11
- shares.map{|s|{name: s[0], type: s[1], comment: s[2]}}
12
- end
13
-
14
- def bind(options={})
15
- bind_req = RubySMB::Dcerpc::Bind.new(options)
16
- write(data: bind_req.to_binary_s)
17
- @size = 1024
18
- dcerpc_raw_response = read()
19
- begin
20
- dcerpc_response = RubySMB::Dcerpc::BindAck.read(dcerpc_raw_response)
21
- rescue IOError
22
- raise RubySMB::Dcerpc::Error::InvalidPacket, "Error reading the DCERPC response"
23
- end
24
- unless dcerpc_response.pdu_header.ptype == RubySMB::Dcerpc::PTypes::BIND_ACK
25
- raise RubySMB::Dcerpc::Error::BindError, "Not a BindAck packet"
26
- end
27
-
28
- res_list = dcerpc_response.p_result_list
29
- if res_list.n_results == 0 ||
30
- res_list.p_results[0].result != RubySMB::Dcerpc::BindAck::ACCEPTANCE
31
- raise RubySMB::Dcerpc::Error::BindError,
32
- "Bind Failed (Result: #{res_list.p_results[0].result}, Reason: #{res_list.p_results[0].reason})"
33
- end
34
- dcerpc_response
35
- end
36
-
37
- def request(opnum, options={})
38
- dcerpc_request = RubySMB::Dcerpc::Request.new({ :opnum => opnum }, options)
39
- ioctl_response = ioctl_send_recv(dcerpc_request, options)
40
- begin
41
- dcerpc_response = RubySMB::Dcerpc::Response.read(ioctl_response.output_data)
42
- rescue IOError
43
- raise RubySMB::Dcerpc::Error::InvalidPacket, "Error reading the DCERPC response"
44
- end
45
- unless dcerpc_response.pdu_header.ptype == RubySMB::Dcerpc::PTypes::RESPONSE
46
- raise RubySMB::Dcerpc::Error::InvalidPacket, "Not a Response packet"
47
- end
48
- dcerpc_response
49
- end
50
-
51
- def ioctl_send_recv(action, options={})
52
- request = set_header_fields(RubySMB::SMB2::Packet::IoctlRequest.new(options))
53
- request.ctl_code = 0x0011C017
54
- request.flags.is_fsctl = 0x00000001
55
- request.buffer = action.to_binary_s
56
- ioctl_raw_response = @tree.client.send_recv(request)
57
- ioctl_response = RubySMB::SMB2::Packet::IoctlResponse.read(ioctl_raw_response)
58
- unless ioctl_response.valid?
59
- raise RubySMB::Error::InvalidPacket.new(
60
- expected_proto: RubySMB::SMB2::SMB2_PROTOCOL_ID,
61
- expected_cmd: RubySMB::SMB2::Packet::IoctlRequest::COMMAND,
62
- received_proto: ioctl_response.smb2_header.protocol,
63
- received_cmd: ioctl_response.smb2_header.command
64
- )
65
- end
66
- unless ioctl_response.status_code == WindowsError::NTStatus::STATUS_SUCCESS
67
- raise RubySMB::Error::UnexpectedStatusCode, ioctl_response.status_code.name
68
- end
69
- ioctl_response
70
- end
71
-
72
- end
73
- end
74
- end
75
-