Vai al contenuto

Cyberchallenge

Pubblicato:

Ricordo che ero al terzo anno di università, durante il periodo delle lezioni a distanza, quando ho sentito parlare per la prima volta di Cyberchallenge. Un paio di colleghi che conoscevo, Simone e Davide, avevano preso parte a questa attività, dedicandogli ogni venerdì per un buon numero di settimane.

La Cyberchallenge è una competizione organizzata dal Cybersecurity National Lab in collaborazione con il CINI. Si tratta di un’attività parecchio esclusiva, considerando che vi si può partecipare una sola volta per (si ha un altro tentativo se la prima volta si era ancora alle superiori). Per di più vi è un test d’ingresso non proprio banale e un limite di età piuttosto stringente a 24 anni.
Per questi motivi, quest’anno era la mia ultima chance per partecipare. Occasione che ho colto al volo.

Selezione

I posti per la sede di Catania erano solo 20, più 5 riserve.
A causa della mia maggiore esperienza rispetto agli altri candidati, molto più giovani di me, non ho avuto troppe difficoltà a superare la selezione.
La selezione si componeva di due fasi: quesiti di logica e programmazione.
I quesiti di logica, a dire il vero, erano abbastanza complessi. Nonostante non abbia fatto un gran punteggio, questo è stato sufficiente a passare alla fase successiva.
La fase di programmazione è stata particolarmente facile, poiché si trattava di una serie di task molto simili a quelle per la programmazione competitiva di base. Avevamo completa libertà di linguaggio. Quindi, sebbene ci fossero dei limiti di tempo per l’esecuzione del programma, ho optato per Python. La scelta si è rivelata vincente. Non sono arrivato a risolvere tutte le task più avanzate, ma ho prodotto un numero di soluzioni sufficienti a rientrare nella graduatoria.

Corso

Il corso è iniziato il 17 Febbraio.
Gli incontri erano ogni Venerdì, dalle 14:00 alle 18:00. In genere si componevano per due ore a spiegazioni teoriche, e per altre due ore da simulazioni pratiche su quanto visto in precedenza.
Ogni settimana venivano anche sbloccate delle challenge sull’argomento fornite dalla piattaforma stessa, al fine di poter fare pratica.

I tutor di quest’anno erano principalmente ex partecipanti.
Simone e Davide hanno fatto rispettivamente Web e Crittografia. Andrea si è dedicato a Software, aiutato dal talentuosissimo Bonfra. Infine Marcello ha riempito i buchi rimasti.

Siamo partiti in quasi 25, tutti con livelli di conoscenze e skill pregresse molto variabili. Qualcuno era ancora decisamente impreparato a questo tipo di sfida, ma sono stato piacevolmente sorpreso dalla capacità di alcuni colleghi, soprattutto di quelli ancora alle superiori. Questi potranno anche ripetere l’esperienza, portandosi dietro un bagaglio di conoscenze invidiabili.
Con il tempo i partecipanti si sono ridotti, fino ad arrivare ad una ventina di persone attive, sotto il limite teorico delle 20.

Quello che mi spiace maggiormente è non aver avuto il tempo di dedicarmi pienamente a questa attività. Fra tutorato, lezioni di Sistemi Cloud proprio il Venerdì pomeriggio, e impegni vari legati al futuro, la mia testa era sempre da un’altra parte.
Fossi stato più libero avrei sicuramente approfondito molto di più tutte le tematiche trattate. Magari mi sarei anche potuto integrare meglio con i colleghi del corso, che sono riuscito a conoscere per bene solo alla fine.

Programma del corso

Gli argomenti trattati sono stati parecchi, e quasi tutti trattati con un buon grado di approfondimento.

Finale locale

La finale locale si è tenuta il 31 Maggio.
Purtroppo in quella settimana avevo contratto il Covid. Fortunatamente ho avuto il permesso di svolgere la prova in remoto, da casa mia.

La prima challenge di ogni categoria era piuttosto banale, ma salendo di difficoltà, le cose si complicavano molto rapidamente.
Sono riuscito a fare solo la seconda di Crypto, anche se ero arrivato molto vicino a risolvere anche la seconda di Web.
Quello che mi ha dato il vantaggio definitivo, però, è stata una challenge su Docker. Avendo un po’ di esperienza in materia, sono riuscito a completarla solo grazie a qualche ricerca online.

La classifica definitiva ha visto me in testa, seguito da Mattia e Matteo.
La premiazione si è tenuta il 23 Giugno.

