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,39 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrOpenAliasReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :domainHandle, :length => 20
|
8
|
+
uint32 :desiredAccess
|
9
|
+
uint32 :aliasId
|
10
|
+
|
11
|
+
def initialize_instance
|
12
|
+
super
|
13
|
+
domainHandle.value = get_parameter(:handle)
|
14
|
+
desiredAccess.value = get_parameter(:access)
|
15
|
+
aliasId.value = get_parameter(:aid)
|
16
|
+
request.pduHead.frag_length = self.num_bytes
|
17
|
+
request.opnum.value = 27 #SamrOpenAlias
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class SamrOpenAliasRes < BinData::Record
|
22
|
+
endian :little
|
23
|
+
request :request
|
24
|
+
string :aliasHandle, :length => 20
|
25
|
+
uint32 :windowsError
|
26
|
+
end
|
27
|
+
|
28
|
+
def openAlias(aliasId:, desiredAccess:SAMR_COMMON_ACCESS_MASK["MAXIMUM_ALLOWED"])
|
29
|
+
samrOpenAliasReq = SamrOpenAliasReq.new(aid:aliasId, access:desiredAccess, handle:@domainHandle)
|
30
|
+
samrOpenAliasRes = @file.ioctl_send_recv(samrOpenAliasReq).buffer
|
31
|
+
samrOpenAliasRes.raise_not_error_success("openAlias")
|
32
|
+
samrOpenAliasRes = SamrOpenAliasRes.read(samrOpenAliasRes)
|
33
|
+
@aliasHandle = samrOpenAliasRes.aliasHandle
|
34
|
+
return self
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrOpenDomainReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :serverHandle, :length => 20
|
8
|
+
uint32 :desiredAccess
|
9
|
+
sid_element :domainId #declared in lsarpc/lsaEnumerateAccounts.rb
|
10
|
+
|
11
|
+
def initialize_instance
|
12
|
+
super
|
13
|
+
serverHandle.value = get_parameter(:handle)
|
14
|
+
desiredAccess.value = get_parameter(:access)
|
15
|
+
sid = get_parameter(:sid)
|
16
|
+
sidArray = sid.split("-")
|
17
|
+
subAuthorityCount = sidArray.size - 3
|
18
|
+
domainId.sub_auth.value = subAuthorityCount
|
19
|
+
domainId.sid.revision.value = sidArray[1].to_i
|
20
|
+
domainId.sid.subAuthorityCount.value = subAuthorityCount
|
21
|
+
domainId.sid.identifierAuthority.value = [sidArray[2].to_i].pack("N").rjust(6, "\x00")
|
22
|
+
subAuthorityCount.times do |i|
|
23
|
+
domainId.sid.subAuthority[i] = sidArray[i + 3].to_i
|
24
|
+
end
|
25
|
+
request.pduHead.frag_length = self.num_bytes
|
26
|
+
request.opnum.value = 7 #SamrOpenDomain
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class SamrOpenDomainRes < BinData::Record
|
31
|
+
endian :little
|
32
|
+
request :request
|
33
|
+
string :domainHandle, :length => 20
|
34
|
+
uint32 :windowsError
|
35
|
+
end
|
36
|
+
|
37
|
+
def openDomain(domainSid:, desiredAccess:SAMR_COMMON_ACCESS_MASK["MAXIMUM_ALLOWED"])
|
38
|
+
samrOpenDomainReq = SamrOpenDomainReq.new(sid:domainSid, access:desiredAccess, handle:@serverHandle)
|
39
|
+
samrOpenDomainRes = @file.ioctl_send_recv(samrOpenDomainReq).buffer
|
40
|
+
samrOpenDomainRes.raise_not_error_success("openDomain")
|
41
|
+
samrOpenDomainRes = SamrOpenDomainRes.read(samrOpenDomainRes)
|
42
|
+
@domainHandle = samrOpenDomainRes.domainHandle
|
43
|
+
return self
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrOpenGroupReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :domainHandle, :length => 20
|
8
|
+
uint32 :desiredAccess
|
9
|
+
uint32 :groupId
|
10
|
+
|
11
|
+
def initialize_instance
|
12
|
+
super
|
13
|
+
domainHandle.value = get_parameter(:handle)
|
14
|
+
desiredAccess.value = get_parameter(:access)
|
15
|
+
groupId.value = get_parameter(:gid)
|
16
|
+
request.pduHead.frag_length = self.num_bytes
|
17
|
+
request.opnum.value = 19 #SamrOpenGroup
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class SamrOpenGroupRes < BinData::Record
|
22
|
+
endian :little
|
23
|
+
request :request
|
24
|
+
string :groupHandle, :length => 20
|
25
|
+
uint32 :windowsError
|
26
|
+
end
|
27
|
+
|
28
|
+
def openGroup(groupId:, desiredAccess:SAMR_COMMON_ACCESS_MASK["MAXIMUM_ALLOWED"])
|
29
|
+
samrOpenGroupReq = SamrOpenGroupReq.new(gid:groupId, access:desiredAccess, handle:@domainHandle)
|
30
|
+
samrOpenGroupRes = @file.ioctl_send_recv(samrOpenGroupReq).buffer
|
31
|
+
samrOpenGroupRes.raise_not_error_success("openGroup")
|
32
|
+
samrOpenGroupRes = SamrOpenGroupRes.read(samrOpenGroupRes)
|
33
|
+
@groupHandle = samrOpenGroupRes.groupHandle
|
34
|
+
return self
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrOpenUserReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :domainHandle, :length => 20
|
8
|
+
uint32 :desiredAccess
|
9
|
+
uint32 :userId
|
10
|
+
|
11
|
+
def initialize_instance
|
12
|
+
super
|
13
|
+
domainHandle.value = get_parameter(:handle)
|
14
|
+
desiredAccess.value = get_parameter(:access)
|
15
|
+
userId.value = get_parameter(:uid)
|
16
|
+
request.pduHead.frag_length = self.num_bytes
|
17
|
+
request.opnum.value = 34 #SamrOpenUser
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class SamrOpenUserRes < BinData::Record
|
22
|
+
endian :little
|
23
|
+
request :request
|
24
|
+
string :userHandle, :length => 20
|
25
|
+
uint32 :windowsError
|
26
|
+
end
|
27
|
+
|
28
|
+
def openUser(userId:, desiredAccess:SAMR_COMMON_ACCESS_MASK["MAXIMUM_ALLOWED"])
|
29
|
+
samrOpenUserReq = SamrOpenUserReq.new(uid:userId, access:desiredAccess, handle:@domainHandle)
|
30
|
+
samrOpenUserRes = @file.ioctl_send_recv(samrOpenUserReq).buffer
|
31
|
+
samrOpenUserRes.raise_not_error_success("openUser")
|
32
|
+
samrOpenUserRes = SamrOpenUserRes.read(samrOpenUserRes)
|
33
|
+
@userHandle = samrOpenUserRes.userHandle
|
34
|
+
return self
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,182 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrQueryInformationUser2Req < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :userHandle, :length => 20
|
8
|
+
uint16 :userInformationClass, :value => 21 #18, 23, 24, 25, 26 will return STATUS_INVALID_INFO_CLASS
|
9
|
+
#21 works but not returning passwords related fileds. Others are just sub set of 21
|
10
|
+
def initialize_instance
|
11
|
+
super
|
12
|
+
userHandle.value = get_parameter(:handle)
|
13
|
+
request.pduHead.frag_length = self.num_bytes
|
14
|
+
request.opnum.value = 47 #SamrQueryInformationUser2
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
#MS-SAMR 2.2.7.5 SAMPR_LOGON_HOURS
|
19
|
+
class Sampr_logon_hours < BinData::Record
|
20
|
+
endian :little
|
21
|
+
uint32 :unitsPerWeek
|
22
|
+
uint32 :ref_id_logonHours
|
23
|
+
end
|
24
|
+
|
25
|
+
#MS-SAMR 2.2.7.6 SAMPR_USER_ALL_INFORMATION
|
26
|
+
class Sampr_user_all_information < BinData::Record
|
27
|
+
endian :little
|
28
|
+
|
29
|
+
uint64 :lastLogon
|
30
|
+
uint64 :lastLogoff
|
31
|
+
uint64 :passwordLastSet
|
32
|
+
uint64 :accountExpires
|
33
|
+
uint64 :passwordCanChange
|
34
|
+
uint64 :passwordMustChange
|
35
|
+
|
36
|
+
rpc_unicode_string :userName
|
37
|
+
rpc_unicode_string :fullName
|
38
|
+
rpc_unicode_string :homeDirectory
|
39
|
+
rpc_unicode_string :homeDirectoryDrive
|
40
|
+
rpc_unicode_string :scriptPath
|
41
|
+
rpc_unicode_string :profilePath
|
42
|
+
rpc_unicode_string :adminComment
|
43
|
+
rpc_unicode_string :workStations
|
44
|
+
rpc_unicode_string :userComment
|
45
|
+
rpc_unicode_string :parameters
|
46
|
+
rpc_unicode_string :lmOwfPassword
|
47
|
+
rpc_unicode_string :ntOwfPassword
|
48
|
+
rpc_unicode_string :privateData
|
49
|
+
|
50
|
+
uint32 :numberOfsecurityDescriptor #not used
|
51
|
+
uint32 :securityDescriptor #not used
|
52
|
+
|
53
|
+
uint32 :userId
|
54
|
+
uint32 :primaryGroupId
|
55
|
+
uint32 :userAccountControl
|
56
|
+
|
57
|
+
# uint32 :whichFields #control which which filed to ignire (aka Ndr field) see MS-SAMR 2.2.1.8 USER_ALL Values
|
58
|
+
struct :whichFields do
|
59
|
+
endian :little
|
60
|
+
|
61
|
+
#reverse bit order in each byte to maintain little endian
|
62
|
+
bit1 :homeDirectoryDrive
|
63
|
+
bit1 :homeDirectory
|
64
|
+
bit1 :userComment
|
65
|
+
bit1 :adminComment
|
66
|
+
|
67
|
+
bit1 :primaryGroupid
|
68
|
+
bit1 :userId
|
69
|
+
bit1 :fullName
|
70
|
+
bit1 :userName
|
71
|
+
#
|
72
|
+
bit1 :logonCount
|
73
|
+
bit1 :badPasswordCount
|
74
|
+
bit1 :logonHours
|
75
|
+
bit1 :lastLogoff
|
76
|
+
|
77
|
+
bit1 :lastLogon
|
78
|
+
bit1 :workStations
|
79
|
+
bit1 :profilePath
|
80
|
+
bit1 :scriptPath
|
81
|
+
#
|
82
|
+
bit1 :codePage
|
83
|
+
bit1 :countryCode
|
84
|
+
bit1 :parameters
|
85
|
+
bit1 :userAccountControl
|
86
|
+
|
87
|
+
bit1 :accountExpires
|
88
|
+
bit1 :passwordLastSet
|
89
|
+
bit1 :passwordMustChange
|
90
|
+
bit1 :passwordCanChange
|
91
|
+
#
|
92
|
+
bit3 :undefined
|
93
|
+
bit1 :securityDescriptor
|
94
|
+
bit1 :passwordExpired
|
95
|
+
bit1 :privateData
|
96
|
+
bit1 :lmPasswordPresent #not set -> ignore lmPasswordPresent filed
|
97
|
+
bit1 :ntPasswordPresent #not set -> ignore ntPasswordPresent filed
|
98
|
+
end
|
99
|
+
|
100
|
+
sampr_logon_hours :logonHours
|
101
|
+
uint16 :badPasswordCount
|
102
|
+
uint16 :logonCount
|
103
|
+
uint16 :countryCode
|
104
|
+
uint16 :codePage
|
105
|
+
|
106
|
+
uint8 :lmPasswordPresent #0 if ignore lmOwfPassword
|
107
|
+
uint8 :ntPasswordPresent #0 if ignore ntOwfPassword
|
108
|
+
uint8 :passwordExpired
|
109
|
+
uint8 :privateDataSensitive #not used
|
110
|
+
#Ndr
|
111
|
+
conformantandVaryingStrings :userNameNdr, :onlyif => lambda { userName.ref_id_buffer > 0 } #if ref pointer is not null, then Ndr should be present
|
112
|
+
conformantandVaryingStrings :fullNameNdr, :onlyif => lambda { fullName.ref_id_buffer > 0 } #just because the filed is ignored according to whichFileds,
|
113
|
+
#doesn't mean Ndr doesnt exist
|
114
|
+
conformantandVaryingStrings :homeDirectoryNdr, :onlyif => lambda { homeDirectory.ref_id_buffer > 0 }
|
115
|
+
conformantandVaryingStrings :homeDirectoryDriveNdr, :onlyif => lambda { homeDirectoryDrive.ref_id_buffer > 0 }
|
116
|
+
conformantandVaryingStrings :scriptPathNdr, :onlyif => lambda { scriptPath.ref_id_buffer > 0 }
|
117
|
+
conformantandVaryingStrings :profilePathNdr, :onlyif => lambda { profilePath.ref_id_buffer > 0 }
|
118
|
+
conformantandVaryingStrings :adminCommentNdr, :onlyif => lambda { adminComment.ref_id_buffer > 0 }
|
119
|
+
conformantandVaryingStrings :workStationsNdr, :onlyif => lambda { workStations.ref_id_buffer > 0 }
|
120
|
+
conformantandVaryingStrings :userCommentNdr, :onlyif => lambda { userComment.ref_id_buffer > 0 }
|
121
|
+
conformantandVaryingStrings :parametersNdr, :onlyif => lambda { parameters.ref_id_buffer > 0 }
|
122
|
+
conformantandVaryingStrings :lmOwfPasswordNdr, :onlyif => lambda { lmOwfPassword.ref_id_buffer > 0 }
|
123
|
+
conformantandVaryingStrings :ntOwfPasswordNdr, :onlyif => lambda { ntOwfPassword.ref_id_buffer > 0 }
|
124
|
+
conformantandVaryingStrings :privateDataNdr, :onlyif => lambda { privateData.ref_id_buffer > 0 }
|
125
|
+
conformantandVaryingStringsAscii :logonHoursNdr, :onlyif => lambda { logonHours.ref_id_logonHours > 0 }
|
126
|
+
end
|
127
|
+
|
128
|
+
class SamrQueryInformationUser2Res < BinData::Record
|
129
|
+
endian :little
|
130
|
+
request :request
|
131
|
+
uint32 :ref_id_buffer
|
132
|
+
uint32 :switch
|
133
|
+
sampr_user_all_information :buffer
|
134
|
+
uint32 :windowsError
|
135
|
+
end
|
136
|
+
|
137
|
+
def queryInformationUser
|
138
|
+
samrQueryInformationUser2Req = SamrQueryInformationUser2Req.new(handle:@userHandle)
|
139
|
+
samrQueryInformationUser2Res = @file.ioctl_send_recv(samrQueryInformationUser2Req).buffer
|
140
|
+
samrQueryInformationUser2Res.raise_not_error_success("QueryInformationUser")
|
141
|
+
samrQueryInformationUser2Res = SamrQueryInformationUser2Res.read(samrQueryInformationUser2Res)
|
142
|
+
buffer = samrQueryInformationUser2Res.buffer
|
143
|
+
h = {
|
144
|
+
:rid => buffer.userId,
|
145
|
+
:gid => buffer.primaryGroupId,
|
146
|
+
:lastLogon => buffer.lastLogon,
|
147
|
+
:lastLogoff => buffer.lastLogoff,
|
148
|
+
:unitsPerWeek => buffer.logonHours.unitsPerWeek,
|
149
|
+
:badPasswordCount => buffer.badPasswordCount,
|
150
|
+
:logonCount => buffer.logonCount,
|
151
|
+
:passwordLastSet => buffer.passwordLastSet,
|
152
|
+
:passwordCanChange => buffer.passwordCanChange,
|
153
|
+
:passwordMustChange => buffer.passwordMustChange,
|
154
|
+
:accountExpires => buffer.accountExpires,
|
155
|
+
:userAccountControl => buffer.userAccountControl,
|
156
|
+
:whichFields => buffer.whichFields,
|
157
|
+
:countryCode => buffer.countryCode,
|
158
|
+
:codePage => buffer.codePage,
|
159
|
+
:lmPasswordPresent => buffer.lmPasswordPresent,
|
160
|
+
:ntPasswordPresent => buffer.ntPasswordPresent,
|
161
|
+
:passwordExpired => buffer.passwordExpired
|
162
|
+
}
|
163
|
+
h[:userName] = buffer.userNameNdr.str.unpack("v*").pack("c*") if buffer.userName.ref_id_buffer > 0
|
164
|
+
h[:fullName] = buffer.fullNameNdr.str.unpack("v*").pack("c*") if buffer.fullName.ref_id_buffer > 0
|
165
|
+
h[:homeDirectory] = buffer.homeDirectoryNdr.str.unpack("v*").pack("c*") if buffer.homeDirectory.ref_id_buffer > 0
|
166
|
+
h[:homeDirectoryDrive] = buffer.homeDirectoryDriveNdr.str.unpack("v*").pack("c*") if buffer.homeDirectoryDrive.ref_id_buffer > 0
|
167
|
+
h[:scriptPath] = buffer.scriptPathNdr.str.unpack("v*").pack("c*") if buffer.scriptPath.ref_id_buffer > 0
|
168
|
+
h[:profilePath] = buffer.profilePathNdr.str.unpack("v*").pack("c*") if buffer.profilePath.ref_id_buffer > 0
|
169
|
+
h[:adminComment] = buffer.adminCommentNdr.str.unpack("v*").pack("c*") if buffer.adminComment.ref_id_buffer > 0
|
170
|
+
h[:userComment] = buffer.userCommentNdr.str.unpack("v*").pack("c*") if buffer.userComment.ref_id_buffer > 0
|
171
|
+
h[:workStations] = buffer.workStationsNdr.str.unpack("v*").pack("c*") if buffer.workStations.ref_id_buffer > 0
|
172
|
+
h[:parameters] = buffer.parametersNdr.str.unpack("v*").pack("c*") if buffer.parameters.ref_id_buffer > 0
|
173
|
+
h[:logonHours] = buffer.logonHoursNdr.str if buffer.logonHours.ref_id_logonHours > 0
|
174
|
+
h[:privateData] = buffer.privateDataNdr.str if buffer.privateData.ref_id_buffer > 0
|
175
|
+
h[:lmOwfPassword] = buffer.lmOwfPasswordNdr.str if buffer.lmOwfPassword.ref_id_buffer > 0
|
176
|
+
h[:ntOwfPassword] = buffer.ntOwfPasswordNdr.str if buffer.ntOwfPassword.ref_id_buffer > 0
|
177
|
+
return h
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrRemoveMemberFromAliasReq < 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 = 32 #SamrRemoveMemberFromAlias
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class SamrRemoveMemberFromAliasRes < BinData::Record
|
29
|
+
endian :little
|
30
|
+
response :response
|
31
|
+
uint32 :windowsError
|
32
|
+
end
|
33
|
+
|
34
|
+
def removeMemberFromAlias(memberId:)
|
35
|
+
samrRemoveMemberFromAliasReq = SamrRemoveMemberFromAliasReq.new(handle:@aliasHandle, sid:memberId)
|
36
|
+
samrRemoveMemberFromAliasRes = @file.ioctl_send_recv(samrRemoveMemberFromAliasReq).buffer
|
37
|
+
samrRemoveMemberFromAliasRes.raise_not_error_success("removeMemberFromAlias")
|
38
|
+
return self
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrRemoveMemberFromGroupReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :groupHandle, :length => 20
|
8
|
+
uint32 :memberId #what happen to consistency MS?(removeMemberFromAlias)
|
9
|
+
|
10
|
+
def initialize_instance
|
11
|
+
super
|
12
|
+
groupHandle.value = get_parameter(:handle)
|
13
|
+
memberId.value = get_parameter(:rid)
|
14
|
+
request.pduHead.frag_length = self.num_bytes
|
15
|
+
request.opnum.value = 24 #SamrRemoveMemberFromGroup
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class SamrRemoveMemberFromGroupRes < BinData::Record
|
20
|
+
endian :little
|
21
|
+
response :response
|
22
|
+
uint32 :windowsError
|
23
|
+
end
|
24
|
+
|
25
|
+
def removeMemberFromGroup(memberId:)
|
26
|
+
samrRemoveMemberFromGroupReq = SamrRemoveMemberFromGroupReq.new(handle:@groupHandle, rid:memberId)
|
27
|
+
samrRemoveMemberFromGroupRes = @file.ioctl_send_recv(samrRemoveMemberFromGroupReq).buffer
|
28
|
+
samrRemoveMemberFromGroupRes.raise_not_error_success("removeMemberFromGroup")
|
29
|
+
return self
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
|
2
|
+
module SmbRpc
|
3
|
+
class Samr < Rpc
|
4
|
+
|
5
|
+
class SamrSetInformationUser2Req < BinData::Record
|
6
|
+
endian :little
|
7
|
+
request :request
|
8
|
+
string :userHandle, :length => 20
|
9
|
+
uint16 :userInformationClass, :value => 21 #UserAllInformation
|
10
|
+
uint16 :switch, :value => :userInformationClass #declared in samr/queryInformationUser.rb
|
11
|
+
sampr_user_all_information :buffer
|
12
|
+
|
13
|
+
def initialize_instance
|
14
|
+
super
|
15
|
+
userHandle.value = get_parameter(:handle)
|
16
|
+
session_key = get_parameter(:session_key)
|
17
|
+
password = get_parameter(:pass)
|
18
|
+
|
19
|
+
if password.bytesize > 0
|
20
|
+
buffer.ntOwfPassword.len = 16
|
21
|
+
buffer.ntOwfPassword.maximumLength = 16
|
22
|
+
buffer.ntPasswordPresent.value = 1
|
23
|
+
buffer.whichFields.ntPasswordPresent.value = 1
|
24
|
+
buffer.lmOwfPassword.len = 16
|
25
|
+
buffer.lmOwfPassword.maximumLength = 16
|
26
|
+
buffer.lmPasswordPresent.value = 1
|
27
|
+
buffer.whichFields.lmPasswordPresent.value = 1
|
28
|
+
buffer.ntOwfPasswordNdr.str = [Smbhash.ntlm_hash(password)].pack("H*").to_des_ecb_lm(session_key)
|
29
|
+
buffer.lmOwfPasswordNdr.str = [Smbhash.lm_hash(password)].pack("H*").to_des_ecb_lm(session_key)
|
30
|
+
end
|
31
|
+
|
32
|
+
buffer.userAccountControl.value = get_parameter(:accControl)
|
33
|
+
buffer.whichFields.userAccountControl.value = 1 if buffer.userAccountControl.value > 0
|
34
|
+
request.pduHead.frag_length = self.num_bytes
|
35
|
+
request.opnum.value = 58 #SamrSetInformationUser2
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class SamrSetInformationUser2Res < BinData::Record
|
40
|
+
endian :little
|
41
|
+
request :request
|
42
|
+
uint32 :windowsError
|
43
|
+
end
|
44
|
+
|
45
|
+
def setInformationUser(password:"", userAccountControl:0)
|
46
|
+
samrSetInformationUser2Req = SamrSetInformationUser2Req.new(handle:@userHandle, session_key:self.smb.session_key, pass:password, accControl:userAccountControl)
|
47
|
+
samrSetInformationUser2Res = @file.ioctl_send_recv(samrSetInformationUser2Req).buffer
|
48
|
+
samrSetInformationUser2Res.raise_not_error_success("setInformationUser")
|
49
|
+
return self
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|