Pass the Hash (PTH hash传递攻击, 即 Mimikatz hash注入 )
在windows系统中,系统通常不会存储用户登录密码,而是存储密码的哈希值.
在我们远程登录系统的时候,实际上向远程传递的就是密码的hash值。
当攻击者获取了存储在计算机上的用户名和密码的hash值的时候(PWDUMP7等)
他虽然不知道密码值,但是仍然可以通过直接连接远程主机,通过传送密码的hash值来达到登录的目的。
工具:
1 | a. Metasploit - exploit/windows/smb/psexec (XP,2003) |
Pass The Key (OverPass-the-Hash)
当系统安装了KB2871997补丁且禁用了NTLM的时候,那我们抓取到的ntlm hash
也就失去了作用,但是可以通过pass the key的攻击方式获得权限
1 | mimikatz "privilege::debug" "sekurlsa::ekeys" 获取用户的aes key |
若dir 查看不了服务器 (测试2008r2域服务器)
查看mimikatz的相关资料发现如下信息:
1 | ntlm hash is mandatory on XP/2003/Vista/2008 and before 7/2008r2/8/2012 kb2871997 (AES not available or replaceable) ; AES keys can be replaced only on 8.1/2012r2 or 7/2008r2/8/2012 with kb2871997, in this case you can avoid ntlm hash. |
根据提示,尝试在系统安装补丁kb2871997后继续测试
安裝 : https://www.microsoft.com/en-us/download/details.aspx?id=42765
之后可以用\计算机名的方式通过远程共享查看目标机器(ps:这里必须要使用计算机名进行连接,会爆密码错误。 不要用win10测试,win10机器测试会在一分鐘后重啓 ,)
(如果获取的散列是NTLM,则Kerberos凭证加密方法是RC4。如果散列加密方法为AES,则Kerberos票使用AES进行的加密。)
Pass the Ticket (票据传递攻击PtT)
简义
1 | 知道用户的ntlm值,由kekeo生成TGT票据,之后导入票据即可 |
与PtH情况类似,但PtT使用的是Kerberos票据,而不是NT哈希
https://github.com/gentilkiwi/mimikatz/wiki/module-~-kerberos
在微软活动目录中颁发的TGT是可移植的。由于Kerberos的无状态特性,TGT中并没有关于票据来源的标识信息。
这意味着可以从某台计算机上导出一个有效的TGT,然后导入到该环境中其他的计算机上。
新导入的票据可以用于域的身份认证,并拥有票据中指定用户的权限来访问网络资源。
这种特别的攻击方法被称为”pass-the-ticket”攻击。
拿到了域控权限,在上面就可以很容易的获得krbtgt的Hash值,再通过mimikatz即可生成任意用户任何权限的Ticket,也就是Golden Ticket
考虑到mimikatz的pth功能需要本地管理员权限,所以mimikatz也提供了不需要管理员权限的解决方法Pass-The-Ticket
Pass-The-Ticket需要用到gentilkiwi开源的另一款工具kekeo : https://github.com/gentilkiwi/kekeo
执行后生成票据TGT_test1@TEST.LOCAL_krbtgt~test.local@TEST.LOCAL.kirbi :
1 | kekeo "tgt::ask /user:test1 /domain:test.local /ntlm:7ECFFFF0C3548187607A14BAD0F88BB1" |
导入票据:
1 | kekeo "kerberos::ptt TGT_test1@TEST.LOCAL_krbtgt~test.local@TEST.LOCAL.kirbi" |
以上3种:
1 | hash传递攻击(PtH):抓住哈希并使用它来访问资源。用户更改帐户密码之前有效。 |
Golden Ticket (黄金票据)
简义 : 在拥有普通域用户权限和 krbtgt账号的hash的情况下,获取域管理员权限。
发生在上面的过程3,可以伪造TGT(前提是获取krbtgt账号的口令散列值(hash)),宣称自己是域内任何账号,包括域管或者不存在的用户。
由來:
1 | Kerberos信任及完全依赖于KDC密码,由于Kerberos协议是无状态的,因此密钥分发中心KDC和票据授予服务TGS并没记录以前的交互信息。 |
如果攻击者能够攻陷KDC和提取krbtgt散列值(hash)。然后利用这些有限信息,攻击者能够为委托人principal生成任意的TGT。
1 | 1. 首先,黄金票据是全功能的TGT。也就意味着万能票据可用于Kerberos认证的任何服务。票据授予服务盲目地相信TGT中的信息,然后处理TGT并颁发服务票据。 |
1 | 6.4 然后我的低权限本地用户,就被提升到域管理权限 |
Silver Ticket (白银票据)
简义 : 发生在上面的过程5,可以伪造TGS(前提是获取服务账号的口令散列值),宣称自己是域内任何账号,例如域管。
Silver Ticket生成时指定了相关的服务名,因此只能用来访问相应的服务,所以局限性比较大,没有golden ticket好用
所需条件(mimikatz生成silver ticket)
1 | 1. /domain |
常用的服务名有以下:
1 | 服务名称 同时需要的服务 |
用法
1 | kerberos::golden /domain:demo.local /sid:S-1-5-21-1239069908-882060383-2558203358 /target:owa2010dc.demo.local /service:cifs /rc4:aac6185241728f7685c8d50c61573b75 /user:silver /ptt |
Kerberoast (Kerberos TGS服务票据(Service Ticket)离线爆破)
简义 : 发生在上面的过程3,4, 目标的服务账户的服务器主体名称(SPN)请求一个Kerberos服务票据 (TGS) 。
这里会采用一个有效的用户认证票据(TGT)来请求一个或几个运行在服务器上的目标服务票据。
域控不会检测用户是否真正连接到了这些资源上(即使用户可能真的有权限访问)。
域控会在活动目录中查找SPN并且用SPN关联的用户账户把票据进行加密,以此赋予用户访问服务的权限。
请求的Kerbero服务票据的加密类型是 RC4_HMAC_MD5, 这意味着服务账户的NTLM密码哈希会被用来加密服务票据。
所以Kerberoast能够通过尝试不同的NTLM哈希来解开kerberos票据,一旦票据被成功解开,它的密码也就到手了。
(获得服务票据不需要提权,同时也不会发送数据到目标机器。)
1 | https://github.com/nidem/kerberoast/blob/master/tgsrepcrack.py |
Kerberoasting - Kerberoast攻击的另一种姿势
我们通常不关心基于主机的SPN,因为计算机的机器帐户密码默认是随机的,每30天更换一次。
但是,请记住,也可以为域用户帐户注册任意的SPN。
一个常见的例子就是一个服务账户管理着多个MSSQL实例;此用户帐户注册的每个MSSQL实例都有一个<MSSQLSvc/HOST:PORT> 这样的SPN,
这个SPN存储在用户的serviceprincipalname属性里.如果我们有一个为域用户帐户注册的任意SPN,
那么该用户帐户的明文密码的NTLM哈希值就将用于创建服务票证
注意的是: 任何具有服务主体名称SPN的域用户帐户都可以被该域中任何用户请求该SPN的TGS,
从而允许攻击者离线破解服务帐户的明文密码!这显然取决于一个可破解的服务帐户明文密码的复杂度
老套的”Kerberoasting攻击姿势
1 | 给出的利用方法或工具包是使用工具集的组合来请求票证,并从内存中提取(使用Mimikatz)票证,然后将它们转换为可破解的格式。 |
一般来说,整个过程如下:
1 | a. 使用Tim的GetUserSPNS.ps1脚本或者Sean的Find-PSServiceAccounts.ps1脚本或PowerView的"Get-NetUser -SPN"来枚举域帐户的SPN。 |
1 | b. 请求这些特定的SPN的 TGS可以使用Windows内置的工具setspn.exe或者在PowerShell中调用.NET的 |
SYSVOL
在域环境中修改域机器的本地账户密码是个很麻烦的事情
但是微软的GPP(组策略偏好)中提供了一个批量修改本地账户的功能,
可以一次性批量的修改本地账户密码(组策略不仅仅可以用来批量管理密码)。
但是最初却导致了一个问题,就是域管理员在配置GPP的时候,会在SYSVOL这个文件夹中保存当前GPP配置的xml文件,
如果管理员在配置的时候填入了密码,其中就包含了加密了的用户密码(SYSVOL是一个存储域公共文件服务器副本的共享文件夹,
所有的认证用户都可以读取。SYSVOL包括登录脚本,组策略数据,以及其他域控所需要的域数据,这是因为SYSVOL能在所有域控里进行自动同步和共享。)
一般sysvol文件的位置是 :
1 | \\<DOMAIN>\\SYSVOL\\<DOMAIN>\\Policies\\ |
其中的groups.xml(Services.xml、ScheduledTasks.xml、Printers.xml、Drives.xml、DataSources.xml)就可能保存了加密后的本地管理账户密码
(ps:这些文件中并不一定存在密码,因为只有当管理员在配置的时候,在界面的密码框中输入密码之后才会保存(設置計劃任務))
我们可以通过这个powershell的脚本进行解密Get-GPPPassword.ps1
1 | (https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Get-GPPPassword.ps1) |
若获取不到:
1 | a. 使用了LAPS批量管理域内主机本地管理员帐户 (使用ldapsearch来dump域中的LAPS密码 https://www.anquanke.com/post/id/86502) |
ntds.dit (活动目录的数据库文件)
包含有关活动目录域中所有对象的所有信息 及 所有域用户和计算机帐户的密码哈希值。
域控制器(DC)上的ntds.dit文件只能由可以登录到DC的用户访问 。
这些组可以默认登录到域控制器:
1 | Enterprise Admins (目录林管理员组) |
不能登录到域控制器可能 :
1 | a. 限制了有权登录到域控制器的组/帐户。 |
若帐户登录了域控制器,首先把所有的登录凭证全部获取到本地:
1 | 1. MIMIKATZ从域控上面抓取到所有账户信息: |
MS14-048 (限制条件:打了补丁或者域中有Win2012/2012R2 域控)
允许域内任何一个普通用户,将自己提升至域管权限。
作为普通用户向域控请求一个没有PAC的Kerberos TGT认证的票据,域控会返回一个TGT(不包含PAC,PAC通常包含有用户组中的成员关系)
生成一个伪造的PAC,因为没有密钥,所以生成的PAC”被标记”有MD5算法,而不是带有域用户密码数据的HMAC_MD5类型。
把伪造的PAC结合上TGT构造认证数据,作为TGS服务的一部分发送到域控。
域控会混淆构造的数据,所以直接丢弃之前用户发送没带有PAC的TGT,然后新构造一个TGT并用自己的认证数据插入到伪造的PAC当中,再把新TGT发送给用户
这样带有伪造PAC的TGT就能使用户成为有漏洞域控上的域管理员。
1 | 1. mimikatz从域控上面抓取到所有账户信息 |
列举缓存证书的命令klist
或者使用 kekeo
kerberos::purge or klist purge(为了让我们自己生成的票据生效,需要我们先用mimikatz将内存中的票据清空)
1 | kekeo.exe # exploit::ms14068 /domain:demo.local /user:testwin7 /password:1qaz$RFV /sid:S-1-5-21-1239069908-882060383-2558203358 /rid:1130 /kdc:owa2010dc.demo.local /ptt (接着使用域、普通域用户名和密码生成票据) |
参考
1 | Attack Methods for Gaining Domain Admin Rights in Active Directory |
转自:https://1sparrow.com/2018/02/19/%E5%9F%9F%E6%B8%97%E9%80%8F%E7%9B%B8%E5%85%B3/