安全矩阵

 找回密码
 立即注册
搜索
查看: 487|回复: 0

【渗透实例】HTB:Support

[复制链接]

252

主题

252

帖子

1307

积分

金牌会员

Rank: 6Rank: 6

积分
1307
发表于 2022-12-28 16:02:58 | 显示全部楼层 |阅读模式
原文链接:【渗透实例】HTB:Support


信息收集
端口扫描
使用nmap进行端口探测,发现存在88、135等多个端口。
编辑
通过nmap发现,这是一个运行 Active Directory (AD) 域控制器 (DC) 的 Windows 服务器。
编辑
首先,我们现在知道 DC 域名“support.htb”。我们可以枚举 DNS 服务器来确认系统的名称。
编辑
我们的 dig 命令确认服务器的计算机名称是“dc”,域名是“support.htb”。
编辑
SMB 文件共享枚举
SMB 文件共享是重要的信息收集方式,然后我们去枚举SMB 文件共享。
编辑
发现了一个名为“support-tools”的共享。
​编辑

使用“dir”命令,我们可以获得存储在“support-tools”上的文件的目录列表。然后下载所有文件,去在本地进行分析。
在连接的 SMB 会话中,运行以下命令。
SMB:> mask ""SMB:> recurse ONSMB:> prompt OFFSMB:> mget *
编辑
“UserInfo.exe.zip”。检查文件的哈希值,发现这个“UserInfo.exe.zip”文件包含一个“UserInfo.exe”。
编辑
枚举策略当面对具有如此多端口的 Windows 服务器时,我通常会根据我的舒适程度优先处理它们。我将生成一个分层列表,其中包含一些关于我可能在每个列表中寻找的内容的粗略想法:
  •         必须看


    •                 SMB - 寻找任何开放的共享,看看我能在那里找到什么。
    •                 LDAP - 我可以在没有凭据的情况下获取任何信息吗?

           
  •         如果那些失败


    •                 Kerberos - 我可以暴力破解用户名吗?如果我找到任何东西,它们可以作为 REP 烤吗?
    •                 DNS - 我可以进行区域传输吗?暴力破解任何子域?
    •                 RPC - 是否可以匿名访问?

           
  •         学分注意事项


    •                 WinRM - 如果我能在 Remote Management Users 组中找到用户的凭据,我可以获得一个 shell

           
