Algoritmo per generare hash NTLMv2 in PHP

1

Sto cercando di sviluppare una funzione PHP per calcolare l'hash NTLMv2 fornendo server & sfida client, dominio, account e password. L'hash risultante sembra non essere corretto. Qualcuno può guidarmi sul modo corretto:

Ecco l'algoritmo in linguaggio 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));
}

Ho fornito i seguenti parametri:

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

La funzione restituisce il seguente hash NTLMv2: 48335EFCA9A07EA12B9EBBC2AEE30C8E

Dove deve essere l'HASH: 3780B32F46FA60CE1431264A525B0D60

Qualcuno può suggerire l'algoritmo corretto?

    
posta asim-ishaq 27.09.2013 - 09:57
fonte

2 risposte

2

Ho risolto l'algoritmo corretto per PHP. Grazie per il contributo. Di seguito è riportato il codice:

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 ) );
}
    
risposta data 27.09.2013 - 23:54
fonte
2

Probabilmente hai problemi di codifica:

  • Fai attenzione al processo di funzione hash byte ma le tue stringhe possono contenere caratteri o anche cifre esadecimali . Ad esempio, $client_challenge è una stringa che inizia con 0101 , probabilmente intendendo che dovrebbe iniziare con due byte di valore 1, ma è probabile che la funzione di hash lo abbia preso come codifica di quattro caratteri, probabilmente come quattro byte di valori 48, 49, 48 e 49 (codici ASCII per le cifre 0 e 1).

  • Almeno il primo MD4 dovrebbe essere calcolato sulla password codificata in little-endian UTF-16 e dubito seriamente che mhash() possa farlo per te.

PHP è piuttosto sottodescritto in questi argomenti, quindi ti consiglio di prototipare il codice con una lingua in cui i byte sono byte e gli argomenti di codifica possono essere gestiti in modo esplicito; Mi vengono in mente Java e C #. Una volta che hai una funzione che calcola il giusto valore in tale linguaggio, puoi stampare i risultati intermedi da confrontare con il tuo codice PHP, in modo da poter individuare il problema.

    
risposta data 27.09.2013 - 13:23
fonte

Leggi altre domande sui tag