一. 域内用户枚举原理和流量
1. 原理
在AS-REQ阶段客户端向AS发送用户名,cname字典存放用户名,AS对用户名进行验证,用户存在和不存在返回的数据包不一样。
不同之处主要是在返回数据包中的状态码不同,根据不同的状态码来区分账号在目标主机上的情况!
状态码主要分为四种:
KRB5DC_ERR_PREAUTH_REQUIRED 需要额外的预认证(用户存在)但是没有提供密码
KRB5DC_ERR_CLIENT_REVOKED 客户端凭证已被吊销(禁用)
KRB5DC_ERR_C_PRINCIPAL_UNKNOWN 在Kerberos数据库中找不到客户端(不存在)
KRB5KDC_ERR_PREAUTH_FAILED(用户存在密码错误)
官方文档中还有对应的状态码
微软地址: https://learn.microsoft.com/zh-cn/windows/security/threat-protection/auditing/event-4771
2. 流量分析
根据上面的四种状态码进行测试和流量分析:
用户存在,但是没有提供密码(test)
使用kerbrute工具输入下面命令并抓包
kerbrute.exe userenum --dc 192.168.41.10 -d hack.com 1.txt
先看AS-REQ包,里面只传输了我们要请求的用户名,而没有写密码
再看AS-REP包里的状态码
客户端凭证已被吊销(Guest(禁用))
我们使用kekeo工具输入下面命令申请用户的TGT票据
Tgt::ask /user:域用户 /domain:域名 /password:密码,
AS-REQ
AS-REP
可以看到请求的用户名是Guest,返回时的
数据是disabled禁用
test2在Kerberos数据库中找不到客户端(不存在)
用上面方法抓包分析
AS-REQ
AS-REP
可以看到请求的用户名是qwe,返回是的
数据是unknown
用户存在密码错误(test)
用上面方法抓包分析
AS-REQ
AS-REP
可以看到请求的用户名是ls,但是提供了错误的密码
3. 总结
域内用户枚举的原理是利用这两个都可以证明用户的存在:
-
- 正确的用户名,没有提供密码
-
- 正确的用户名,密码错误
这俩种都是根据AS-REP返回的error-code值来判断枚举的用户是否存在
比如利用kerbrute测试,在用户字典中添加几个用户
二. 域内密码喷洒原理和流量
利用kerbrute测试并抓包分析
kerbrute.exe passwordspray --dc 192.168.41.10 -d hack.com 1.txt qwe123!@#
test用户存在,密码错误
这里与上面不同,有四个数据包,原理是它先验证用户名是否存在,然后再进行密码验证
AS-REQ
AS-REP
test用户存在,密码正确
AS-REQ
AS-REP
三. 枚举和喷洒工具的使用
原理搞明白后接下来介绍来个工具
1. kerbrute工具
kerbrute使用Go语言开发,github提供了编译好的文件
地址: https://github.com/ropnop/kerbrute/releases
使用方法:
域内用户枚举
kerbrute.exe userenum--dc 域控IP -d 域名 用户字典
域内密码喷洒
kerbrute.exe passwordspray--dc 域控IP -d 域名 用户字典 密码(单密码)(有锁定策略使用)
kerbrute.exe bruteuser --dc 域控IP -d 域名 密码字典 用户名(没有锁定策略使用)
2. pykerbute工具
该工具是使用python2编写,支持tcp和udp俩种协议来用户枚举
用户枚举
EnumADUser.py 192.168.41.10 hack.com 1.txt tcp密码喷洒
hash值:
ADPwdSpray.py 192.168.41.10 hack.COM 1.txt ntlmhash e00045bd566a1b74386f5c1e3612921b udp
明文密码:
ADPwdSpray.py 192.168.41.10 hack.COM 1.txt clearpassword Admin@123 udp
四. 工作组和域内 – 喷洒和枚举
1. 不同环境下使用密码喷洒的场景
工作组环境
(1) 可以使用本地账号进行hash碰撞,找到可以登录的机器进行PTH认证,然后横向过去
(2) 如果通过信息收集,发现了域控的IP还有域名,可以直接使用工作组机器对域内用户进行密码喷洒,如果知道了域用户的密码可以生成票据,进行PTT,然后横向攻击上线
域环境
(1) 在域环境中一般不需要进行域内用户枚举,因为可以使用 net user /domain 可以直接查看。
(2) 在域环境中我们可以使用密码喷洒找到域用户的密码然后进行横向。
2. 工作组喷洒和域内主机喷洒的区别
工作组:工作组--工作组:可以使用NTLM协议:IPC,明文密码,PTH工作组--域内主机kerberos协议:用户枚举,密码喷洒NTLM协议:IPC,PTH
域内机器:域内机器-域内机kerberos协议:密码喷洒,IPC,PTH,PTT,PTK,明文密码域内机器-工作组机器NTLM协议:IPC,PTH
五. 通过喷洒控制域内主机
由上可知要喷洒用户由如下特点:
工作组:administrator用户 普通管理员(有UAC)但是只能上线低版本机器
域用户:administrator或者普通域管理员用户都可以
1. 工作组喷洒域内主机
前提条件:域控IP域名域内用户(需要枚举)
前俩个条件可以通过信息收集得到,但查看域内用户不行,除非控制的是域内用户,可以使用net user /domain 查看,所以需要枚举
- 需要注意的是:上线的时候一定要把DNS修改不然PTT会失败
不然无法与域控通信
第一步成功上线内网一台工作组机器,利用CS插件上传FSCAN扫描C段
看到有DC的IP
第二步开始用户枚举,先上传工具kerbrute
输入命令开始用户枚举
kerbrute.exe userenum --dc 192.168.41.10 -d hack.com 1.txt
枚举到DC的用户,开始对administrator用户进行密码喷洒
kerbrute.exe bruteuser --dc 192.168.41.10 -d hack.com 2.txt administrator
得到DC的超管用户和明文密码使用之前的任意横向技术即可上线!
2. 域内主机进行喷洒,上线域控
前提:
域控IP
域名
域内用户(不需要枚举,使用net user /domain)
查看域内成员
上传工具,进行密码喷洒
接下来横向推荐使用PTT,因为得到票据,将超管票据打入内存后,可以上线任意域内成员机
3. 工作组hash碰撞或者密码喷洒
只能使用IPC,明文密码或者是pth认证,认证通过之后,可以使用copy命令将木马copy到目标机器,还可以使用服务或者是计划任务上线CS!