Da sinistra a destra: Andrea Maugeri (tutor), Simone Benedetto (tutor), Mattia Lembo (secondo classificato), Ernesto Casablanca (primo classificato), Matteo Capodicasa (terzo classificato), Marcello Maugeri (tutor), Giampaolo Bella (professore)
Da sinistra a destra: Andrea Maugeri (tutor), Simone Benedetto (tutor), Mattia Lembo (secondo classificato), Ernesto Casablanca (primo classificato), Matteo Capodicasa (terzo classificato), Marcello Maugeri (tutor), Giampaolo Bella (professore)

Finale nazionale

L’ultima tappa di questa esperienza è la gara nazionale.
Tutte le università partecipanti devono stilare un team di 6 membri per partecipare a questa competizione in presenza a Torino. Viaggio rimborsato, ovviamente.

Il team

Il team dell’Università di Catania è composto da:

NomeRuoloAnno
Ernesto CasablancaTuttofare, Crypto, InfrastrutturaMagistrale Informatica
Matteo CapodicasaCrypto, Web, InfrastrutturaTriennale Informatica
Mattia LemboSoftware, HardwareTriennale Informatica
Graziano CastiglioneWebTriennale Informatica
Samuele NicotraWebSuperiore
Andrea LeoneSoftware, WebSuperiore
Da sinistra a destra: Samuele Nicotra, Mattia Lembo, Graziano Castiglione, Andrea Maugeri (tutor), Matteo Capodicasa, Ernesto Casablanca, Andrea Leone
Da sinistra a destra: Samuele Nicotra, Mattia Lembo, Graziano Castiglione, Andrea Maugeri (tutor), Matteo Capodicasa, Ernesto Casablanca, Andrea Leone

La gara

La gara si è svolta dalle 16:00 alle 18:00 del 29 Giugno. Si trattava di una competizione di Attack & Defense, in cui ogni squadra doveva difendere la propria vulnbox, e attaccare quelle delle altre squadre.
Eravamo un totale di 42 squadre, provenienti da tutta italia.
Ci siamo tutti raccolti nel padiglione Piemonte, con parte delle squadre al piano terra e parte al primo piano, dove eravamo posizionati anche noi. Ci è stato fornito uno switch a cui connetterci con i nostri laptop tramite cavo ethernet.

La competizione è stata piuttosto intensa. La prima è ora passata a preparare il setup della nostra vulnbox, aggiungendo i vari tool.
Poi ci siamo messi ad analizzare le 4 challenge che componevano la competizione:

Ci siamo divisi i servizi in base alle nostre competenze. A me è toccato CheesyCheats.
Si trattava di un servizio che utilizzava un protocollo di google, gRPC. Per nostra fortuna, ci veniva fornito anche un semplice client in grado di comunicare con il server, entrambi scritti in Python.
La ricerca degli exploit è stata molto più lenta del necessario.

CheesyCheats 1

La prima vulnerabilità era nella fase di login. Questa prevedeva una sorta di Diffie-Hellman-Key-Exchange, in cui il generatore era ottenuto in funzione della password dell’utente.
Il server, però, non controllava che il valore di gag^a ottenuto dal client fosse diverso da uno dei valori critici, come 0, 1, o p1p-1.
Quindi è bastato forzare l’invio di un ga=1g^a = 1 per conoscere il valore della chiave condivisa K=1K = 1 e poter effettuare il login come un qualsiasi utente.

CheesyCheats 2

Il secondo exploit è arrivato ancora più tardi, all’incirca nell’ultima ora di competizione.
L’unica scusante è che il first blood su questa challenge è arrivato solo dopo circa 4 ore dall’inizio della gara.
Si doveva ottenere il codice di uno di questi cheat. Per farlo, era possibile far crashare il server e leggere il messaggio di errore, che conteneva la flag. Dato che veniva utlizzato un encoding latin-1, era possibile inserire un carattere non valido, come 0x80, e ottenere il messaggio di errore.

Resto della gara

Dopo essermi dedicato per 8 ore praticamente ininterrotte a questa challenge, ero troppo esausto per fare altro, anche se ho cercato di dare supporto tecnico laddove serviva. Purtroppo abbiamo avuto qualche solito problema con il Service Level Agreement, probabilmente a causa dei tool troppo pesanti caricati sulla nostra vulnbox.

Abbiamo passato la maggior parte della competizione da 14°, fino al momento di freeze della classifica.
Alla fine il risultato è stato un onorevolissimo 12° posto. Anche se, per qualche motivo, avrei scommesso su un 11° posto.
I team vincitori, in particolare la Sapienza di Roma, si sono sempre distinti per delle prestazioni decisamente superiori a quelle degli altri, quindi mi sento di dire che la vittoria sia più che meritata.

Considerazioni sulla gara

Sin dalle simulazioni è apparso evidente come uno dei punti più critici della nostra organizzazione siano sia il lato difensivo che l’abilità di scrivere exploit stabili.

Lato difensivo

