域渗透-横向移动(PTH)

一:Windows本地认证

***基础知识***

  • Windows内部是不保存明文密码的,只保存密码的hash。
  • 本机用户的密码hash是放在本地的SAM文件 里面,域内用户的密码hash是存在域控的NTDS.DIT文件里面。
  • SAM文件位置:%SystemRoot%\system32\config\sam
  • 当我们登录系统的时候,系统会自动地读取SAM文件中的“密码”与我们输入的“密码”进行对比,如果相同,则认证成功。

***密码格式***

Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::

其中AAD3B435B51404EEAAD3B435B51404EE是LM Hash而31D6CFE0D16AE931B73C59D7E0C089C0是NTLM Hash

1.1:LM HASH

全称是:LAN Manager Hash, windows最早用的加密算法,由IBM设计。

***LM Hash计算***

  1. 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。
  2. 密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
  1. 再分7bit为一组,每组末尾加0,再组成一组。
  2. 上步骤得到的二组,分别作为key 为 “KGS!@#$%”进行DES加密

从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NTLM Hash,LM Hash将不再存在。

如果空密码或者不储蓄LM Hash的话,一般抓到的LM Hash是AAD3B435B51404EEAAD3B435B51404EE(win7)这里的LM Hash并没有价值。

1.2:NTLM HASH

为了解决LM加密和身份验证方案中固有的安全弱点,Microsoft 于1993年在Windows NT 3.1中引入了NTLM协议。

***系统版本对LM和NTLM的支持***

2000

XP

2003

Vista

Win7

2008

Win8

2012

LM

X

X

X

NTLM

X

X

X

X

X

X

X

X

注:X:当密码超过14位时使用的加密方式 X:系统默认使用的加密方式

  1. 将加密后的两组拼接在一起,得到最终LM HASH值。
    #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")

    ***加密算法漏洞***

  2. 首先,密码长度最大只能为14个字符
  3. 密码不区分大小写。在生成哈希值之前,所有密码都将转换为大写
  4. 查看我们的加密过程,就可以看到使用的是分组的DES,如果密码强度是小于7位,那么第二个分组加密后的结果肯定是aad3b435b51404ee,如果我们看到lm hash的结尾是aad3b435b51404ee,就可以很轻易的发现密码强度少于7位
  5. 一个14个字符的密码分成7 + 7个字符,并且分别为这两个半部分计算哈希值。这种计算哈希值的方式使破解难度成倍增加,因为攻击者需要将7个字符(而不是14个字符)强制暴力破解。这使得14个字符的密码的有效强度等于,或者是7个字符的密码的两倍,该密码的复杂度明显低于14个字符的密码的理论强度。
  6. Des密码强度不高

从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NTLM Hash,LM Hash将不再存在。

如果空密码或者不储蓄LM Hash的话,一般抓到的LM Hash是AAD3B435B51404EEAAD3B435B51404EE(win7)这里的LM Hash并没有价值。

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
laosec:1000:aad3b435b51404eeaad3b435b51404ee:4ed9fa78b52edf56286dc7fac36d5742:::

***抓取Win7 NTLM HASH***

mimikatz
privilege::debug
sekurlsa::logonpasswords

***NTML HASH计算***

  1. 先将用户密码转换为十六进制格式。
  2. 将十六进制格式的密码进行Unicode编码。

二:Windows网络认证

  1. 使用MD4摘要算法对Unicode编码数据进行Hash计算。
    admin -> hex(16进制编码) = 61646d696e
    61646d696e -> Unicode = 610064006d0069006e00
    610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634

    1.3:本地认证流程

    Windows Logon Process

    即 winlogon.exe,是Windows NT 用户登陆程序,用于管理用户登录和退出。

    LSASS

    本地安全认证子系统服务,用于微软Windows系统的安全机制。负责用户在本地验证或远程登陆时验证用户身份,管理用户密码变更,并产生访问日志。

    ***整体流程***

  2. 开机
  3. winlogon.exe显示输入用户名密码的图形化页面
  4. 用户输入用户名密码,winlogon.exe进程将输入信息交付给lsass.exe进程
  5. lsass.exe将密码加密为NTLM Hash,并与本地SAM数据库中的NTLM Hash进行比较
  6. 如果相同,则认证通过 logonpasswords

2.1:实验1:MSF进行PTH攻击

步骤一:在已经获取的Meterpreter shell下抓取NTML HASH

 步骤二:调用psexec模块,设置好选项进行登录

 实验结果:

***实验问题***

1:靶机Win7

1)共享服务不允许远程访问

将注册表中LocalAccountTokenFilterPolicy的值更改为1,如果没有该文件,直接新建一个(DWORD32位)

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

2:靶机Winxp

1)连接拒绝

开启Windows XP 的445端口和Server服务

2)登陆失败

检测SMBPass的值是否正确.依次打开本地计算机策略 - >计算机配置 - > Windows设置 - >安全设置 - >本地策略 - >安全选项修改网络访问:本地帐户的共享和安全模式经典 - 本地用户身份验证

***疑问解决***

SMB协议是Windows网络中用来存取远程文件的通讯协议

2.2:实验2:Mimikatz进行PTH攻击

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值