Algoritmo para generar hash NTLMv2 en PHP

1

Estoy tratando de desarrollar una función PHP para calcular el hash NTLMv2 al proporcionar el servidor & Desafío del cliente, dominio, cuenta y contraseña. El hash resultante parece no ser correcto. Alguien me puede guiar sobre la forma correcta:

Aquí está el algoritmo en lenguaje PHP:

function GenerateNTMLv2($password, $account, $domain, $client_challenge, $server_challenge) {

    $hash = mhash(MHASH_MD4, $password);
    $hash = mhash(MHASH_MD5, strtoupper($account) . $domain, $hash); 
    $hash = mhash(MHASH_MD5, $client_challenge . $server_challenge, $hash);

    return strtoupper(bin2hex($hash));
}

He proporcionado los siguientes parámetros:

$password='asim3347';
$client_challenge =  '0101000000000000DF5ED1178FBACE012FDEE788AA2574CE0000000002001200430041004E00440059004C0041004E00440001001200430041004E00440059004C0041004E00440004001200630061006E00640079006C0061006E00640003001200630061006E00640079006C0061006E006400060004000300000007000800DF5ED1178FBACE0108003000300000000000000001000000002000004C60DD0226C932C69BAF540769C9E4DA53ABF77A8D56DBA0F9AA214EEEBB30AE0A001000000000000000000000000000000000000900240063006900660073002F003100390032002E003100360038002E0030002E003200320038000000000000000000';
$server_challenge = 'FFC7C728CAAC8BE8';
$domain = 'SOFTECH';
$account = 'asim';

La función devuelve el siguiente hash NTLMv2: 48335EFCA9A07EA12B9EBBC2AEE30C8E

Donde debe estar el HASH: 3780B32F46FA60CE1431264A525B0D60

¿Alguien puede sugerir el algoritmo correcto?

    
pregunta asim-ishaq 27.09.2013 - 09:57
fuente

2 respuestas

2

He ordenado el algoritmo correcto para PHP. Gracias por la contribución. El siguiente es el código:

function GenerateNTMLv2($password, $account, $domain, $client_challenge, $server_challenge) {

    $unicode_password= iconv ( 'UTF-8', 'UTF-16LE', $password );

    $NTLM_Key = mhash ( MHASH_MD4, $unicode_password);
    $NTLM_Hash = mhash ( MHASH_MD5, iconv ( 'UTF-8', 'UTF-16LE', strtoupper ( $account ) . $domain ), $NTLM_Key );
    $NTLM_Chal_Hash = mhash ( MHASH_MD5, pack ( "H*", $server_challenge . $client_challenge ), $NTLM_Hash );

    return strtoupper ( bin2hex ( $NTLM_Chal_Hash ) );
}
    
respondido por el asim-ishaq 27.09.2013 - 23:54
fuente
2

Es probable que tenga problemas de codificación:

  • Tenga cuidado con la función hash que procesa bytes , pero sus cadenas pueden contener caracteres o incluso dígitos hexadecimales . Por ejemplo, su $client_challenge es una cadena que comienza con 0101 , lo que probablemente significa que debería comenzar con dos bytes de valor 1, pero es probable que la función hash la haya tomado como la codificación de cuatro caracteres, probablemente como cuatro bytes de los valores 48, 49, 48 y 49 (códigos ASCII para los dígitos 0 y 1).

  • Al menos el primer MD4 debería computarse sobre la contraseña codificada en little-endian UTF-16 y dudo seriamente que mhash() lo haga por usted.

PHP está muy poco especificado en estos asuntos, por lo que le recomiendo que primero prototipo el código con un lenguaje donde los bytes son bytes y los asuntos de codificación se pueden manejar de manera explícita; Java y C # vienen a la mente. Una vez que tenga una función que calcula el valor correcto en ese idioma, puede imprimir resultados intermedios para compararlos con su código PHP, de modo que pueda identificar el problema.

    
respondido por el Tom Leek 27.09.2013 - 13:23
fuente

Lea otras preguntas en las etiquetas