smbRpc 0.0.3
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 +7 -0
- data/README.md +11 -0
- data/examples/enumLsa.rb +44 -0
- data/examples/enumSmbPipe.rb +16 -0
- data/lib/smbRpc.rb +33 -0
- data/lib/smbRpc/epmapper.rb +13 -0
- data/lib/smbRpc/epmapper/constants.rb +28 -0
- data/lib/smbRpc/epmapper/epmLookup.rb +98 -0
- data/lib/smbRpc/lsarpc.rb +22 -0
- data/lib/smbRpc/lsarpc/close.rb +48 -0
- data/lib/smbRpc/lsarpc/constants.rb +54 -0
- data/lib/smbRpc/lsarpc/enumerateAccounts.rb +55 -0
- data/lib/smbRpc/lsarpc/enumeratePrivilegesAccount.rb +49 -0
- data/lib/smbRpc/lsarpc/lookupNames.rb +74 -0
- data/lib/smbRpc/lsarpc/lookupPrivilegeName.rb +37 -0
- data/lib/smbRpc/lsarpc/lookupSids.rb +96 -0
- data/lib/smbRpc/lsarpc/openAccount.rb +49 -0
- data/lib/smbRpc/lsarpc/openPolicy.rb +52 -0
- data/lib/smbRpc/lsarpc/queryInformationPolicy.rb +92 -0
- data/lib/smbRpc/lsarpc/querySecurityObject.rb +75 -0
- data/lib/smbRpc/rpc.rb +5 -0
- data/lib/smbRpc/rpc/connection.rb +34 -0
- data/lib/smbRpc/rpc/constants.rb +64 -0
- data/lib/smbRpc/rpc/endpoints.rb +38 -0
- data/lib/smbRpc/rpc/ndrep.rb +24 -0
- data/lib/smbRpc/rpc/pdu.rb +40 -0
- data/lib/smbRpc/samr.rb +40 -0
- data/lib/smbRpc/samr/addMemberToAlias.rb +43 -0
- data/lib/smbRpc/samr/addMemberToGroup.rb +36 -0
- data/lib/smbRpc/samr/changePasswordUser.rb +64 -0
- data/lib/smbRpc/samr/closeHandle.rb +50 -0
- data/lib/smbRpc/samr/connect.rb +46 -0
- data/lib/smbRpc/samr/constants.rb +114 -0
- data/lib/smbRpc/samr/createAliasInDomain.rb +45 -0
- data/lib/smbRpc/samr/createGroupInDomain.rb +46 -0
- data/lib/smbRpc/samr/createUserInDomain.rb +48 -0
- data/lib/smbRpc/samr/deleteAlias.rb +35 -0
- data/lib/smbRpc/samr/deleteGroup.rb +35 -0
- data/lib/smbRpc/samr/deleteUser.rb +35 -0
- data/lib/smbRpc/samr/enumerateAliasesInDomain.rb +61 -0
- data/lib/smbRpc/samr/enumerateDomainsInSamServer.rb +52 -0
- data/lib/smbRpc/samr/enumerateGroupsInDomain.rb +60 -0
- data/lib/smbRpc/samr/enumerateUsersInDomain.rb +67 -0
- data/lib/smbRpc/samr/getMembersInAlias.rb +41 -0
- data/lib/smbRpc/samr/getMembersInGroup.rb +45 -0
- data/lib/smbRpc/samr/lookupDomainInSamServer.rb +41 -0
- data/lib/smbRpc/samr/lookupIdsInDomain.rb +52 -0
- data/lib/smbRpc/samr/lookupNamesInDomain.rb +55 -0
- data/lib/smbRpc/samr/openAlias.rb +39 -0
- data/lib/smbRpc/samr/openDomain.rb +48 -0
- data/lib/smbRpc/samr/openGroup.rb +39 -0
- data/lib/smbRpc/samr/openUser.rb +39 -0
- data/lib/smbRpc/samr/queryInformationUser.rb +182 -0
- data/lib/smbRpc/samr/removeMemberFromAlias.rb +43 -0
- data/lib/smbRpc/samr/removeMemberFromGroup.rb +34 -0
- data/lib/smbRpc/samr/setInformationUser.rb +53 -0
- data/lib/smbRpc/srvsvc.rb +12 -0
- data/lib/smbRpc/srvsvc/netShareEnum.rb +104 -0
- data/lib/smbRpc/srvsvc/serverGetInfo.rb +57 -0
- data/lib/smbRpc/svcctl.rb +20 -0
- data/lib/smbRpc/svcctl/closeService.rb +48 -0
- data/lib/smbRpc/svcctl/constants.rb +88 -0
- data/lib/smbRpc/svcctl/controlService.rb +48 -0
- data/lib/smbRpc/svcctl/createService.rb +68 -0
- data/lib/smbRpc/svcctl/deleteService.rb +31 -0
- data/lib/smbRpc/svcctl/enumServicesStatus.rb +96 -0
- data/lib/smbRpc/svcctl/openScm.rb +37 -0
- data/lib/smbRpc/svcctl/openService.rb +36 -0
- data/lib/smbRpc/svcctl/queryServiceConfig.rb +67 -0
- data/lib/smbRpc/svcctl/startService.rb +35 -0
- data/lib/smbRpc/updateRuby_smb.rb +3 -0
- data/lib/smbRpc/updateRuby_smb/client.rb +29 -0
- data/lib/smbRpc/updateRuby_smb/dcerpc.rb +30 -0
- data/lib/smbRpc/updateRuby_smb/ioctl_request.rb +53 -0
- data/lib/smbRpc/updateString.rb +3 -0
- data/lib/smbRpc/updateString/raise_not_error_success.rb +11 -0
- data/lib/smbRpc/updateString/to_des_ecb_lm.rb +34 -0
- data/smbRpc.gemspec +16 -0
- metadata +148 -0
@@ -0,0 +1,75 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Lsarpc < Rpc
|
3
|
+
|
4
|
+
class LsarQuerySecurityObjectReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :objectHandle, :length => 20
|
8
|
+
uint32 :securityInformation, :initial_value => 4 #1#7 #owner, group and DACL
|
9
|
+
|
10
|
+
def initialize_instance
|
11
|
+
super
|
12
|
+
objectHandle.value = get_parameter(:handle)
|
13
|
+
request.pduHead.frag_length = self.num_bytes
|
14
|
+
request.opnum.value = 3 #LsarQuerySecurityObject
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
#[MS-DTYPE] 2.4.4.1 ACE_HEADER
|
20
|
+
class Ace < BinData::Record
|
21
|
+
endian :little
|
22
|
+
uint8 :aceType
|
23
|
+
uint8 :aceFlags
|
24
|
+
uint16 :aceSize
|
25
|
+
string :content, :length => lambda { aceSize - 4 }
|
26
|
+
end
|
27
|
+
|
28
|
+
#[MS-DTYPE] 2.4.5 ACL
|
29
|
+
class Acl < BinData::Record
|
30
|
+
endian :little
|
31
|
+
uint8 :aclRevision
|
32
|
+
uint8 :sbz1 #alignment
|
33
|
+
uint16 :aclSize
|
34
|
+
uint16 :aceCount
|
35
|
+
uint16 :sbz2
|
36
|
+
array :aces, :type => :ace, :initial_length => :aceCount
|
37
|
+
end
|
38
|
+
|
39
|
+
class Lsapr_security_descriptor < BinData::Record
|
40
|
+
endian :little
|
41
|
+
uint8 :revision
|
42
|
+
uint8 :sbz1
|
43
|
+
uint16 :control
|
44
|
+
uint32 :ref_id_owner
|
45
|
+
uint32 :ref_id_group
|
46
|
+
uint32 :ref_id_sacl
|
47
|
+
uint32 :ref_id_dacl
|
48
|
+
acl :dacl
|
49
|
+
end
|
50
|
+
|
51
|
+
class Plsapr_sr_security_descriptor < BinData::Record
|
52
|
+
endian :little
|
53
|
+
uint32 :len
|
54
|
+
uint32 :ref_id_security
|
55
|
+
uint32 :secLen
|
56
|
+
lsapr_security_descriptor :securityDescriptor
|
57
|
+
end
|
58
|
+
|
59
|
+
class LsarQuerySecurityObjectRes < BinData::Record
|
60
|
+
endian :little
|
61
|
+
response :response
|
62
|
+
uint32 :ref_id_SecurityDescriptor
|
63
|
+
plsapr_sr_security_descriptor :securityDescriptor
|
64
|
+
uint32 :windowsError
|
65
|
+
end
|
66
|
+
|
67
|
+
def querySecurityObject(objectHandle:)
|
68
|
+
lsarQuerySecurityObjectReq = LsarQuerySecurityObjectReq.new(handle:objectHandle)
|
69
|
+
lsarQuerySecurityObjectRes = @file.ioctl_send_recv(lsarQuerySecurityObjectReq).buffer
|
70
|
+
lsarQuerySecurityObjectRes.raise_not_error_success("querySecurityObject")
|
71
|
+
lsarQuerySecurityObjectRes = LsarQuerySecurityObjectRes.read(lsarQuerySecurityObjectRes)
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
data/lib/smbRpc/rpc.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
|
2
|
+
module SmbRpc
|
3
|
+
class Rpc
|
4
|
+
|
5
|
+
attr_reader :smb
|
6
|
+
|
7
|
+
def initialize(ip:, port:445, user:"", pass:"")
|
8
|
+
@ip = ip
|
9
|
+
@port = port
|
10
|
+
@user = user
|
11
|
+
@pass = pass
|
12
|
+
end
|
13
|
+
|
14
|
+
def connect
|
15
|
+
sock = TCPSocket.open(@ip, @port)
|
16
|
+
dispatcher = RubySMB::Dispatcher::Socket.new(sock)
|
17
|
+
@smb = RubySMB::Client.new(dispatcher, smb1: true, smb2: true, username: @user, password: @pass)
|
18
|
+
result = @smb.login.value
|
19
|
+
error = WindowsError::NTStatus.find_by_retval(result.to_i)[0]
|
20
|
+
result == 0? result : (raise "Connect Fail, WinError: %s %s"%[error.name, error.description])
|
21
|
+
end
|
22
|
+
|
23
|
+
def bind(pipe:)
|
24
|
+
@ipc = @smb.tree_connect("\\\\#{@ip}\\IPC$")
|
25
|
+
@file = @ipc.open_file(filename: pipe, read: true, write: true)
|
26
|
+
@file.bind(endpoint: ENDPOINT[pipe]) #ruby_smb bind uses modules as endpoints, so setup and give it one
|
27
|
+
end
|
28
|
+
|
29
|
+
def close
|
30
|
+
@file.close if @file != nil
|
31
|
+
@smb.disconnect!
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
|
2
|
+
PFC_FIRST_FRAG = 0x01
|
3
|
+
PFC_LAST_FRAG = 0x02
|
4
|
+
PFC_PENDING_CANCEL = 0x04
|
5
|
+
PFC_RESERVED_1 = 0x08
|
6
|
+
PFC_CONC_MPX = 0x10
|
7
|
+
PFC_DID_NOT_EXECUTE = 0x20
|
8
|
+
PFC_MAYBE = 0x40
|
9
|
+
PFC_OBJECT_UUID = 0x80
|
10
|
+
|
11
|
+
P_CONT_DEF_RESULT_T = {
|
12
|
+
"ACCEPTANCE" => 0,
|
13
|
+
"USER_REJECTION" => 1,
|
14
|
+
"PROVIDER_REJECTION" => 2
|
15
|
+
}
|
16
|
+
P_PROVIDER_REASON_T = {
|
17
|
+
"REASON_NOT_SPECIFIED" => 0,
|
18
|
+
"ABSTRACT_SYNTAX_NOT_SUPPORTED" => 1,
|
19
|
+
"PROPOSED_TRANSFER_SYNTAXES_NOT_SUPPORTED" => 2,
|
20
|
+
"LOCAL_LIMIT_EXCEEDED" => 3
|
21
|
+
}
|
22
|
+
|
23
|
+
PDU_TYPE = {
|
24
|
+
"REQUEST" => 0,
|
25
|
+
"PING" => 1,
|
26
|
+
"RESPONSE" => 2,
|
27
|
+
"FAULT" => 3,
|
28
|
+
"WORKING" => 4,
|
29
|
+
"NOCALL" => 5,
|
30
|
+
"REJECT" => 6,
|
31
|
+
"ACK" => 7,
|
32
|
+
"CL_CANCEL" => 8,
|
33
|
+
"FACK" => 9,
|
34
|
+
"CANCEL_ACK" => 10,
|
35
|
+
"BIND" => 11,
|
36
|
+
"BIND_ACK" => 12,
|
37
|
+
"BIND_NAK" => 13,
|
38
|
+
"ALTER_CONTEXT" => 14,
|
39
|
+
"ALTER_CONTEXT_RESP" => 15,
|
40
|
+
"SHUTDOWN" => 17,
|
41
|
+
"CO_CANCEL" => 18,
|
42
|
+
"ORPHANED" => 19
|
43
|
+
}
|
44
|
+
|
45
|
+
#PDU Type Protocol Type Value
|
46
|
+
#request CO/CL 0
|
47
|
+
#ping CL 1
|
48
|
+
#response CO/CL 2
|
49
|
+
#fault CO/CL 3
|
50
|
+
#working CL 4
|
51
|
+
#nocall CL 5
|
52
|
+
#reject CL 6
|
53
|
+
#ack CL 7
|
54
|
+
#cl_cancel CL 8
|
55
|
+
#fack CL 9
|
56
|
+
#cancel_ack CL 10
|
57
|
+
#bind CO 11
|
58
|
+
#bind_ack CO 12
|
59
|
+
#bind_nak CO 13
|
60
|
+
#alter_context CO 14
|
61
|
+
#alter_context_resp CO 15
|
62
|
+
#shutdown CO 17
|
63
|
+
#co_cancel CO 18
|
64
|
+
#orphaned CO 19
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
module Endpoint
|
3
|
+
module Srvsvc
|
4
|
+
UUID = '4B324FC8-1670-01D3-1278-5A47BF6EE188'
|
5
|
+
VER_MAJOR = 3
|
6
|
+
VER_MINOR = 0
|
7
|
+
end
|
8
|
+
module Svcctl
|
9
|
+
UUID = '367ABB81-9844-35F1-AD32-98F038001003'
|
10
|
+
VER_MAJOR = 2
|
11
|
+
VER_MINOR = 0
|
12
|
+
end
|
13
|
+
module Lsarpc
|
14
|
+
UUID = '12345778-1234-ABCD-EF00-0123456789AB'
|
15
|
+
VER_MAJOR = 0
|
16
|
+
VER_MINOR = 0
|
17
|
+
end
|
18
|
+
module Epmapper
|
19
|
+
UUID = 'e1af8308-5d1f-11c9-91a4-08002b14a0fa'
|
20
|
+
VER_MAJOR = 3
|
21
|
+
VER_MINOR = 0
|
22
|
+
end
|
23
|
+
module Samr
|
24
|
+
UUID = '12345778-1234-ABCD-EF00-0123456789AC'
|
25
|
+
VER_MAJOR = 1
|
26
|
+
VER_MINOR = 0
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
ENDPOINT = {
|
32
|
+
"srvsvc" => SmbRpc::Endpoint::Srvsvc,
|
33
|
+
"svcctl" => SmbRpc::Endpoint::Svcctl,
|
34
|
+
"lsarpc" => SmbRpc::Endpoint::Lsarpc,
|
35
|
+
"epmapper" => SmbRpc::Endpoint::Epmapper,
|
36
|
+
"samr" => SmbRpc::Endpoint::Samr
|
37
|
+
}
|
38
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
module SmbRpc
|
3
|
+
class Rpc
|
4
|
+
|
5
|
+
class ConformantandVaryingStrings < BinData::Record
|
6
|
+
endian :little
|
7
|
+
uint32 :max_count, :initial_value => :actual_count
|
8
|
+
uint32 :offset
|
9
|
+
uint32 :actual_count, :value => lambda{ str.num_bytes / 2}
|
10
|
+
string :str, :read_length => lambda { actual_count.nonzero?? actual_count.value * 2 : 0 }
|
11
|
+
string :pad, :onlyif => lambda{ (str.num_bytes % 4) > 0 }, :length => lambda { (4 - (str.num_bytes % 4)) % 4 }
|
12
|
+
end
|
13
|
+
|
14
|
+
class ConformantandVaryingStringsAscii < BinData::Record
|
15
|
+
endian :little
|
16
|
+
uint32 :max_count, :initial_value => :actual_count
|
17
|
+
uint32 :offset
|
18
|
+
uint32 :actual_count, :value => lambda{ str.num_bytes }
|
19
|
+
string :str, :read_length => :actual_count
|
20
|
+
string :pad, :onlyif => lambda{ (str.num_bytes % 4) > 0}, :length => lambda { (4 - (str.num_bytes % 4)) % 4 }
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
|
2
|
+
module SmbRpc
|
3
|
+
class Rpc
|
4
|
+
class PduHead < BinData::Record
|
5
|
+
endian :little
|
6
|
+
uint8 :rpc_vers, :initial_value => 5
|
7
|
+
uint8 :rpc_vers_minor
|
8
|
+
uint8 :ptype #packet type
|
9
|
+
uint8 :pfc_flags, :initial_value => lambda{ PFC_FIRST_FRAG | PFC_LAST_FRAG } #flags (see PFC_... )
|
10
|
+
uint32 :drep, :initial_value => 0x10 #NDR data representation format label
|
11
|
+
uint16 :frag_length #total length of the PDU
|
12
|
+
uint16 :auth_length #length of auth_value
|
13
|
+
uint32 :call_id, :initial_value => 1 #call identifier for matching rewponse like smb msg ID
|
14
|
+
end
|
15
|
+
|
16
|
+
class Request < BinData::Record
|
17
|
+
endian :little
|
18
|
+
pduHead :pduHead
|
19
|
+
uint32 :alloc_hint
|
20
|
+
uint16 :p_cont_id
|
21
|
+
uint16 :opnum
|
22
|
+
string :auth_verifier, :onlyif => lambda { pduHead.auth_length > 0 }, :length => lambda { pduHead.auth_length }
|
23
|
+
|
24
|
+
def initialize_instance
|
25
|
+
super
|
26
|
+
pduHead.ptype = PDU_TYPE["REQUEST"]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class Response < BinData::Record
|
31
|
+
endian :little
|
32
|
+
pduHead :pduHead
|
33
|
+
uint32 :alloc_hint
|
34
|
+
uint16 :p_cont_id
|
35
|
+
uint8 :cancel_count
|
36
|
+
uint8 :reserved
|
37
|
+
string :auth_verifier, :onlyif => lambda { pduHead.auth_length > 0 }, :length => lambda { pduHead.auth_length }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/smbRpc/samr.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require"smbRpc/samr/connect"
|
2
|
+
require"smbRpc/samr/constants"
|
3
|
+
require"smbRpc/samr/openDomain"
|
4
|
+
require"smbRpc/samr/enumerateUsersInDomain"
|
5
|
+
require"smbRpc/samr/enumerateDomainsInSamServer"
|
6
|
+
require"smbRpc/samr/lookupDomainInSamServer"
|
7
|
+
require"smbRpc/samr/closeHandle"
|
8
|
+
require"smbRpc/samr/openUser"
|
9
|
+
require"smbRpc/samr/queryInformationUser"
|
10
|
+
require"smbRpc/samr/enumerateGroupsInDomain"
|
11
|
+
require"smbRpc/samr/enumerateAliasesInDomain"
|
12
|
+
require"smbRpc/samr/openAlias"
|
13
|
+
require"smbRpc/samr/getMembersInAlias"
|
14
|
+
require"smbRpc/samr/lookupNamesInDomain"
|
15
|
+
require"smbRpc/samr/lookupIdsInDomain"
|
16
|
+
require"smbRpc/samr/createUserInDomain"
|
17
|
+
require"smbRpc/samr/setInformationUser"
|
18
|
+
require"smbRpc/samr/deleteUser"
|
19
|
+
require"smbRpc/samr/changePasswordUser"
|
20
|
+
require"smbRpc/samr/createGroupInDomain"
|
21
|
+
require"smbRpc/samr/createAliasInDomain"
|
22
|
+
require"smbRpc/samr/deleteAlias"
|
23
|
+
require"smbRpc/samr/addMemberToAlias"
|
24
|
+
require"smbRpc/samr/getMembersInAlias"
|
25
|
+
require"smbRpc/samr/removeMemberFromAlias"
|
26
|
+
require"smbRpc/samr/openGroup"
|
27
|
+
require"smbRpc/samr/deleteGroup"
|
28
|
+
require"smbRpc/samr/addMemberToGroup"
|
29
|
+
require"smbRpc/samr/getMembersInGroup"
|
30
|
+
require"smbRpc/samr/removeMemberFromGroup"
|
31
|
+
|
32
|
+
module SmbRpc
|
33
|
+
class Samr < Rpc
|
34
|
+
def initialize(**argv)
|
35
|
+
super(argv)
|
36
|
+
self.connect
|
37
|
+
self.bind(pipe:"samr")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrAddMemberToAliasReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :aliasHandle, :length => 20
|
8
|
+
sid_element :memberId
|
9
|
+
|
10
|
+
def initialize_instance
|
11
|
+
super
|
12
|
+
aliasHandle.value = get_parameter(:handle)
|
13
|
+
sid = get_parameter(:sid)
|
14
|
+
sidArray = sid.split("-")
|
15
|
+
subAuthorityCount = sidArray.size - 3
|
16
|
+
memberId.sub_auth.value = subAuthorityCount
|
17
|
+
memberId.sid.revision.value = sidArray[1].to_i
|
18
|
+
memberId.sid.subAuthorityCount.value = subAuthorityCount
|
19
|
+
memberId.sid.identifierAuthority.value = [sidArray[2].to_i].pack("N").rjust(6, "\x00")
|
20
|
+
subAuthorityCount.times do |i|
|
21
|
+
memberId.sid.subAuthority[i] = sidArray[i + 3].to_i
|
22
|
+
end
|
23
|
+
request.pduHead.frag_length = self.num_bytes
|
24
|
+
request.opnum.value = 31 #SamrAddMemberToAlias
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class SamrAddMemberToAliasRes < BinData::Record
|
29
|
+
endian :little
|
30
|
+
response :response
|
31
|
+
uint32 :windowsError
|
32
|
+
end
|
33
|
+
|
34
|
+
def addMemberToAlias(memberId:)
|
35
|
+
samrAddMemberToAliasReq = SamrAddMemberToAliasReq.new(handle:@aliasHandle, sid:memberId)
|
36
|
+
samrAddMemberToAliasRes = @file.ioctl_send_recv(samrAddMemberToAliasReq).buffer
|
37
|
+
samrAddMemberToAliasRes.raise_not_error_success("addMemberToAlias")
|
38
|
+
return self
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrAddMemberToGroupReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :groupHandle, :length => 20
|
8
|
+
uint32 :memberId #addMemberToAlias use SID, why not here MS?
|
9
|
+
uint32 :attributes
|
10
|
+
|
11
|
+
def initialize_instance
|
12
|
+
super
|
13
|
+
groupHandle.value = get_parameter(:handle)
|
14
|
+
memberId.value = get_parameter(:rid)
|
15
|
+
attributes.value = get_parameter(:attr)
|
16
|
+
request.pduHead.frag_length = self.num_bytes
|
17
|
+
request.opnum.value = 22 #SamrAddMemberToGroup
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class SamrAddMemberToGroupRes < BinData::Record
|
22
|
+
endian :little
|
23
|
+
response :response
|
24
|
+
uint32 :windowsError
|
25
|
+
end
|
26
|
+
|
27
|
+
def addMemberToGroup(memberId:, attributes:SAMR_SE_GROUP_ATTRIBUTES["SE_GROUP_ENABLED_BY_DEFAULT"])
|
28
|
+
samrAddMemberToGroupReq = SamrAddMemberToGroupReq.new(handle:@groupHandle, rid:memberId, attr:attributes)
|
29
|
+
samrAddMemberToGroupRes = @file.ioctl_send_recv(samrAddMemberToGroupReq).buffer
|
30
|
+
samrAddMemberToGroupRes.raise_not_error_success("addMemberToGroup")
|
31
|
+
return self
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
@@ -0,0 +1,64 @@
|
|
1
|
+
|
2
|
+
module SmbRpc
|
3
|
+
class Samr < Rpc
|
4
|
+
|
5
|
+
class SamrChangePasswordUserReq < BinData::Record
|
6
|
+
endian :little
|
7
|
+
request :request
|
8
|
+
string :userHandle, :length => 20
|
9
|
+
|
10
|
+
uint32 :lmPresent, :value => 1
|
11
|
+
uint32 :ref_id_oldLmEncryptedWithNewLm, :value => 1
|
12
|
+
string :oldLmEncryptedWithNewLm, :length => 16
|
13
|
+
uint32 :ref_id_newLmEncryptedWithOldLm, :value => 1
|
14
|
+
string :newLmEncryptedWithOldLm, :length => 16
|
15
|
+
|
16
|
+
uint32 :ntPresent, :value => 1
|
17
|
+
uint32 :ref_id_oldNtEncryptedWithNewNt, :value => 1
|
18
|
+
string :oldNtEncryptedWithNewNt, :length => 16
|
19
|
+
uint32 :ref_id_newNtEncryptedWithOldNt, :value => 1
|
20
|
+
string :newNtEncryptedWithOldNt, :length => 16
|
21
|
+
|
22
|
+
uint32 :ntCrossEncryptionPresent, :value => 1
|
23
|
+
uint32 :ref_id_newNtEncryptedWithNewLm, :value => 1
|
24
|
+
string :newNtEncryptedWithNewLm, :length => 16
|
25
|
+
|
26
|
+
uint32 :lmCrossEncryptionPresent, :value => 1
|
27
|
+
uint32 :ref_id_newLmEncryptedWithNewNt, :value => 1
|
28
|
+
string :newLmEncryptedWithNewNt, :length => 16
|
29
|
+
|
30
|
+
def initialize_instance
|
31
|
+
super
|
32
|
+
userHandle.value = get_parameter(:handle)
|
33
|
+
oldPass = get_parameter(:oldPass)
|
34
|
+
newPass = get_parameter(:newPass)
|
35
|
+
oldLm = [Smbhash.lm_hash(oldPass)].pack("H*")
|
36
|
+
oldNt = [Smbhash.ntlm_hash(oldPass)].pack("H*")
|
37
|
+
newLm = [Smbhash.lm_hash(newPass)].pack("H*")
|
38
|
+
newNt = [Smbhash.ntlm_hash(newPass)].pack("H*")
|
39
|
+
oldLmEncryptedWithNewLm.value = oldLm.to_des_ecb_lm(newLm)
|
40
|
+
newLmEncryptedWithOldLm.value = newLm.to_des_ecb_lm(oldLm)
|
41
|
+
oldNtEncryptedWithNewNt.value = oldNt.to_des_ecb_lm(newNt)
|
42
|
+
newNtEncryptedWithOldNt.value = newNt.to_des_ecb_lm(oldNt)
|
43
|
+
newNtEncryptedWithNewLm.value = newNt.to_des_ecb_lm(newLm)
|
44
|
+
newLmEncryptedWithNewNt.value = newLm.to_des_ecb_lm(newNt)
|
45
|
+
request.pduHead.frag_length = self.num_bytes
|
46
|
+
request.opnum.value = 38 #SamrChangePasswordUser
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class SamrChangePasswordUserRes < BinData::Record
|
51
|
+
endian :little
|
52
|
+
request :request
|
53
|
+
uint32 :windowsError
|
54
|
+
end
|
55
|
+
|
56
|
+
def changePasswordUser(oldPass:, newPass:)
|
57
|
+
samrChangePasswordUserReq = SamrChangePasswordUserReq.new(handle:@userHandle, oldPass:oldPass, newPass:newPass)
|
58
|
+
samrChangePasswordUserRes = @file.ioctl_send_recv(samrChangePasswordUserReq).buffer
|
59
|
+
samrChangePasswordUserRes.raise_not_error_success("changePasswordUser")
|
60
|
+
return self
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|