0%

THM学习日寄13-域学习Enumerating Active Directory

经过上一个房间之后,我们已经得到了多组的 AD 凭据且可以使用他们进行身份验证

由此我们可以枚举需要身份验证才能访问的 AD 设置和结构的详细信息

这通常会导致横向移动或提权。即大多数情况下,枚举后利用,利用后再枚举

在这里会涉及到 AD 的一些枚举办法:

  • Microsoft 管理控制台的 AD 管理单元。
  • 命令提示符的网络命令
  • PowerShellAD-RSAT cmdlet
  • Bloodhound

  • Credential Injection 凭据注入

    对于拿到 AD 但无法登陆的情况,在 Windows 上可以使用 Runas 来将凭据注入至内存中:

    1
    runas.exe /netonly /user:<domain>\<username> cmd.exe
    • /netonly:因为暂时没有加入域,所以希望加载网络身份验证的凭据,但不针对域控制器进行身份验证。所以任何网络连接都将使用此处指定的账户进行
    • /user:这里需要提供域和用户名的详细信息,而且需要使用完全限定域名 FQDN 而非域的 NetBIOS 名称
    • cmd.exe 注入凭据后要执行的程序,使用 cmd 是最保险的,因为其可以带着凭据启动任何内容

      输入命令后需要提供密码,值得注意的是在 /netonly 参数影响下,域控制器不会直接验证凭据,即他会接受任何密码,所以仍需确认是否正确加载凭据

      最可靠的方法是列出 SYSVOL ,对于任何 AD 凭据,无论权限有多低都能读取 SYSVOL 目录的内容

      SYSVOL 是所有域控制器上都存在的一个共享文件夹,存储组策略对象 GPO 的信息。是 AD 的重要组件,因为其将这些 GPO 传递到域中所有计算机,而加入域的计算机可以读取并应用适当的 GPO ,从而进行域范围的配置更改

      而在列出 SYSVOl 前,需要配置 DNS ,在 Powershell 窗口执行:

      1
      2
      3
      $dnsip = "<DC IP>"
      $index = Get-NetAdapter -Name 'Ethernet' | Select-Object -ExpandProperty 'ifIndex'
      Set-DnsClientServerAddress -InterfaceIndex $index -ServerAddresses $dnsip

      可以通过 nslookup za.tryhackme.com 来验证 DNS 是否正常工作

    • iphostnames

      1
      2
      dir \\za.tryhackme.com\SYSVOL
      dir \\<DC IP>\SYSVOL

      这两条命令的区别?

      当提供主机名时,网络身份验证将首先尝试执行 Kerberos 身份验证。由于该身份验证使用嵌在凭据中的主机名,所以如果提供 IP ,则可以强制身份验证类型为 NTLM

      在某些情况下,组织会监控 OverpassPass-the-Hash 攻击,此时强制进行 NTLM 身份验证可以避免被检测到

  • Enumeration through Microsoft Management Console MMC枚举

    这是唯一一个需要使用 GUI 的方法,即 rdp 远程连接后使用 Microsoft 管理控制台 MMC 和远程服务器管理工具 RSAT

    访问 http://distributor.za.tryhackme.com/creds 来获得第一个 ad 凭据

    sally.cole:Changeme123

    这个 sshrdp 都可以登

    这里用 remmina 登录到 THMJMP1 上:

    由于远程连接的问题,windows 靶机不能识别 Win+R 呼出运行窗口,所以在开始菜单搜 run ,然后再启动 mmc

    Files-Add or Remove Snap-ins 中,加入所有三个 AD 管理单元

    然后右键这三个, change forestza.tryhackme.comUser and Computers 那个要 change domain

    然后左侧栏右键 User and Computersview-advanced features

    现在可以在这里枚举内容了:

    AD 的结构中,我们将重点关注 AD 用户和计算机,查看初始组织单位 OU

    people 文件夹中,看到用户按照部门划分

    也可以看到用户属于哪个组

    Servers 中可以找到加入域的计算机的列表

  • Enumeration through Command Prompt 命令行看 AD 信息

    cmd 的内置命令 net 用于枚举本地系统和 AD 的信息

    值得注意的是,该命令必须从加入域的计算机执行,且不一定会显示所有信息

    • net user /domain

      该命令将返回所有 AD 用户,其有助于确认域的大小来进行下一步攻击

      也可以进阶的来枚举单个用户的详细信息:

      net user [用户名] /domain

    • net group /domain

      枚举域的组

      同样的,指定组以获得更多信息:

      net group "[groupname]" /domain

    • net accounts /domain

      这些关于密码设置的信息或许会在爆破中使用

      看这里以获得更多关于net的命令

  • Enumeration through PowerShell powershell偷看 AD

    • Get-ADUser -Identity [username] -Server za.tryhackme.com -Properties *

      枚举用户

    • Get-ADUser -Filter 'Name -like "*stevens"' -Server za.tryhackme.com | Format-Table Name,SamAccountName -A

      也可以对用户名模糊搜索

      更进一步,可以用 -Filter 参数进行过更多控制,Format-Table 来整齐显示

    • Get-ADGroupMember -Identity Administrators -Server za.tryhackme.com

      枚举组成员身份,这里查找身份为 admin 的组员:

    • Get-ADObject

      执行更通用的搜索,以查找特定日期后更改的所有 AD 对象为例:

      1
      2
      $ChangeDate = New-Object DateTime(2022, 02, 28, 12, 00, 00)
      Get-ADObject -Filter 'whenChanged -gt $ChangeDate' -includeDeletedObjects -Server za.tryhackme.com

      又例如,在爆破密码的时候想避开账户锁定,那么枚举 badPwdCount 次数大于 $0$ 的账户

      Get-ADObject -Filter 'badPwdCount -gt 0' -Server za.tryhackme.com

    • Get-ADDomain -Server za.tryhackme.com

      检索关于特定域的附加信息

    • Set-ADAccountPassword -Identity gordon.stevens -Server za.tryhackme.com -OldPassword (ConvertTo-SecureString -AsPlaintext "old" -force) -NewPassword (ConvertTo-SecureString -AsPlainText "new" -Force)

      强制更改 AD 用户的密码

  • Enumeration through Bloodhound bloodhound 枚举信息

    bloodhound 是迄今为止最强大的 AD 枚举工具

    其允许攻击者通过互联节点以图形来可视化 AD 环境,其优点在于可以进行两阶段攻击:

    第一阶段下,红队借助钓鱼的手段等进到 AD 里面进行信息枚举。这一阶段的 payload 经常比较嘈杂(?),而且容易被检测到。

    第二阶段前,bloodhound可以离线使用这些枚举到的数据,得到图形化的攻击路径,显示所需的步骤。所以能大大减少第二阶段的攻击时间,来避免被蓝队检测到

    • shapehound

      其是 bloodhound 的枚举工具,用于枚举 AD 信息并在 bloodhound 中直观显示,即bloodhound 是显示 AD 攻击图的 GUI

      THMJMP1 中, sharphoundC:\Tools 下:

      Sharphound.exe --CollectionMethods <Methods> --Domain za.tryhackme.com --ExcludeDCs

      其中 ExcludeDCs 参数用于避免接触域控制器,来降低告警的可能性

      运行完毕后在 sharphound 文件夹中会有一个 zip

      如上所述,Bloodhound 还需要安装 Neo4j 来作为图形系统

      但我这里用的是 AttackBox 啊嗯

      neo4j console start 启动 neo4j ,然后再启动 bloodhound

      现在还需要把获得的枚举数据传给 bloodhound :先下到本机 scp <AD Username>@THMJMP1.za.tryhackme.com:C:/.../<Sharphound ZIP> .

      然后直接拖进去等加载:

      导入之后看左侧:

      Node info-输入想查询的 AD 用户-点击该用户的 GUI 节点

      比如想看账户关联的组成员身份,可以去 First degree group membership

      可以看到是两个组的成员

      再去看 analysis 模块:

      使用 Find all Domain Admins 模块:

      可以看到一个用户名为 T0_TINUS.GREENAD 用户,其属于组 Tier 0 ADMINS ,而该组又属于 DOMAIN ADMINS 组,所以 Tier 0 ADMINS 组的所有用户都是域管理员 DA

      对于另一个 AD 用户 ADMINISTRATOR ,其也是 DA 组的一部分,而考虑到其是内置用户,所以拿权限还是侧重于 T0_TINUS.GREEN

      每个 AD 对象都是 bloodhound 中的一个节点,那么以当前拿到的 AD 用户为起点,域管理员组 Tier 1 ADMINS 为终点搜索路线:

      就可以得到一条攻击路径