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
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 301126aea359549d334c576f81e3984f45d1a77483980f9fa82963fadb112724
4
+ data.tar.gz: afea3703a681b4e4f12f411c36b2348b77ee7a07ffa295eefc1dd4c5ba18624e
5
+ SHA512:
6
+ metadata.gz: aad2222fd4eca5c0edaddb75bffaea09d6c903f6341133ec1a98b86e26c98d2490efe26097650f61a3d87da5fdd9d435fb3a2c71fc13c3b4eb35cb9f6078804d
7
+ data.tar.gz: 42044cfd25b6fe7af0fd23ce4a212f31c22be6631c89318de50cf65be7e1964423774a8462f2ee5c297aea975642224466b0e9dbfec333c5a37acfdf5ba465a8
data/README.md ADDED
@@ -0,0 +1,11 @@
1
+ his is a Windows RPC over SMB namepipe library modeled over the ruby_smb library.
2
+ All function names and arguments were written to closely reflct the originals MS documented specifications.
3
+ Currently I have only exposed some functions to the following namepipes. I'll be adding more as I continue developing this project.
4
+
5
+ epmapper
6
+ samr
7
+ srvsvc
8
+ svcctl
9
+ lsarpc
10
+
11
+ Comments and suggestions are welcome, please email to rubysmbrpc@gmail.com
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/ruby
2
+ require"smbRpc"
3
+
4
+ ip = ARGV[0]
5
+ port = 445
6
+ user = ARGV[1]
7
+ pass = ARGV[2]
8
+
9
+ lsarpc = SmbRpc::Lsarpc.new(ip:ip, user:user, pass:pass)
10
+ policy = lsarpc.openPolicy
11
+
12
+ puts"PolicyDnsDomainInformation"
13
+ p pddi = policy.queryInformationPolicy
14
+
15
+ puts"\nPolicyLsaServerRoleInformation"
16
+ p policy.queryInformationPolicy(informationClass:LSARPC_POLICY_INFORMATION_CLASS["PolicyLsaServerRoleInformation"])
17
+
18
+ puts"\nLSA builtin Accounts"
19
+ lsarpc.enumerateAccounts.each do |sid|
20
+ p sid
21
+ p lsarpc.lookupSids(sid:sid)
22
+ end
23
+
24
+ if !pddi[:dnsDomainName].nil? #if enumerating DC
25
+ domain = pddi[:dnsDomainName]
26
+ domSid = policy.lookupNames(name:domain)[:sid]
27
+ else #else workstation
28
+ domSid = policy.lookupNames(name:"guest")[:sid]
29
+ end
30
+
31
+ puts"\nrid 1000-1500"
32
+ (1000..1500).each do |i|
33
+ begin
34
+ sid = "%s-%i"%[domSid, i]
35
+ out = lsarpc.lookupSids(sid:sid)
36
+ (print"%s -> "%[sid];p out; puts"") if !out.nil?
37
+ rescue
38
+ next
39
+ end
40
+ end
41
+
42
+ lsarpc.close
43
+ puts"-"*80
44
+
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/ruby
2
+ require"smbRpc"
3
+
4
+
5
+ ip = ARGV[0]
6
+ port = 445
7
+ user = ARGV[1]
8
+ pass = ARGV[2]
9
+
10
+ epmapper = SmbRpc::Epmapper.new(ip:ip, user:user, pass:pass)
11
+ epmapper.epmLookup.each do |e|
12
+ puts "%s %s"%[e[:uuid], e[:smb]] if !e[:smb].nil?
13
+ end
14
+
15
+ epmapper.close
16
+ puts"-"*80
data/lib/smbRpc.rb ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/ruby
2
+ require"ruby_smb"
3
+ require"bindata"
4
+ require"windows_error/win32"
5
+ require"smbhash" #nice little library to make Lm/NTLM hash
6
+ #require"windows_error/nt_status" #already loaded by ruby_smb
7
+
8
+ #$:.unshift(File.expand_path('.',__dir__))
9
+ require"smbRpc/rpc"
10
+ require"smbRpc/srvsvc"
11
+ require"smbRpc/svcctl"
12
+ require"smbRpc/lsarpc"
13
+ require"smbRpc/epmapper"
14
+ require"smbRpc/samr"
15
+ require"smbRpc/updateRuby_smb"
16
+ require"smbRpc/updateString"
17
+
18
+ #require"rpc_packet"
19
+ #require"endpoints"
20
+ #require"constants"
21
+ #require"ndrep"
22
+ #require"srvsvc_packet"
23
+ #require"svcctl_packet"
24
+
25
+ #require_relative"endpoints"
26
+ #require_relative"constants"
27
+ #require_relative"ndrep"
28
+ #require_relative"rpc"
29
+ #require_relative"rpc_packet"
30
+ #require_relative"srvsvc"
31
+ #require_relative"srvsvc_packet"
32
+ #require_relative"svcctl"
33
+ #require_relative"svcctl_packet"
@@ -0,0 +1,13 @@
1
+ require"smbRpc/epmapper/epmLookup"
2
+ require"smbRpc/epmapper/constants"
3
+
4
+ module SmbRpc
5
+ class Epmapper < Rpc
6
+ def initialize(**argv)
7
+ super(argv)
8
+ self.connect
9
+ self.bind(pipe:"epmapper")
10
+ end
11
+ end
12
+ end
13
+
@@ -0,0 +1,28 @@
1
+ EPM_PROTOCOL = {
2
+ "EPM_PROTOCOL_DNET_NSP" => 0x04,
3
+ "EPM_PROTOCOL_OSI_TP4" => 0x05,
4
+ "EPM_PROTOCOL_OSI_CLNS" => 0x06,
5
+ "EPM_PROTOCOL_TCP" => 0x07,
6
+ "EPM_PROTOCOL_UDP" => 0x08,
7
+ "EPM_PROTOCOL_IP" => 0x09,
8
+ "EPM_PROTOCOL_NCADG" => 0x0a,
9
+ "EPM_PROTOCOL_NCACN" => 0x0b,
10
+ "EPM_PROTOCOL_NCALRPC" => 0x0c,
11
+ "EPM_PROTOCOL_UUID" => 0x0d,
12
+ "EPM_PROTOCOL_IPX" => 0x0e,
13
+ "EPM_PROTOCOL_SMB" => 0x0f,
14
+ "EPM_PROTOCOL_NAMED_PIPE" => 0x10,
15
+ "EPM_PROTOCOL_NETBIOS" => 0x11,
16
+ "EPM_PROTOCOL_NETBEUI" => 0x12,
17
+ "EPM_PROTOCOL_SPX" => 0x13,
18
+ "EPM_PROTOCOL_NB_IPX" => 0x14,
19
+ "EPM_PROTOCOL_DSP" => 0x16,
20
+ "EPM_PROTOCOL_DDP" => 0x17,
21
+ "EPM_PROTOCOL_APPLETALK" => 0x18,
22
+ "EPM_PROTOCOL_VINES_SPP" => 0x1a,
23
+ "EPM_PROTOCOL_VINES_IPC" => 0x1b,
24
+ "EPM_PROTOCOL_STREETTALK" => 0x1c,
25
+ "EPM_PROTOCOL_HTTP" => 0x1f,
26
+ "EPM_PROTOCOL_UNIX_DS" => 0x20,
27
+ "EPM_PROTOCOL_NULL" => 0x21
28
+ }
@@ -0,0 +1,98 @@
1
+ module SmbRpc
2
+ class Epmapper < Rpc
3
+ #https://svn.nmap.org/nmap-exp/drazen/var/IDL/epmapper.idl?p=25000
4
+ class Epm_LookupReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ uint32 :inquiry_type, :value => 0x0f
8
+ uint32 :object
9
+ uint32 :interface_id
10
+ uint32 :vers_option
11
+ string :entry_handle, :length => 20
12
+ uint32 :max_ents, :value => 1
13
+
14
+ def initialize_instance
15
+ super
16
+ entry_handle.value = get_parameter(:handle)
17
+ request.pduHead.frag_length = self.num_bytes
18
+ request.opnum.value = 2 #epm_Lookup
19
+ end
20
+ end
21
+
22
+ class Epm_floor < BinData::Record
23
+ endian :little
24
+ uint16 :lhsLength
25
+ uint8 :protocol
26
+ string :lhs_data, :length => lambda { lhsLength - 1 }
27
+ uint16 :rhsLength
28
+ string :rhs_data, :length => :rhsLength
29
+ end
30
+
31
+ class Epm_LookupRes < BinData::Record
32
+ endian :little
33
+ response :response
34
+ string :entry_handle, :length => 20
35
+ uint32 :num_ents
36
+
37
+ #epm_entry_t
38
+ uint32 :max_count
39
+ uint32 :offset
40
+ uint32 :actual_count
41
+ string :guid, :length => 16
42
+ uint32 :ref_id_tower
43
+ uint32 :annotation_offset
44
+ uint32 :annotation_length
45
+ choice :annotation, :selection => :annotation_length do
46
+ uint32 1
47
+ string :default, :length => :annotation_length
48
+ end
49
+
50
+ #16 byte align
51
+ string :pad, :onlyif => lambda { annotation_length > 1 }, :length => lambda { (4 - ( annotation_length % 4 )) % 4 }
52
+
53
+ #epm_twr_t
54
+ uint32 :tower_length
55
+ uint32 :tower_len
56
+ uint16 :num_floors
57
+ array :floors, :type => :epm_floor, :initial_length => :num_floors
58
+ uint32 :windowsError
59
+ end
60
+
61
+ def epmLookup()
62
+ @handle = "\x00"*20
63
+ out = []
64
+ loop do
65
+ epm_LookupReq = Epm_LookupReq.new(handle:@handle)
66
+ epm_LookupRes = @file.ioctl_send_recv(epm_LookupReq).buffer
67
+ result = epm_LookupRes[-4,4].unpack("V")[0]
68
+ break if result == 0x16c9a0d6 #[MS-RPCE] There are no elements that satisfy the specified search criteria
69
+ epm_LookupRes.raise_not_error_success("epmLookup")
70
+ #https://msdn.microsoft.com/en-us/library/cc243786.aspx
71
+ #RPC over SMB MUST use a protocol identifier of 0x0F instead of 0x10, as specified in [C706] Appendix I.<4>
72
+ epm_LookupRes = Epm_LookupRes.read(epm_LookupRes)
73
+ h = {}
74
+ epm_LookupRes.floors.each do |e|
75
+ h[:uuid] = "%s.%i"%[uuidParse(e.lhs_data), e.rhs_data.unpack("v")[0]] if e.protocol == EPM_PROTOCOL["EPM_PROTOCOL_UUID"]
76
+ h[:ndr] = "%s.%i"%[uuidParse(e.lhs_data), e.rhs_data.unpack("v")[0]] if e.protocol == EPM_PROTOCOL["EPM_PROTOCOL_UUID"] && h.has_key?(:uuid)
77
+ h[:name_pipe] = "%s"%[e.rhs_data.gsub("\x00","")] if e.protocol == EPM_PROTOCOL["EPM_PROTOCOL_NAMED_PIPE"]
78
+ h[:smb] = "%s"%[e.rhs_data.gsub("\x00","")] if e.protocol == EPM_PROTOCOL["EPM_PROTOCOL_SMB"]
79
+ h[:netBios] = "%s"%[e.rhs_data.gsub("\x00","")] if e.protocol == EPM_PROTOCOL["EPM_PROTOCOL_NETBIOS"]
80
+ h[:ip] = "%s"%[e.rhs_data.unpack("c*").join(".")] if e.protocol == EPM_PROTOCOL["EPM_PROTOCOL_IP"]
81
+ h[:port] = "%i"%[e.rhs_data.unpack("v")[0]] if e.protocol == EPM_PROTOCOL["EPM_PROTOCOL_TCP"]
82
+ h[:ncalrpc] = true if e.protocol == EPM_PROTOCOL["EPM_PROTOCOL_NCALRPC"]
83
+ end
84
+ out << h
85
+ @handle = epm_LookupRes.entry_handle
86
+ end
87
+ return out
88
+ end
89
+
90
+ def uuidParse(uuidBin)
91
+ return "%s-%s-%s-%s-%s %i"%[uuidBin[0,4].b.reverse.unpack("H*")[0],
92
+ uuidBin[4,2].b.reverse.unpack("H*")[0], uuidBin[6,2].b.reverse.unpack("H*")[0],
93
+ uuidBin[8,2].unpack("H*")[0], uuidBin[10,6].unpack("H*")[0], uuidBin[16,2].unpack("v")[0]]
94
+ end
95
+
96
+ end
97
+ end
98
+
@@ -0,0 +1,22 @@
1
+ require"smbRpc/lsarpc/constants"
2
+ require"smbRpc/lsarpc/openPolicy"
3
+ require"smbRpc/lsarpc/close"
4
+ require"smbRpc/lsarpc/queryInformationPolicy"
5
+ require"smbRpc/lsarpc/enumerateAccounts"
6
+ require"smbRpc/lsarpc/lookupSids"
7
+ require"smbRpc/lsarpc/openAccount"
8
+ require"smbRpc/lsarpc/enumeratePrivilegesAccount"
9
+ require"smbRpc/lsarpc/lookupPrivilegeName"
10
+ #require"smbRpc/lsarpc/querySecurityObject"
11
+ require"smbRpc/lsarpc/lookupNames"
12
+
13
+ module SmbRpc
14
+ class Lsarpc < Rpc
15
+ def initialize(**argv)
16
+ super(argv)
17
+ self.connect
18
+ self.bind(pipe:"lsarpc")
19
+ end
20
+ end
21
+ end
22
+
@@ -0,0 +1,48 @@
1
+
2
+ module SmbRpc
3
+ class Lsarpc < Rpc
4
+
5
+ class LsarCloseReq < BinData::Record
6
+ endian :little
7
+ request :request
8
+ string :objectHandle, :length => 20
9
+ def initialize_instance
10
+ super
11
+ objectHandle.value = get_parameter(:handle)
12
+ request.pduHead.frag_length = self.num_bytes
13
+ request.opnum.value = 0 #LsarClose
14
+ end
15
+ end
16
+
17
+ class LsarCloseRes < BinData::Record
18
+ endian :little
19
+ request :request
20
+ string :objectHandle, :length => 20
21
+ uint32 :windowsError
22
+ end
23
+
24
+ def closePolicy()
25
+ if !@policyHandle.nil?
26
+ lsarCloseReq = LsarCloseReq.new(handle:@policyHandle)
27
+ lsarCloseRes = @file.ioctl_send_recv(lsarCloseReq).buffer
28
+ lsarCloseRes.raise_not_error_success("closeAccount")
29
+ @policyHandle = nil
30
+ end
31
+ end
32
+
33
+ def closeAccount()
34
+ if !@accountHandle.nil?
35
+ lsarCloseReq = LsarCloseReq.new(handle:@accountHandle)
36
+ lsarCloseRes = @file.ioctl_send_recv(lsarCloseReq).buffer
37
+ lsarCloseRes.raise_not_error_success("closeAccount")
38
+ @accountHandle = nil
39
+ end
40
+ end
41
+
42
+ def close()
43
+ closeAccount()
44
+ closePolicy()
45
+ super
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,54 @@
1
+ LSARPC_ALL_ACCESS_MASK = {
2
+ "DELETE" => 0x00010000,
3
+ "READ_CONTROL" => 0x00020000,
4
+ "WRITE_DAC" => 0x00040000,
5
+ "WRITE_OWNER" => 0x00080000,
6
+ "MAXIMUM_ALLOWED" => 0x02000000
7
+ }
8
+
9
+ LSARPC_POLICY_ACCESS_MASK = {
10
+ "POLICY_VIEW_LOCAL_INFORMATION" => 0x00000001,
11
+ "POLICY_VIEW_AUDIT_INFORMATION" => 0x00000002,
12
+ "POLICY_GET_PRIVATE_INFORMATION" => 0x00000004,
13
+ "POLICY_TRUST_ADMIN" => 0x00000008,
14
+ "POLICY_CREATE_ACCOUNT" => 0x00000010,
15
+ "POLICY_CREATE_SECRET" => 0x00000020,
16
+ "POLICY_CREATE_PRIVILEGE" => 0x00000040,
17
+ "POLICY_SET_DEFAULT_QUOTA_LIMITS" => 0x00000080,
18
+ "POLICY_SET_AUDIT_REQUIREMENTS" => 0x00000100,
19
+ "POLICY_AUDIT_LOG_ADMIN" => 0x00000200,
20
+ "POLICY_SERVER_ADMIN" => 0x00000400,
21
+ "POLICY_LOOKUP_NAMES" => 0x00000800,
22
+ "POLICY_NOTIFICATION" => 0x00001000
23
+ }
24
+
25
+ LSARPC_ACCOUNT_ACCESS_MASK = {
26
+ "ACCOUNT_VIEW" => 0x00000001,
27
+ "ACCOUNT_ADJUST_PRIVILEGES" => 0x00000002,
28
+ "ACCOUNT_ADJUST_QUOTAS" => 0x00000004,
29
+ "ACCOUNT_ADJUST_SYSTEM_ACCESS" => 0x00000008
30
+ }
31
+
32
+ #only these 2 looks interesting
33
+ LSARPC_POLICY_INFORMATION_CLASS = {
34
+ "PolicyLsaServerRoleInformation" => 6,
35
+ "PolicyDnsDomainInformation" => 12
36
+ }
37
+
38
+ LSARPC_POLICY_LSA_SERVER_ROLE = {
39
+ "PolicyServerRoleBackup" => 2,
40
+ "PolicyServerRolePrimary" => 3
41
+ }
42
+
43
+ LSARPC_SID_NAME_USE = {
44
+ "SidTypeUser" => 1,
45
+ "SidTypeGroup" => 2,
46
+ "SidTypeDomain" => 3,
47
+ "SidTypeAlias" => 4,
48
+ "SidTypeWellKnownGroup" => 5,
49
+ "SidTypeDeletedAccount" => 6,
50
+ "SidTypeInvalid" => 7,
51
+ "SidTypeUnknown" => 8,
52
+ "SidTypeComputer" => 9,
53
+ "SidTypeLabel" => 10
54
+ }
@@ -0,0 +1,55 @@
1
+ module SmbRpc
2
+ class Lsarpc < Rpc
3
+
4
+ class LsarEnumerateAccountsReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :policyHandle, :length => 20
8
+ uint32 :enumerationContext
9
+ uint32 :preferedMaximumLength, :value => 1024
10
+
11
+ def initialize_instance
12
+ super
13
+ policyHandle.value = get_parameter(:handle)
14
+ request.pduHead.frag_length = self.num_bytes
15
+ request.opnum.value = 11 #LsarEnumerateAccounts
16
+ end
17
+ end
18
+
19
+ class Sid_element < BinData::Record
20
+ endian :little
21
+ uint32 :sub_auth
22
+ rpc_sid :sid #declared in lsaQueryInformationPolicy.rb
23
+ end
24
+
25
+ class Lsapr_account_enum_buffer < BinData::Record
26
+ endian :little
27
+ uint32 :entriesRead
28
+ uint32 :ref_id_sid, :initial_value => 1
29
+ uint32 :max_count, :value => :entriesRead
30
+ array :ref_id_information, :initial_length => :entriesRead, :type => :uint32, :initial_value => 1
31
+ array :information, :initial_length => :entriesRead, :type => :sid_element
32
+ end
33
+
34
+ class LsarEnumerateAccountsRes < BinData::Record
35
+ endian :little
36
+ response :response
37
+ uint32 :enumerationContext
38
+ lsapr_account_enum_buffer :enumerationBuffer
39
+ uint32 :windowsError
40
+ end
41
+
42
+ def enumerateAccounts()
43
+ lsarEnumerateAccountsReq = LsarEnumerateAccountsReq.new(handle:@policyHandle)
44
+ lsarEnumerateAccountsRes = @file.ioctl_send_recv(lsarEnumerateAccountsReq).buffer
45
+ lsarEnumerateAccountsRes.raise_not_error_success("enumerateAccounts")
46
+ lsarEnumerateAccountsRes = LsarEnumerateAccountsRes.read(lsarEnumerateAccountsRes)
47
+ sids = []
48
+ lsarEnumerateAccountsRes.enumerationBuffer.information.each do |e|
49
+ sids << e.sid.to_s
50
+ end
51
+ return sids
52
+ end
53
+
54
+ end
55
+ end