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,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
|
+
|