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,61 @@
1
+ module SmbRpc
2
+ class Samr < Rpc
3
+
4
+ class SamrEnumerateAliasesInDomainReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :domainHandle, :length => 20
8
+ uint32 :enumerationContext
9
+ uint32 :preferedMaximumLength, :value => 1024
10
+
11
+ def initialize_instance
12
+ super
13
+ domainHandle.value = get_parameter(:handle)
14
+ enumerationContext.value = get_parameter(:enumContext)
15
+ request.pduHead.frag_length = self.num_bytes
16
+ request.opnum.value = 15 #SamrEnumerateAliasesInDomain
17
+ end
18
+ end
19
+
20
+ class SamrEnumerateAliasesInDomainRes < BinData::Record
21
+ endian :little
22
+ request :request
23
+ uint32 :enumerationContext
24
+
25
+ uint32 :ref_id_buffer
26
+ uint32 :numberOfBuffer
27
+ uint32 :ref_id_sampr_enumeration_buffer
28
+ uint32 :entriesRead
29
+ #_SAMPR_RID_ENUMERATION declared in enumerateUsersInDomain.rb
30
+ array :name, :type => :sampr_rid_enumeration, :initial_length => :entriesRead
31
+ array :nameNdr, :type => :conformantandVaryingStrings, :initial_length => :entriesRead
32
+
33
+ uint32 :countReturned, :onlyif => lambda { entriesRead.value > 0 }
34
+ uint32 :windowsError
35
+ end
36
+
37
+ def enumerateAliasesInDomain
38
+ result = 0
39
+ enumerationContext = 0
40
+ out = []
41
+ loop do
42
+ samrEnumerateAliasesInDomainReq = SamrEnumerateAliasesInDomainReq.new(handle:@domainHandle, enumContext:enumerationContext)
43
+ samrEnumerateAliasesInDomainRes = @file.ioctl_send_recv(samrEnumerateAliasesInDomainReq).buffer
44
+ samrEnumerateAliasesInDomainRes = SamrEnumerateAliasesInDomainRes.read(samrEnumerateAliasesInDomainRes)
45
+ enumerationContext = samrEnumerateAliasesInDomainRes.enumerationContext
46
+ samrEnumerateAliasesInDomainRes.numberOfBuffer.times do |i|
47
+ h = {}
48
+ h[:rid] = samrEnumerateAliasesInDomainRes.name[i].relativeId
49
+ h[:aliasName] = samrEnumerateAliasesInDomainRes.nameNdr[i].str.unpack("v*").pack("c*")
50
+ out << h
51
+ end
52
+ result = samrEnumerateAliasesInDomainRes.windowsError
53
+ break if result != WindowsError::NTStatus::STATUS_MORE_ENTRIES #0x00000105
54
+ end
55
+ result == 0? result : (raise "enumerateAliasesInDomain Fail, WinError: %i"%[result])
56
+ return out
57
+ end
58
+
59
+ end
60
+ end
61
+
@@ -0,0 +1,52 @@
1
+ module SmbRpc
2
+ class Samr < Rpc
3
+
4
+ class SamrEnumerateDomainsInSamServerReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :serverHandle, :length => 20
8
+ uint32 :enumerationContext
9
+ uint32 :preferedMaximumLength, :value => 512
10
+
11
+ def initialize_instance
12
+ super
13
+ serverHandle.value = get_parameter(:handle)
14
+ request.pduHead.frag_length = self.num_bytes
15
+ request.opnum.value = 6 #SamrEnumerateDomainsInSamServer
16
+ end
17
+ end
18
+
19
+ class SamrEnumerateDomainsInSamServerRes < BinData::Record
20
+ endian :little
21
+ request :request
22
+ uint32 :enumerationContext
23
+ uint32 :ref_id_buffer
24
+ uint32 :numberOfBuffer
25
+ uint32 :ref_id_sampr_enumeration_buffer
26
+ uint32 :entriesRead
27
+ #sampr_rid_enumeration declared in samEnumerateUsersInDomain.rb
28
+ array :name, :type => :sampr_rid_enumeration, :initial_length => :entriesRead
29
+ array :nameNdr, :type => :conformantandVaryingStrings, :initial_length => :entriesRead
30
+
31
+ uint32 :countReturned
32
+ uint32 :windowsError
33
+ end
34
+
35
+ def enumerateDomainsInSamServer()
36
+ samrEnumerateDomainsInSamServerReq = SamrEnumerateDomainsInSamServerReq.new(handle:@serverHandle)
37
+ samrEnumerateDomainsInSamServerRes = @file.ioctl_send_recv(samrEnumerateDomainsInSamServerReq).buffer
38
+ samrEnumerateDomainsInSamServerRes.raise_not_error_success("enumerateDomainsInSamServer")
39
+ samrEnumerateDomainsInSamServerRes = SamrEnumerateDomainsInSamServerRes.read(samrEnumerateDomainsInSamServerRes)
40
+ out = []
41
+ samrEnumerateDomainsInSamServerRes.countReturned.times do |i|
42
+ h = {}
43
+ h[:rid] = samrEnumerateDomainsInSamServerRes.name[i].relativeId
44
+ h[:domainName] = samrEnumerateDomainsInSamServerRes.nameNdr[i].str.unpack("v*").pack("c*")
45
+ out << h
46
+ end
47
+ return out
48
+ end
49
+
50
+ end
51
+ end
52
+
@@ -0,0 +1,60 @@
1
+ module SmbRpc
2
+ class Samr < Rpc
3
+
4
+ class SamrEnumerateGroupsInDomainReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :domainHandle, :length => 20
8
+ uint32 :enumerationContext
9
+ uint32 :preferedMaximumLength, :value => 1024
10
+
11
+ def initialize_instance
12
+ super
13
+ domainHandle.value = get_parameter(:handle)
14
+ enumerationContext.value = get_parameter(:enumContext)
15
+ request.pduHead.frag_length = self.num_bytes
16
+ request.opnum.value = 11 #SamrEnumerateGroupsInDomain
17
+ end
18
+ end
19
+
20
+ class SamrEnumerateGroupsInDomainRes < BinData::Record
21
+ endian :little
22
+ request :request
23
+ uint32 :enumerationContext
24
+
25
+ uint32 :ref_id_buffer
26
+ uint32 :numberOfBuffer
27
+ uint32 :ref_id_sampr_enumeration_buffer
28
+ uint32 :entriesRead
29
+ #_SAMPR_RID_ENUMERATION enumerateUsersInDomain.rb
30
+ array :name, :type => :sampr_rid_enumeration, :initial_length => :entriesRead
31
+ array :nameNdr, :type => :conformantandVaryingStrings, :initial_length => :entriesRead
32
+ uint32 :countReturned, :onlyif => lambda { entriesRead.value > 0 }
33
+ uint32 :windowsError
34
+ end
35
+
36
+ def enumerateGroupsInDomain()
37
+ result = 0
38
+ enumerationContext = 0
39
+ out = []
40
+ loop do
41
+ samrEnumerateGroupsInDomainReq = SamrEnumerateGroupsInDomainReq.new(handle:@domainHandle, enumContext:enumerationContext)
42
+ samrEnumerateGroupsInDomainRes = @file.ioctl_send_recv(samrEnumerateGroupsInDomainReq).buffer
43
+ samrEnumerateGroupsInDomainRes = SamrEnumerateGroupsInDomainRes.read(samrEnumerateGroupsInDomainRes)
44
+ enumerationContext = samrEnumerateGroupsInDomainRes.enumerationContext
45
+ samrEnumerateGroupsInDomainRes.numberOfBuffer.times do |i|
46
+ h = {}
47
+ h[:rid] = samrEnumerateGroupsInDomainRes.name[i].relativeId
48
+ h[:groupName] = samrEnumerateGroupsInDomainRes.nameNdr[i].str.unpack("v*").pack("c*")
49
+ out << h
50
+ end
51
+ result = samrEnumerateGroupsInDomainRes.windowsError
52
+ break if result != WindowsError::NTStatus::STATUS_MORE_ENTRIES #0x00000105
53
+ end
54
+ result == 0? result : (raise "enumerateGroupsInDomain Fail, WinError: %i"%[result])
55
+ return out
56
+ end
57
+
58
+ end
59
+ end
60
+
@@ -0,0 +1,67 @@
1
+ module SmbRpc
2
+ class Samr < Rpc
3
+
4
+ class SamrEnumerateUsersInDomainReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :domainHandle, :length => 20
8
+ uint32 :enumerationContext
9
+ uint32 :userAccountControl
10
+ uint32 :preferedMaximumLength, :value => 1024
11
+
12
+ def initialize_instance
13
+ super
14
+ domainHandle.value = get_parameter(:handle)
15
+ enumerationContext.value = get_parameter(:enumContext)
16
+ userAccountControl.value = get_parameter(:accountControl)
17
+ request.pduHead.frag_length = self.num_bytes
18
+ request.opnum.value = 13 #SamrEnumerateUsersInDomain
19
+ end
20
+ end
21
+
22
+ class Sampr_rid_enumeration < BinData::Record
23
+ endian :little
24
+ uint32 :relativeId
25
+ rpc_unicode_string :name
26
+ end
27
+
28
+ class SamrEnumerateUsersInDomainRes < BinData::Record
29
+ endian :little
30
+ request :request
31
+ uint32 :enumerationContext
32
+ uint32 :ref_id_buffer
33
+ uint32 :numberOfBuffer
34
+ uint32 :ref_id_sampr_enumeration_buffer
35
+ uint32 :entriesRead
36
+ #_SAMPR_RID_ENUMERATION
37
+ array :name, :type => :sampr_rid_enumeration, :initial_length => :entriesRead
38
+ array :nameNdr, :type => :conformantandVaryingStrings, :initial_length => :entriesRead
39
+ uint32 :countReturned, :onlyif => lambda { entriesRead.value > 0 }
40
+ uint32 :windowsError
41
+ end
42
+
43
+ def enumerateUsersInDomain(userAccountControl:SAMR_USER_ACCOUNT["USER_NORMAL_ACCOUNT"])
44
+ result = 0
45
+ enumerationContext = 0
46
+ out = []
47
+ loop do
48
+ samrEnumerateUsersInDomainReq = SamrEnumerateUsersInDomainReq.new(handle:@domainHandle, accountControl:userAccountControl, enumContext:enumerationContext)
49
+ samrEnumerateUsersInDomainRes = @file.ioctl_send_recv(samrEnumerateUsersInDomainReq).buffer
50
+ samrEnumerateUsersInDomainRes = SamrEnumerateUsersInDomainRes.read(samrEnumerateUsersInDomainRes)
51
+ enumerationContext = samrEnumerateUsersInDomainRes.enumerationContext
52
+ samrEnumerateUsersInDomainRes.numberOfBuffer.times do |i|
53
+ h = {}
54
+ h[:rid] = samrEnumerateUsersInDomainRes.name[i].relativeId
55
+ h[:userName] = samrEnumerateUsersInDomainRes.nameNdr[i].str.unpack("v*").pack("c*")
56
+ out << h
57
+ end
58
+ result = samrEnumerateUsersInDomainRes.windowsError
59
+ break if result != WindowsError::NTStatus::STATUS_MORE_ENTRIES #0x00000105
60
+ end
61
+ result == 0? result : (raise "SamEnumerateUsersInDomain Fail, WinError: %i"%[result])
62
+ return out
63
+ end
64
+
65
+ end
66
+ end
67
+
@@ -0,0 +1,41 @@
1
+ module SmbRpc
2
+ class Samr < Rpc
3
+
4
+ class SamrGetMembersInAliasReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :aliasHandle, :length => 20
8
+
9
+ def initialize_instance
10
+ super
11
+ aliasHandle.value = get_parameter(:handle)
12
+ request.pduHead.frag_length = self.num_bytes
13
+ request.opnum.value = 33 #SamrGetMembersInAlias
14
+ end
15
+ end
16
+
17
+ class SamrGetMembersInAliasRes < BinData::Record
18
+ endian :little
19
+ response :response
20
+ uint32 :numberOfSids
21
+ uint32 :ref_id_members
22
+
23
+ uint32 :numberOfMembers, :onlyif => lambda { numberOfSids.value > 0 }
24
+ array :ref_id_member, :type => :uint32, :initial_length => :numberOfMembers, :onlyif => lambda { numberOfSids.value > 0 }
25
+ array :member, :type => :sid_element, :initial_length => :numberOfMembers, :onlyif => lambda { numberOfSids.value > 0 }
26
+ uint32 :windowsError
27
+ end
28
+
29
+ def getMembersInAlias
30
+ samrGetMembersInAliasReq = SamrGetMembersInAliasReq.new(handle:@aliasHandle)
31
+ samrGetMembersInAliasRes = @file.ioctl_send_recv(samrGetMembersInAliasReq).buffer
32
+ samrGetMembersInAliasRes.raise_not_error_success("getMembersInAlias")
33
+ samrGetMembersInAliasRes = SamrGetMembersInAliasRes.read(samrGetMembersInAliasRes)
34
+ out = []
35
+ samrGetMembersInAliasRes.member.each{|e| out << e.sid.to_s}
36
+ return out
37
+ end
38
+
39
+ end
40
+ end
41
+
@@ -0,0 +1,45 @@
1
+ module SmbRpc
2
+ class Samr < Rpc
3
+
4
+ class SamrGetMembersInGroupReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :groupHandle, :length => 20
8
+
9
+ def initialize_instance
10
+ super
11
+ groupHandle.value = get_parameter(:handle)
12
+ request.pduHead.frag_length = self.num_bytes
13
+ request.opnum.value = 25 #SamrGetMembersInGroup
14
+ end
15
+ end
16
+
17
+ class SamrGetMembersInGroupRes < BinData::Record
18
+ endian :little
19
+ response :response
20
+ uint32 :ref_id_members
21
+ uint32 :numberOfMembers
22
+ uint32 :ref_id_relativeId
23
+ uint32 :ref_id_attributes
24
+ uint32 :numberOfRelativeId, :onlyif => lambda { ref_id_relativeId.value > 0 }
25
+ array :relativeId, :type => :uint32, :initial_length => :numberOfMembers
26
+ uint32 :numberOfAttributes, :onlyif => lambda { ref_id_attributes.value > 0 }
27
+ array :attributes, :type => :uint32, :initial_length => :numberOfMembers
28
+ uint32 :windowsError
29
+ end
30
+
31
+ def getMembersInGroup
32
+ samrGetMembersInGroupReq = SamrGetMembersInGroupReq.new(handle:@groupHandle)
33
+ samrGetMembersInGroupRes = @file.ioctl_send_recv(samrGetMembersInGroupReq).buffer
34
+ samrGetMembersInGroupRes.raise_not_error_success("getMembersInGroup")
35
+ samrGetMembersInGroupRes = SamrGetMembersInGroupRes.read(samrGetMembersInGroupRes)
36
+ out = []
37
+ samrGetMembersInGroupRes.numberOfMembers.times do |i|
38
+ out << {:relativeId => samrGetMembersInGroupRes.relativeId[i], :attributes => samrGetMembersInGroupRes.attributes[i]}
39
+ end
40
+ return out
41
+ end
42
+
43
+ end
44
+ end
45
+
@@ -0,0 +1,41 @@
1
+ module SmbRpc
2
+ class Samr < Rpc
3
+
4
+ class SamrLookupDomainInSamServerReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :serverHandle, :length => 20
8
+ rpc_unicode_string :name
9
+ conformantandVaryingStrings :nameNdr
10
+
11
+ def initialize_instance
12
+ super
13
+ serverHandle.value = get_parameter(:handle)
14
+ domainNameUni = "#{get_parameter(:domainName)}\x00".bytes.pack("v*")
15
+ name.len.value = domainNameUni.bytesize
16
+ name.maximumLength.value = domainNameUni.bytesize
17
+ nameNdr.str = domainNameUni
18
+ request.pduHead.frag_length = self.num_bytes
19
+ request.opnum.value = 5 #SamrLookupDomainInSamServer
20
+ end
21
+ end
22
+
23
+ class SamrLookupDomainInSamServerRes < BinData::Record
24
+ endian :little
25
+ request :request
26
+ uint32 :ref_id_domainId
27
+ sid_element :domainId, :onlyif => lambda { ref_id_domainId != 0 } #declared in lsarpc/lsaEnumerateAccounts.rb
28
+ uint32 :windowsError
29
+ end
30
+
31
+ def lookupDomainInSamServer(domainName:)
32
+ samrLookupDomainInSamServerReq = SamrLookupDomainInSamServerReq.new(handle:@serverHandle, domainName:domainName)
33
+ samrLookupDomainInSamServerRes = @file.ioctl_send_recv(samrLookupDomainInSamServerReq).buffer
34
+ samrLookupDomainInSamServerRes.raise_not_error_success("lookupDomainInSamServer")
35
+ samrLookupDomainInSamServerRes = SamrLookupDomainInSamServerRes.read(samrLookupDomainInSamServerRes)
36
+ return samrLookupDomainInSamServerRes.domainId.sid.to_s
37
+ end
38
+
39
+ end
40
+ end
41
+
@@ -0,0 +1,52 @@
1
+ module SmbRpc
2
+ class Samr < Rpc
3
+
4
+ class SamrLookupIdsInDomainReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :domainHandle, :length => 20
8
+
9
+ uint32 :numberOfName, :value => 1
10
+ uint32 :maxCount, :value => 1000 #range max at 1000
11
+ uint32 :offset
12
+ uint32 :actualCont, :value => 1
13
+ uint32 :relativeId
14
+
15
+ def initialize_instance
16
+ super
17
+ domainHandle.value = get_parameter(:handle)
18
+ relativeId.value = get_parameter(:rid)
19
+ request.pduHead.frag_length = self.num_bytes
20
+ request.opnum.value = 18 #SamrLookupIdsInDomain
21
+ end
22
+ end
23
+
24
+ class SamrLookupIdsInDomainRes < BinData::Record
25
+ endian :little
26
+ request :request
27
+ uint32 :numberOfRef_id_name
28
+ uint32 :ref_id_name
29
+ uint32 :numberOfName
30
+ rpc_unicode_string :name #declared in lsarpc/lsaQueryInformationPolicy.rb
31
+ conformantandVaryingStrings :nameNdr
32
+ uint32 :numberOfRef_id_use
33
+ uint32 :ref_id_use
34
+ uint32 :numberOfuse
35
+ uint32 :use
36
+ uint32 :windowsError
37
+ end
38
+
39
+ def lookupIdsInDomain(relativeId:)
40
+ samrLookupIdsInDomainReq = SamrLookupIdsInDomainReq.new(rid:relativeId, handle:@domainHandle)
41
+ samrLookupIdsInDomainRes = @file.ioctl_send_recv(samrLookupIdsInDomainReq).buffer
42
+ samrLookupIdsInDomainRes.raise_not_error_success("lookupIdsInDomain")
43
+ samrLookupIdsInDomainRes = SamrLookupIdsInDomainRes.read(samrLookupIdsInDomainRes)
44
+ return {
45
+ :name => samrLookupIdsInDomainRes.nameNdr.str.unpack("v*").pack("c*"),
46
+ :type => samrLookupIdsInDomainRes.use
47
+ }
48
+ end
49
+
50
+ end
51
+ end
52
+
@@ -0,0 +1,55 @@
1
+ module SmbRpc
2
+ class Samr < Rpc
3
+
4
+ class SamrLookupNamesInDomainReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :domainHandle, :length => 20
8
+ uint32 :numberOfName, :value => 1
9
+ uint32 :maxCount, :value => 1000 #range max at 1000
10
+ uint32 :offset
11
+ uint32 :actualCont, :value => 1
12
+ rpc_unicode_string :name #declared in lsarpc/lsaQueryInformationPolicy.rb
13
+ conformantandVaryingStrings :nameNdr
14
+
15
+ def initialize_instance
16
+ super
17
+ domainHandle.value = get_parameter(:handle)
18
+
19
+ nameNdr.str = get_parameter(:accName).bytes.pack("v*")
20
+ numBytes = nameNdr.actual_count * 2
21
+ name.len.value = numBytes
22
+ name.maximumLength.value = numBytes
23
+ request.pduHead.frag_length = self.num_bytes
24
+ request.opnum.value = 17 #SamrLookupNamesInDomain
25
+ end
26
+ end
27
+
28
+ class SamrLookupNamesInDomainRes < BinData::Record
29
+ endian :little
30
+ request :request
31
+ uint32 :numberOfRef_id_relativeId
32
+ uint32 :ref_id_relativeId
33
+ uint32 :numberOfRelativeId
34
+ uint32 :relativeId
35
+ uint32 :numberOfRef_id_use
36
+ uint32 :ref_id_use
37
+ uint32 :numberOfuse
38
+ uint32 :use
39
+ uint32 :windowsError
40
+ end
41
+
42
+ def lookupNamesInDomain(name:)
43
+ samrLookupNamesInDomainReq = SamrLookupNamesInDomainReq.new(accName:name, handle:@domainHandle)
44
+ samrLookupNamesInDomainRes = @file.ioctl_send_recv(samrLookupNamesInDomainReq).buffer
45
+ samrLookupNamesInDomainRes.raise_not_error_success("lookupNamesInDomain")
46
+ samrLookupNamesInDomainRes = SamrLookupNamesInDomainRes.read(samrLookupNamesInDomainRes)
47
+ return {
48
+ :relativeId => samrLookupNamesInDomainRes.relativeId.to_i,
49
+ :type => samrLookupNamesInDomainRes.use.to_i
50
+ }
51
+ end
52
+
53
+ end
54
+ end
55
+