Přinášíme ukázku řešení dalších 3 flagů z naší CTF soutěže.
Flag 4: „Chybovat je lidské“
Při bezpečnostních testech je běžné, že se snažíme aplikaci donutit udělat nějakou chybu, aby nám prozradila nějaké informace, nebo provedla něco nečekaného.
U webových aplikací je častým prohřeškem zobrazování chybových hlášek s informacemi, které by měl znát jen administrátor.
Nejjednodušší cestou jak toto ověřit je navštívení adresy /wp-includes/rss-functions.php, čímž vyvoláme chybu 500. Podobně funguje i volání přímo šablony (např. /wp-content/themes/twentynineteen/index.php), nebo různých souborů z administrace (/wp-admin/admin-header.php). Jako odměnu za vyvolání chyby 500 získáme první flag. Pro zobrazení vlastní chyby jsme si museli pohrát s PHP funkci register-shutdown-function.
Další běžnou chybou je 404 – nenalezeno. WP nám v tomto případě vrací poměrně použitelnou stránku, což je častým problémem u jednodušších systémů. Ta je typicky renderována ze souboru 404.php v šabloně. Při infekci webu se tento soubor často zneužívá jako odložený spouštěč infekce – spuštění škodlivého kódu se odloží do vyvolání chyby 404 návštěvníkem, nebo přímo útočníkem. Na našem webu je v něm však ukryt pouze další flag.
Pokud se pokusíme provést nějakou nepovolenou akci, tak nám WordPress zobrazí chybovou hlášku pomocí funkce wp_die() a pošle stavový kód 403. Tuto chybu mimo administraci můžeme získat například přímým přístupem k souboru wp-mail.php. Pro úpravu této chybové hlášky jsme použili wp_die_handler a nechali ji prozradit další flag.
Poučení: výpisy chyb na produkčním serveru nemají co dělat.
Flag 5: „Známe své lidi“
Chyba 500 z minulé sady flagů nám prozradila i umístění aplikace na serveru. Z toho bylo možné získat jméno uživatele, pod kterým na serveru aplikace běží. Není náhoda, že jeho jméno je prvním flagem tohoto klíče. Za normálních okolností by bylo možné tuto informaci získat i z informací v zapomenutém phpinfo.php z předchozích úkolech. Tam jsme však cestu naschvál zcenzurovali 🙂
Zajímavé informace o uživatelích můžeme získat i na jiných místech. Pokud nás zajímají přímo uživatelé WordPressu, můžeme je zkusit vyčítat pomocí parametru ?author=X. Nebo je můžeme získat moderněji – použitím REST API a endpointu /wp-json/wp/v2/users. Našem webu tak nalezneme velmi zajímavého uživatele s id = 5. Pokud tedy navštívíme adresu /?author=5, adresa se magicky změní a prozradí nám login našeho uživatele, což je zároveň další flag.
Dalším typem uživatelů jsou komentující návštěvníci. V základním nastavení sbírá WordPress jejich e-maily, ze kterých následně generuje adresu pro gravatary. To je poměrně nešťastné, protože služba gravatar používá k hashování e-mailu md5 a tak není příliš složité e-maily reverzovat zpět.
Stejně, jako na mnoha dalších webech, jsme nesmazali testovací příspěvek s id = 1 – stačí navštívit /?p=1. Zde číhá drobná zrada. Pokud ve WP vypneme komentáře, tak se změna aplikuje pouze na nově přidané příspěvky – ty staré se řídí původním nastavením a je potřeba u nich komentáře povypínat ručně a na to se často zapomíná. Tento první zapomenutý příspěvek je proto často terčem různých spambotů.
Podivný komentář jste tak mohli najít i u nás:
Jméno uživatele prozrazuje, že hodnota flagu se skrývá v jeho e-mailu. Stačilo tedy získat adresu obrázku jeho gravataru, vzít si z ní md5 hash a ten zkusit prolomit. Protože to jsou jen 4 čísla, nebylo to nic těžkého a flag byl náš!
Tyto informace o uživatelích běžně získáme i z REST API (můžete si to vyzkoušet na webu WP Exposé). My jsme však aplikovali filtr, který se snaží citlivá data z REST API odstraňovat. Pokud nechcete, aby unikaly informace o e-mailech, je lepší gravatary zakázat, nebo pro ně použít jiné řešení.
Flag 6: „Důvěrné informace“
V jednom z předchozích flagů jsme zjistili, že na webu je otevřený git repozitář. Zjistili jsme také, že se zde vyskytuje soubor flag.php, ve kterém jsou určitě zajímavé informace. Bohužel se při přímém přístupu vykonal a nic zajímavého neprozradil.
Není však nic lehčího, než z git repozitáře získat zdrojové kódy a podívat se přímo do nich. Pomohli jsme si automatickým nástrojem, který prochází známé soubory ze struktury repozitáře a snaží se z nich vyparsovat jednotlivé objekty.
Po rekonstrukci repozitáře a zdrojových kódů se již stačilo jen podívat do obsahu flag.php a půlka klíče byla naše.
Při podrobnějším zkoumání změn v repozitáři bylo dále možné získat informaci, že se upravoval soubor search.php v šabloně (git whatchanged -n 1). A navíc změna není už od pohledu úplně bezpečná – není zde ošetřený uživatelský vstup, což s sebou přináší možnost XSS.
Pokud jste zkusili tento kód zneužít a dokázat existenci XSS a zavolat si nějaký pěkný javascriptový alert(), web tento pokus detekoval a místo toho zobrazil hlášku s odměnou ve formě flagu :-).
WordPress se sám o sobě snaží uživatelské vstupy dobře ošetřovat, nevhodně použitý vlastní kód však může jeho principy narušit.
Poučení: nechávat přístupný git repozitář na webu rozhodně není dobrý nápad.
Získání těchto flagů již vyžadovalo trochu úsilí a zkoušení. A příště se to nezlepší.