Skip to content

Commit c9a54d3

Browse files
committed
Smarter "AUTHENTICATE_MESSAGE" encoding by using
the server-provided "TargetName"
1 parent 24258be commit c9a54d3

3 files changed

Lines changed: 14 additions & 11 deletions

File tree

src/Robin/Ntlm/Message/AbstractAuthenticateMessageEncoder.php

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ protected function __construct(EncodingConverterInterface $encoding_converter)
103103
* @param int $negotiate_flags The negotiation flags encoded in the message.
104104
* @param string $lm_challenge_response The calcualted LM response.
105105
* @param string $nt_challenge_response The calcualted NT response.
106-
* @param string $nt_domain The domain name of the NT user authenticating.
106+
* @param string $target_name The "TargetName" (domain/server name) of the
107+
* NT user authenticating.
107108
* @param string $username The user's "username".
108109
* @param string $client_hostname The hostname of the client (the hostname
109110
* of the machine calling this code).
@@ -114,7 +115,7 @@ public function encodeBinaryMessageString(
114115
$negotiate_flags,
115116
$lm_challenge_response,
116117
$nt_challenge_response,
117-
$nt_domain,
118+
$target_name,
118119
$username,
119120
$client_hostname,
120121
$session_key
@@ -128,7 +129,7 @@ public function encodeBinaryMessageString(
128129

129130
// Convert our provided values to proper encoding
130131
$username = $this->encoding_converter->convert($username, $expected_encoding);
131-
$nt_domain = $this->encoding_converter->convert(strtoupper($nt_domain), $expected_encoding);
132+
$target_name = $this->encoding_converter->convert(strtoupper($target_name), $expected_encoding);
132133
$client_hostname = $this->encoding_converter->convert(strtoupper($client_hostname), $expected_encoding);
133134
$session_key = $this->encoding_converter->convert(strtoupper($session_key), $expected_encoding);
134135

@@ -157,13 +158,13 @@ public function encodeBinaryMessageString(
157158
$binary_string .= pack('V', $message_position); // 32-bit unsigned little-endian, 1st value in the payload
158159
$message_position += $nt_response_length;
159160

160-
$domain_name_length = strlen($nt_domain);
161+
$target_name_length = strlen($target_name);
161162

162163
// Domain name fields: length; length; offset of the value from the beginning of the message
163-
$binary_string .= pack('v', $domain_name_length); // 16-bit unsigned little-endian
164-
$binary_string .= pack('v', $domain_name_length); // 16-bit unsigned little-endian
164+
$binary_string .= pack('v', $target_name_length); // 16-bit unsigned little-endian
165+
$binary_string .= pack('v', $target_name_length); // 16-bit unsigned little-endian
165166
$binary_string .= pack('V', $message_position); // 32-bit unsigned little-endian, 1st value in the payload
166-
$message_position += $domain_name_length;
167+
$message_position += $target_name_length;
167168

168169
$username_length = strlen($username);
169170

@@ -194,7 +195,7 @@ public function encodeBinaryMessageString(
194195
// Add our payload data
195196
$binary_string .= $lm_challenge_response;
196197
$binary_string .= $nt_challenge_response;
197-
$binary_string .= $nt_domain;
198+
$binary_string .= $target_name;
198199
$binary_string .= $username;
199200
$binary_string .= $client_hostname;
200201
$binary_string .= $session_key;

src/Robin/Ntlm/Message/NtlmV1AuthenticateMessageEncoder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ public function encode(
159159
) {
160160
$negotiate_flags = $server_challenge->getNegotiateFlags();
161161
$server_challenge_nonce = $server_challenge->getNonce();
162+
$target_name = $server_challenge->getTargetName() ?: $nt_domain;
162163

163164
$client_challenge = null;
164165

@@ -218,7 +219,7 @@ public function encode(
218219
$negotiate_flags,
219220
$lm_challenge_response,
220221
$nt_challenge_response,
221-
$nt_domain,
222+
$target_name,
222223
$username,
223224
$client_hostname,
224225
$session_key

src/Robin/Ntlm/Message/NtlmV2AuthenticateMessageEncoder.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ public function encode(
138138
$negotiate_flags = $server_challenge->getNegotiateFlags();
139139
$server_challenge_nonce = $server_challenge->getNonce();
140140
$target_info = $server_challenge->getTargetInfo();
141+
$target_name = $server_challenge->getTargetName() ?: $nt_domain;
141142

142143
// Generate a client challenge
143144
$client_challenge = $this->random_byte_generator->generate(static::CLIENT_CHALLENGE_LENGTH);
@@ -146,7 +147,7 @@ public function encode(
146147
$binary_blob = $this->encodeBlob(new DateTime(), $client_challenge, $target_info);
147148

148149
if ($credential->isPlaintext()) {
149-
$nt_hash = $this->nt_hasher->hash($credential, $username, $nt_domain);
150+
$nt_hash = $this->nt_hasher->hash($credential, $username, $target_name);
150151
} elseif ($credential instanceof HashCredentialInterface && HashType::NT_V2 === $credential->getType()) {
151152
$nt_hash = $credential;
152153
} else {
@@ -170,7 +171,7 @@ public function encode(
170171
$negotiate_flags,
171172
$lm_challenge_response,
172173
$nt_challenge_response,
173-
$nt_domain,
174+
$target_name,
174175
$username,
175176
$client_hostname,
176177
$session_key

0 commit comments

Comments
 (0)