Capture the Flag – řešení flagu 9

Jako třešničku na dortu jsme si nechali řešení poslední flagu, který odolal statisícům pokusů o jeho rozluštění.

< flagy 7 – 8

Flag 9: „Zákaz vstupu se zvířaty“

Umístění flagu bylo jasné poměrně brzo. Při objevení souboru phpinfo.php jsme se dozvěděli i o existenci zvláštní složky secret-flag9-dir.

Před samotnou cestou k flagu jsme se vydali několika slepými uličkami.

WP-Scan ukázal, že je na webu plugin se zranitelností typu Local File Inclusion. Z jeho kódu však bylo patrné, že se nám příliš nehodí – soubory načítá pomocí require_once a PHP soubory vykoná a nezobrazí. Pro získání jiných citlivých informací by se však velmi hodil.

Při skenování portů se ukázalo, že je otevřený port 22 – SSH. Při pokusu, zda náhodou správce serveru nepoužil nějaké primitivní heslo, vyšlo najevo, že heslo lze velmi jednoduše odhadnout a administrátorský přístup byl náš. Alespoň zdánlivě. Brzy se ukázalo, že SSH není opravdové SSH, ale pouze jeho simulace. Tudy cesta také nevedla.

Dalším dobrým nápadem bylo využití nalezeného Admineru. Bylo možné se připojit k externímu databázovému serveru s oprávněním pro práci se soubory a díky tomu číst libovolné soubory z klienta:

LOAD DATA LOCAL INFILE "/home/flag5a6557/htdocs/www/flag.php" INTO TABLE test.a

Bohužel zatím neznáme jméno souboru, který se snažíme získat. Pokud tedy nechceme slepě zkoušet, není to pro nás vhodná cesta.

Pokusy o přihlášení do administrace přes login formulář byly také liché, ze zdrojového kódu stránky šlo zjistit, že formulář není pravý. A i kdyby pravý byl, tak WP samotný byl upraven tak, aby byl jen read-only a přihlášení by tak možné nebylo.

Přes administraci však jedna z cest vedla. Z předchozích flagů jsme totiž získali dostatek informací, abychom byli schopni vygenerovat přihlašovací cookies.

  • Hash hesla z databáze
  • Krypto klíče z wp-config.php
  • Session_token z uživatelských metadat v databázi

Za normálních okolností by potřebný session token byl k ničemu, protože se jedná o sha256 hash z více než 40 znakového náhodného řetězce, který v cookie musí být v originální podobě. U nás se však jednalo pouze o hash slova wordpress a tak ho bylo možné jednoduše zneužít.

Stačilo připravit další WP web, kterému se předhodily získané krypto klíče a založil uživatel se stejným hashem hesla (je jedno, že heslo neznáme) a nechat si vygenerovat přihlašovací cookies, které následně stačilo vložit do prohlížeče pod správným názvem obsahujícím md5 hash adresy webu:

wp_generate_auth_cookie(1,1560620800,'logged_in', 'wordpress')
wp_generate_auth_cookie(1,1560620800,'secure_auth', 'wordpress')

Díky tomu jsme se dostali do administrace, ta sice byla jen pro čtení, to však nezabránilo nahrání vlastního pluginu i když nešel aktivovat. Takto jsme na web propašovali cizí kód v podobě prohlížeče souborů.

Touto poměrně komplikovanou cestou jsme byli schopni získat přístup k poslednímu flagu.

Byla zde však i mnohem jednodušší cesta. Mohli jsme si všimnout, že je na webu nahrán Adminer ve starší verzi 4.2.3, která navíc podporuje mnoho dalších databázových systémů – včetně SQLite.

SQLite má nepříjemnou vlastnost, že při přístupu k neexistující databázi ji na disku vytvoří. Vytvořit lze pouze soubory s koncovkou .db (a několika dalšími). To nás ale příliš nezbrzdilo. Pomocí příkazu ATTACH DATABASE jsme jednoduše vytvořili novou prázdnou databázi s koncovkou .php. Pak už stačilo jen vytvořit novou tabulku a naplnit ji PHP kódem. I přes trochu binárních dat na začátku souboru se náš kód bez problémů pustil a mohli jsme tak jednoduše získat poslední flag! Stačilo už jen určit výsledek logické podmínky:

I přes to, že jsou existující soubory na serveru pouze pro čtení, šlo tímto způsobem modifikovat vzhled webu. Stačilo například vytvořit soubor home.php ve složce šablony a díky hierarchii šablony byl pak místo samotného webu zobrazen on.

Objevením posledního flagu naše CTF soutěž končí. Doufáme, že vás bavila, že  jste se třeba i něco zajímavého naučili a že se uvidíme na WordCampu.

 

Kupte si vstupenku a přijďte na WordCamp

WordCamp Praha 23 .2. 2019 is over. Check out the next edition!