域渗透学习
科恩的任务罢了
前置知识
windows域渗透接触的都是windows的东西,都没学过。。。。
AD
Active Directory,活动目录,存域内各种信息的数据库
域内所有的计算机共享一个集中式的目录数据库(又称为活动目录数据库),它包含着整个域内的对象(用户账户、计算机账户、打印机、共享文件等)和安全信息等等,而活动目录负责目录数据库的添加,修改,更新和删除。
组策略
Group Policy,有本地的和域的
域组策略管理能够统一的对域内机器和用户进行管理
GPO
组策略对象,GPO(Group Policy Object),实际上就是组策略设置的集合
GPP
Group Policy Preference,组策略首选项,作用似乎是简单化管理
SYSVOL目录
域中共享文件夹,该文件夹存储组策略数据以及一些配置文件脚本,这些策略可以被共享到域间机器,由于域控机器之间因为要自动同步域数据,SYSVOL文档允许该域内的所有DC机之间进行复制,所有的AD用户都可以访问它,包括普通用户
所有组策略都存储于如下目录\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\
域内身份验证
windows身份验证分两种,一个kerberos一个NTLM
NTLM就是一个用密码哈希进行的挑战应答,kerberos不多说了,在windows域环境中由DC担任KDC
Golden Ticket & Silver Ticket
黄金票据,是通过krbtgt的密码哈希计算而成的票据,绝对伪造
白银票据,通过对TGS的伪造,只能访问伪造的对应服务
攻击手法
脚本明文包含
当管理员想通过脚本进行批量密码修改的时候,一般来说这个密码就会以明文的形式保存在脚本里,然后在通过组策略批量下发,这个时候就可以通过搜寻vbs之类的脚本看里面有没有明文密码
尝试搜索组策略目录下的脚本命令
shell for /r \\dc/sysvol %i in (*.vbs) do @echo %i
shell for /r \\dc/sysvol %i in (*.bat) do @echo %i
GPP密码解密
GPP所在的目录为\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\
,双反斜线这个目录还有个说法,叫UNC路径,用于访问网络资源
一个以
\\
开头的服务器名或主机名,支持IP地址
所以只要是域成员一般就能读啦,直接文件资源管理器里面填路径就行,GPP里面有一些批量管理操作,比如定时任务,比如批量修改本地用户密码
GPO里面选择用户配置->首选项->控制面板设置->本地用户和组可以进行批量的密码修改(可能也能新建用户?)定时操作则可以输入用户名密码使用固定身份执行定时操作
每一个新建的组策略都会生成一个对应的XML文件存配置,都在对应的组策略号的文件夹下
所以,可以翻一下SYSVOL目录下的所有XML,万一哪个就有这种配置呢
如果用户提供了密码则会在对应的XML文件下以cpassword项存储AES-256方式加密的密码
然后微软还把密钥放出来了
4e 99 06 e8 fc b6 6c c9 fa f4 93 10 62 0f fe e8
f4 96 e8 06 cc 05 79 90 20 9b 09 a4 33 b6 6c 1b
直接解密就可以拿到密码
补丁就是禁止输入密码,所以就不会保存密码了。。。但之前输入过密码的XML需要手动删除,不让输入密码就等于是废除了批量改密码功能了嘛(因为微软推出了新的方法LAPS)
其他trick
可以使用gpupdate
更新组策略,以及gpresult /v
查看组策略应用情况
坑点
这个非常简单的实验花了我一个下午加一个晚上,因为改密码功能完全不生效,最后还是求助于师傅。不生效的理由很简单,一开始设的testvul这个密码太弱了。。。。但是什么提示都不给,也就写着应用成功了,我真的没想到会是这么个情况
最新发现
新加入域的机器也会受到之前组策略的影响,今天刚整了个winserver2016,然后加进去之后就直接把我的admin号也给改掉了
MS14-068
windows最有名的提权(大概?)
Kerberos系统运行复习
打的Kerberos系统,再复习一下这个东西怎么跑的吧
1.用户A先向AS认证自己的身份,AS返回一个TGT票据
2.用户A用TGT去请求TGS并告知想请求的资源B,TGS验证TGT通过之后返回ServiceTicket
3.用户A用ServiceTicket请求B,B验证通过,使用Ticket中的会话密钥进行通信
Kerberos with PAC
上述验证过程就是正常密码学学的东西,只能完成用户的验证,却不能完成用户的权限控制,一个用户只要完成了认证就能访问任意服务了,所以引进了PAC进行权限控制
PAC即Privilege Attribute Certificate,特权属性证书
PAC版本的kerberos变为:
1.第一步返回的TGT里面带一个PAC,PAC里包含用户所在的组和sid,用两个签名防篡改,一个Server Signature,一个是KDC Signature,此时的KDC为AS,Server为TGS(但是AS和TGS好像都是KDC);
2.还是用TGT请求TGS,**但不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据(为什么不在这里直接做权限校验呢。。。)**,并且TGS检验PAC,若签名校验通过,回复的ServerTicke中的PAC的签名被更新为Server是B,KDC是TGS;
3.拿ServiceTicket去请求B,B解密ServiceTicket,把解密出来的PAC拿去问KDC有没有访问权限,KDC解密PAC,获取用户的sid和组决定是否拥有访问权限
特别说明的是,PAC对于用户和服务全程都是不可见的。只有KDC能制作和查看PAC。
漏洞利用要素
有三个主要因素决定了这个漏洞的完整利用
1.PAC的签名算法可控,虽然TGS签出来的PAC是用密钥签的名,但是如果你能伪造出一个PAC并且用MD5直接签,他也能接受
2.TGS接受位于TGT之外的PAC数据,本来PAC应该是塞在TGT里面的,TGT用AS的密钥加密了,用户就算伪造出一个MD5签的PAC也没法塞进TGT里再过校验,但是用户可以把伪造的PAC放到TGT以外的部分,再放一个对应的密钥,TGS不仅能解密出来进行校验,甚至还能再给你用这个PAC更新一个内嵌PAC的ServiceTicket回来
3.当向TGS请求的服务为krbtgt时,返回的ServiceTicket可以当TGT用
漏洞利用过程
1.申请TGT时可以选择申请一个没有PAC的TGT,使用普通用户请求AS拿到无PAC的TGT
2.自己伪造一个PAC,PAC签名直接用MD5签,产生随机数加密PAC,PAC放在请求的 enc-authorization-data字段中,密钥放在PA-DATA里面的APREQ中,向TGS请求对krbtgt的票据
3.TGS拿到奇怪的PAC检验成功,签了一个目标是krbtgt的ServiceTicket,这个票能当TGT用,此时就已经获得了一个正常且高权限的TGT了
4.用这个TGT想申请谁申请谁,成功提权
Kerberos ServiceTicket离线碰撞
就硬爆破,感觉成功率不大。。。文章里说十一二位也算弱密码。。。对不起我大部分密码都是弱密码呜呜
这个方法不能打windows,因为windows上运行的服务会映射到活动目录账户,其密码128位,无敌
攻击流程就是向TGS申请一个目标服务账户的Service Principal Name (SPN),然后域控就会用对应账户对Ticket加密,加密使用的算法是RC4_HMAC_MD5,这时这个账户的NTLM password的哈希值会参与进来,然后就是硬爆破环节了
这个爆破的好处在于本地跑,不需要像其他爆破一样发一万个包,不容易被发现
凭证窃取
怎么说呢。。。就是mimikatz抓密码,抓到一个就去试这个密码能不能登其他机器,登到其他机器了如法炮制,顺便收集信息,数据库,RDP之类的账号密码的信息,直到拿到想要的账户
这里有几个抓密码为什么能抓到的注意点
1.以域管理员账户登录计算机时凭证会被放入LSASS(受保护的内存区),但拥有admin或localSystem权限的用户可以把这个受保护内存区dump出来
2.RunAs切换身份的,同1(这个命令是不是和Linux的su一样啊)
3.在受控机上RDP远程登录其他机器的,直接抓键盘记录被打穿
4.如果有使用域管理员上下文账户运行的服务部署在所有服务器上,只要拿下一个系统就拿下了所有系统,当一个服务以显式凭证启动时,凭证存进LSASS,被打穿
win10和winserver 2012R2之后的版本默认在内存中禁止保存明文密码,需要修改注册表才行reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
重启或用户重新登录后可以成功抓取
用powershell连接远程系统不会在远程系统内存中留下凭证,不会被随便打爆
使用零知识证明以不传输凭证登录
但是这样子就不能双重跳跃,从A跳到B时不能再从B跳到C,因为B不能提供凭证,如果在B上输入凭证B不安全就又被打穿了
微软提供了CredSSP来保护数据,但这个方案本身并不安全
传递哈希升级为传递凭证
感觉。。就是说的特别高级的重放,作为凭证窃取整个过程中的子过程进行解释
虽然认证需要的是用户名和密码,但因为需要零知识证明,实际用于验证的应该是他们的哈希结果,所以抓到了哈希就等于获得了授权,虽然正常人不能直接提交哈希进行验证,但是可以使用强力软件mimikatz
Pass-the-Ticket,偷kerboros凭证,时间戳内能重放(好垃圾哦)
OverPass-the-Hash 比直接传哈希复杂一点,先搞来一个哈希过的kerberos密码,然后把内存里所有的kerberos密码清空,下一次Kerberos请求票据的时候就会用上注入进内存的密码,这种方式比直接传递哈希来伪造身份更为隐蔽,无敌工具mimikatz能做到上述操作
Pass-the-Hash: grab the hash and use to access a resource. Hash is valid until the user changes the account password.
Pass-the-Ticket: grab the Kerberos ticket(s) and use to access a resource. Ticket is valid until the ticket lifetime expires (typically 7 days).
OverPass-the-Hash: use the password hash to get a Kerberos ticket. Hash is valid until the user changes the account password.
虽然话是这么说,不改密码打一辈子,但是大家哈希校验的时候真的不额外加一个时间戳什么的防重放吗
应对方案
管理员应该使用单独的电脑登录工作站,而不是在可能执行用户操作,如收发邮件,浏览网站的机器上登录。smartcard同样会在内存中留下凭证而被日翻(虽然并不是很懂smartcard是什么东西)
权限控制,每个管理员应该只给与其对应所需的管理员权限
工作站上的本地管理员账号密码应该足够复杂
配置组策略以禁止管理员账号通过网络进行认证
接触AD数据库文件(ntds.dit)
AD数据库包含了AD域中所有对象的信息,这个数据库被所有的域控都复制了一遍,这个文件一般来说包含了所有用户密码的哈希,该文件只能被能够登陆DC的用户访问
在不是域管理员的情况下获取NTDS.dit的方法
1.备份位置,从共享备份文件中接触NTDS.dit
2.在成员服务器变为域控之前获取到其存储的的NTDS.dit
3.当拥有虚拟主机管理员权限时,虚拟DC可以离线复制相关数据
4.控制一个能登录到DC的账户(屁话)
AD中大部分组是不被期待拥有默认能登录DC的权限的
但如下组默认能登
Enterprise Admins (member of the domain Administrators group in every domain in the forest)
Domain Admins (member of the domain Administrators group)
Administrators
Backup Operators
Account Operators
Print Operators
成为DC管理员后的操作
首先需要是一个管理员才能运行mimikatz
成为DC管理员后,mimikatz一把梭dump全部凭证,dump LSASS内存
创建一个Install From Media(IFM)来获取NTDS.dit文件,即上述获取NTDS.dit文件的第二种方法。创建的IFM集就是NTDS.dit文件的复制,这个文件可能会在新的DC直接共享,或者在一个还未升级为域控的服务器上发现,在升级之前这个文件可能不会受到很好的保护
从NTDS.dit文件中dump AD域凭证,当攻击者获得了一份NTDS.dit文件和某些能解密数据库数据的注册表项时,AD数据库文件就被打穿了。当攻击者拥有注册表中的系统配置单元和NTDS.dit文件时,即可获取整个AD的所有凭证
内网信息搜集
堆一下用的时候慢慢翻
ipconfig /all 查询本机IP段,所在域等
net config Workstation 当前计算机名,全名,用户名,系统版本,工作站域,登陆域
net user 本机用户列表
net localhroup administrators 本机管理员[通常含有域用户]
net user /domain 查询域用户
net user 用户名 /domain 获取指定用户的账户信息
net group /domain 查询域里面的工作组
net group 组名 /domain 查询域中的某工作组
net group "domain admins" /domain 查询域管理员列表
net group "enterprise admins" /domain 获得企业管理员列表
net group 组名 /del /domain 删除域中的某组
net group 组名 组成员名 /del /domain 删除域中的某组的组成员
net localgroup administrators /domain 登录本机的域管理员
net group 组名 /add 增加域中的组
net localgroup administrators workgroup\user001 /add 域用户添加到本机
net group "domain controllers" /domain 查看域控制器(如果有多台)
net time /domain 判断主域,主域服务器都做时间服务器
net session 查看当前会话
net use \\ip\ipc$ pawword /user:username@domain 建立IPC会话[空连接-***]
net use z: \\192.168.200.21\文件夹名 建立映射到本机Z盘
net share 查看SMB指向的路径[即共享]
at \\192.168.200.2 0:00 c:\windows\muma.exe 在共享主机上执行
net view 查询同一域内机器列表
net view /domain 查询域列表
net view /domain:M0RK 查看test域中计算机列表
net view \\域控的机器名 查看域控共享情况
nltest /domain_trusts 获取域信任信息
net session 查看当前会话
net start 查看当前运行的服务
net time /domain 查询主域服务器的时间
echo %logonserver% 查看登录认证的机器(即域控机器)
net accounts 查看本地密码策略
net accounts /domain 查看域密码策略
query user 查看当前的登录信息
netsh firewall show config 查看防火墙策略
netsh firewall show state 查看防火墙策略
route print 路由表
tracert IP 路由跟踪
arp -a 列出本网段内所有活跃的IP地址
arp -s (ip + mac) 绑定mac和IP
arp -d (iP + mac) 解绑IP和Mac
tasklist /V 查看进程[显示对应用户]
tasklist /S ip /U domain\username /P /V 查看远程计算机进程列表
tasklist /S IP地址 /U 域名\用户名 /P /V 查看远程计算机进程
tasklist /svc 查看进程
taskkill /im 进程名称(cmd.exe) 结束进程
taskkill /pid[进程码] -t(结束该进程) -f(强制结束该进程以及所有子进程)
qprocess * 类似tasklist
qprocess /SERVER:IP 远程查看计算机进程列表
whoami /all 查询当前用户权限等
set 查看系统环境变量
systeminfo 查看系统信息
qwinsta 查看登录情况
fsutil fsinfo drives 查看所有盘符
wmic bios 查看bios信息
wmic qfe 查看补丁信息
wmic qfe get hotfixid 查看补丁-Patch号,很实用
wmic share get name,path 查看SMB指向路径
net view /domain
net config workstation
net group "Domain Admins" /domain
net time /domain
ipconfig /all
nslookup xxx
dsquery server
查看域控制器
net group "Domain controllers"
环境搞得差不多了,该手动实验了
上述大部分域有关的信息搜集指令执行之后都会
这项请求将在域z33.com的域控制器处理
发生系统错误5
拒绝访问
试了半天发现是需要以域账户登录才能成功执行,就登录本地机器的话就会拒绝访问
参考链接
本文学习原文
Attack Methods for Gaining Domain Admin Rights in Active Directory
域渗透之票据
浅析域渗透中的组策略利用
Windows系统中的文件路径格式
内网渗透技巧之横向控制
Windows域安全
下面两篇文章一起看MS16-068基本上就看懂了
Windows内网协议学习Kerberos篇之PAC
深入解读MS14-068漏洞
好姐姐的中文译本
翻译和复现