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,49 @@
|
|
|
1
|
+
module SmbRpc
|
|
2
|
+
class Lsarpc < Rpc
|
|
3
|
+
|
|
4
|
+
class LsarEnumeratePrivilegesAccountReq < BinData::Record
|
|
5
|
+
endian :little
|
|
6
|
+
request :request
|
|
7
|
+
string :accountHandle, :length => 20
|
|
8
|
+
|
|
9
|
+
def initialize_instance
|
|
10
|
+
super
|
|
11
|
+
accountHandle.value = get_parameter(:handle)
|
|
12
|
+
request.pduHead.frag_length = self.num_bytes
|
|
13
|
+
request.opnum.value = 18 #LsarEnumeratePrivilegesAccount
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class Lsapr_luid_and_attributes < BinData::Record
|
|
18
|
+
endian :little
|
|
19
|
+
string :luid, :length => 8
|
|
20
|
+
uint32 :attributes #2.2.5.4 LSAPR_LUID_AND_ATTRIBUTES
|
|
21
|
+
#bit maks of last 2 least significant bit, so 1 = emable by default, 2 = enable
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class Lsapr_privilege_set < BinData::Record
|
|
25
|
+
endian :little
|
|
26
|
+
uint32 :privilegeCount
|
|
27
|
+
uint32 :numberOfPrivilegeCount
|
|
28
|
+
uint32 :control
|
|
29
|
+
array :privilege, :type => :lsapr_luid_and_attributes, :initial_length => :privilegeCount
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
class LsarEnumeratePrivilegesAccountRes < BinData::Record
|
|
33
|
+
endian :little
|
|
34
|
+
response :response
|
|
35
|
+
uint32 :ref_id_privileges
|
|
36
|
+
lsapr_privilege_set :privileges
|
|
37
|
+
uint32 :windowsError
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def enumeratePrivilegesAccount()
|
|
41
|
+
lsarEnumeratePrivilegesAccountReq = LsarEnumeratePrivilegesAccountReq.new(handle:@accountHandle)
|
|
42
|
+
lsarEnumeratePrivilegesAccountRes = @file.ioctl_send_recv(lsarEnumeratePrivilegesAccountReq).buffer
|
|
43
|
+
lsarEnumeratePrivilegesAccountRes.raise_not_error_success("enumeratePrivilegesAccount")
|
|
44
|
+
lsarEnumeratePrivilegesAccountRes = LsarEnumeratePrivilegesAccountRes.read(lsarEnumeratePrivilegesAccountRes)
|
|
45
|
+
return lsarEnumeratePrivilegesAccountRes.privileges.privilege
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
module SmbRpc
|
|
2
|
+
class Lsarpc < Rpc
|
|
3
|
+
|
|
4
|
+
class Lsapr_translated_sids < BinData::Record
|
|
5
|
+
endian :little
|
|
6
|
+
uint32 :numberOfEntries
|
|
7
|
+
choice :sids, :selection => :numberOfEntries do
|
|
8
|
+
uint32 0
|
|
9
|
+
array :default, :type => :rpc_sid, :initial_length => :numberOfEntries
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class LsarLookupNamesReq < BinData::Record
|
|
14
|
+
endian :little
|
|
15
|
+
request :request
|
|
16
|
+
string :policyHandle, :length => 20
|
|
17
|
+
uint32 :numCount, :value => 1
|
|
18
|
+
uint32 :numberOfNames, :value => :numCount
|
|
19
|
+
rpc_unicode_string :name
|
|
20
|
+
conformantandVaryingStrings :nameNdr
|
|
21
|
+
lsapr_translated_sids :translatedSids
|
|
22
|
+
uint32 :lookupLevel, :value => 1
|
|
23
|
+
uint32 :mappedCount
|
|
24
|
+
|
|
25
|
+
def initialize_instance
|
|
26
|
+
super
|
|
27
|
+
policyHandle.value = get_parameter(:handle)
|
|
28
|
+
uniString = get_parameter(:accountName).bytes.pack("v*")
|
|
29
|
+
name.len.value = uniString.bytesize
|
|
30
|
+
name.maximumLength.value = uniString.bytesize
|
|
31
|
+
nameNdr.str.value = uniString
|
|
32
|
+
|
|
33
|
+
request.pduHead.frag_length = self.num_bytes
|
|
34
|
+
request.opnum.value = 14 #LsarLookupNames
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
class Lsa_translated_sid < BinData::Record
|
|
39
|
+
endian :little
|
|
40
|
+
uint32 :use
|
|
41
|
+
uint32 :relativeId
|
|
42
|
+
uint32 :domainIndex
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class LsarLookupNamesRes < BinData::Record
|
|
46
|
+
endian :little
|
|
47
|
+
response :response
|
|
48
|
+
uint32 :ref_id_referencedDomains
|
|
49
|
+
lsapr_referenced_domain_list :referencedDomains #already declared in lsarpc/lsaLookupSids.rb
|
|
50
|
+
uint32 :numberOfEntries
|
|
51
|
+
lsapr_trust_information :domain #already declared in lsarpc/lsaLookupSids.rb
|
|
52
|
+
uint32 :numberOfSids
|
|
53
|
+
uint32 :ref_id_translatedSids
|
|
54
|
+
uint32 :numberOfTranslatedSids
|
|
55
|
+
lsa_translated_sid :translatedSids
|
|
56
|
+
uint32 :mappedCount
|
|
57
|
+
uint32 :windowsError
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def lookupNames(name:)
|
|
61
|
+
lsarLookupNamesReq = LsarLookupNamesReq.new(handle:@policyHandle, accountName:name)
|
|
62
|
+
lsarLookupNamesRes = @file.ioctl_send_recv(lsarLookupNamesReq).buffer
|
|
63
|
+
lsarLookupNamesRes.raise_not_error_success("lookupNames")
|
|
64
|
+
lsarLookupNamesRes = LsarLookupNamesRes.read(lsarLookupNamesRes)
|
|
65
|
+
h = {}
|
|
66
|
+
h[:domain] = lsarLookupNamesRes.domain.name.str.unpack("v*").pack("c*")
|
|
67
|
+
h[:sid] = lsarLookupNamesRes.domain.sid.sid.to_s
|
|
68
|
+
h[:rid] = lsarLookupNamesRes.translatedSids.relativeId.to_i
|
|
69
|
+
h[:type] = lsarLookupNamesRes.translatedSids.use.to_i
|
|
70
|
+
return h
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module SmbRpc
|
|
2
|
+
class Lsarpc < Rpc
|
|
3
|
+
|
|
4
|
+
class LsarLookupPrivilegeNameReq < BinData::Record
|
|
5
|
+
endian :little
|
|
6
|
+
request :request
|
|
7
|
+
string :policyHandle, :length => 20
|
|
8
|
+
string :luid, :length => 8
|
|
9
|
+
|
|
10
|
+
def initialize_instance
|
|
11
|
+
super
|
|
12
|
+
policyHandle.value = get_parameter(:handle)
|
|
13
|
+
luid.value = get_parameter(:lu)
|
|
14
|
+
request.pduHead.frag_length = self.num_bytes
|
|
15
|
+
request.opnum.value = 32 #LsarLookupPrivilegeName
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class LsarLookupPrivilegeNameRes < BinData::Record
|
|
20
|
+
endian :little
|
|
21
|
+
response :response
|
|
22
|
+
uint32 :ref_id_name
|
|
23
|
+
rpc_unicode_string :name
|
|
24
|
+
conformantandVaryingStrings :nameNdr
|
|
25
|
+
uint32 :windowsError
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def lookupPrivilegeName(luid:)
|
|
29
|
+
lsarLookupPrivilegeNameReq = LsarLookupPrivilegeNameReq.new(handle:@policyHandle, lu:luid)
|
|
30
|
+
lsarLookupPrivilegeNameRes = @file.ioctl_send_recv(lsarLookupPrivilegeNameReq).buffer
|
|
31
|
+
lsarLookupPrivilegeNameRes.raise_not_error_success("lookupPrivilegeName")
|
|
32
|
+
lsarLookupPrivilegeNameRes = LsarLookupPrivilegeNameRes.read(lsarLookupPrivilegeNameRes)
|
|
33
|
+
return lsarLookupPrivilegeNameRes.nameNdr.str.unpack("v*").pack("c*")
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
module SmbRpc
|
|
2
|
+
class Lsarpc < Rpc
|
|
3
|
+
|
|
4
|
+
class LsarLookupSidsReq < BinData::Record
|
|
5
|
+
endian :little
|
|
6
|
+
request :request
|
|
7
|
+
string :policyHandle, :length => 20
|
|
8
|
+
lsapr_account_enum_buffer :sidEnumBuffer #declare in lsaEnumerateAccounts.rb
|
|
9
|
+
uint32 :entriesRead
|
|
10
|
+
uint32 :translatedNames
|
|
11
|
+
uint32 :lookupLevel, :value => 1
|
|
12
|
+
uint32 :mappedCount
|
|
13
|
+
|
|
14
|
+
def initialize_instance
|
|
15
|
+
super
|
|
16
|
+
policyHandle.value = get_parameter(:handle)
|
|
17
|
+
|
|
18
|
+
sid = get_parameter(:sid)
|
|
19
|
+
sidEnumBuffer.entriesRead.value = 1
|
|
20
|
+
|
|
21
|
+
sidArray = sid.split("-")
|
|
22
|
+
subAuthorityCount = sidArray.size - 3
|
|
23
|
+
sidEnumBuffer.ref_id_information[0].value = 1
|
|
24
|
+
sidEnumBuffer.information[0].sub_auth.value = subAuthorityCount
|
|
25
|
+
sidEnumBuffer.information[0].sid.revision.value = sidArray[1].to_i
|
|
26
|
+
sidEnumBuffer.information[0].sid.subAuthorityCount.value = subAuthorityCount
|
|
27
|
+
sidEnumBuffer.information[0].sid.identifierAuthority.value = [sidArray[2].to_i].pack("N").rjust(6, "\x00")
|
|
28
|
+
subAuthorityCount.times do |i|
|
|
29
|
+
sidEnumBuffer.information[0].sid.subAuthority[i] = sidArray[i + 3].to_i
|
|
30
|
+
end
|
|
31
|
+
request.pduHead.frag_length = self.num_bytes
|
|
32
|
+
request.opnum.value = 15 #LsarLookupSids
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
class Lsapr_trust_information < BinData::Record
|
|
37
|
+
endian :little
|
|
38
|
+
uint16 :len
|
|
39
|
+
uint16 :maxLength
|
|
40
|
+
uint32 :ref_id_name
|
|
41
|
+
uint32 :ref_id_sid
|
|
42
|
+
conformantandVaryingStrings :name
|
|
43
|
+
sid_element :sid #declared in lsarpc/lsaEnumerateAccounts.rb
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
class Lsapr_referenced_domain_list < BinData::Record
|
|
47
|
+
endian :little
|
|
48
|
+
uint32 :numberOfEntries
|
|
49
|
+
uint32 :ref_id_domains
|
|
50
|
+
uint32 :maxEntries
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
class Lsapr_translated_name < BinData::Record
|
|
54
|
+
endian :little
|
|
55
|
+
uint32 :use
|
|
56
|
+
rpc_unicode_string :name
|
|
57
|
+
uint32 :domainIndex
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
class Lsapr_translated_names < BinData::Record
|
|
61
|
+
endian :little
|
|
62
|
+
uint32 :numberOfNames
|
|
63
|
+
uint32 :ref_id_names
|
|
64
|
+
uint32 :numberOfEntries, :value => :numberOfNames
|
|
65
|
+
array :names, :type => :lsapr_translated_name, :initial_length => :numberOfEntries
|
|
66
|
+
array :nameNdr, :type => :conformantandVaryingStrings, :initial_length => :numberOfEntries
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
class LsarLookupSidsRes < BinData::Record
|
|
70
|
+
endian :little
|
|
71
|
+
response :response
|
|
72
|
+
uint32 :ref_id_referencedDomains
|
|
73
|
+
lsapr_referenced_domain_list :referencedDomains
|
|
74
|
+
uint32 :numberOfEntries
|
|
75
|
+
lsapr_trust_information :domain
|
|
76
|
+
lsapr_translated_names :translatedNames
|
|
77
|
+
uint32 :mappedCount
|
|
78
|
+
uint32 :windowsError
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def lookupSids(sid:)
|
|
82
|
+
lsarLookupSidsReq = LsarLookupSidsReq.new(handle:@policyHandle, sid:sid)
|
|
83
|
+
lsarLookupSidsRes = @file.ioctl_send_recv(lsarLookupSidsReq).buffer
|
|
84
|
+
lsarLookupSidsRes.raise_not_error_success("lookupSids")
|
|
85
|
+
lsarLookupSidsRes = LsarLookupSidsRes.read(lsarLookupSidsRes)
|
|
86
|
+
result = lsarLookupSidsRes.windowsError
|
|
87
|
+
result == 0? result : (raise "LsaLookupSids Fail, WinError: %i"%[result])
|
|
88
|
+
h = {}
|
|
89
|
+
h[:domain] = lsarLookupSidsRes.domain.name.str.unpack("v*").pack("c*")
|
|
90
|
+
h[:name] = lsarLookupSidsRes.translatedNames.nameNdr[0].str.unpack("v*").pack("c*")
|
|
91
|
+
h[:type] = lsarLookupSidsRes.translatedNames.names[0].use
|
|
92
|
+
return h
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module SmbRpc
|
|
2
|
+
class Lsarpc < Rpc
|
|
3
|
+
|
|
4
|
+
attr_accessor :accountHandle
|
|
5
|
+
|
|
6
|
+
class LsarOpenAccountReq < BinData::Record
|
|
7
|
+
endian :little
|
|
8
|
+
request :request
|
|
9
|
+
string :policyHandle, :length => 20
|
|
10
|
+
uint32 :sub_auth, :value => lambda { accountSid.subAuthorityCount.value }
|
|
11
|
+
rpc_sid :accountSid
|
|
12
|
+
uint32 :desiredAccess
|
|
13
|
+
|
|
14
|
+
def initialize_instance
|
|
15
|
+
super
|
|
16
|
+
policyHandle.value = get_parameter(:handle)
|
|
17
|
+
desiredAccess.value = get_parameter(:access)
|
|
18
|
+
sid = get_parameter(:sid)
|
|
19
|
+
sidArray = sid.split("-")
|
|
20
|
+
subAuthorityCount = sidArray.size - 3
|
|
21
|
+
accountSid.revision.value = sidArray[1].to_i
|
|
22
|
+
accountSid.subAuthorityCount.value = subAuthorityCount
|
|
23
|
+
accountSid.identifierAuthority.value = [sidArray[2].to_i].pack("N").rjust(6, "\x00")
|
|
24
|
+
subAuthorityCount.times do |i|
|
|
25
|
+
accountSid.subAuthority[i] = sidArray[i + 3].to_i
|
|
26
|
+
end
|
|
27
|
+
request.pduHead.frag_length = self.num_bytes
|
|
28
|
+
request.opnum.value = 17 #LsarOpenAccount
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
class LsarOpenAccountRes < BinData::Record
|
|
33
|
+
endian :little
|
|
34
|
+
response :response
|
|
35
|
+
string :accountHandle, :length => 20
|
|
36
|
+
uint32 :windowsError
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def openAccount(desiredAccess:, sid:)
|
|
40
|
+
lsarOpenAccountReq = LsarOpenAccountReq.new(handle:@policyHandle, access:desiredAccess, sid:sid)
|
|
41
|
+
lsarOpenAccountRes = @file.ioctl_send_recv(lsarOpenAccountReq).buffer
|
|
42
|
+
lsarOpenAccountRes.raise_not_error_success("openAccount")
|
|
43
|
+
lsarOpenAccountRes = LsarOpenAccountRes.read(lsarOpenAccountRes)
|
|
44
|
+
@accountHandle = lsarOpenAccountRes.accountHandle
|
|
45
|
+
return self
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
|
|
2
|
+
module SmbRpc
|
|
3
|
+
class Lsarpc < Rpc
|
|
4
|
+
|
|
5
|
+
attr_accessor :policyHandle
|
|
6
|
+
|
|
7
|
+
class Lsapr_object_attributes < BinData::Record
|
|
8
|
+
endian :little
|
|
9
|
+
uint32 :len
|
|
10
|
+
uint32 :rootDirectory
|
|
11
|
+
uint32 :objectName
|
|
12
|
+
uint32 :attributes
|
|
13
|
+
uint32 :securityDescriptor
|
|
14
|
+
uint32 :securityQualityOfService
|
|
15
|
+
def initialize_instance
|
|
16
|
+
super
|
|
17
|
+
len.value = self.num_bytes
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class LsarOpenPolicy2Req < BinData::Record
|
|
22
|
+
endian :little
|
|
23
|
+
request :request
|
|
24
|
+
uint32 :systemName
|
|
25
|
+
lsapr_object_attributes :objectAttributes
|
|
26
|
+
uint32 :desiredAccess
|
|
27
|
+
def initialize_instance
|
|
28
|
+
super
|
|
29
|
+
desiredAccess.value = get_parameter(:accessMask)
|
|
30
|
+
request.pduHead.frag_length = self.num_bytes
|
|
31
|
+
request.opnum.value = 44 #LsarOpenPolicy2
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
class LsarOpenPolicy2Res < BinData::Record
|
|
36
|
+
endian :little
|
|
37
|
+
response :response
|
|
38
|
+
string :policyHandle, :length => 20
|
|
39
|
+
uint32 :windowsError
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def openPolicy(desiredAccess:LSARPC_ALL_ACCESS_MASK["MAXIMUM_ALLOWED"])
|
|
43
|
+
lsarOpenPolicy2Req = LsarOpenPolicy2Req.new(accessMask:desiredAccess)
|
|
44
|
+
lsarOpenPolicy2Res = @file.ioctl_send_recv(lsarOpenPolicy2Req).buffer
|
|
45
|
+
lsarOpenPolicy2Res.raise_not_error_success("openPolicy")
|
|
46
|
+
lsarOpenPolicy2Res = LsarOpenPolicy2Res.read(lsarOpenPolicy2Res)
|
|
47
|
+
@policyHandle = lsarOpenPolicy2Res.policyHandle
|
|
48
|
+
return self
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
module SmbRpc
|
|
4
|
+
class Lsarpc < Rpc
|
|
5
|
+
|
|
6
|
+
#[MS-DTYPE]
|
|
7
|
+
class Rpc_unicode_string < BinData::Record
|
|
8
|
+
endian :little
|
|
9
|
+
uint16 :len #length in bytes, multiple of 2, not include null terminate
|
|
10
|
+
uint16 :maximumLength #maxlength in bytes, multiple of 2, not less than length
|
|
11
|
+
#If MaximumLength is greater than zero, the buffer MUST contain a non-null value
|
|
12
|
+
uint32 :ref_id_buffer, :initial_value => 1 #set null pointer if maximumLength == 0
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class Rpc_sid < BinData::Record
|
|
16
|
+
endian :little
|
|
17
|
+
uint8 :revision
|
|
18
|
+
uint8 :subAuthorityCount
|
|
19
|
+
string :identifierAuthority, :length => 6
|
|
20
|
+
array :subAuthority, :type => :uint32, :initial_length => :subAuthorityCount
|
|
21
|
+
|
|
22
|
+
def to_s
|
|
23
|
+
sid = "S-%i"%[self.revision]
|
|
24
|
+
sid << "-%i"%[self.identifierAuthority.unpack("H*")[0].to_i(16)]
|
|
25
|
+
self.subAuthority.each { |i| sid << "-%i"%[i] }
|
|
26
|
+
return sid
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class Lsapr_policy_dns_domain_info < BinData::Record
|
|
31
|
+
endian :little
|
|
32
|
+
rpc_unicode_string :name
|
|
33
|
+
rpc_unicode_string :dnsDomainName
|
|
34
|
+
rpc_unicode_string :dnsForestName
|
|
35
|
+
string :guid, :length => 16
|
|
36
|
+
uint32 :sid
|
|
37
|
+
conformantandVaryingStrings :nameNdr, :onlyif => lambda { name.maximumLength > 0 }
|
|
38
|
+
conformantandVaryingStrings :dnsDomainNameNdr, :onlyif => lambda { dnsDomainName.maximumLength > 0 }
|
|
39
|
+
conformantandVaryingStrings :dnsForestNameNdr, :onlyif => lambda { dnsForestName.maximumLength > 0 }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
class LsarQueryInformationPolicy2Req < BinData::Record
|
|
43
|
+
endian :little
|
|
44
|
+
request :request
|
|
45
|
+
string :policyHandle, :length => 20
|
|
46
|
+
uint16 :informationClass
|
|
47
|
+
|
|
48
|
+
def initialize_instance
|
|
49
|
+
super
|
|
50
|
+
policyHandle.value = get_parameter(:handle)
|
|
51
|
+
informationClass.value = get_parameter(:infoClass)
|
|
52
|
+
request.pduHead.frag_length = self.num_bytes
|
|
53
|
+
request.opnum.value = 46 #LsarQueryInformationPolicy2
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
class LsarQueryInformationPolicy2Res < BinData::Record
|
|
58
|
+
endian :little
|
|
59
|
+
response :response
|
|
60
|
+
uint32 :ref_id_policyInformation
|
|
61
|
+
uint32 :informationClass_tag
|
|
62
|
+
|
|
63
|
+
choice :policyInformation, :selection => lambda { get_parameter(:infoClass) } do
|
|
64
|
+
uint32 6 #enum _POLICY_LSA_SERVER_ROLE { PolicyServerRoleBackup = 2, PolicyServerRolePrimary}
|
|
65
|
+
lsapr_policy_dns_domain_info 12
|
|
66
|
+
end
|
|
67
|
+
uint32 :windowsError
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def queryInformationPolicy(informationClass:LSARPC_POLICY_INFORMATION_CLASS["PolicyDnsDomainInformation"])
|
|
71
|
+
lsarQueryInformationPolicy2Req = LsarQueryInformationPolicy2Req.new(handle:@policyHandle, infoClass:informationClass)
|
|
72
|
+
response = @file.ioctl_send_recv(lsarQueryInformationPolicy2Req).buffer
|
|
73
|
+
response.raise_not_error_success("queryInformationPolicy")
|
|
74
|
+
lsarQueryInformationPolicy2Res = LsarQueryInformationPolicy2Res.new(infoClass:informationClass)
|
|
75
|
+
lsarQueryInformationPolicy2Res.read(response)
|
|
76
|
+
short = lsarQueryInformationPolicy2Res.policyInformation
|
|
77
|
+
out = {}
|
|
78
|
+
if informationClass == LSARPC_POLICY_INFORMATION_CLASS["PolicyDnsDomainInformation"]
|
|
79
|
+
out[:name] = short.nameNdr.str.unpack("v*").pack("c*") if short.name.len > 0
|
|
80
|
+
out[:dnsDomainName] = short.dnsDomainNameNdr.str.unpack("v*").pack("c*") if short.dnsDomainName.len > 0
|
|
81
|
+
out[:dnsForestName] = short.dnsForestNameNdr.str.unpack("v*").pack("c*") if short.dnsForestName.len > 0
|
|
82
|
+
out[:guid] = short.guid
|
|
83
|
+
out[:sid] = short.sid
|
|
84
|
+
end
|
|
85
|
+
if informationClass == LSARPC_POLICY_INFORMATION_CLASS["PolicyLsaServerRoleInformation"]
|
|
86
|
+
out[:policyServerRole] = short
|
|
87
|
+
end
|
|
88
|
+
return out
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
end
|
|
92
|
+
end
|