目录
一,Windows HASH
hash
Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
windows HASH简介
Windows 加密过的密码口令,我们称之为 hash
Windows 系统使用两种方法对用户的密码进行哈希处理,它们分别是 LAN Manager(LM) 哈希和 NT
LAN Manager(NTLM) 哈希。
现在已经有了更新的 NTLMv2 以及 Kerberos 验证体系。
二,Windows认证基础
Windows的认证包括三个部分:
本地认证:用户直接操作计算机登录账户
网络认证:远程连接到工作组中的某个设备
域认证:登陆到域环境中的某个设备
Windows本地认证
- 用户输入密码
- 系统收到密码后将用户输入的密码计算成NTLM Hash
- 与sam数据库(%SystemRoot%\system32\config\sam)中该用户的哈希比对
- 匹配则登陆成功,不匹配则登陆失败
Windows本地认证采用sam hash比对的形式来判断用户密码是否正确,计算机本地用户的所有密码被加密存储在%SystemRoot%\system32\config\sam文件中,当我们登录系统的时候,系统会自动地读取SAM文件中的“密码”与我们输入的密码进行比对,如果相同,证明认证成功.
LM-HASH
LM-HASH简介
LAN Manager(LM)哈希是Windows系统所用的第一种密码哈希算法,是一种较古老的Hash,在LAN
Manager协议中使用,非常容易通过暴力破解获取明文凭据。
它只有唯一一个版本且一直用到了 NT LAN Manager(NTLM) 哈希的出现,
在 Windows XP / Windows Server 2003 之前, 它是Windows上占主导地位的密码存储算法。
从 Windows Vista / Windows Server 2008 开始,默认情况下已禁用该算法。
LM 算法是在 DES 基础上实现的,不区分字母大小写。
LM-HASH生成原理
假设用户密码为:password
- 将用户密码所有字符转换为大写: PASSWORD
- 密码长度不足14个字符将用0填充到14个字符
- 这14个字符将被分成两半: PASSWOR D000000
- 将每一半转换为位,并且每7位之后将添加一个奇偶校验位(0),因此结果为64位: 1101000011->
1101000 0 011 ,在将这些奇偶校验位相加之后,我们将从两个预先生成的两半中获得两个密钥 - 分别用生成的两个密钥作为key 对 KGS!@#$% 进行DES加密: PASSWOR =E52CAC67419A9A22
D000000 = 4A3B108F3FA6CB6D - 将加密后的两组拼接在一起,得到LM HASH值: E52CAC67419A9A22 4A3B108F3FA6CB6D
使用python得到LM HASH值:
python3 -c "from passlib.hash import lmhash;print(lmhash.hash('password'))"
#coding=utf-8 import re import binascii from pyDes import * def DesEncrypt(str, Des_Key): k = des(binascii.a2b_hex(Des_Key), ECB, pad=None) EncryptStr = k.encrypt(str) return binascii.b2a_hex(EncryptStr) def group_just(length,text): # text 00110001001100100011001100110100001101010011011000000000 text_area = re.findall(r'.{%d}' % int(length), text) # ['0011000', '1001100', '1000110', '0110011', '0100001', '1010100', '1101100', '0000000'] text_area_padding = [i + '0' for i in text_area] #['00110000', '10011000', '10001100', '01100110', '01000010', '10101000', '11011000', '00000000'] hex_str = ''.join(text_area_padding) # 0011000010011000100011000110011001000010101010001101100000000000 hex_int = hex(int(hex_str, 2))[2:].rstrip("L") #30988c6642a8d800 if hex_int == '0': hex_int = '0000000000000000' return hex_int def lm_hash(password): # 1. 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。 pass_hex = password.upper().encode("hex").ljust(28,'0') #3132333435360000000000000000 print(pass_hex) # 2. 密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不 足使用0在左边补齐长度 left_str = pass_hex[:14] #31323334353600 right_str = pass_hex[14:] #00000000000000 left_stream = bin(int(left_str, 16)).lstrip('0b').rjust(56, '0') # 00110001001100100011001100110100001101010011011000000000 right_stream = bin(int(right_str, 16)).lstrip('0b').rjust(56, '0') # 00000000000000000000000000000000000000000000000000000000 # 3. 再分7bit为一组,每组末尾加0,再组成一组 left_stream = group_just(7,left_stream) # 30988c6642a8d800 right_stream = group_just(7,right_stream) # 0000000000000000 # 4. 上步骤得到的二组,分别作为key 为 "KGS!@#$%"进行DES加密。 left_lm = DesEncrypt('KGS!@#$%',left_stream) #44efce164ab921ca right_lm = DesEncrypt('KGS!@#$%',right_stream) # aad3b435b51404ee # 5. 将加密后的两组拼接在一起,得到最终LM HASH值。 return left_lm + right_lm if __name__ == '__main__': hash = lm_hash("123456")
Mysql数据库密码破解
一旦获取了网站一定的权限后,如果能够获取MySQL中保存用户数据,通过解密后,即可通过正常途径
来访问数据库;一方面可以直接操作数据库中的数据,另一方面可以用来提升权限。
MySQL数据库用户密码跟其它数据库用户密码一样,在应用系统代码中都是以明文出现的,在获取文件
读取权限后即可直接从数据库连接文件中读取
一般都包含有数据库类型,物理位置,用户名和密码等信息
1. MYSQL数据库文件类型
MYSQL数据库文件共有 frm 、 MYD 和 MYI 三种文件
".frm" 是描述表结构的文件
".MYD" 是表的数据文件
".MYI" 是表数据文件中任何索引的数据树
一般是单独存在一个文件夹中
与用户有关的一共有三个文件即 user.frm 、 user.MYD 和 user.MYI ,MYSQL数据库用户密码都保存
在 user.MYD 文件中,包括root用户和其他用户的密码。
2. Mysql加密方式
MYSQL数据库的认证密码有两种方式
MYSQL 4.1版本之前是MYSQL323加密,MYSQL 4.1和之后的版本都是MYSQLSHA1加密
MYSQL数据库中自带 Old_Password(str) 和 Password(str) 函数,它们均可以在MYSQL数据库里进
行查询,前者是 MYSQL323 加密,后者是 MYSQLSHA1 方式加密
mysql> select Password('root'); +-------------------------------------------+ | Password('root') | +-------------------------------------------+ | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B | +-------------------------------------------+ 1 row in set