分析 UserInfo.exe我们可以使用“mono”或“wine64”等模拟器运行 Windows 可执行文件。
编辑
LDAP-TCP 389使用ldapsearch获取文件内容。
编辑
要继续搜索,它说我需要身份验证(“成功绑定”):
编辑
创建一个目录,然后解压压缩包。
编辑
然后给Userinfo.exe增加执行权限。
编辑
使用Userinfo.exe去枚举信息
编辑
编辑
Wireshark分析网络前面提到服务器,打开 Wireshark 并再次运行它。发现它正在寻找support.htb:
编辑
接着看请求包。
编辑
编辑
使用 LDAP 查询:
PS > .\UserInfo.exe -v find -first john
  • LDAP query to use: (givenName=john)[-] No users identified with that query.做一些基本的 LDAP 注入,让所有用户都有名字:
    PS > .\UserInfo.exe find -first '*'raven.cliftonanderson.damianmonroe.davidcromwell.gerardwest.lauralevine.leopoldolangley.lucydaughtler.mabelbardot.marystoll.rachellethomas.raphaelsmith.rosariowilson.shelbyhernandez.stanleyford.victoria使用有效名称,它会打印出可能需要的有关用户的信息:
    PS > .\UserInfo.exe user -username smith.rosarioFirst Name:           rosarioLast Name:            smithContact:              smith.rosario@support.htbLast Password Change: 5/28/2022 7:12:19 AM.net代码审计恢复 LDAP 密码静态的
    我可以进一步研究 LDAP 注入,但考虑到它正在对 Support 进行 LDAP 查询,并且我已经表明这些查询需要身份验证,我将查看二进制文件以找到凭据。
    将UserInfo.exe在 DNSpy 中打开。
    编辑

    LdapQuery似乎是一个很好的起点。有两个函数printUser和query,它们可能与这两个命令匹配。显示它正在加载密码,然后使用用户 SUPPORT\ldap 和该密码连接到 LDAP。
    我需要查看Protected.getPassword()函数(实际上是整个类):
    1. using System;
    2. using System.Text;

    3. namespace UserInfo.Services
    4. {
    5.         // Token: 0x02000006 RID: 6
    6.         internal class Protected
    7.         {
    8.                 // Token: 0x0600000F RID: 15 RVA: 0x00002118 File Offset: 0x00000318
    9.                 public static string getPassword()
    10.                 {
    11.                         byte[] array = Convert.FromBase64String(Protected.enc_password);
    12.                         byte[] array2 = array;
    13.                         for (int i = 0; i < array.Length; i++)
    14.                         {
    15.                                 array2[i] = (array[i] ^ Protected.key[i % Protected.key.Length] ^ 223);
    16.                         }
    17.                         return Encoding.Default.GetString(array2);
    18.                 }

    19.                 // Token: 0x04000005 RID: 5
    20.                 private static string enc_password = "0Nv32PTwgYjzg9/8j5TbmvPd3e7WhtWWyuPsyO76/Y+U193E";

    21.                 // Token: 0x04000006 RID: 6
    22.                 private static byte[] key = Encoding.ASCII.GetBytes("armando");
    23.         }
    24. }
    复制代码


    我们接着往下看,没有发现别的有用的代码。
    编辑
    使用python解密密码
    我将使用 Python 终端解密密码:
    编辑
    动态的
    在我的 Linux 系统上,我已经安装了 .NET 框架,它与mono二进制文件一起提供,也可以用来运行这个二进制文件。如果我打开 Wireshark 并运行二进制文件,我将在 LDAP 流中捕获身份验证:
    编辑
    使用Wireshark 在“bindRequest”的数据包中看到:
    编辑
    验证信用crackmapexec是快速展示这些信息的好方法:
    编辑
    Bloodhound收集域信息使用Bloodhound收集信息。
    编辑
    下面这些就是使用Bloodhound.py收集的一些信息。
    编辑
    都是json格式的文件。
    编辑
    LDAPldapsearch将显示 AD 中的所有项目。
    编辑
    发现有一个名为 support 的用户。
    编辑
    “Ironside47pleasure40Watchful”是它的密码。
    编辑
    使用ldapdomaindump发现也存在相同的信息。
    ​编辑

    查看 Bloodhound 数据,支持显示为 Remote Management Users 的成员:
    编辑
    获取user.txt使用WinRM连接evil-winrm -i 10.10.11.174 -u support -p Ironside47pleasure40Watchful
    使用之前获取到的用户名和密码进行连接,连接之后获取到第一个webshell。
    然后进入Desktop,获取到root.txt.
    编辑
    我们接着往下看。
    枚举再次查看 Bloodhound 数据,支持用户是 Shared Support Accounts 组的成员,该组GenericAll在计算机对象上具有 DC.SUPPORT.HTB:
    编辑
    基于资源的约束委派基础这类似于基本的约束委派,但不是授予对象权限以针对服务模拟任何用户。Resource-based Constrain Delegation在能够模拟任何用户的对象中设置。
    在这种情况下,受限对象将具有一个名为msDS-AllowedToActOnBehalfOfOtherIdentity的属性,其中包含可以模拟任何其他用户的用户名。
    此约束委派与其他委派的另一个重要区别是,任何对计算机帐户(GenericAll/GenericWrite/WriteDacl/WriteProperty/etc )具有写权限的用户都可以设置msDS-AllowedToActOnBehalfOfOtherIdentity(在其他形式的委派中,您需要域管理员特权)。
    攻击结构如果您对计算机帐户具有等效的写入权限,则可以获得该计算机的特权访问权限
    假设攻击者已经在受害计算机上写入了等效的权限
    •         1 .攻击者破坏具有SPN创建一个(“服务 A”)的帐户。请注意,没有任何其他特殊权限的任何管理员用户最多可以创建10 个计算机对象 ( MachineAccountQuota )并为它们设置一个SPN 。因此,攻击者只需创建一个 Computer 对象并设置一个 SPN。
    •         2 .攻击者滥用其对受害计算机 (ServiceB) 的 WRITE 特权来配置基于资源的约束委派,以允许 ServiceA 冒充该受害计算机 (ServiceB) 的任何用户。
    •         3 .攻击者使用 Rubeus 为具有服务 B特权访问权限的用户执行从服务 A 到服务 B的完整 S4U 攻击(S4U2Self 和 S4U2Proxy)


      •                 1 .S4U2Self(来自 SPN 受损/创建的帐户):向我请求管理员的 TGS (不可转发)。
      •                 2 .S4U2Proxy:使用之前步骤中不可转发的TGS管理员请求TGS受害者主机
      •                 3 .即使您使用的是不可转发的 TGS,因为您正在利用基于资源的约束委派,它也会起作用。

             
    •         4 .攻击者可以传递票据冒充用户来访问受害者 ServiceB

    要检查您可以使用的域的MachineAccountQuota :
    获取域 TGT我要滥用基于资源的约束委派。首先,我将在我控制的域中添加一台假计算机。然后我可以作为 DC 为假计算机请求 Kerberos 票证,从而能够模拟其他帐户,如管理员。为此,我需要一个可以将机器添加到域中的经过身份验证的用户(默认情况下,任何用户最多可以添加 10 个)。这是在ms-ds-machineaccountquota属性中配置的,它需要大于 0。最后,我需要对加入域的计算机(GenericALL在 DC 上得到我)的写入权限。
    我需要三个脚本来完成这次攻击:
    •         PowerView.ps1
    •         PowerMad.ps1
    •         Rubeus.exe (来自SharpCollection的预编译 exe )

    上传工具上传这些工具到目标机器中。
    upload /home/kali/PowerSploit/Recon/PowerView.ps1
    编辑
    将这些工具都上传好之后。
    编辑
    Winserver2012(DC)验证环境我需要知道 DC 上的管理员,Bloodhound 告诉我是 administrator@support.htb
    编辑
    验证用户是否可以将机器添加到域中:
    编辑
    发现其设置为默认值 10,确保环境中有 2012+ DC:
    编辑
    编辑
    提权攻击我们首先需要连接到“dc.support.htb”服务器;使用相同的 Evil-WinRM 会话连接。连接后,将我们需要的两个工具上传到服务器上,Powermad和Rubeus。上传后,我们将执行以下操作。
    服务器端
    •         将新的假计算机对象添加到 AD。
    •         将新的假计算机对象设置为具有约束委派权限。
    •         为新的假计算机生成密码哈希。

    创建一个计算机使用 PowermadNew-MachineAccount来创建一台假计算机:
    New-MachineAccount -MachineAccount (Get-Variable -Name "FakePC").Value -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose
    编辑
    1.使用内置 AD 模块,给新的假计算机对象 Constrained Delegation 权限
    2.使用内置 AD 模块,检查最后一个命令是否有效。
    Set-ADComputer (Get-Variable -Name "targetComputer").Value -PrincipalsAllowedToDelegateToAccount ((Get-Variable -Name "FakePC").Value + '$')Get-ADComputer (Get-Variable -Name "targetComputer").Value -Properties PrincipalsAllowedToDelegateToAccount
    编辑

    ./r.exe hash /password:123456 /user:FAKE01$ /domain:support.htb
    编辑
    解压我们要用到的工具。
    编辑
    攻击系统端我们已经利用了这个安全漏洞,并赋予计算机对象“FAKE01”冒充另一台计算机。因此,我们向“dc.support.htb”上的资源请求一个新的 Kerberos Ticket-Granting-Ticket(TGT)。
    编辑
    获取管理员权限使用impacket工具获取管理员权限,我们成功获取到管理员权限。
    编辑
    获取root.txt然后进入Desktop,获取到了root.txt
    编辑
    总结:在整个过程中,用到了SMB文件共享和枚举、wireshark分析数据包、.net代码审计及ldAP密码恢复。基于资源的约束委派攻击和一些工具的使用,感兴趣的小伙伴可以尝试一下。


  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|安全矩阵

    GMT+8, 2024-4-21 00:03 , Processed in 0.018620 second(s), 18 queries .

    Powered by Discuz! X4.0

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表