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,50 @@
|
|
1
|
+
|
2
|
+
module SmbRpc
|
3
|
+
class Samr < Rpc
|
4
|
+
|
5
|
+
class SamrCloseHandleReq < BinData::Record
|
6
|
+
endian :little
|
7
|
+
request :request
|
8
|
+
string :samHandle, :length => 20
|
9
|
+
def initialize_instance
|
10
|
+
super
|
11
|
+
samHandle.value = get_parameter(:handle)
|
12
|
+
request.pduHead.frag_length = self.num_bytes
|
13
|
+
request.opnum.value = 1 #SamrCloseHandle
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class SamrCloseHandleRes < BinData::Record
|
18
|
+
endian :little
|
19
|
+
request :request
|
20
|
+
string :samHandle, :length => 20
|
21
|
+
uint32 :windowsError
|
22
|
+
end
|
23
|
+
|
24
|
+
def closeDomain()
|
25
|
+
if !@domainHandle.nil?
|
26
|
+
samrCloseHandleReq = SamrCloseHandleReq.new(handle:@domainHandle)
|
27
|
+
samrCloseHandleRes = @file.ioctl_send_recv(samrCloseHandleReq).buffer
|
28
|
+
samrCloseHandleRes.raise_not_error_success("closeDomain")
|
29
|
+
samrCloseHandleRes = SamrCloseHandleRes.read(samrCloseHandleRes)
|
30
|
+
@domainHandle = nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def closeServer()
|
35
|
+
if !@serverHandle.nil?
|
36
|
+
samrCloseHandleReq = SamrCloseHandleReq.new(handle:@serverHandle)
|
37
|
+
samrCloseHandleRes = @file.ioctl_send_recv(samrCloseHandleReq).buffer
|
38
|
+
samrCloseHandleRes.raise_not_error_success("closeServer")
|
39
|
+
samrCloseHandleRes = SamrCloseHandleRes.read(samrCloseHandleRes)
|
40
|
+
@serverHandle = nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def close()
|
45
|
+
closeDomain()
|
46
|
+
closeServer()
|
47
|
+
super
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrConnectReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
uint32 :ref_id_unc, :value => 1
|
8
|
+
conformantandVaryingStrings :serverName
|
9
|
+
uint32 :desiredAccess
|
10
|
+
uint32 :inVersion, :value => 1
|
11
|
+
uint32 :switch, :value => :inVersion #only version available, may as well use normal SamrConnect
|
12
|
+
uint32 :revision, :value => 3
|
13
|
+
uint32 :supportedFeatures
|
14
|
+
|
15
|
+
def initialize_instance
|
16
|
+
super
|
17
|
+
serverName.str = "\\\\#{get_parameter(:srvName)}\x00".bytes.pack("v*")
|
18
|
+
desiredAccess.value = get_parameter(:access)
|
19
|
+
request.pduHead.frag_length = self.num_bytes
|
20
|
+
request.opnum.value = 64 #SamrConnect5
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class SamrConnectRes < BinData::Record
|
25
|
+
endian :little
|
26
|
+
request :request
|
27
|
+
uint32 :outVersion
|
28
|
+
uint32 :switch
|
29
|
+
uint32 :revision
|
30
|
+
uint32 :supportedFeatures
|
31
|
+
string :serverHandle, :length => 20
|
32
|
+
uint32 :windowsError
|
33
|
+
end
|
34
|
+
|
35
|
+
def connect5(serverName:@ip, desiredAccess:SAMR_COMMON_ACCESS_MASK["MAXIMUM_ALLOWED"])
|
36
|
+
samrConnectReq = SamrConnectReq.new(:srvName=> serverName, access:desiredAccess)
|
37
|
+
samrConnectRes = @file.ioctl_send_recv(samrConnectReq).buffer
|
38
|
+
samrConnectRes.raise_not_error_success("SamConnect")
|
39
|
+
samrConnectRes = SamrConnectRes.read(samrConnectRes)
|
40
|
+
@serverHandle = samrConnectRes.serverHandle
|
41
|
+
return self
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
@@ -0,0 +1,114 @@
|
|
1
|
+
SAMR_SERVER_ACCESS_MASK = {
|
2
|
+
"SAM_SERVER_CONNECT" => 0x00000001,
|
3
|
+
"SAM_SERVER_SHUTDOWN" => 0x00000002,
|
4
|
+
"SAM_SERVER_INITIALIZE" => 0x00000004,
|
5
|
+
"SAM_SERVER_CREATE_DOMAIN" => 0x00000008,
|
6
|
+
"SAM_SERVER_ENUMERATE_DOMAINS" => 0x00000010,
|
7
|
+
"SAM_SERVER_LOOKUP_DOMAIN" => 0x00000020,
|
8
|
+
"SAM_SERVER_ALL_ACCESS" => 0x000F003F,
|
9
|
+
"SAM_SERVER_READ" => 0x00020010,
|
10
|
+
"SAM_SERVER_WRITE" => 0x0002000E,
|
11
|
+
"SAM_SERVER_EXECUTE" => 0x00020021
|
12
|
+
}
|
13
|
+
|
14
|
+
#https://msdn.microsoft.com/en-us/library/cc230294.aspx
|
15
|
+
SAMR_COMMON_ACCESS_MASK = {
|
16
|
+
"GENERIC_READ" => 0x80000000,
|
17
|
+
"GENERIC_WRITE" => 0x4000000,
|
18
|
+
"GENERIC_EXECUTE" => 0x20000000,
|
19
|
+
"GENERIC_ALL" => 0x10000000,
|
20
|
+
"SYNCHRONIZE" => 0x00100000,
|
21
|
+
"DELETE" => 0x00010000,
|
22
|
+
"READ_CONTROL" => 0x00020000,
|
23
|
+
"WRITE_DAC" => 0x00040000,
|
24
|
+
"WRITE_OWNER" => 0x00080000,
|
25
|
+
"ACCESS_SYSTEM_SECURITY" => 0x01000000,
|
26
|
+
"MAXIMUM_ALLOWED" => 0x02000000
|
27
|
+
}
|
28
|
+
|
29
|
+
SAMR_USER_ACCOUNT = {
|
30
|
+
"USER_ACCOUNT_DISABLED" => 0x00000001, #account is not enabled for authentication.
|
31
|
+
"USER_HOME_DIRECTORY_REQUIRED" => 0x00000002, #homeDirectory attribute is required.
|
32
|
+
"USER_PASSWORD_NOT_REQUIRED" => 0x00000004, #password-length policy does not apply to this user.
|
33
|
+
"USER_TEMP_DUPLICATE_ACCOUNT" => 0x00000008, #This bit is ignored by clients and servers.
|
34
|
+
"USER_NORMAL_ACCOUNT" => 0x00000010, #user is not a computer object
|
35
|
+
"USER_MNS_LOGON_ACCOUNT" => 0x00000020, #This bit is ignored by clients and servers
|
36
|
+
"USER_INTERDOMAIN_TRUST_ACCOUNT" => 0x00000040, #object represents a trust object.
|
37
|
+
"USER_WORKSTATION_TRUST_ACCOUNT" => 0x00000080, #object is a member workstation or server.
|
38
|
+
"USER_SERVER_TRUST_ACCOUNT" => 0x00000100, #object is a DC
|
39
|
+
"USER_DONT_EXPIRE_PASSWORD" => 0x00000200, #maximum-password-age policy does not apply to this user.
|
40
|
+
"USER_ACCOUNT_AUTO_LOCKED" => 0x00000400, #account has been locked out
|
41
|
+
"USER_ENCRYPTED_TEXT_PASSWORD_ALLOWED" => 0x00000800, #cleartext password is to be persisted
|
42
|
+
"USER_SMARTCARD_REQUIRED" => 0x00001000, #user can authenticate only with a smart card
|
43
|
+
"USER_TRUSTED_FOR_DELEGATION" => 0x00002000, #used by the Kerberos protocol, "OK as Delegate" ticket flag is to be set
|
44
|
+
"USER_NOT_DELEGATED" => 0x00004000, #used by the Kerberos protocol. TGTs and service tickets obtained by this account
|
45
|
+
#are not marked as forwardable or proxiable
|
46
|
+
"USER_USE_DES_KEY_ONLY" => 0x00008000, #used by the Kerberos protocol. only des-cbc-md5 or des-cbc-crc keys
|
47
|
+
"USER_DONT_REQUIRE_PREAUTH" => 0x00010000, #used by the Kerberos protocol. the account is not required pre-authentication data
|
48
|
+
"USER_PASSWORD_EXPIRED" => 0x00020000, #password age on the user has exceeded the maximum password age policy
|
49
|
+
"USER_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION" => 0x00040000, #used by the Kerberos protocol, in [MS-KILE] section 3.3.1.1.
|
50
|
+
"USER_NO_AUTH_DATA_REQUIRED" => 0x00080000, #used by the Kerberos protocol. when the KDC is issuing a service ticket
|
51
|
+
#the privilege attribute certificate (PAC) is not to be included
|
52
|
+
"USER_PARTIAL_SECRETS_ACCOUNT" => 0x00100000, #Specifies that the object is a read-only domain controller (RODC).
|
53
|
+
"USER_USE_AES_KEYS" => 0x00200000 #This bit is ignored by clients and servers.
|
54
|
+
}
|
55
|
+
|
56
|
+
#https://msdn.microsoft.com/en-us/library/cc245770.aspx
|
57
|
+
SAMR_CREATE_USER_ACCOUNT = {
|
58
|
+
"USER_NORMAL_ACCOUNT" => 0x00000010, #user is not a computer object
|
59
|
+
"USER_WORKSTATION_TRUST_ACCOUNT" => 0x00000080, #object is a member workstation or server.
|
60
|
+
"USER_SERVER_TRUST_ACCOUNT" => 0x00000100 #object is a DC
|
61
|
+
}
|
62
|
+
|
63
|
+
#https://msdn.microsoft.com/en-us/library/cc245525.aspx
|
64
|
+
|
65
|
+
SAMR_USER_ACCESS_MASK = {
|
66
|
+
"USER_READ_GENERAL" => 0x00000001,
|
67
|
+
"USER_READ_PREFERENCES" => 0x00000002,
|
68
|
+
"USER_WRITE_PREFERENCES" => 0x00000004,
|
69
|
+
"USER_READ_LOGON" => 0x00000008,
|
70
|
+
"USER_READ_ACCOUNT" => 0x00000010,
|
71
|
+
"USER_WRITE_ACCOUNT" => 0x00000020,
|
72
|
+
"USER_CHANGE_PASSWORD" => 0x00000040,
|
73
|
+
"USER_FORCE_PASSWORD_CHANGE" => 0x00000080,
|
74
|
+
"USER_LIST_GROUPS" => 0x00000100,
|
75
|
+
"USER_READ_GROUP_INFORMATION" => 0x00000200,
|
76
|
+
"USER_WRITE_GROUP_INFORMATION" => 0x00000400,
|
77
|
+
"USER_ALL_ACCESS" => 0x000F07FF,
|
78
|
+
"USER_READ" => 0x0002031A,
|
79
|
+
"USER_WRITE" => 0x00020044,
|
80
|
+
"USER_EXECUTE" => 0x00020041
|
81
|
+
}
|
82
|
+
|
83
|
+
SAMR_GROUP_ACCESS_MASK = {
|
84
|
+
"GROUP_READ_INFORMATION" => 0x00000001,
|
85
|
+
"GROUP_WRITE_ACCOUNT" => 0x00000002,
|
86
|
+
"GROUP_ADD_MEMBER" => 0x00000004,
|
87
|
+
"GROUP_REMOVE_MEMBER" => 0x00000008,
|
88
|
+
"GROUP_LIST_MEMBERS" => 0x00000010,
|
89
|
+
"GROUP_ALL_ACCESS" => 0x000F001F,
|
90
|
+
"GROUP_READ" => 0x00020010,
|
91
|
+
"GROUP_WRITE" => 0x0002000E,
|
92
|
+
"GROUP_EXECUTE" => 0x00020001
|
93
|
+
}
|
94
|
+
SAMR_ALIAS_ACCESS_MASK = {
|
95
|
+
"ALIAS_ADD_MEMBER" => 0x00000001,
|
96
|
+
"ALIAS_REMOVE_MEMBER" => 0x00000002,
|
97
|
+
"ALIAS_LIST_MEMBERS" => 0x00000004,
|
98
|
+
"ALIAS_READ_INFORMATION" => 0x00000008,
|
99
|
+
"ALIAS_WRITE_ACCOUNT" => 0x00000010,
|
100
|
+
"ALIAS_ALL_ACCESS" => 0x000F001F,
|
101
|
+
"ALIAS_READ" => 0x00020004,
|
102
|
+
"ALIAS_WRITE" => 0x00020013,
|
103
|
+
"ALIAS_EXECUTE" => 0x00020008
|
104
|
+
}
|
105
|
+
SAMR_ENUM_USER_INFORMATION_CLASS = {
|
106
|
+
"UserAccountInformation" => 5,
|
107
|
+
"UserInternal1Information" => 18
|
108
|
+
}
|
109
|
+
|
110
|
+
SAMR_SE_GROUP_ATTRIBUTES = {
|
111
|
+
"SE_GROUP_MANDATORY" => 0x00000001,
|
112
|
+
"SE_GROUP_ENABLED_BY_DEFAULT" => 0x00000002,
|
113
|
+
"SE_GROUP_ENABLED" => 0x00000004
|
114
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrCreateAliasInDomainReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :domainHandle, :length => 20
|
8
|
+
rpc_unicode_string :accountName #declared in lsarpc/lsaQueryInformationPolicy.rb
|
9
|
+
conformantandVaryingStrings :accountNameNdr
|
10
|
+
uint32 :desiredAccess
|
11
|
+
|
12
|
+
def initialize_instance
|
13
|
+
super
|
14
|
+
domainHandle.value = get_parameter(:handle)
|
15
|
+
accountNameNdr.str = get_parameter(:aliasName).bytes.pack("v*")
|
16
|
+
numBytes = accountNameNdr.actual_count * 2
|
17
|
+
accountName.len.value = numBytes
|
18
|
+
accountName.maximumLength.value = numBytes
|
19
|
+
desiredAccess.value = get_parameter(:access)
|
20
|
+
|
21
|
+
request.pduHead.frag_length = self.num_bytes
|
22
|
+
request.opnum.value = 14 #SamrCreateAliasInDomain
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class SamrCreateAliasInDomainRes < BinData::Record
|
27
|
+
endian :little
|
28
|
+
request :request
|
29
|
+
string :aliasHandle, :length => 20
|
30
|
+
uint32 :relativeId
|
31
|
+
uint32 :windowsError
|
32
|
+
end
|
33
|
+
|
34
|
+
def createAliasInDomain(name:, desiredAccess:SAMR_ALIAS_ACCESS_MASK["ALIAS_ALL_ACCESS"])
|
35
|
+
samrCreateAliasInDomainReq = SamrCreateAliasInDomainReq.new(aliasName:name, access:desiredAccess, handle:@domainHandle)
|
36
|
+
samrCreateAliasInDomainRes = @file.ioctl_send_recv(samrCreateAliasInDomainReq).buffer
|
37
|
+
samrCreateAliasInDomainRes.raise_not_error_success("createAliasInDomain")
|
38
|
+
samrCreateAliasInDomainRes = SamrCreateAliasInDomainRes.read(samrCreateAliasInDomainRes)
|
39
|
+
@aliasHandle = samrCreateAliasInDomainRes.aliasHandle
|
40
|
+
return self
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrCreateGroupInDomainReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :domainHandle, :length => 20
|
8
|
+
rpc_unicode_string :name #declared in lsarpc/lsaQueryInformationPolicy.rb
|
9
|
+
conformantandVaryingStrings :nameNdr
|
10
|
+
uint32 :desiredAccess
|
11
|
+
|
12
|
+
def initialize_instance
|
13
|
+
super
|
14
|
+
domainHandle.value = get_parameter(:handle)
|
15
|
+
nameNdr.str = get_parameter(:groupName).bytes.pack("v*")
|
16
|
+
numBytes = nameNdr.actual_count * 2
|
17
|
+
name.len.value = numBytes
|
18
|
+
name.maximumLength.value = numBytes
|
19
|
+
desiredAccess.value = get_parameter(:access)
|
20
|
+
|
21
|
+
request.pduHead.frag_length = self.num_bytes
|
22
|
+
request.opnum.value = 10 #SamrCreateGroupInDomain
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class SamrCreateGroupInDomainRes < BinData::Record
|
27
|
+
endian :little
|
28
|
+
request :request
|
29
|
+
string :groupHandle, :length => 20
|
30
|
+
uint32 :relativeId
|
31
|
+
uint32 :windowsError
|
32
|
+
end
|
33
|
+
|
34
|
+
def createGroupInDomain(name:, desiredAccess:SAMR_GROUP_ACCESS_MASK["GROUP_ALL_ACCESS"])
|
35
|
+
samrCreateGroupInDomainReq = SamrCreateGroupInDomainReq.new(groupName:name, access:desiredAccess, handle:@domainHandle)
|
36
|
+
|
37
|
+
samrCreateGroupInDomainRes = @file.ioctl_send_recv(samrCreateGroupInDomainReq).buffer
|
38
|
+
samrCreateGroupInDomainRes.raise_not_error_success("createGroupInDomainRes")
|
39
|
+
samrCreateGroupInDomainRes = SamrCreateGroupInDomainRes.read(samrCreateGroupInDomainRes)
|
40
|
+
@groupHandle = samrCreateGroupInDomainRes.groupHandle
|
41
|
+
return self
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrCreateUser2InDomainReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :domainHandle, :length => 20
|
8
|
+
rpc_unicode_string :name #declared in lsarpc/lsaQueryInformationPolicy.rb
|
9
|
+
conformantandVaryingStrings :nameNdr
|
10
|
+
uint32 :accountType
|
11
|
+
uint32 :desiredAccess
|
12
|
+
|
13
|
+
def initialize_instance
|
14
|
+
super
|
15
|
+
domainHandle.value = get_parameter(:handle)
|
16
|
+
nameNdr.str = get_parameter(:accName).bytes.pack("v*")
|
17
|
+
numBytes = nameNdr.actual_count * 2
|
18
|
+
name.len.value = numBytes
|
19
|
+
name.maximumLength.value = numBytes
|
20
|
+
accountType.value = get_parameter(:accType)
|
21
|
+
desiredAccess.value = get_parameter(:access)
|
22
|
+
request.pduHead.frag_length = self.num_bytes
|
23
|
+
request.opnum.value = 50 #SamrCreateUser2InDomain
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class SamrCreateUser2InDomainRes < BinData::Record
|
28
|
+
endian :little
|
29
|
+
request :request
|
30
|
+
string :userHandle, :length => 20
|
31
|
+
uint32 :grantedAccess
|
32
|
+
uint32 :relativeId
|
33
|
+
uint32 :windowsError
|
34
|
+
end
|
35
|
+
|
36
|
+
def createUserInDomain(name:, accountType:SAMR_CREATE_USER_ACCOUNT["USER_NORMAL_ACCOUNT"],
|
37
|
+
desiredAccess:SAMR_USER_ACCESS_MASK["USER_ALL_ACCESS"])
|
38
|
+
samrCreateUser2InDomainReq = SamrCreateUser2InDomainReq.new(accName:name, accType:accountType, access:desiredAccess, handle:@domainHandle)
|
39
|
+
samrCreateUser2InDomainRes = @file.ioctl_send_recv(samrCreateUser2InDomainReq).buffer
|
40
|
+
samrCreateUser2InDomainRes.raise_not_error_success("createUserInDomain")
|
41
|
+
samrCreateUser2InDomainRes = SamrCreateUser2InDomainRes.read(samrCreateUser2InDomainRes)
|
42
|
+
@userHandle = samrCreateUser2InDomainRes.userHandle
|
43
|
+
return self
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrDeleteAliasReq < 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 = 30 #SamrDeleteAlias
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class SamrDeleteAliasRes < BinData::Record
|
18
|
+
endian :little
|
19
|
+
request :request
|
20
|
+
string :aliasHandle, :length => 20
|
21
|
+
uint32 :windowsError
|
22
|
+
end
|
23
|
+
|
24
|
+
def deleteAlias
|
25
|
+
samrDeleteAliasReq = SamrDeleteAliasReq.new(handle:@aliasHandle)
|
26
|
+
samrDeleteAliasRes = @file.ioctl_send_recv(samrDeleteAliasReq).buffer
|
27
|
+
samrDeleteAliasRes.raise_not_error_success("deleteAlias")
|
28
|
+
samrDeleteAliasRes = SamrDeleteAliasRes.read(samrDeleteAliasRes)
|
29
|
+
@aliasHandle = nil
|
30
|
+
return 0
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrDeleteGroupReq < 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 = 23 #SamrDeleteGroup
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class SamrDeleteGroupRes < BinData::Record
|
18
|
+
endian :little
|
19
|
+
request :request
|
20
|
+
string :groupHandle, :length => 20
|
21
|
+
uint32 :windowsError
|
22
|
+
end
|
23
|
+
|
24
|
+
def deleteGroup
|
25
|
+
samrDeleteGroupReq = SamrDeleteGroupReq.new(handle:@groupHandle)
|
26
|
+
samrDeleteGroupRes = @file.ioctl_send_recv(samrDeleteGroupReq).buffer
|
27
|
+
samrDeleteGroupRes.raise_not_error_success("deleteGroup")
|
28
|
+
samrDeleteGroupRes = SamrDeleteGroupRes.read(samrDeleteGroupRes)
|
29
|
+
@groupHandle = nil
|
30
|
+
return 0
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module SmbRpc
|
2
|
+
class Samr < Rpc
|
3
|
+
|
4
|
+
class SamrDeleteUserReq < BinData::Record
|
5
|
+
endian :little
|
6
|
+
request :request
|
7
|
+
string :userHandle, :length => 20
|
8
|
+
|
9
|
+
def initialize_instance
|
10
|
+
super
|
11
|
+
userHandle.value = get_parameter(:handle)
|
12
|
+
request.pduHead.frag_length = self.num_bytes
|
13
|
+
request.opnum.value = 35 #SamrDeleteUser
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class SamrDeleteUserRes < BinData::Record
|
18
|
+
endian :little
|
19
|
+
request :request
|
20
|
+
string :userHandle, :length => 20
|
21
|
+
uint32 :windowsError
|
22
|
+
end
|
23
|
+
|
24
|
+
def deleteUser
|
25
|
+
samrDeleteUserReq = SamrDeleteUserReq.new(handle:@userHandle)
|
26
|
+
samrDeleteUserRes = @file.ioctl_send_recv(samrDeleteUserReq).buffer
|
27
|
+
samrDeleteUserRes.raise_not_error_success("deleteUser")
|
28
|
+
samrDeleteUserRes = SamrDeleteUserRes.read(samrDeleteUserRes)
|
29
|
+
@userHandle = samrDeleteUserRes.userHandle
|
30
|
+
return 0
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|