ruby_smb 0.0.19 → 0.0.20
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.tar.gz.sig +0 -0
- data/README.md +16 -16
- data/lib/ruby_smb/client.rb +12 -5
- data/lib/ruby_smb/client/negotiation.rb +5 -10
- data/lib/ruby_smb/dispatcher/socket.rb +8 -1
- data/lib/ruby_smb/version.rb +1 -1
- metadata +2 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4dff3ea0843193837a2e7ca9f8f0ab4a7fd2eea
|
4
|
+
data.tar.gz: 7b8e7321255ff7da69f8aba3658c3f5f6769325e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 129e91974e7487ed551eb69506ecd7c7adb92a1b528b135a3bece8387fcb45acde5abde401475c03d469732a94dfd38aaa1f30b810acf641796e7860797b0b3c
|
7
|
+
data.tar.gz: 1233ed26721566ce8f86ea7e8eea3572b959251ae9db1faa6d1f84b324fc9c06a392c823b2551d2161972aaebb190920b465869e6bd97046ca67ec6dc4fb96db
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/README.md
CHANGED
@@ -8,10 +8,9 @@ A native Ruby implementation of the SMB Protocol Family. It currently supports
|
|
8
8
|
1. [[MS-SMB]](https://msdn.microsoft.com/en-us/library/cc246231.aspx)
|
9
9
|
1. [[MS-SMB2]](http://msdn.microsoft.com/en-us/library/cc246482.aspx)
|
10
10
|
|
11
|
-
This library currently include both a
|
12
|
-
SMB packets, or simply use the simple client to perform SMB operations.
|
11
|
+
This library currently include both a client level, and packet level support. A user can parse and manipulate raw SMB packets, or use the simple client to perform SMB operations.
|
13
12
|
|
14
|
-
See the Wiki for more information on this
|
13
|
+
See the Wiki for more information on this project's long-term goals, style guide, and developer tips.
|
15
14
|
|
16
15
|
## Installation
|
17
16
|
|
@@ -33,20 +32,21 @@ Or install it yourself as:
|
|
33
32
|
|
34
33
|
### Defining a packet
|
35
34
|
|
36
|
-
All packets are
|
37
|
-
|
35
|
+
All packets are implemented in a declarative style with BinData. Nested data
|
36
|
+
structures are used where appropriate to give users an easy method of adjusting
|
37
|
+
data.
|
38
38
|
|
39
39
|
#### SMB1
|
40
40
|
SMB1 Packets are made up of three basic components:
|
41
41
|
1. **The SMB Header** - This is a standard SMB Header. All SMB1 packets use the same SMB header.
|
42
|
-
1. **The Parameter Block** - This is where function parameters are passed across the wire in the packet. Parameter Blocks will always
|
42
|
+
1. **The Parameter Block** - This is where function parameters are passed across the wire in the packet. Parameter Blocks will always
|
43
43
|
have a 'Word Count' field that gives the size of the Parameter Block in words(2-bytes)
|
44
44
|
1. **The Data Block** - This is the data section of the packet. the Data Block will always have a 'byte count' field that gives the size of
|
45
45
|
the Data block in bytes.
|
46
|
-
|
46
|
+
|
47
47
|
The SMB Header can always just be declared as a field in the BinData DSL for the packet class, because its structure never changes.
|
48
48
|
For the ParameterBlock and DataBlocks, we always define subclasses for this particular packet. They inherit the 'Word Count' and
|
49
|
-
'Byte Count' fields, along with the auto-calculation routines for those fields, from their ancestors. Any other fields are then
|
49
|
+
'Byte Count' fields, along with the auto-calculation routines for those fields, from their ancestors. Any other fields are then
|
50
50
|
defined in our subclass before we start the DSL declarations for the packet.
|
51
51
|
|
52
52
|
Example:
|
@@ -165,7 +165,7 @@ Example:
|
|
165
165
|
|
166
166
|
#### Reading from a Binary Blob
|
167
167
|
|
168
|
-
Sometimes you need to read a binary blob and apply one of the packet structures to it.
|
168
|
+
Sometimes you need to read a binary blob and apply one of the packet structures to it.
|
169
169
|
For example, when you are reading a response packet off of the wire, you will need to read the raw response
|
170
170
|
string into an actual packet class. This is done using the #read class method.
|
171
171
|
|
@@ -230,7 +230,7 @@ Anonymous Example:
|
|
230
230
|
```ruby
|
231
231
|
sock = TCPSocket.new address, 445
|
232
232
|
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
233
|
-
|
233
|
+
|
234
234
|
client = RubySMB::Client.new(dispatcher, smb1: true, smb2: false, username: '', password: '')
|
235
235
|
client.negotiate
|
236
236
|
client.authenticate
|
@@ -238,7 +238,7 @@ Anonymous Example:
|
|
238
238
|
|
239
239
|
#### Connecting to a Tree
|
240
240
|
|
241
|
-
While there is one Client, that has branching code-paths for SMB1 and SMB2, once you connect to a
|
241
|
+
While there is one Client, that has branching code-paths for SMB1 and SMB2, once you connect to a
|
242
242
|
Tree you will be given a protocol specific Tree object. This Tree object will be responsible for all file operations
|
243
243
|
that are to be conducted on that Tree.
|
244
244
|
|
@@ -247,26 +247,26 @@ Example:
|
|
247
247
|
```ruby
|
248
248
|
sock = TCPSocket.new address, 445
|
249
249
|
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
250
|
-
|
250
|
+
|
251
251
|
client = RubySMB::Client.new(dispatcher, smb1: true, smb2: false, username: 'msfadmin', password: 'msfadmin')
|
252
252
|
client.negotiate
|
253
253
|
client.authenticate
|
254
|
-
|
254
|
+
|
255
255
|
begin
|
256
256
|
tree = client.tree_connect('TEST_SHARE')
|
257
257
|
puts "Connected to #{path} successfully!"
|
258
258
|
rescue StandardError => e
|
259
259
|
puts "Failed to connect to #{path}: #{e.message}"
|
260
260
|
end
|
261
|
-
|
261
|
+
|
262
262
|
files = tree.list(directory: 'subdir1')
|
263
|
-
|
263
|
+
|
264
264
|
files.each do |file|
|
265
265
|
create_time = file.create_time.to_datetime.to_s
|
266
266
|
access_time = file.last_access.to_datetime.to_s
|
267
267
|
change_time = file.last_change.to_datetime.to_s
|
268
268
|
file_name = file.file_name.encode("UTF-8")
|
269
|
-
|
269
|
+
|
270
270
|
puts "FILE: #{file_name}\n\tSIZE(BYTES):#{file.end_of_file}\n\tSIZE_ON_DISK(BYTES):#{file.allocation_size}\n\tCREATED:#{create_time}\n\tACCESSED:#{access_time}\n\tCHANGED:#{change_time}\n\n"
|
271
271
|
end
|
272
272
|
```
|
data/lib/ruby_smb/client.rb
CHANGED
@@ -146,12 +146,18 @@ module RubySMB
|
|
146
146
|
# @return [String]
|
147
147
|
attr_accessor :user_id
|
148
148
|
|
149
|
-
# The maximum size
|
150
|
-
#
|
149
|
+
# The maximum size SMB message that the Client accepts (in bytes)
|
150
|
+
# The default value is equal to {MAX_BUFFER_SIZE}.
|
151
151
|
# @!attribute [rw] max_buffer_size
|
152
152
|
# @return [Integer]
|
153
153
|
attr_accessor :max_buffer_size
|
154
154
|
|
155
|
+
# The maximum size SMB message that the Server accepts (in bytes)
|
156
|
+
# The default value is small by default
|
157
|
+
# @!attribute [rw] max_buffer_size
|
158
|
+
# @return [Integer]
|
159
|
+
attr_accessor :server_max_buffer_size
|
160
|
+
|
155
161
|
# @param dispatcher [RubySMB::Dispacther::Socket] the packet dispatcher to use
|
156
162
|
# @param smb1 [Boolean] whether or not to enable SMB1 support
|
157
163
|
# @param smb2 [Boolean] whether or not to enable SMB2 support
|
@@ -172,6 +178,7 @@ module RubySMB
|
|
172
178
|
@smb2 = smb2
|
173
179
|
@username = username.encode('utf-8') || ''.encode('utf-8')
|
174
180
|
@max_buffer_size = MAX_BUFFER_SIZE
|
181
|
+
@server_max_buffer_size = MAX_BUFFER_SIZE
|
175
182
|
|
176
183
|
negotiate_version_flag = 0x02000000
|
177
184
|
flags = Net::NTLM::Client::DEFAULT_FLAGS |
|
@@ -185,7 +192,7 @@ module RubySMB
|
|
185
192
|
domain: @domain,
|
186
193
|
flags: flags
|
187
194
|
)
|
188
|
-
|
195
|
+
|
189
196
|
@tree_connects = []
|
190
197
|
@open_files = {}
|
191
198
|
|
@@ -253,7 +260,7 @@ module RubySMB
|
|
253
260
|
flags = Net::NTLM::Client::DEFAULT_FLAGS |
|
254
261
|
Net::NTLM::FLAGS[:TARGET_INFO] |
|
255
262
|
negotiate_version_flag
|
256
|
-
|
263
|
+
|
257
264
|
@ntlm_client = Net::NTLM::Client.new(
|
258
265
|
@username,
|
259
266
|
@password,
|
@@ -334,7 +341,7 @@ module RubySMB
|
|
334
341
|
smb1_net_share_enum_all(host)
|
335
342
|
end
|
336
343
|
end
|
337
|
-
|
344
|
+
|
338
345
|
#
|
339
346
|
# SMB2 Methods
|
340
347
|
#
|
@@ -80,24 +80,19 @@ module RubySMB
|
|
80
80
|
when RubySMB::SMB1::Packet::NegotiateResponseExtended
|
81
81
|
self.smb1 = true
|
82
82
|
self.smb2 = false
|
83
|
-
|
84
|
-
self.signing_required = true
|
85
|
-
else
|
86
|
-
self.signing_required = false
|
87
|
-
end
|
83
|
+
self.signing_required = packet.parameter_block.security_mode.security_signatures_required == 1
|
88
84
|
self.dialect = packet.negotiated_dialect.to_s
|
85
|
+
self.server_max_buffer_size = packet.parameter_block.max_buffer_size
|
89
86
|
'SMB1'
|
90
87
|
when RubySMB::SMB2::Packet::NegotiateResponse
|
91
88
|
self.smb1 = false
|
92
89
|
self.smb2 = true
|
93
|
-
self.signing_required =
|
94
|
-
true
|
95
|
-
else
|
96
|
-
false
|
97
|
-
end
|
90
|
+
self.signing_required = packet.security_mode.signing_required == 1
|
98
91
|
self.dialect = "0x%04x" % packet.dialect_revision
|
92
|
+
self.server_max_buffer_size = 16644
|
99
93
|
'SMB2'
|
100
94
|
end
|
95
|
+
|
101
96
|
end
|
102
97
|
|
103
98
|
# Create a {RubySMB::SMB1::Packet::NegotiateRequest} packet with the
|
@@ -38,8 +38,15 @@ module RubySMB
|
|
38
38
|
bytes_written = 0
|
39
39
|
begin
|
40
40
|
while bytes_written < data.size
|
41
|
-
|
41
|
+
retval = @tcp_socket.write(data[bytes_written..-1])
|
42
|
+
|
43
|
+
if retval == nil
|
44
|
+
raise RubySMB::Error::CommunicationError
|
45
|
+
else
|
46
|
+
bytes_written += retval
|
47
|
+
end
|
42
48
|
end
|
49
|
+
|
43
50
|
rescue IOError, Errno::ECONNABORTED, Errno::ECONNRESET => e
|
44
51
|
raise RubySMB::Error::CommunicationError, "An error occured writing to the Socket: #{e.message}"
|
45
52
|
end
|
data/lib/ruby_smb/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_smb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.20
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Maloney
|
@@ -89,7 +89,7 @@ cert_chain:
|
|
89
89
|
G+Hmcg1v810agasPdoydE0RTVZgEOOMoQ07qu7JFXVWZ9ZQpHT7qJATWL/b2csFG
|
90
90
|
8mVuTXnyJOKRJA==
|
91
91
|
-----END CERTIFICATE-----
|
92
|
-
date: 2018-02-
|
92
|
+
date: 2018-02-22 00:00:00.000000000 Z
|
93
93
|
dependencies:
|
94
94
|
- !ruby/object:Gem::Dependency
|
95
95
|
name: redcarpet
|
metadata.gz.sig
CHANGED
Binary file
|