终于到来分析NTLMv2session response了。解决这个问题,我们就完成对PROXY认证中相关的NTLM算法的编写,可以进入PROXY认证交换过程,实现我们的网络编程。数一下,捣腾这个问题可以快半个月,主要在DES的算法上,在网上也看到有人很绝望地呼喊为什么不同工具算出来的结果不一样。而且一直没有下定决心自己写一个。原来想在网上找一个现成的代码,例如openssl,但是挖个萝卜带框泥,就拿DES算法,我已经在project中导入十数个openssl的源代码,发现还不行,还有函数没导入,于是乎搞得源码乱糟糟,看来还是自己弄一个算了,这样才开始了NTLM的大学习。今天终于完成了NTLM v2 session response的计算,算法阶段可以竣工。至于kerberos,我想在NTLM认证通过后,再作考虑。
NTLMv2 session比NTLMv2要简单,输入参数为:
- client的password,为了配合验证,我们给出例子:SecREt01
- 来自server的挑战值chanllenge,例如0x01 23 45 67 89 ab cd ef
- client自己生成的8字节的nonce,记做client_nonce,例如0xff ff ff 00 11 22 33 44
输出有两个:ntlm response和lm response,长度据为24字节。函数定义为:
void ntlmv2_session_response(IN char * passwd, IN unsigned char * chanllenge,
IN unsigned char * client_nonce,
OUT unsigned char * ntlm_response, OUT int * ntlm_response_len,
OUT unsigned char * lm_response,OUT int * lm_response_len);
步骤一:LM response的获取
这步骤很简单,比NTLMv1的LM响应值都简单。在8字节的client_nonce后面,补充16个0字节作为pad,生成一个24字节的数据,即为所求。
memset(lm_response,0,24);
memcpy(lm_response,client_nonce,8);
if(lm_response_len != NULL)
* lm_response_len = 24;
即:0xff ff ff 00 11 22 33 44
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
步骤二:NTLM response的获取
step1:计算NTLMv2 session的hash值,MD5(chanllenge+client_nonce)
将server给的8位挑战值和客户端自己生成的8位nonce值,合并为一个16字节的数据,通过MD5,生成一个新的16字节数据,截取前面的8字节,就是NTLMv2 session的hash值。存放在hash[16]中。
memcpy(buf,chanllenge,8);
memcpy(buf+8,client_nonce,8);
MD5String((char*)buf,16,hash);
即:0xbe ac 9a 1b c5 a9 86 7c,后面8字节的数据不参与后面的运算
step2:对password进行加密
将password转换为unicode的方式,然后对它进行MD4的处理,所得的16字节数据为所求,存放在buf[21]中
len = strlen(passwd);
c = (unsigned char *) malloc(len * 2);
unicode(passwd, len, (char *)c, NULL);
memset(buf,0,21);
MD4String((char*)c,2 * len ,buf);
free(c);
即:0xcd 06 ca 7c 7e 10 c9 9b 1d 33 b7 48 5a 2e d8 08
step3:通过DES计算响应值
这个步骤和NTLMv1的计算有些类似,在step2中我们根据passwd得到了16字节的数据,放置在buf中,增加5个null的pad,获得21字节的数据。这些我们在step2中已经进行了处理。将这21字节的数据,均分为3份,每份7字节56比特,作为DES加密中的key,分布对step1计算出来的hash的前8字节数据进行DES加密,然后组合起来,就是最终的NTLMv2 response值。
algorithm_des_56key(hash,buf,ntlm_response);
algorithm_des_56key(hash,buf +7 ,ntlm_response+8);
algorithm_des_56key(hash,buf +14 ,ntlm_response+16);
if(ntlm_response_len != NULL)
* ntlm_response_len = 24;
即:
0x10 d5 50 83 2d 12 b2 cc
b7 9d 5a d1 f4 ee d3 df
82 ac a4 c3 68 1d d4 55
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net