0
点赞
收藏
分享

微信扫一扫

实现PROXY穿越(8):NT-Hash的实现


  最近忙,事比较多,活多了,还要降薪,唉。没什么时间看书,将以前的一些技术blog也移到这里。NTLM在去年年底和今年年初研究过一阵子,写了总结和例子程序。里面涉及很多算法,在网上查了很久。(下面是以前的博客)最近想实现一个通过PROXY穿越的网络编程,将相关的内容进行一下汇总。很多东西来自网络共产主义,也应该为共产主义有所回馈。介绍NT-hash的实现。


  从IBM设计的LM Hash算法存在几个弱点,微软在保持向后兼容性的同时提出了自己的挑战响应机制,NTLM Hash应运而生。假设明文口令是“123456”,首先转换成Unicode字符串,与LM Hash算法不同,这次不需要添加0x00补足14字节,并且是区分大小写的。


      "123456" -> 310032003300340035003600。


  SMB报文解码中。0x80之前的标准ASCII码转换成Unicode码,就是简单地从0x??变成0x00??。此 类标准ASCII串按little- endian序转换成Unicode串,就是简单地在原有每个字节之后添加0x00。对所获取的Unicode串进行标准MD4单向哈希,无论数据源有多 少字节,MD4固定产生128-bit的哈希值。


     16字节310032003300340035003600 -进行标准MD4单向哈希-> 32ED87BDB5FDC5E9CBA88547376818D4
  就得到了最后的NTLM Hash: 32ED87BDB5FDC5E9CBA88547376818D4。


static void unicode(IN char * src, IN int src_len, OUT char * dst, OUT int * dst_len){
     int i ;
     for( i = 0 ; i < src_len; i ++){
         dst[2*i] = src[i];
         dst[2*i +1] = 0;
     }
     if(dst_len != NULL)
         * dst_len = src_len * 2;
 }

 void nt_hash(IN char * src, IN int is_unicode,OUT unsigned char * dst, OUT int * dst_len){
     char * source = NULL;
     int len = strlen(src);
     if(!is_unicode){
         source = (char * ) malloc(len *2 );
         unicode(src,len,source,&len);
     }else{
         source = src;
     }

     MD4String (source,len,dst);
     if(dst_len != NULL)
         * dst_len = 16;

     if(!is_unicode)
         free(source);
 }


调用例子:
unsigned char dst[16];
nt_hash("123456",0,dst,NULL)

 


举报

相关推荐

0 条评论