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
|