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,75 @@
1
+ module SmbRpc
2
+ class Lsarpc < Rpc
3
+
4
+ class LsarQuerySecurityObjectReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :objectHandle, :length => 20
8
+ uint32 :securityInformation, :initial_value => 4 #1#7 #owner, group and DACL
9
+
10
+ def initialize_instance
11
+ super
12
+ objectHandle.value = get_parameter(:handle)
13
+ request.pduHead.frag_length = self.num_bytes
14
+ request.opnum.value = 3 #LsarQuerySecurityObject
15
+ end
16
+ end
17
+
18
+
19
+ #[MS-DTYPE] 2.4.4.1 ACE_HEADER
20
+ class Ace < BinData::Record
21
+ endian :little
22
+ uint8 :aceType
23
+ uint8 :aceFlags
24
+ uint16 :aceSize
25
+ string :content, :length => lambda { aceSize - 4 }
26
+ end
27
+
28
+ #[MS-DTYPE] 2.4.5 ACL
29
+ class Acl < BinData::Record
30
+ endian :little
31
+ uint8 :aclRevision
32
+ uint8 :sbz1 #alignment
33
+ uint16 :aclSize
34
+ uint16 :aceCount
35
+ uint16 :sbz2
36
+ array :aces, :type => :ace, :initial_length => :aceCount
37
+ end
38
+
39
+ class Lsapr_security_descriptor < BinData::Record
40
+ endian :little
41
+ uint8 :revision
42
+ uint8 :sbz1
43
+ uint16 :control
44
+ uint32 :ref_id_owner
45
+ uint32 :ref_id_group
46
+ uint32 :ref_id_sacl
47
+ uint32 :ref_id_dacl
48
+ acl :dacl
49
+ end
50
+
51
+ class Plsapr_sr_security_descriptor < BinData::Record
52
+ endian :little
53
+ uint32 :len
54
+ uint32 :ref_id_security
55
+ uint32 :secLen
56
+ lsapr_security_descriptor :securityDescriptor
57
+ end
58
+
59
+ class LsarQuerySecurityObjectRes < BinData::Record
60
+ endian :little
61
+ response :response
62
+ uint32 :ref_id_SecurityDescriptor
63
+ plsapr_sr_security_descriptor :securityDescriptor
64
+ uint32 :windowsError
65
+ end
66
+
67
+ def querySecurityObject(objectHandle:)
68
+ lsarQuerySecurityObjectReq = LsarQuerySecurityObjectReq.new(handle:objectHandle)
69
+ lsarQuerySecurityObjectRes = @file.ioctl_send_recv(lsarQuerySecurityObjectReq).buffer
70
+ lsarQuerySecurityObjectRes.raise_not_error_success("querySecurityObject")
71
+ lsarQuerySecurityObjectRes = LsarQuerySecurityObjectRes.read(lsarQuerySecurityObjectRes)
72
+ end
73
+
74
+ end
75
+ end
data/lib/smbRpc/rpc.rb ADDED
@@ -0,0 +1,5 @@
1
+ require"smbRpc/rpc/pdu"
2
+ require"smbRpc/rpc/connection"
3
+ require"smbRpc/rpc/constants"
4
+ require"smbRpc/rpc/endpoints"
5
+ require"smbRpc/rpc/ndrep"
@@ -0,0 +1,34 @@
1
+
2
+ module SmbRpc
3
+ class Rpc
4
+
5
+ attr_reader :smb
6
+
7
+ def initialize(ip:, port:445, user:"", pass:"")
8
+ @ip = ip
9
+ @port = port
10
+ @user = user
11
+ @pass = pass
12
+ end
13
+
14
+ def connect
15
+ sock = TCPSocket.open(@ip, @port)
16
+ dispatcher = RubySMB::Dispatcher::Socket.new(sock)
17
+ @smb = RubySMB::Client.new(dispatcher, smb1: true, smb2: true, username: @user, password: @pass)
18
+ result = @smb.login.value
19
+ error = WindowsError::NTStatus.find_by_retval(result.to_i)[0]
20
+ result == 0? result : (raise "Connect Fail, WinError: %s %s"%[error.name, error.description])
21
+ end
22
+
23
+ def bind(pipe:)
24
+ @ipc = @smb.tree_connect("\\\\#{@ip}\\IPC$")
25
+ @file = @ipc.open_file(filename: pipe, read: true, write: true)
26
+ @file.bind(endpoint: ENDPOINT[pipe]) #ruby_smb bind uses modules as endpoints, so setup and give it one
27
+ end
28
+
29
+ def close
30
+ @file.close if @file != nil
31
+ @smb.disconnect!
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,64 @@
1
+
2
+ PFC_FIRST_FRAG = 0x01
3
+ PFC_LAST_FRAG = 0x02
4
+ PFC_PENDING_CANCEL = 0x04
5
+ PFC_RESERVED_1 = 0x08
6
+ PFC_CONC_MPX = 0x10
7
+ PFC_DID_NOT_EXECUTE = 0x20
8
+ PFC_MAYBE = 0x40
9
+ PFC_OBJECT_UUID = 0x80
10
+
11
+ P_CONT_DEF_RESULT_T = {
12
+ "ACCEPTANCE" => 0,
13
+ "USER_REJECTION" => 1,
14
+ "PROVIDER_REJECTION" => 2
15
+ }
16
+ P_PROVIDER_REASON_T = {
17
+ "REASON_NOT_SPECIFIED" => 0,
18
+ "ABSTRACT_SYNTAX_NOT_SUPPORTED" => 1,
19
+ "PROPOSED_TRANSFER_SYNTAXES_NOT_SUPPORTED" => 2,
20
+ "LOCAL_LIMIT_EXCEEDED" => 3
21
+ }
22
+
23
+ PDU_TYPE = {
24
+ "REQUEST" => 0,
25
+ "PING" => 1,
26
+ "RESPONSE" => 2,
27
+ "FAULT" => 3,
28
+ "WORKING" => 4,
29
+ "NOCALL" => 5,
30
+ "REJECT" => 6,
31
+ "ACK" => 7,
32
+ "CL_CANCEL" => 8,
33
+ "FACK" => 9,
34
+ "CANCEL_ACK" => 10,
35
+ "BIND" => 11,
36
+ "BIND_ACK" => 12,
37
+ "BIND_NAK" => 13,
38
+ "ALTER_CONTEXT" => 14,
39
+ "ALTER_CONTEXT_RESP" => 15,
40
+ "SHUTDOWN" => 17,
41
+ "CO_CANCEL" => 18,
42
+ "ORPHANED" => 19
43
+ }
44
+
45
+ #PDU Type Protocol Type Value
46
+ #request CO/CL 0
47
+ #ping CL 1
48
+ #response CO/CL 2
49
+ #fault CO/CL 3
50
+ #working CL 4
51
+ #nocall CL 5
52
+ #reject CL 6
53
+ #ack CL 7
54
+ #cl_cancel CL 8
55
+ #fack CL 9
56
+ #cancel_ack CL 10
57
+ #bind CO 11
58
+ #bind_ack CO 12
59
+ #bind_nak CO 13
60
+ #alter_context CO 14
61
+ #alter_context_resp CO 15
62
+ #shutdown CO 17
63
+ #co_cancel CO 18
64
+ #orphaned CO 19
@@ -0,0 +1,38 @@
1
+ module SmbRpc
2
+ module Endpoint
3
+ module Srvsvc
4
+ UUID = '4B324FC8-1670-01D3-1278-5A47BF6EE188'
5
+ VER_MAJOR = 3
6
+ VER_MINOR = 0
7
+ end
8
+ module Svcctl
9
+ UUID = '367ABB81-9844-35F1-AD32-98F038001003'
10
+ VER_MAJOR = 2
11
+ VER_MINOR = 0
12
+ end
13
+ module Lsarpc
14
+ UUID = '12345778-1234-ABCD-EF00-0123456789AB'
15
+ VER_MAJOR = 0
16
+ VER_MINOR = 0
17
+ end
18
+ module Epmapper
19
+ UUID = 'e1af8308-5d1f-11c9-91a4-08002b14a0fa'
20
+ VER_MAJOR = 3
21
+ VER_MINOR = 0
22
+ end
23
+ module Samr
24
+ UUID = '12345778-1234-ABCD-EF00-0123456789AC'
25
+ VER_MAJOR = 1
26
+ VER_MINOR = 0
27
+ end
28
+ end
29
+ end
30
+
31
+ ENDPOINT = {
32
+ "srvsvc" => SmbRpc::Endpoint::Srvsvc,
33
+ "svcctl" => SmbRpc::Endpoint::Svcctl,
34
+ "lsarpc" => SmbRpc::Endpoint::Lsarpc,
35
+ "epmapper" => SmbRpc::Endpoint::Epmapper,
36
+ "samr" => SmbRpc::Endpoint::Samr
37
+ }
38
+
@@ -0,0 +1,24 @@
1
+
2
+ module SmbRpc
3
+ class Rpc
4
+
5
+ class ConformantandVaryingStrings < BinData::Record
6
+ endian :little
7
+ uint32 :max_count, :initial_value => :actual_count
8
+ uint32 :offset
9
+ uint32 :actual_count, :value => lambda{ str.num_bytes / 2}
10
+ string :str, :read_length => lambda { actual_count.nonzero?? actual_count.value * 2 : 0 }
11
+ string :pad, :onlyif => lambda{ (str.num_bytes % 4) > 0 }, :length => lambda { (4 - (str.num_bytes % 4)) % 4 }
12
+ end
13
+
14
+ class ConformantandVaryingStringsAscii < BinData::Record
15
+ endian :little
16
+ uint32 :max_count, :initial_value => :actual_count
17
+ uint32 :offset
18
+ uint32 :actual_count, :value => lambda{ str.num_bytes }
19
+ string :str, :read_length => :actual_count
20
+ string :pad, :onlyif => lambda{ (str.num_bytes % 4) > 0}, :length => lambda { (4 - (str.num_bytes % 4)) % 4 }
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,40 @@
1
+
2
+ module SmbRpc
3
+ class Rpc
4
+ class PduHead < BinData::Record
5
+ endian :little
6
+ uint8 :rpc_vers, :initial_value => 5
7
+ uint8 :rpc_vers_minor
8
+ uint8 :ptype #packet type
9
+ uint8 :pfc_flags, :initial_value => lambda{ PFC_FIRST_FRAG | PFC_LAST_FRAG } #flags (see PFC_... )
10
+ uint32 :drep, :initial_value => 0x10 #NDR data representation format label
11
+ uint16 :frag_length #total length of the PDU
12
+ uint16 :auth_length #length of auth_value
13
+ uint32 :call_id, :initial_value => 1 #call identifier for matching rewponse like smb msg ID
14
+ end
15
+
16
+ class Request < BinData::Record
17
+ endian :little
18
+ pduHead :pduHead
19
+ uint32 :alloc_hint
20
+ uint16 :p_cont_id
21
+ uint16 :opnum
22
+ string :auth_verifier, :onlyif => lambda { pduHead.auth_length > 0 }, :length => lambda { pduHead.auth_length }
23
+
24
+ def initialize_instance
25
+ super
26
+ pduHead.ptype = PDU_TYPE["REQUEST"]
27
+ end
28
+ end
29
+
30
+ class Response < BinData::Record
31
+ endian :little
32
+ pduHead :pduHead
33
+ uint32 :alloc_hint
34
+ uint16 :p_cont_id
35
+ uint8 :cancel_count
36
+ uint8 :reserved
37
+ string :auth_verifier, :onlyif => lambda { pduHead.auth_length > 0 }, :length => lambda { pduHead.auth_length }
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ require"smbRpc/samr/connect"
2
+ require"smbRpc/samr/constants"
3
+ require"smbRpc/samr/openDomain"
4
+ require"smbRpc/samr/enumerateUsersInDomain"
5
+ require"smbRpc/samr/enumerateDomainsInSamServer"
6
+ require"smbRpc/samr/lookupDomainInSamServer"
7
+ require"smbRpc/samr/closeHandle"
8
+ require"smbRpc/samr/openUser"
9
+ require"smbRpc/samr/queryInformationUser"
10
+ require"smbRpc/samr/enumerateGroupsInDomain"
11
+ require"smbRpc/samr/enumerateAliasesInDomain"
12
+ require"smbRpc/samr/openAlias"
13
+ require"smbRpc/samr/getMembersInAlias"
14
+ require"smbRpc/samr/lookupNamesInDomain"
15
+ require"smbRpc/samr/lookupIdsInDomain"
16
+ require"smbRpc/samr/createUserInDomain"
17
+ require"smbRpc/samr/setInformationUser"
18
+ require"smbRpc/samr/deleteUser"
19
+ require"smbRpc/samr/changePasswordUser"
20
+ require"smbRpc/samr/createGroupInDomain"
21
+ require"smbRpc/samr/createAliasInDomain"
22
+ require"smbRpc/samr/deleteAlias"
23
+ require"smbRpc/samr/addMemberToAlias"
24
+ require"smbRpc/samr/getMembersInAlias"
25
+ require"smbRpc/samr/removeMemberFromAlias"
26
+ require"smbRpc/samr/openGroup"
27
+ require"smbRpc/samr/deleteGroup"
28
+ require"smbRpc/samr/addMemberToGroup"
29
+ require"smbRpc/samr/getMembersInGroup"
30
+ require"smbRpc/samr/removeMemberFromGroup"
31
+
32
+ module SmbRpc
33
+ class Samr < Rpc
34
+ def initialize(**argv)
35
+ super(argv)
36
+ self.connect
37
+ self.bind(pipe:"samr")
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,43 @@
1
+ module SmbRpc
2
+ class Samr < Rpc
3
+
4
+ class SamrAddMemberToAliasReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :aliasHandle, :length => 20
8
+ sid_element :memberId
9
+
10
+ def initialize_instance
11
+ super
12
+ aliasHandle.value = get_parameter(:handle)
13
+ sid = get_parameter(:sid)
14
+ sidArray = sid.split("-")
15
+ subAuthorityCount = sidArray.size - 3
16
+ memberId.sub_auth.value = subAuthorityCount
17
+ memberId.sid.revision.value = sidArray[1].to_i
18
+ memberId.sid.subAuthorityCount.value = subAuthorityCount
19
+ memberId.sid.identifierAuthority.value = [sidArray[2].to_i].pack("N").rjust(6, "\x00")
20
+ subAuthorityCount.times do |i|
21
+ memberId.sid.subAuthority[i] = sidArray[i + 3].to_i
22
+ end
23
+ request.pduHead.frag_length = self.num_bytes
24
+ request.opnum.value = 31 #SamrAddMemberToAlias
25
+ end
26
+ end
27
+
28
+ class SamrAddMemberToAliasRes < BinData::Record
29
+ endian :little
30
+ response :response
31
+ uint32 :windowsError
32
+ end
33
+
34
+ def addMemberToAlias(memberId:)
35
+ samrAddMemberToAliasReq = SamrAddMemberToAliasReq.new(handle:@aliasHandle, sid:memberId)
36
+ samrAddMemberToAliasRes = @file.ioctl_send_recv(samrAddMemberToAliasReq).buffer
37
+ samrAddMemberToAliasRes.raise_not_error_success("addMemberToAlias")
38
+ return self
39
+ end
40
+
41
+ end
42
+ end
43
+
@@ -0,0 +1,36 @@
1
+ module SmbRpc
2
+ class Samr < Rpc
3
+
4
+ class SamrAddMemberToGroupReq < BinData::Record
5
+ endian :little
6
+ request :request
7
+ string :groupHandle, :length => 20
8
+ uint32 :memberId #addMemberToAlias use SID, why not here MS?
9
+ uint32 :attributes
10
+
11
+ def initialize_instance
12
+ super
13
+ groupHandle.value = get_parameter(:handle)
14
+ memberId.value = get_parameter(:rid)
15
+ attributes.value = get_parameter(:attr)
16
+ request.pduHead.frag_length = self.num_bytes
17
+ request.opnum.value = 22 #SamrAddMemberToGroup
18
+ end
19
+ end
20
+
21
+ class SamrAddMemberToGroupRes < BinData::Record
22
+ endian :little
23
+ response :response
24
+ uint32 :windowsError
25
+ end
26
+
27
+ def addMemberToGroup(memberId:, attributes:SAMR_SE_GROUP_ATTRIBUTES["SE_GROUP_ENABLED_BY_DEFAULT"])
28
+ samrAddMemberToGroupReq = SamrAddMemberToGroupReq.new(handle:@groupHandle, rid:memberId, attr:attributes)
29
+ samrAddMemberToGroupRes = @file.ioctl_send_recv(samrAddMemberToGroupReq).buffer
30
+ samrAddMemberToGroupRes.raise_not_error_success("addMemberToGroup")
31
+ return self
32
+ end
33
+
34
+ end
35
+ end
36
+
@@ -0,0 +1,64 @@
1
+
2
+ module SmbRpc
3
+ class Samr < Rpc
4
+
5
+ class SamrChangePasswordUserReq < BinData::Record
6
+ endian :little
7
+ request :request
8
+ string :userHandle, :length => 20
9
+
10
+ uint32 :lmPresent, :value => 1
11
+ uint32 :ref_id_oldLmEncryptedWithNewLm, :value => 1
12
+ string :oldLmEncryptedWithNewLm, :length => 16
13
+ uint32 :ref_id_newLmEncryptedWithOldLm, :value => 1
14
+ string :newLmEncryptedWithOldLm, :length => 16
15
+
16
+ uint32 :ntPresent, :value => 1
17
+ uint32 :ref_id_oldNtEncryptedWithNewNt, :value => 1
18
+ string :oldNtEncryptedWithNewNt, :length => 16
19
+ uint32 :ref_id_newNtEncryptedWithOldNt, :value => 1
20
+ string :newNtEncryptedWithOldNt, :length => 16
21
+
22
+ uint32 :ntCrossEncryptionPresent, :value => 1
23
+ uint32 :ref_id_newNtEncryptedWithNewLm, :value => 1
24
+ string :newNtEncryptedWithNewLm, :length => 16
25
+
26
+ uint32 :lmCrossEncryptionPresent, :value => 1
27
+ uint32 :ref_id_newLmEncryptedWithNewNt, :value => 1
28
+ string :newLmEncryptedWithNewNt, :length => 16
29
+
30
+ def initialize_instance
31
+ super
32
+ userHandle.value = get_parameter(:handle)
33
+ oldPass = get_parameter(:oldPass)
34
+ newPass = get_parameter(:newPass)
35
+ oldLm = [Smbhash.lm_hash(oldPass)].pack("H*")
36
+ oldNt = [Smbhash.ntlm_hash(oldPass)].pack("H*")
37
+ newLm = [Smbhash.lm_hash(newPass)].pack("H*")
38
+ newNt = [Smbhash.ntlm_hash(newPass)].pack("H*")
39
+ oldLmEncryptedWithNewLm.value = oldLm.to_des_ecb_lm(newLm)
40
+ newLmEncryptedWithOldLm.value = newLm.to_des_ecb_lm(oldLm)
41
+ oldNtEncryptedWithNewNt.value = oldNt.to_des_ecb_lm(newNt)
42
+ newNtEncryptedWithOldNt.value = newNt.to_des_ecb_lm(oldNt)
43
+ newNtEncryptedWithNewLm.value = newNt.to_des_ecb_lm(newLm)
44
+ newLmEncryptedWithNewNt.value = newLm.to_des_ecb_lm(newNt)
45
+ request.pduHead.frag_length = self.num_bytes
46
+ request.opnum.value = 38 #SamrChangePasswordUser
47
+ end
48
+ end
49
+
50
+ class SamrChangePasswordUserRes < BinData::Record
51
+ endian :little
52
+ request :request
53
+ uint32 :windowsError
54
+ end
55
+
56
+ def changePasswordUser(oldPass:, newPass:)
57
+ samrChangePasswordUserReq = SamrChangePasswordUserReq.new(handle:@userHandle, oldPass:oldPass, newPass:newPass)
58
+ samrChangePasswordUserRes = @file.ioctl_send_recv(samrChangePasswordUserReq).buffer
59
+ samrChangePasswordUserRes.raise_not_error_success("changePasswordUser")
60
+ return self
61
+ end
62
+
63
+ end
64
+ end