rex 2.0.5 → 2.0.7

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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rex/exploitation/egghunter.rb +4 -6
  3. data/lib/rex/exploitation/powershell/psh_methods.rb +9 -0
  4. data/lib/rex/java/serialization.rb +2 -1
  5. data/lib/rex/java/serialization/builder.rb +94 -0
  6. data/lib/rex/java/serialization/model.rb +29 -18
  7. data/lib/rex/java/serialization/model/annotation.rb +2 -2
  8. data/lib/rex/java/serialization/model/field.rb +2 -2
  9. data/lib/rex/java/serialization/model/new_array.rb +8 -3
  10. data/lib/rex/java/serialization/model/new_class_desc.rb +3 -3
  11. data/lib/rex/java/serialization/model/new_enum.rb +4 -4
  12. data/lib/rex/java/serialization/model/new_object.rb +17 -10
  13. data/lib/rex/ole/direntry.rb +1 -1
  14. data/lib/rex/ole/samples/create_ole.rb +0 -0
  15. data/lib/rex/ole/samples/dir.rb +0 -0
  16. data/lib/rex/ole/samples/dump_stream.rb +0 -0
  17. data/lib/rex/ole/samples/ole_info.rb +0 -0
  18. data/lib/rex/parser/foundstone_nokogiri.rb +1 -1
  19. data/lib/rex/parser/fs/ntfs.rb +252 -0
  20. data/lib/rex/parser/openvas_nokogiri.rb +2 -0
  21. data/lib/rex/payloads/win32/kernel.rb +3 -3
  22. data/lib/rex/post/meterpreter/client_core.rb +172 -64
  23. data/lib/rex/post/meterpreter/extensions/priv/priv.rb +3 -2
  24. data/lib/rex/post/meterpreter/extensions/stdapi/fs/file.rb +12 -10
  25. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/api_constants.rb +64 -37
  26. data/lib/rex/post/meterpreter/extensions/stdapi/railgun/dll.rb +8 -2
  27. data/lib/rex/post/meterpreter/extensions/stdapi/ui.rb +15 -3
  28. data/lib/rex/post/meterpreter/packet.rb +41 -38
  29. data/lib/rex/post/meterpreter/packet_dispatcher.rb +7 -1
  30. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/core.rb +17 -4
  31. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/fs.rb +11 -4
  32. data/lib/rex/post/meterpreter/ui/console/command_dispatcher/stdapi/ui.rb +1 -1
  33. data/lib/rex/proto.rb +2 -0
  34. data/lib/rex/proto/acpp.rb +17 -0
  35. data/lib/rex/proto/acpp/client.rb +29 -0
  36. data/lib/rex/proto/acpp/message.rb +183 -0
  37. data/lib/rex/proto/http/client.rb +1 -2
  38. data/lib/rex/proto/iax2/call.rb +22 -3
  39. data/lib/rex/proto/iax2/client.rb +1 -0
  40. data/lib/rex/proto/kerberos.rb +13 -0
  41. data/lib/rex/proto/kerberos/client.rb +213 -0
  42. data/lib/rex/proto/kerberos/credential_cache.rb +19 -0
  43. data/lib/rex/proto/kerberos/credential_cache/cache.rb +81 -0
  44. data/lib/rex/proto/kerberos/credential_cache/credential.rb +151 -0
  45. data/lib/rex/proto/kerberos/credential_cache/element.rb +49 -0
  46. data/lib/rex/proto/kerberos/credential_cache/key_block.rb +62 -0
  47. data/lib/rex/proto/kerberos/credential_cache/principal.rb +70 -0
  48. data/lib/rex/proto/kerberos/credential_cache/time.rb +69 -0
  49. data/lib/rex/proto/kerberos/crypto.rb +21 -0
  50. data/lib/rex/proto/kerberos/crypto/rc4_hmac.rb +65 -0
  51. data/lib/rex/proto/kerberos/crypto/rsa_md5.rb +15 -0
  52. data/lib/rex/proto/kerberos/model.rb +133 -0
  53. data/lib/rex/proto/kerberos/model/ap_req.rb +98 -0
  54. data/lib/rex/proto/kerberos/model/authenticator.rb +143 -0
  55. data/lib/rex/proto/kerberos/model/authorization_data.rb +85 -0
  56. data/lib/rex/proto/kerberos/model/checksum.rb +59 -0
  57. data/lib/rex/proto/kerberos/model/element.rb +67 -0
  58. data/lib/rex/proto/kerberos/model/enc_kdc_response.rb +215 -0
  59. data/lib/rex/proto/kerberos/model/encrypted_data.rb +171 -0
  60. data/lib/rex/proto/kerberos/model/encryption_key.rb +106 -0
  61. data/lib/rex/proto/kerberos/model/kdc_request.rb +166 -0
  62. data/lib/rex/proto/kerberos/model/kdc_request_body.rb +315 -0
  63. data/lib/rex/proto/kerberos/model/kdc_response.rb +141 -0
  64. data/lib/rex/proto/kerberos/model/krb_error.rb +219 -0
  65. data/lib/rex/proto/kerberos/model/last_request.rb +82 -0
  66. data/lib/rex/proto/kerberos/model/pre_auth_data.rb +104 -0
  67. data/lib/rex/proto/kerberos/model/pre_auth_enc_time_stamp.rb +126 -0
  68. data/lib/rex/proto/kerberos/model/pre_auth_pac_request.rb +81 -0
  69. data/lib/rex/proto/kerberos/model/principal_name.rb +116 -0
  70. data/lib/rex/proto/kerberos/model/ticket.rb +151 -0
  71. data/lib/rex/proto/kerberos/pac.rb +36 -0
  72. data/lib/rex/proto/kerberos/pac/client_info.rb +53 -0
  73. data/lib/rex/proto/kerberos/pac/element.rb +52 -0
  74. data/lib/rex/proto/kerberos/pac/logon_info.rb +566 -0
  75. data/lib/rex/proto/kerberos/pac/priv_svr_checksum.rb +29 -0
  76. data/lib/rex/proto/kerberos/pac/server_checksum.rb +30 -0
  77. data/lib/rex/proto/kerberos/pac/type.rb +121 -0
  78. data/lib/rex/proto/rmi.rb +7 -0
  79. data/lib/rex/proto/rmi/model.rb +31 -0
  80. data/lib/rex/proto/rmi/model/call.rb +60 -0
  81. data/lib/rex/proto/rmi/model/continuation.rb +76 -0
  82. data/lib/rex/proto/rmi/model/dgc_ack.rb +62 -0
  83. data/lib/rex/proto/rmi/model/element.rb +143 -0
  84. data/lib/rex/proto/rmi/model/output_header.rb +86 -0
  85. data/lib/rex/proto/rmi/model/ping.rb +41 -0
  86. data/lib/rex/proto/rmi/model/ping_ack.rb +41 -0
  87. data/lib/rex/proto/rmi/model/protocol_ack.rb +100 -0
  88. data/lib/rex/proto/rmi/model/return_data.rb +60 -0
  89. data/lib/rex/socket.rb +9 -1
  90. data/lib/rex/socket/tcp_server.rb +3 -0
  91. data/lib/rex/ui/text/dispatcher_shell.rb +4 -4
  92. data/lib/rex/ui/text/output/tee.rb +2 -0
  93. data/lib/rex/zip/samples/comment.rb +0 -0
  94. data/lib/rex/zip/samples/mkwar.rb +0 -0
  95. data/lib/rex/zip/samples/mkzip.rb +0 -0
  96. data/lib/rex/zip/samples/recursive.rb +0 -0
  97. data/rex.gemspec +1 -1
  98. metadata +56 -2
