前言
今天的靶机依然是HTB(Hack The Box)的靶机--Support。通过这次的靶机训练,我们可以继续了解域渗透工具BloodHound的使用,也可以了解一点PE文件逆向相关的知识。
**开干:
**
1、环境准备
选择HTB的Support靶机,下载HTB的VPN。
将HTB的vpn文件put到kali中,使用命令 openvpn + ovpn文件路径 命令开启vpn连接。连接成功会在HTB网页右上角显示CONNECTIONS
2、扫描开放端口
使用nmap命令扫描开放端口:
nmap xxx.xxx.xxx.xxx -sV -sC -p- -T4 -Pn
列举几个比较重要的端口:88(kerberos),135、593(RPC),139、445(SMB),389、3268、3269(Ldap)
3、寻找漏洞尝试利用
开放了Ldap服务,先使用ldapsearch匿名搜索下目录对象。
ldapsearch -x -H ldap://10.129.xxx.xxx/ -D '' -w '' -b 'DC=htb,DC=local'
并没有权限,接着访问下SMB服务,列举下共享目录:
访问support-tools目录:
目录下有很多exe文件,mget 将所有文件下载到本地,其中有个文件名称为UserInfo.exe.zip,可能存在一些用户信息,将该文件解压:
其中有个文件名称为UserInfo.exe,将该文件导入IDA中,当然也可以选择其他PE文件逆向工具。
查看左边的方法名称,有个方法为getPassword,似乎与密码有关。
.field private static string enc_password 表明enc_password是一个私有静态字段,下面就去其他方法中查找enc_password是在哪赋值的。
这边可以看到enc_password的值为:0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E
加密的密钥为:armando
继续研究getPassword方法,尝试逆向解密方法。
把getPassword方法直接丢进GPT:
所以流程为:
1、将base64的密文解码为字节数组。
2、解码后的字节数组与密钥的字节数组中相应的字节进行异或操作,然后再与数字223(16进制的0xDF)进行异或操作。
3、将最后的字节数组转换为字符串。
编写代码,尝试解密密钥:
得到密钥为:nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz
接下来就是去找用户,在UserInfo.Services.LdapQuery相关方法中找到一些和用户相关的逻辑:
可以看到这边调用了UserInfo.Services.Protected::getPassword() 方法,获取一个密码字符串,并将其放到堆栈上,然后将字符串 "LDAP://support.htb" 加载到栈上,将字符串 "support\ldap" 加载到栈上。
总结来说,这个方法初始化LdapQuery实例,获取一个密码,以及LDAP路径和用户名创建一个DirectoryEntry实例。为后续LDAP操作做准备。所以我们通过这边可以找到用户名就是 “support” 。
至此我们就找到了一对用户名密码,"support" : "nvEfEK16^1aM4$e7AclUf8x$tRWxPWO1%lmz"
尝试winrm登录:
登录失败了,因为通过逆向这个exe文件,发现是在做Ldap相关的操作,所以接下来用这个用户对LDAP服务进行搜索操作,看看能不能发现其他有用的信息:
可以发现在用户support这边,有个info字段,内容为:Ironside47pleasure40Watchful,以这个为密码,用evil-winrm尝试登录:
成功登录后,读取用户Flag:
4、提权
靶机开放了88端口,是个域环境靶机,使用SharpHound进行域内信息收集再好不过了。
下载SharpHound进行域内信息收集
将生成的zip文件下载到装有BloodHound的机器(sharphound&bloodhound的安装启动,可以参考上一篇文章)。
点击Shortest Paths to Unconstrained Delegation Systems
将拿到的用户SUPPORT@SUPPORT.HTB 设置为起始节点,查看该节点的详细信息,包括与之相关的权限和控制关系。
这边我们就可以看到,SUPPORT@SUPPORT.HTB用户是SHARED SUPPORT ACCOUNTS@SUPPORT.HTB组的成员,同时,SHARED SUPPORT ACCOUNTS@SUPPORT.HTB组对DC.SUPPORT.HTB有GenericAll权限,DC.SUPPORT.HTB又是DOMAIN CONTROLLERS@SUPPORT.HTB组的成员。
右键GenericAll 查看使用建议:
其中说到,对计算机对象的完全控制可用于执行基于资源的约束委派攻击。接下来就按照Help中的步骤,一步步执行。
执行提示中的Powershell命令,需要下载两个脚本PowerView.ps1、Powermad.ps1,还需要下载一个针对Kerberos认证系统的工具Rubeus.exe。三个工具都可以去github中下载。
. ./Powermad.ps1
. ./PowerView.ps1
运行两个PowerShell脚本文件后,执行攻击命令。
流程是这样的:
1、首先,如果攻击者没有控制设置了 SPN 的账户,可以使用 Kevin Robertson 的 Powermad 项目添加一个新的攻击者控制的计算机账户
2、然后可以使用 PowerView 来检索新创建的计算机帐户的安全标识符 (SID)。
3、再以攻击者添加的计算机 SID 为委托人建立一个通用 ACE,并获取新 DACL/ACE
4、接下来,需要在接管的计算器账户的 msDS-AllowedToActOnBehalfOfOtherIdentity 字段中设置这个新创建的安全描述符
5、然后,使用 Rubeus 将明文密码散列为 RC4_HMAC 形式
6、最后,使用 Rubeus 的 *s4u* 模块,为要 "假装 "为 "管理员 "的服务名称(sname)获取服务票据。
将票据复制出来,去除其中所有的空格,保存本地。
在将Kerberos票据文件转换为ticket.ccache文件(Kerberos凭据缓存文件)
更新KRB5CCNAME 环境变量,将域名support.htb、dc.support.htb添加到/etc/hosts中,使用带有Kerberos身份验证的psexec获取SYSTEM shell。
这边获取失败了,可能之前票据处理空格时候有点问题,下面直接使用getST脚本自动生成票据。
命令如下:
impacket-getST -spn 'cifs/support.htb' -impersonate 'administrator' -dc-ip 'xxx.xxx.xxx.xxx' 'support.htb'/'attackersystem$':'xxxxxxxxx'
"-spn 'cifs/support.htb'" 指定了要请求服务票据的服务主体名称(Service Principal Name)。
"-impersonate 'administrator'" 表示要冒充(impersonate)管理员用户来请求票据。
"-dc-ip 'xxx.xxx.xxx.xxx'" 指定域控制器的 IP 地址。
"'support.htb'/'attackersystem$':'xxxxxxxxx'" 包含了目标域、攻击者系统的计算机名以及相应的密码。
更新KRB5CCNAME 环境变量,使用带有Kerberos身份验证的psexec获取SYSTEM shell。
成功拿到管理员的shell,读取root flag:
5、总结
获取这个靶机的用户权限,先是通过逆向分析smb服务中的共享文件,拿到ldap服务的一个账户、密码。然后通过ldapsearch发现了用户support的密码。
获取这个靶机的管理员权限,先是通过SharpHound进行域内信息收集,然后通过基于资源的约束委派攻击(RBCD)提权。