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.
Files changed (79) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +11 -0
  3. data/examples/enumLsa.rb +44 -0
  4. data/examples/enumSmbPipe.rb +16 -0
  5. data/lib/smbRpc.rb +33 -0
  6. data/lib/smbRpc/epmapper.rb +13 -0
  7. data/lib/smbRpc/epmapper/constants.rb +28 -0
  8. data/lib/smbRpc/epmapper/epmLookup.rb +98 -0
  9. data/lib/smbRpc/lsarpc.rb +22 -0
  10. data/lib/smbRpc/lsarpc/close.rb +48 -0
  11. data/lib/smbRpc/lsarpc/constants.rb +54 -0
  12. data/lib/smbRpc/lsarpc/enumerateAccounts.rb +55 -0
  13. data/lib/smbRpc/lsarpc/enumeratePrivilegesAccount.rb +49 -0
  14. data/lib/smbRpc/lsarpc/lookupNames.rb +74 -0
  15. data/lib/smbRpc/lsarpc/lookupPrivilegeName.rb +37 -0
  16. data/lib/smbRpc/lsarpc/lookupSids.rb +96 -0
  17. data/lib/smbRpc/lsarpc/openAccount.rb +49 -0
  18. data/lib/smbRpc/lsarpc/openPolicy.rb +52 -0
  19. data/lib/smbRpc/lsarpc/queryInformationPolicy.rb +92 -0
  20. data/lib/smbRpc/lsarpc/querySecurityObject.rb +75 -0
  21. data/lib/smbRpc/rpc.rb +5 -0
  22. data/lib/smbRpc/rpc/connection.rb +34 -0
  23. data/lib/smbRpc/rpc/constants.rb +64 -0
  24. data/lib/smbRpc/rpc/endpoints.rb +38 -0
  25. data/lib/smbRpc/rpc/ndrep.rb +24 -0
  26. data/lib/smbRpc/rpc/pdu.rb +40 -0
  27. data/lib/smbRpc/samr.rb +40 -0
  28. data/lib/smbRpc/samr/addMemberToAlias.rb +43 -0
  29. data/lib/smbRpc/samr/addMemberToGroup.rb +36 -0
  30. data/lib/smbRpc/samr/changePasswordUser.rb +64 -0
  31. data/lib/smbRpc/samr/closeHandle.rb +50 -0
  32. data/lib/smbRpc/samr/connect.rb +46 -0
  33. data/lib/smbRpc/samr/constants.rb +114 -0
  34. data/lib/smbRpc/samr/createAliasInDomain.rb +45 -0
  35. data/lib/smbRpc/samr/createGroupInDomain.rb +46 -0
  36. data/lib/smbRpc/samr/createUserInDomain.rb +48 -0
  37. data/lib/smbRpc/samr/deleteAlias.rb +35 -0
  38. data/lib/smbRpc/samr/deleteGroup.rb +35 -0
  39. data/lib/smbRpc/samr/deleteUser.rb +35 -0
  40. data/lib/smbRpc/samr/enumerateAliasesInDomain.rb +61 -0
  41. data/lib/smbRpc/samr/enumerateDomainsInSamServer.rb +52 -0
  42. data/lib/smbRpc/samr/enumerateGroupsInDomain.rb +60 -0
  43. data/lib/smbRpc/samr/enumerateUsersInDomain.rb +67 -0
  44. data/lib/smbRpc/samr/getMembersInAlias.rb +41 -0
  45. data/lib/smbRpc/samr/getMembersInGroup.rb +45 -0
  46. data/lib/smbRpc/samr/lookupDomainInSamServer.rb +41 -0
  47. data/lib/smbRpc/samr/lookupIdsInDomain.rb +52 -0
  48. data/lib/smbRpc/samr/lookupNamesInDomain.rb +55 -0
  49. data/lib/smbRpc/samr/openAlias.rb +39 -0
  50. data/lib/smbRpc/samr/openDomain.rb +48 -0
  51. data/lib/smbRpc/samr/openGroup.rb +39 -0
  52. data/lib/smbRpc/samr/openUser.rb +39 -0
  53. data/lib/smbRpc/samr/queryInformationUser.rb +182 -0
  54. data/lib/smbRpc/samr/removeMemberFromAlias.rb +43 -0
  55. data/lib/smbRpc/samr/removeMemberFromGroup.rb +34 -0
  56. data/lib/smbRpc/samr/setInformationUser.rb +53 -0
  57. data/lib/smbRpc/srvsvc.rb +12 -0
  58. data/lib/smbRpc/srvsvc/netShareEnum.rb +104 -0
  59. data/lib/smbRpc/srvsvc/serverGetInfo.rb +57 -0
  60. data/lib/smbRpc/svcctl.rb +20 -0
  61. data/lib/smbRpc/svcctl/closeService.rb +48 -0
  62. data/lib/smbRpc/svcctl/constants.rb +88 -0
  63. data/lib/smbRpc/svcctl/controlService.rb +48 -0
  64. data/lib/smbRpc/svcctl/createService.rb +68 -0
  65. data/lib/smbRpc/svcctl/deleteService.rb +31 -0
  66. data/lib/smbRpc/svcctl/enumServicesStatus.rb +96 -0
  67. data/lib/smbRpc/svcctl/openScm.rb +37 -0
  68. data/lib/smbRpc/svcctl/openService.rb +36 -0
  69. data/lib/smbRpc/svcctl/queryServiceConfig.rb +67 -0
  70. data/lib/smbRpc/svcctl/startService.rb +35 -0
  71. data/lib/smbRpc/updateRuby_smb.rb +3 -0
  72. data/lib/smbRpc/updateRuby_smb/client.rb +29 -0
  73. data/lib/smbRpc/updateRuby_smb/dcerpc.rb +30 -0
  74. data/lib/smbRpc/updateRuby_smb/ioctl_request.rb +53 -0
  75. data/lib/smbRpc/updateString.rb +3 -0
  76. data/lib/smbRpc/updateString/raise_not_error_success.rb +11 -0
  77. data/lib/smbRpc/updateString/to_des_ecb_lm.rb +34 -0
  78. data/smbRpc.gemspec +16 -0
  79. 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