@@ -0,0 +1,21 @@
1
+ # -*- coding: binary -*-
2
+ require 'rex/proto/kerberos/crypto/rc4_hmac'
3
+ require 'rex/proto/kerberos/crypto/rsa_md5'
4
+
5
+ module Rex
6
+ module Proto
7
+ module Kerberos
8
+ module Crypto
9
+
10
+ include Rex::Proto::Kerberos::Crypto::Rc4Hmac
11
+ include Rex::Proto::Kerberos::Crypto::RsaMd5
12
+
13
+ RSA_MD5 = 7
14
+ RC4_HMAC = 23
15
+ ENC_KDC_REQUEST_BODY = 10
16
+ ENC_AS_RESPONSE = 8
17
+ ENC_TGS_RESPONSE = 9
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,65 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Proto
5
+ module Kerberos
6
+ module Crypto
7
+ module Rc4Hmac
8
+ # Decrypts the cipher using RC4-HMAC schema
9
+ #
10
+ # @param cipher [String] the data to decrypt
11
+ # @param key [String] the key to decrypt
12
+ # @param msg_type [Fixnum] the message type
13
+ # @return [String] the decrypted cipher
14
+ # @raise [RuntimeError] if decryption doesn't succeed
15
+ def decrypt_rc4_hmac(cipher, key, msg_type)
16
+ unless cipher && cipher.length > 16
17
+ raise ::RuntimeError, 'RC4-HMAC decryption failed'
18
+ end
19
+
20
+ checksum = cipher[0, 16]
21
+ data = cipher[16, cipher.length - 1]
22
+
23
+ k1 = OpenSSL::HMAC.digest('MD5', key, [msg_type].pack('V'))
24
+ k3 = OpenSSL::HMAC.digest('MD5', k1, checksum)
25
+
26
+ cipher = OpenSSL::Cipher::Cipher.new('rc4')
27
+ cipher.decrypt
28
+ cipher.key = k3
29
+ decrypted = cipher.update(data) + cipher.final
30
+
31
+ if OpenSSL::HMAC.digest('MD5', k1, decrypted) != checksum
32
+ raise ::RuntimeError, 'RC4-HMAC decryption failed, incorrect checksum verification'
33
+ end
34
+
35
+ decrypted
36
+ end
37
+
38
+ # Encrypts the cipher using RC4-HMAC schema
39
+ #
40
+ # @param data [String] the data to encrypt
41
+ # @param key [String] the key to encrypt
42
+ # @param msg_type [Fixnum] the message type
43
+ # @return [String] the encrypted data
44
+ def encrypt_rc4_hmac(data, key, msg_type)
45
+ k1 = OpenSSL::HMAC.digest('MD5', key, [msg_type].pack('V'))
46
+
47
+ data_encrypt = Rex::Text::rand_text(8) + data
48
+
49
+ checksum = OpenSSL::HMAC.digest('MD5', k1, data_encrypt)
50
+
51
+ k3 = OpenSSL::HMAC.digest('MD5', k1, checksum)
52
+
53
+ cipher = OpenSSL::Cipher::Cipher.new('rc4')
54
+ cipher.encrypt
55
+ cipher.key = k3
56
+ encrypted = cipher.update(data_encrypt) + cipher.final
57
+
58
+ res = checksum + encrypted
59
+ res
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,15 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Proto
5
+ module Kerberos
6
+ module Crypto
7
+ module RsaMd5
8
+ def checksum_rsa_md5(data)
9
+ Rex::Text.md5_raw(data)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,133 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Proto
5
+ module Kerberos
6
+ module Model
7
+ VERSION = 5
8
+
9
+ # Application Message Id's
10
+
11
+ AS_REQ = 10
12
+ AS_REP = 11
13
+ TGS_REQ = 12
14
+ TGS_REP = 13
15
+ KRB_ERROR = 30
16
+ TICKET = 1
17
+ AUTHENTICATOR = 2
18
+ AP_REQ = 14
19
+
20
+ # Kerberos error codes
21
+ ERROR_CODES = {
22
+ 0 => ['KDC_ERR_NONE', 'No error'],
23
+ 1 => ['KDC_ERR_NAME_EXP', 'Client\'s entry in database has expired'],
24
+ 2 => ['KDC_ERR_SERVICE_EXP', 'Server\'s entry in database has expired'],
25
+ 3 => ['KDC_ERR_BAD_PVNO', 'Requested protocol version number not supported'],
26
+ 4 => ['KDC_ERR_C_OLD_MAST_KVNO', 'Client\'s key encrypted in old master key'],
27
+ 5 => ['KDC_ERR_S_OLD_MAST_KVNO', 'Server\'s key encrypted in old master key'],
28
+ 6 => ['KDC_ERR_C_PRINCIPAL_UNKNOWN', 'Client not found in Kerberos database'],
29
+ 7 => ['KDC_ERR_S_PRINCIPAL_UNKNOWN', 'Server not found in Kerberos database'],
30
+ 8 => ['KDC_ERR_PRINCIPAL_NOT_UNIQUE', 'Multiple principal entries in database'],
31
+ 9 => ['KDC_ERR_NULL_KEY', 'The client or server has a null key'],
32
+ 10 => ['KDC_ERR_CANNOT_POSTDATE', 'Ticket not eligible for postdating'],
33
+ 11 => ['KDC_ERR_NEVER_VALID', 'Requested start time is later than end time'],
34
+ 12 => ['KDC_ERR_POLICY', 'KDC policy rejects request'],
35
+ 13 => ['KDC_ERR_BADOPTION', 'KDC cannot accommodate requested option'],
36
+ 14 => ['KDC_ERR_ETYPE_NOSUPP', 'KDC has no support for encryption type'],
37
+ 15 => ['KDC_ERR_SUMTYPE_NOSUPP', 'KDC has no support for checksum type'],
38
+ 16 => ['KDC_ERR_PADATA_TYPE_NOSUPP', 'KDC has no support for padata type'],
39
+ 17 => ['KDC_ERR_TRTYPE_NOSUPP', 'KDC has no support for transited type'],
40
+ 18 => ['KDC_ERR_CLIENT_REVOKED', 'Clients credentials have been revoked'],
41
+ 19 => ['KDC_ERR_SERVICE_REVOKED', 'Credentials for server have been revoked'],
42
+ 20 => ['KDC_ERR_TGT_REVOKED', 'TGT has been revoked'],
43
+ 21 => ['KDC_ERR_CLIENT_NOTYET', 'Client not yet valid - try again later'],
44
+ 22 => ['KDC_ERR_SERVICE_NOTYET', 'Server not yet valid - try again later'],
45
+ 23 => ['KDC_ERR_KEY_EXPIRED', 'Password has expired - change password to reset'],
46
+ 24 => ['KDC_ERR_PREAUTH_FAILED', 'Pre-authentication information was invalid'],
47
+ 25 => ['KDC_ERR_PREAUTH_REQUIRED', 'Additional pre-authentication required'],
48
+ 31 => ['KRB_AP_ERR_BAD_INTEGRITY', 'Integrity check on decrypted field failed'],
49
+ 32 => ['KRB_AP_ERR_TKT_EXPIRED', 'Ticket expired'],
50
+ 33 => ['KRB_AP_ERR_TKT_NYV', 'Ticket not yet valid'],
51
+ 34 => ['KRB_AP_ERR_REPEAT', 'Request is a replay'],
52
+ 35 => ['KRB_AP_ERR_NOT_US', 'The ticket isn\'t for us'],
53
+ 36 => ['KRB_AP_ERR_BADMATCH', 'Ticket and authenticator don\'t match'],
54
+ 37 => ['KRB_AP_ERR_SKEW', 'Clock skew too great'],
55
+ 38 => ['KRB_AP_ERR_BADADDR', 'Incorrect net address'],
56
+ 39 => ['KRB_AP_ERR_BADVERSION', 'Protocol version mismatch'],
57
+ 40 => ['KRB_AP_ERR_MSG_TYPE', 'Invalid msg type'],
58
+ 41 => ['KRB_AP_ERR_MODIFIED', 'Message stream modified'],
59
+ 42 => ['KRB_AP_ERR_BADORDER', 'Message out of order'],
60
+ 44 => ['KRB_AP_ERR_BADKEYVER', 'Specified version of key is not available'],
61
+ 45 => ['KRB_AP_ERR_NOKEY', 'Service key not available'],
62
+ 46 => ['KRB_AP_ERR_MUT_FAIL', 'Mutual authentication failed'],
63
+ 47 => ['KRB_AP_ERR_BADDIRECTION', 'Incorrect message direction'],
64
+ 48 => ['KRB_AP_ERR_METHOD', 'Alternative authentication method required'],
65
+ 49 => ['KRB_AP_ERR_BADSEQ', 'Incorrect sequence number in message'],
66
+ 50 => ['KRB_AP_ERR_INAPP_CKSUM', 'Inappropriate type of checksum in message'],
67
+ 60 => ['KRB_ERR_GENERIC', 'Generic error'],
68
+ 61 => ['KRB_ERR_FIELD_TOOLONG', 'Field is too long for this implementation']
69
+ }
70
+
71
+ KDC_OPTION_RESERVED = 0
72
+ KDC_OPTION_FORWARDABLE = 1
73
+ KDC_OPTION_FORWARDED = 2
74
+ KDC_OPTION_PROXIABLE = 3
75
+ KDC_OPTION_PROXY = 4
76
+ KDC_OPTION_ALLOW_POST_DATE = 5
77
+ KDC_OPTION_POST_DATED = 6
78
+ KDC_OPTION_UNUSED_7 = 7
79
+ KDC_OPTION_RENEWABLE = 8
80
+ KDC_OPTION_UNUSED_9 = 9
81
+ KDC_OPTION_UNUSED_10 = 10
82
+ KDC_OPTION_UNUSED_11 = 11
83
+ KDC_OPTION_RENEWABLE_OK = 27
84
+ KDC_OPTION_ENC_TKT_IN_SKEY = 28
85
+ KDC_OPTION_RENEW = 30
86
+ KDC_OPTION_VALIDATE = 31
87
+
88
+ # From Principal
89
+
90
+ # Name type not known
91
+ NT_UNKNOWN = 0
92
+ # The name of the principal
93
+ NT_PRINCIPAL = 1
94
+ # Service and other unique instances
95
+ NT_SRV_INST = 2
96
+ # Service with host name and instance
97
+ NT_SRV_HST = 3
98
+ # Service with host as remaining component
99
+ NT_SRV_XHST = 4
100
+ # Unique ID
101
+ NT_UID = 5
102
+
103
+ # From padata
104
+
105
+ PA_TGS_REQ = 1
106
+ PA_ENC_TIMESTAMP = 2
107
+ PA_PW_SALT = 3
108
+ PA_PAC_REQUEST = 128
109
+
110
+ AD_IF_RELEVANT = 1
111
+ end
112
+ end
113
+ end
114
+ end
115
+
116
+ require 'rex/proto/kerberos/model/element'
117
+ require 'rex/proto/kerberos/model/principal_name'
118
+ require 'rex/proto/kerberos/model/encrypted_data'
119
+ require 'rex/proto/kerberos/model/checksum'
120
+ require 'rex/proto/kerberos/model/pre_auth_pac_request'
121
+ require 'rex/proto/kerberos/model/pre_auth_enc_time_stamp'
122
+ require 'rex/proto/kerberos/model/pre_auth_data'
123
+ require 'rex/proto/kerberos/model/ap_req'
124
+ require 'rex/proto/kerberos/model/krb_error'
125
+ require 'rex/proto/kerberos/model/authorization_data'
126
+ require 'rex/proto/kerberos/model/encryption_key'
127
+ require 'rex/proto/kerberos/model/authenticator'
128
+ require 'rex/proto/kerberos/model/ticket'
129
+ require 'rex/proto/kerberos/model/last_request'
130
+ require 'rex/proto/kerberos/model/kdc_request_body'
131
+ require 'rex/proto/kerberos/model/kdc_request'
132
+ require 'rex/proto/kerberos/model/enc_kdc_response'
133
+ require 'rex/proto/kerberos/model/kdc_response'
@@ -0,0 +1,98 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Proto
5
+ module Kerberos
6
+ module Model
7
+ # This class provides a representation of a KRB_AP_REQ definition, containing the Kerberos protocol version number,
8
+ # the message type KRB_AP_REQ, an options field to indicate any options in use, and the ticket and authenticator
9
+ # themselves
10
+ class ApReq < Element
11
+ # @!attribute pvno
12
+ # @return [Fixnum] The protocol version number
13
+ attr_accessor :pvno
14
+ # @!attribute msg_type
15
+ # @return [Fixnum] The type of the protocol message
16
+ attr_accessor :msg_type
17
+ # @!attribute options
18
+ # @return [Fixnum] request options, affects processing
19
+ attr_accessor :options
20
+ # @!attribute ticket
21
+ # @return [Rex::Proto::Kerberos::Model::Ticket] The ticket authenticating the client to the server
22
+ attr_accessor :ticket
23
+ # @!attribute authenticator
24
+ # @return [Rex::Proto::Kerberos::Model::EncryptedData] This contains the authenticator, which includes the
25
+ # client's choice of a subkey
26
+ attr_accessor :authenticator
27
+
28
+ # Rex::Proto::Kerberos::Model::ApReq decoding isn't supported
29
+ #
30
+ # @raise [NotImplementedError]
31
+ def decode(input)
32
+ raise ::NotImplementedError, 'AP-REQ decoding not supported'
33
+ end
34
+
35
+ # Encodes the Rex::Proto::Kerberos::Model::ApReq into an ASN.1 String
36
+ #
37
+ # @return [String]
38
+ def encode
39
+ elems = []
40
+ elems << OpenSSL::ASN1::ASN1Data.new([encode_pvno], 0, :CONTEXT_SPECIFIC)
41
+ elems << OpenSSL::ASN1::ASN1Data.new([encode_msg_type], 1, :CONTEXT_SPECIFIC)
42
+ elems << OpenSSL::ASN1::ASN1Data.new([encode_options], 2, :CONTEXT_SPECIFIC)
43
+ elems << OpenSSL::ASN1::ASN1Data.new([encode_ticket], 3, :CONTEXT_SPECIFIC)
44
+ elems << OpenSSL::ASN1::ASN1Data.new([encode_authenticator], 4, :CONTEXT_SPECIFIC)
45
+ seq = OpenSSL::ASN1::Sequence.new(elems)
46
+
47
+ seq_asn1 = OpenSSL::ASN1::ASN1Data.new([seq], AP_REQ, :APPLICATION)
48
+
49
+ seq_asn1.to_der
50
+ end
51
+
52
+ private
53
+
54
+ # Encodes the pvno field
55
+ #
56
+ # @return [OpenSSL::ASN1::Integer]
57
+ def encode_pvno
58
+ bn = OpenSSL::BN.new(pvno.to_s)
59
+ int = OpenSSL::ASN1::Integer.new(bn)
60
+
61
+ int
62
+ end
63
+
64
+ # Encodes the msg_type field
65
+ #
66
+ # @return [OpenSSL::ASN1::Integer]
67
+ def encode_msg_type
68
+ bn = OpenSSL::BN.new(msg_type.to_s)
69
+ int = OpenSSL::ASN1::Integer.new(bn)
70
+
71
+ int
72
+ end
73
+
74
+ # Encodes the options field
75
+ #
76
+ # @return [OpenSSL::ASN1::BitString]
77
+ def encode_options
78
+ OpenSSL::ASN1::BitString.new([options].pack('N'))
79
+ end
80
+
81
+ # Encodes the ticket field
82
+ #
83
+ # @return [String]
84
+ def encode_ticket
85
+ ticket.encode
86
+ end
87
+
88
+ # Encodes the authenticator field
89
+ #
90
+ # @return [String]
91
+ def encode_authenticator
92
+ authenticator.encode
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,143 @@
1
+ # -*- coding: binary -*-
2
+
3
+ module Rex
4
+ module Proto
5
+ module Kerberos
6
+ module Model
7
+ # This class provides a representation of an Authenticator, sent with a
8
+ # ticket to the server to certify the client's knowledge of the encryption
9
+ # key in the ticket.
10
+ class Authenticator < Element
11
+ # @!attribute vno
12
+ # @return [Fixnum] The authenticator version number
13
+ attr_accessor :vno
14
+ # @!attribute crealm
15
+ # @return [String] The realm in which the client is registered
16
+ attr_accessor :crealm
17
+ # @!attribute cname
18
+ # @return [Rex::Proto::Kerberos::Model::PrincipalName] The name part of the client's principal
19
+ # identifier
20
+ attr_accessor :cname
21
+ # @!attribute checksum
22
+ # @return [Rex::Proto::Kerberos::Model::Checksum] The checksum of the application data that
23
+ # accompanies the KRB_AP_REQ.
24
+ attr_accessor :checksum
25
+ # @!attribute cusec
26
+ # @return [Fixnum] The microsecond part of the client's timestamp
27
+ attr_accessor :cusec
28
+ # @!attribute ctime
29
+ # @return [Time] The current time of the client's host
30
+ attr_accessor :ctime
31
+ # @!attribute subkey
32
+ # @return [Rex::Proto::Kerberos::Model::EncryptionKey] the client's choice for an encryption
33
+ # key which is to be used to protect this specific application session
34
+ attr_accessor :subkey
35
+
36
+ # Rex::Proto::Kerberos::Model::Authenticator decoding isn't supported
37
+ #
38
+ # @raise [NotImplementedError]
39
+ def decode(input)
40
+ raise ::NotImplementedError, 'Authenticator decoding not supported'
41
+ end
42
+
43
+ # Encodes the Rex::Proto::Kerberos::Model::Authenticator into an ASN.1 String
44
+ #
45
+ # @return [String]
46
+ def encode
47
+ elems = []
48
+ elems << OpenSSL::ASN1::ASN1Data.new([encode_vno], 0, :CONTEXT_SPECIFIC)
49
+ elems << OpenSSL::ASN1::ASN1Data.new([encode_crealm], 1, :CONTEXT_SPECIFIC)
50
+ elems << OpenSSL::ASN1::ASN1Data.new([encode_cname], 2, :CONTEXT_SPECIFIC)
51
+ elems << OpenSSL::ASN1::ASN1Data.new([encode_checksum], 3, :CONTEXT_SPECIFIC) if checksum
52
+ elems << OpenSSL::ASN1::ASN1Data.new([encode_cusec], 4, :CONTEXT_SPECIFIC)
53
+ elems << OpenSSL::ASN1::ASN1Data.new([encode_ctime], 5, :CONTEXT_SPECIFIC)
54
+ elems << OpenSSL::ASN1::ASN1Data.new([encode_subkey], 6, :CONTEXT_SPECIFIC) if subkey
55
+
56
+ seq = OpenSSL::ASN1::Sequence.new(elems)
57
+ seq_asn1 = OpenSSL::ASN1::ASN1Data.new([seq], AUTHENTICATOR, :APPLICATION)
58
+
59
+ seq_asn1.to_der
60
+ end
61
+
62
+ # Encrypts the Rex::Proto::Kerberos::Model::Authenticator
63
+ #
64
+ # @param etype [Fixnum] the crypto schema to encrypt
65
+ # @param key [String] the key to encrypt
66
+ # @return [String] the encrypted result
67
+ # @raise [NotImplementedError] if the encryption schema isn't supported
68
+ def encrypt(etype, key)
69
+ data = self.encode
70
+
71
+ res = ''
72
+ case etype
73
+ when RC4_HMAC
74
+ res = encrypt_rc4_hmac(data, key, 7)
75
+ else
76
+ raise ::NotImplementedError, 'EncryptedData schema is not supported'
77
+ end
78
+
79
+ res
80
+ end
81
+
82
+
83
+ private
84
+
85
+ # Encodes the vno field
86
+ #
87
+ # @return [OpenSSL::ASN1::Integer]
88
+ def encode_vno
89
+ bn = OpenSSL::BN.new(vno.to_s)
90
+ int = OpenSSL::ASN1::Integer.new(bn)
91
+
92
+ int
93
+ end
94
+
95
+ # Encodes the crealm field
96
+ #
97
+ # @return [OpenSSL::ASN1::GeneralString]
98
+ def encode_crealm
99
+ OpenSSL::ASN1::GeneralString.new(crealm)
100
+ end
101
+
102
+ # Encodes the cname field
103
+ #
104
+ # @return [String]
105
+ def encode_cname
106
+ cname.encode
107
+ end
108
+
109
+ # Encodes the checksum field
110
+ #
111
+ # @return [String]
112
+ def encode_checksum
113
+ checksum.encode
114
+ end
115
+
116
+ # Encodes the cusec field
117
+ #
118
+ # @return [OpenSSL::ASN1::Integer]
119
+ def encode_cusec
120
+ bn = OpenSSL::BN.new(cusec.to_s)
121
+ int = OpenSSL::ASN1::Integer.new(bn)
122
+
123
+ int
124
+ end
125
+
126
+ # Encodes the ctime field
127
+ #
128
+ # @return [OpenSSL::ASN1::GeneralizedTime]
129
+ def encode_ctime
130
+ OpenSSL::ASN1::GeneralizedTime.new(ctime)
131
+ end
132
+
133
+ # Encodes the subkey field
134
+ #
135
+ # @return [String]
136
+ def encode_subkey
137
+ subkey.encode
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end