Capture the flag!

ctf-results.pngErano anni che mi veniva proposto di partecipare a “Capture the flag“, il noto contest internazionale di sicurezza informatica. Più per poca fiducia nelle mie competenze tecniche in fatto di sicurezza informatica applicata che per mancanza di tempo, avevo sempre nicchiato ed evitato. Quest’anno invece, ho ceduto all’insistere di Danilo e Stefano, e alle 19 mi sono presentato al DEI, armato di portatile, pronto a tirare le due di notte insieme agli altri membri del team “The Tower of Hanoi” il cui passato glorioso non poteva che mettere soggezione ai diversi nuovi arrivati.

Dopo qualche minuto di disorientamento (la competizione era già iniziata quando sono arrivato, trattenuto da impegni di lavoro, per cui tutti erano troppo concentrati sui propri compiti per spiegare l sottoscritto i rudimenti necessari anche solo per accedere al sistema di test), ho attaccato la sezione dei quiz, insieme alla persona che mi stava vicino. Entrare nell’ottica del gioco non è stato semplice, ma il mio principale contributo, alla fine della serata, è stato la soluzione del seguente contest:

Dato un “key_validator”, era necessario trovare la “chiave” per ottenere il testo decifrato. Dopo un po’ di analisi, abbiamo appurato che si trattava di php offuscato, senza tag di apertura e chiusura, con una serie di complicazioni atte ad evitare che potesse essere lanciato ‘as is’. Il lavoro di “de-offuscamento” ha preso qualche tempo, e alla fine il codice derivante altro non faceva che uno xor tra un testo ed una chiave (encodata base64), generando una parte di codice php, che veniva poi eseguito passando un parametro via $_GET.

<?php

$key = "Hr5yvogypL";
$code  = "LgdbGgIGCBdQLyAXVhIpCxUULyctCx1dBg";
$code .= "4eFR8tLFtOWVYGAVlYaBc1cC0tTQwcCW4V";
$code .= "TwhMQVZeSUF+YQkVWVZPAhoYI2hSFzBWBR";
$code .= "IKBGwgE1FZF08LEAQ4JBcVHRMFBlkGOWpJ";
$code .= "FVkLT0ccHD8tUhVZDU9HWVApKxpaWyEdCB";
$code .= "cXbBgTRxgbChMcAm5zUhUEVhIBDB4vPBtaF";
$code .= "1YKHxwTOTwXHV0GDh4VHy0sW05ZVk9HGhgp";
$code .= "KxlqHQQCOBIVNWBQF1BNTxoLFTg9AFtZVAo";
$code .= "fHBM5PBcXQg==";

$code = base64_decode($code);

for( $j = 0 ; $j < 214 ; $j++ ) {
    $code[ $j ] = $code[ $j ] ^ $key[ $j % 10 ];
}

$result = eval( $code );
$result( $code );

?>

La soluzione paradossalmente è stata chiara nel momento in cui abbiamo inserito una print_r in una serie di punti del codice, tirando fuori il codice contenuto in quella che avevevamo chiamato $code.

Alla fine della gara (le 2:00 in Italia), ci siamo classificati settimi su trentasei squadre partecipanti, con un punteggio tutto sommato discreto. I miei personali complimenti vanno naturalmente ai vincitori (di gran lunga tra l’altro!), i “cioccolatai”, dell’Università degli Studi di Milano. Il CTF, anche quest’anno, è in Italia.

Pubblicità

Rispondi

Effettua il login con uno di questi metodi per inviare il tuo commento:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.