La componente difensiva in un A/D consiste nel rendere inoffensivi sulla propria vulnbox gli exploit individuati e sfruttati per attaccare gli altri giocatori. Bisogna però assicurarsi che il servizio sia ancora operativo ed accessibile ai checker, che ne controlleranno la funzionalità, pena perdita di prezioso Service Level Agreement. Il patching può avvenire in molti modi.
Si può usare un Intrusion Prevention System come Suricata, per stroncare direttamente le connessioni malevole.
Oppure si può modificare direttamente il sorgente o l’eseguibile per poi rebuildare il container Docker con la nuova versione sicura.

Il problema è che, intimiditi dalla paura di realizzare una patch che rendesse il servizio non funzionante, spesso ci siamo limitati ad aggiungere delle regole Suricata in grado di bloccare le connessioni malevoli.
Sebbene sia un approccio più sicuro, non è sicuramente quello più completo. Del resto ci si limita ad eliminare un vettore di attacco, ma non la vulnerabilità in sè.
Essendo contro un gran numero di avversari, è facile che uno di questi utilizzi un metodo alternativo per exploitare la stessa vulnerabilità. D’altra parte, una patch software richiede una buona conoscenza del linguaggio di programmazione e dell’eventuale framework utilizzato. Era proprio su questo appunto che, ho avuto la sensazione, eravamo un po’ carenti.

L’infrastruttura, sebbene ottima da un punto di vista difensivo, ci ha causato diversi problemi a causa del carico eccessivo messo sulla vulnbox, con conseguente perdita di SLA.
In una prossima iterazione, sarà sicuramente necessario ottimizzare il posizionamento dei tool, cercando di spostare il carico computazionale sulle macchine dei partecipanti.

Scrittura di exploit

Un altro aspetto che mi sento di criticare è la capacità di scrittura degli script di exploit.
Si tratta di codice python che deve effettuare una serie di operazioni attraverso la rete che vanno ripetute per tutti i team.
Poiché il tempo è limitato, è necessario che lo script sia il più efficiente possibile. In caso contrario, c’è il rischio concreto di perdere potenziali flag in quanto scadute.
Mi è capitato spesso di vedere obbrobri di programmazione, pressapochismo e soprattutto mancanza di riguardo verso le risorse, con moltissimi try-except che dimenticavano di chiudere le connessioni, o che non gestivano correttamente le eccezioni. Non posso farne troppo una colpa ai ragazzi, ancora un po’ inesperti e sotto pressione, ma è sicuramente qualcosa che attenzionerei di più in futuro, magari con qualche esempio di script scritto bene.

Festino

Dopo la premiazione, tenutasi il giorno successivo, e che è durata la bellezza di 3 ore, ci siamo diretti al festino organizzato al campus. Non si trattava di niente di che: giusto qualcosa da mangiare e un po’ di aperitivi. Però mi è piaciuto parecchio.
Dopo essere arrivati alle 21:00, sono rimasto fino all’01:00, parlando, giocando, cantando, ballando ed, in generale, godendomi l’atmosfera.
Il tipo di community che si è creata, stando accanto a gente di cui condividi gli interessi, è qualcosa che non mi è capitato di apprezzare tanto spesso quanto ora, con il senno di poi, avrei voluto.
Ad esempio, ho avuto modo di parlare con uno degli organizzatori di una delle challenge, che mi ha dato qualche dritta su come hanno strutturato la cyberchallenge e sulla suddivisione dei tool nella macchine dei partecipanti.
Ovviamente ho continuato a sfidare e farmi a sfidare a ping pong, e ho concluso la serata da imbattuto.

Diario di Viaggio

Impressioni finali

Nonostante il periodo non ottimale per prendere impegni di un certo calibro, come questo, posso affermare senza ombra di dubbio che l’esperienza è stata decisamente positiva. Innanzitutto ho avuto modo di entrare in un mondo che disconoscevo, apprezzandone molte delle qualità che lo rendono estremamente appetibile e stimolante. Ho imparato tantissime cose e approfondito la conoscenza su concetti di cui avevo solo le basi.
Sebbene non penso sia un percorso che proseguirò, adesso ho comunque uno strumento in più per affrontare ogni sfida che mi si presenterà davanti, nonché un punto di vista nuovo.
Non posso non menzionare anche il lato umano. Purtroppo non ho avuto modo di legare particolarmente durante i Venerdì di lezione, e mi sono quindi sentito spesso un pesce fuor d’acqua.
Tuttavia, questi quattro giorni mi hanno permesso di fare la conoscenza vera di altre 5 (+ 1, il tutor, che già conoscevo) magnifiche persone. Ragazzi giovanissimi e con un enorme potenziale, con cui ho condiviso tanti sforzi, risate e emozioni.
Sono davvero felice di poter definire amici.