Bootstrap

[横向移动] Pass The Hash(PTH,哈希传递)攻击横向移动

🌟想系统化学习内网渗透?看看这个:[内网安全] 内网渗透 - 学习手册-CSDN博客

0x01:Pass The Hash 攻击介绍

哈希传递(Pass The Hash)攻击,有时也叫 PTH 攻击。该攻击通过找到与账户相关的密码散列值(通常是 NTLM Hash)来进行攻击。

在域环境中,用户的登陆计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本地管理员账号和密码。因此,如果计算机的本地管理员账号密码都是相同的,那么攻击者就能够通过在靶机上抓取的管理员账号的 NTLM Hash 值利用哈希传递的方法登录内网中的其他计算机。

哈希传递攻击并不需要攻击者花费时间来破解密码散列值(进而获取明文密码)。而在 Windows 网络中,散列值是用来证明用户身份的(有正确的用户名和密码散列值,就能通过验证),而微软自己的产品和工具显然不会支持这种攻击,所以,通常情况下攻击者会采用第三方工具来完成攻击。

在 Windows 2012 R2 及之后版本的操作系统中,默认在内存中是不会记录明文密码的,因此哈希传递的攻击手法在内网渗透中就显得更为重要了。

0x02:Pass The Hash 攻击原理

当用户需要登录某网站时,如果该网站使用明文的方式保存了用户的密码,那么,一旦该网站出现了安全漏洞,所有用户的明文密码就均会被泄露出去。因此,就产生了散列值的概念。

当用户设置密码时,网站服务器会对用户输入的密码进行散列加密处理(通常使用 MD5 算法)后再存储到数据库中,散列加密算法一般为单向不可逆算法。当用户再次尝试登录站点时,网站会将用户输入的密码再次以相同方法进行加密后再到数据库中比对,如果完全相同则表示验证成功。

目前主流的 Windows 操作系统,通常会使用 NTLM Hash 对访问资源的用户进行身份验证。早期版本的 Windows 操作系统使用 LM Hash 对用户密码进行验证。但是,当用户密码大于 14 位时,就无法使用 LM Hash 了。

从 Windows Vista 和 Windows Server 2008 版本开始,Windows 操作系统默认禁用 LM Hash,统一改用 NTLM Hash。NTLM Hash 在进行身份认证时,不会使用明文口令,而是将明文口令通过系统 API(例如 Lsalogon User)转换成散列值。不过,攻击者在获得密码散列值之后,依然可以使用哈希传递攻击来模拟用户进行认证。

0x03:Pass The Hash 攻击条件

哈希传递的攻击有以下两个硬性条件:

  1. 成功获取到管理员的 NTLM Hash(本地的或者域管的)

  2. 目标机器开放 445 端口

另外,使用哈希传递对你当前所处的环境与获取的用户权限也有一定要求:

  • 工作组环境:

    • Windows Vista 之前的机器:可以使用本地管理员组用户进行攻击。

    • Windows Vista 之后的机器:只能使用 Administrator (RID 值为 500)用户的哈希值才能进行哈希传递攻击,其他用户(包括管理员组的其他用户)也不能使用哈希传递攻击,会提示拒绝访问。

  • 在域环境中: 只能是域管理员组(可以是域管理员组内非 Administrator 的用户)内用户的哈希值才能进行哈希传递攻击,攻击成功后,你可以访问域内任何一台机器。

0x04:Pass The Hash 攻击复现 — 远控版

实验环境

  • 攻击机(Kali Linux):IP 172.16.0.100 — 安装了 Cobalt Strike 客户端与服务端

  • 内网肉鸡 - 域环境(Windows Server 2008):IP 172.16.0.120

  • 内网靶机 - 域控(Windows Server 2012):IP 172.16.0.110

  • 内网肉鸡与内网靶机的本地 Administrator 账号密码相同

本环境还有一个要点,就是你能够通过工具登上内网肉鸡的远程桌面。关于如何对内网机器进行远程桌面,笔者在前面几章已经介绍了好几种方法了,所以这里就不说了也不演示了。

0x0401:获取内网肉鸡提权 & 抓密码

抓密码你肯定得拿到靶机的 Administrator 权限或者 System 权限,这里笔者偷懒了,直接让靶机的 Administrator 用户上线了,然后通过 CS Run mimikatz 获取肉鸡本地的密码:

如上,这里我们获得了肉鸡本地管理员的 NTLM Hash:

570a9a65db8fba761c1008a51d4c95ab

这里我们假设,它们内网管理员都使用相同的密码,于是,我们决定使用肉鸡管理员的 Hash 值去通过哈希传递控制域控(或者内网其他机器)。

0x0402:使用 Mimikatz 进行 Hash 传递

当我们获取到一个本地管理员密码的 Hash 值后,可以采用下面这个命令,通过 Mimikatz 进行哈希传递攻击:

mimikatz.exe "privilege::debug" "sekurlsa::pth /user:<PTH 攻击的用户> /domain:<靶机 IP> /ntlm:<PTH 攻击的用户对应的 NTLM Hash>" exit
​
# 示例: 以下是在 CS 中运行的方法,若是通过上传的 Mimikatz 运行,则采用上面的形式
mimikatz privilege::debug
mimikatz sekurlsa::pth /user:administrator /domain:dc.hack3rx.cn /ntlm:570a9a65db8fba761c1008a51d4c95ab

如上,当我们 PTH 攻击成功后,我们控制的肉鸡就会自动弹出一个 CMD 窗口,这个窗口相当于与靶机建立了一个 IPC连接,接下来,我们就需要远程桌面到肉鸡,然后利用这个弹出来的窗口,对靶机进行​ 的横向移动攻击了(这些内容笔者之前都讲过,这里就不提了):

0x05:Pass The Hash 攻击复现 — CS 版

在上面那个方法中,我们 PTH 攻击成功后,还得远程桌面到靶机上,然后通过 IPC$ 才能横向移动,既麻烦,动作又大,那么有没有啥简单的方法来通过 PTH 上线内网其它机器呢?

有的,兄弟,有的。通过 Cobalt Strike 我们就可以利用 PTH 实现一键上线内网其它机器的目的。

0x0501:使用 Mimikatz 抓取 NTLM Hash

在使用 Cobalt Strike 的 PTH 上线其它机器之前,我们得先用它自带的 Mimikatz 抓一下管理员的 NTLM Hash 值,直接 Run Mimikatz 就行,然后 CS 会记录下来的:

0x0502:使用 Cobalt Strike 扫描内网

抓到了 NTLM Hash 后,我们还得了解内网中存活的机器,这里需要用 CS 的端口扫描模块探测一下内网(CS 内置了一个内网地图,你扫描的东西它都会记录在里面)。点击 “Explore” => “Port Scan”,扫就完了:

等它扫描完成后,你点击 “靶标” 图案,就可以看到它识别出来的内网存活主机:

0x0503:使用 Cobalt Strike PTH 一键上线

假设,我们现在要通过 PTH 攻击域控,也就是 172.16.0.110 那个机器,然后刚刚我们已经跑出了这台机器了,我们右击这台机器,选择 “Jump” => “psexec_psh”:

然后选择我们刚刚在 PC-2008-R2 上抓的 Administrator 用户的 NTLM Hash,并配置攻击目标与发起攻击的肉鸡,配置完成后点击 “Launch” 发起攻击:

如下,若攻击成功,被攻击的机器会直接上线,十分的方便: