2 * https://msdn.microsoft.com/en-us/library/cc245828.aspx
3 * http://buchananweb.co.uk/security50.aspx
4 * http://ubiqx.org/cifs/examples/SMB/listing06.html
5 * http://davenport.sourceforge.net/ntlm.html#theType1Message
17 #include <sys/types.h>
22 #include <openssl/des.h>
29 #define MIN(a,b) ((a)<(b)?(a):(b))
31 #define ERROR(err, ...) \
33 do_log(__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__); \
39 do_log(__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__); \
48 static void do_log(const char *file, int line, const char *func,
56 len = vasprintf(&message, fmt, args);
62 printf("%s:%d(%s): %s\n", file, line, func, message);
66 static void print_asc(const uint8_t *buf, int len)
72 for (i=0; i<len; i++) {
73 s[0] = isprint(buf[i]) ? buf[i] : '.';
79 * Write dump of binary data to a callback
81 static void dump_data(const uint8_t *buf, size_t len)
84 static const uint8_t empty[16] = { 0, };
92 for (i = 0; i < len; ) {
100 printf("%02X ", (int)buf[i]);
107 print_asc(&buf[i-16], 8);
109 print_asc(&buf[i-8], 8);
125 print_asc(&buf[i-(i%16)], n);
129 print_asc(&buf[i-n], n);
136 static uint8_t parity(uint8_t _c) {
137 uint8_t bits_set = 0;
138 uint8_t parity_needed = 0;
142 bits_set += c & 1 ? 1 : 0;
146 parity_needed = bits_set & 1 ? 0 : 1;
147 return parity_needed;
150 static char *make_des_key(TALLOC_CTX *mem_ctx, uint8_t *key56)
152 uint8_t *key64 = NULL;
155 key64 = talloc_array(mem_ctx, uint8_t, 8);
157 ERROR(ERR_CALL, "talloc_array\n");
160 key64[0] = key56[0]>>1;
161 key64[1] = ((key56[0]&0x01)<<6) | (key56[1]>>2);
162 key64[2] = ((key56[1]&0x03)<<5) | (key56[2]>>3);
163 key64[3] = ((key56[2]&0x07)<<4) | (key56[3]>>4);
164 key64[4] = ((key56[3]&0x0F)<<3) | (key56[4]>>5);
165 key64[5] = ((key56[4]&0x1F)<<2) | (key56[5]>>6);
166 key64[6] = ((key56[5]&0x3F)<<1) | (key56[6]>>7);
167 key64[7] = key56[6]&0x7F;
169 key64[i] = (key64[i]<<1);
173 key64[0] = key56[0] & 0xFE;
174 key64[1] = (key56[0] << 7) | (key56[1] >> 1) & 0xFE;
175 key64[2] = (key56[1] << 6) | (key56[2] >> 2) & 0xFE;
176 key64[3] = (key56[2] << 5) | (key56[3] >> 3) & 0xFE;
177 key64[4] = (key56[3] << 4) | (key56[4] >> 4) & 0xFE;
178 key64[5] = (key56[4] << 3) | (key56[5] >> 5) & 0xFE;
179 key64[6] = (key56[5] << 2) | (key56[6] >> 6) & 0xFE;
180 key64[7] = key56[6] << 1;
182 for (i= 0; i < 8; i++) {
183 key64[i] |= parity(key64[i]) & 1;
189 static char *lm_hash_gcrypt(TALLOC_CTX *mem_ctx, const char *_pwd)
191 gcry_error_t gcry_err;
192 gcry_cipher_hd_t gcry_hd;
193 const char *lm_str = "KGS!@#$%";
196 char *lm_hash = NULL;
197 char *des_key = NULL;
199 char pwd[14] = { 0 };
201 strncpy(pwd, _pwd, 14);
203 for (i = 0; pwd[i] != '\0'; i++) {
204 if (!isascii(pwd[i])) {
205 LOG("Password contains non-ASCII characters, "
206 "skipping LM hash\n");
209 pwd[i] = toupper(pwd[i]);
212 lm_hash = talloc_array(mem_ctx, char, 16);
213 if (lm_hash == NULL) {
214 ERROR(3, "talloc error\n");
217 gcry_err = gcry_cipher_open(&gcry_hd,
219 GCRY_CIPHER_MODE_ECB,
222 ERROR(3, ("gcry_cipher_open: %s\n", gcry_strerror(gcry_err)));
225 des_key = make_des_key(mem_ctx, pwd);
226 if (des_key == NULL) {
227 ERROR(ERR_CALL, "make_des_key\n");
230 gcry_err = gcry_cipher_setkey(gcry_hd, des_key, 8);
232 ERROR(3, ("gcry_cipher_setkey: %s\n", gcry_strerror(gcry_err)));
235 TALLOC_FREE(des_key);
237 gcry_err = gcry_cipher_encrypt(gcry_hd, lm_hash1, 8, lm_str, 8);
239 ERROR(3, ("gcry_cipher_encrypt: %s\n", gcry_strerror(gcry_err)));
242 gcry_cipher_close(gcry_hd);
244 gcry_err = gcry_cipher_open(&gcry_hd,
246 GCRY_CIPHER_MODE_ECB,
249 ERROR(3, ("gcry_cipher_open: %s\n", gcry_strerror(gcry_err)));
252 des_key = make_des_key(mem_ctx, pwd + 7);
253 if (des_key == NULL) {
254 ERROR(ERR_CALL, "make_des_key\n");
257 gcry_err = gcry_cipher_setkey(gcry_hd, des_key, 8);
259 ERROR(3, ("gcry_cipher_setkey: %s\n", gcry_strerror(gcry_err)));
262 TALLOC_FREE(des_key);
264 gcry_err = gcry_cipher_encrypt(gcry_hd, lm_hash2, 8, lm_str, 8);
266 ERROR(3, ("gcry_cipher_encrypt: %s\n", gcry_strerror(gcry_err)));
269 gcry_cipher_close(gcry_hd);
271 memcpy(lm_hash, lm_hash1, 8);
272 memcpy(lm_hash + 8 ,lm_hash2, 8);
273 printf("libgcrypt LM Hash:\n");
274 dump_data(lm_hash, 16);
279 static char *lm_hash_openssl(TALLOC_CTX *mem_ctx, const char *_pwd)
281 const_DES_cblock des_key1, des_key2;
282 DES_cblock lm_hash1, lm_hash2, lm_magic;
283 DES_key_schedule des_sched1, des_sched2;
284 const char *lm_str = "KGS!@#$%";
285 char *lm_hash = NULL;
286 char *des_key = NULL;
288 char pwd1[8] = { 0 };
289 char pwd2[8] = { 0 };
291 memcpy(pwd1, _pwd, 7);
292 memcpy(pwd2, _pwd + 7, 7);
293 memcpy(lm_magic, lm_str, 8);
295 for (i = 0; i < 7; i++) {
296 if (!isascii(pwd1[i]) || !isascii(pwd2[i])) {
297 LOG("Password contains non-ASCII characters, "
298 "skipping LM hash\n");
301 pwd1[i] = toupper(pwd1[i]);
302 pwd2[i] = toupper(pwd2[i]);
305 lm_hash = talloc_array(mem_ctx, char, 16);
306 if (lm_hash == NULL) {
307 ERROR(3, "talloc error\n");
310 des_key = make_des_key(mem_ctx, pwd1);
311 if (des_key == NULL) {
312 ERROR(ERR_CALL, "make_des_key\n");
314 memcpy(des_key1, des_key, 8);
315 TALLOC_FREE(des_key);
317 DES_set_key_unchecked(&des_key1, &des_sched1);
319 des_key = make_des_key(mem_ctx, pwd2);
320 if (des_key == NULL) {
321 ERROR(ERR_CALL, "make_des_key\n");
323 memcpy(des_key2, des_key, 8);
324 TALLOC_FREE(des_key);
326 DES_set_key_unchecked(&des_key2, &des_sched2);
328 DES_ecb_encrypt(&lm_magic, &lm_hash1, &des_sched1, DES_ENCRYPT);
329 DES_ecb_encrypt(&lm_magic, &lm_hash2, &des_sched2, DES_ENCRYPT);
331 memcpy(lm_hash, lm_hash1, 8);
332 memcpy(lm_hash + 8 ,lm_hash2, 8);
333 printf("OpenSSL LM Hash:\n");
334 dump_data(lm_hash, 16);
339 int main(int argc, char **argv)
341 TALLOC_CTX *mem_ctx = NULL;
346 char *lm_hash_str = NULL;
348 mem_ctx = talloc_init("ntlm");
349 if (mem_ctx == NULL) {
350 ERROR(2, "talloc_init\n");
353 memset(pwdbuf, 0, sizeof(pwdbuf));
355 ok = gcry_check_version(GCRYPT_VERSION);
357 fputs("libgcrypt version mismatch\n", stderr);
361 printf("Enter password: ");
363 p = fgets(pwdbuf, sizeof(pwdbuf), stdin);
365 ERROR(2, "fgets: %s\n", strerror(errno));
368 pwdlen = strlen(pwdbuf);
369 if (pwdbuf[pwdlen - 1] == '\n') {
370 pwdbuf[pwdlen - 1] = '\0';
374 lm_hash_str = lm_hash_gcrypt(mem_ctx, pwdbuf);
375 if (lm_hash_str == NULL) {
376 ERROR(2, "lm_hash\n");
378 TALLOC_FREE(lm_hash_str);
380 lm_hash_str = lm_hash_openssl(mem_ctx, pwdbuf);
381 if (lm_hash_str == NULL) {
382 ERROR(2, "lm_hash\n");
385 TALLOC_FREE(mem_ctx);