CTF: Un tip de concurs informatic despre care poate nu ai auzit

Dacă vreodată ai fost pasionat de conceptul de hacking, sau dacă te-ai întrebat la ce îți pot folosi anumite lucruri pe care le-ai învățat în facultate, atunci articolul acesta este potrivit pentru tine. 

CTF-urile, adică ”Capture The Flag”, reprezintă un tip de concurs care se bazează pe găsirea unui șir de caractere cu format specific, care este denumit și ”flag”. Există mai multe categorii generale în care se încadrează tipurile de puzzle-uri întâlnite în aceste competiții. În continuare, vom menționa câteva dintre ele și vom descrie exemple simple pentru fiecare, pentru a te ajuta să-ți formezi o idee generală despre direcția în care se îndreaptă problemele.

Înainte să începem, am vrea să știți că pe parcursul acestui articol am ascuns și noi câteva flag-uri. Acestea vor avea un format standard, ca să fie ușor să vă dați seama dacă ați obținut ce trebuie – el arată cam așa:
{ASII:<xyz>}, unde <xyz> reprezintă mai multe caractere alfanumerice și punctuație. 
Vedeți dacă reușiți să le găsiți pe toate!

Steganografie

Un concept des întâlnit în puzzle-urile de tip CTF este cel al steganografiei: practica ascunderii unui mesaj în interiorul altuia. În contextul electronic, steganografia implică ascunderea unor fișiere sau informații într-o imagine, fișier audio, video etc. Haideți să ne uităm la câteva exemple, ca să înțelegem mai bine acest concept.

Exif (Exchangeable image file format) este un format standard prin care, în interiorul fișierelor imagine – de obicei, JPG – sunt incluse metadate despre acea imagine. De obicei, aceste informații sunt adăugate automat de un aparat de fotografiat – aspecte ca data și ora, expunerea, rezoluția imaginii, chiar și coordonate geografice. Aceste informații pot fi vizualizate folosind diferite unelte, ușor de găsit – este bine să știți despre ele în caz că, de exemplu, trimiteți o fotografie online și nu vreți să vi se știe locația. 

Mai mult de atât, totuși, atât timp cât se respectă formatul necesar, aceste date Exif pot include, de fapt, orice. Vă puteți imagina cum s-ar putea ascunde un flag într-o imagine în acest mod. 

Totuși, nu e neapărat ca o imagine să fie menită să ascundă și informații ca acest lucru să fie posibil. Hai să ne uităm puțin la cum arată pe disc, de fapt, o imagine JPG. Pentru acest lucru, vom folosi un program numit hex editor, care poate vizualiza și edita un fișier ca șir de octeți.

Putem vedea în partea stângă octeții reprezentați ca valori hexazecimale, iar în dreapta programul încearcă să interpreteze octeții ca niște caractere ASCII, în caz că se ascunde cumva text citibil printre aceștia. Ce înseamnă aceste date? Căutăm pe Wikipedia și vedem cum este structurat un fișier JPG.

Mai sus sunt câteva perechi de octeți cu care se marchează începutul unor blocuri de informații din structura imaginii. O să vă lăsăm pe voi să intrați în detalii dacă doriți, dar putem chiar vedea câțiva dintre acești octeți la începutul afișării de mai sus. În special, vedem că folosind marcatorul COM, putem introduce un comentariu text, cu orice vrem noi, fără a schimba datele imaginii. Mai mult, după marcatorul EOI, orice octet va fi ignorat, deci putem adăuga un mesaj.

Ce este cel mai important aici este că aceste date adăugate nici măcar nu modifică modul în care este afișată imaginea. Nu ai cum să știi că sunt aici decât dacă le cauți!

Dacă aveți chef de ceva mai avansat, poate reușiți să faceți ceva cu acest zgomot deranjant. Atenție, se aude tare!

Criptografie și Hashing

Criptografia se referă la știința care se ocupă cu construirea și analiza protocoalelor de comunicare care sunt menite să prevină surse externe din a le înțelege. Ea se bazează pe construirea sau rezolvarea unor cifruri, care sunt aplicate, de obicei, asupra unui text.

Un exemplu de bază ar fi cifrul lui Cezar, numit după împăratul roman Iulius Cezar. Acest cifru înlocuiește literele unei propoziții cu literele care se află pe o poziție cu K mai mare sau mai mică – spre exemplu, pentru K=+3, litera A devine D, litera B devine E etc. În acest context, K-ul este considerat cheia pentru acest tip de cifru.

Alte cifruri cunoscute care sunt întâlnite deseori în concursuri de tip CTF sunt cifrul Vigenère, cifruri de substituție, RSA, ASCII și Base64. Vă invităm să vă uitați măcar sumar peste cum merg acestea și să încercați să descifrați singuri următorul flag:

e0FTSUk6WW91TGVhcm5RdWlja2x5fQo=

Deși la majoritatea puzzle-urilor este nevoie să folosești fie un site care îți decriptează textul, fie să îți scrii propriul cod care se ocupă cu asta, există și o categorie de puzzle-uri care necesită gândire logică și descifrare complet manuală. Acestea se bazează în general pe realizarea unor conexiuni între imagini, cifre și litere. Un exemplu relevant pentru acest tip de problemă este acesta:

Hashingul este o tehnică asemănătoare criptografiei, dar care produce un text ce nu ar trebui să poată fi decriptat. De obicei, aceste texte sunt folosite pentru verificarea faptului că un mesaj mai mare a fost transmis cu succes. Mai mult, unele tipuri de hashing pot produce și același text pentru date diferite de intrare. Folosind aceste informații, o problemă de CTF poate să ceară aflarea mesajului care a produs un anumit hash – dat fiind că flagurile au de multe ori un format standard, ca aici, acest lucru nu e neapărat imposibil.

Dacă ești student în anul I și ți-a atras atenția această parte a articolului, dorim să te informăm că ai posibilitatea de a alege drept opțional materia ”Introducere în criptografie” în anul următor, unde vei învăța mult mai multe lucruri despre acest domeniu. Dacă nu, sigur vei întâlni aceste concepte oricum în anul 3, la Securitatea Informației.

Slăbiciuni informatice

În informatică, securitatea este importantă – poate mai importantă decât realizăm. Poate nu este atunci o surpriză că de multe ori problemele CTF se intersectează cu câmpul “penetration testing”-ului, sau pentesting – o ramură a securității informatice ce implică atacarea sistemelor informatice pentru a găsi slăbiciuni și oportunități de a cauza daune. Ideea este, e mai bine să le găsească cineva care vrea binele și va transmite către dezvoltatori dacă găsește probleme, decât cineva care vrea să cauzeze probleme.

Atacarea slăbiciunilor poate fi aplicată și la CTF. Una dintre primele slăbiciuni de care o să auziți la FII va fi probabil SQL Injection, sau “injectarea” SQL. Pentru cine nu a ajuns încă acolo, SQL este un limbaj folosit în controlarea și interacțiunea cu bazele de date relaționale. Nu vom intra prea mult în detalii, dar de fiecare dată când o aplicație are nevoie să stocheze multe date, șansele sunt bune să folosească SQL pentru a face asta. 

Ideea din spatele unei SQL Injection este aceasta: aplicațiile sunt scrise într-un limbaj, dar comunică cu bazele de date prin intermediul altuia. Pentru a construi comenzile SQL, o opțiune este manipularea lor ca stringuri, dar acest lucru poate duce la probleme. De exemplu, să luăm următoarea comandă care ar căuta într-o bază de date informații despre o anumită materie la facultate:

Dacă aplicația construiește această comandă concatenând interogarea cu inputul utilizatorului, atunci cineva care o folosește ar putea să încerce căutarea materiei ‘ UNION SELECT * FROM profesori;–ca să afle totul despre toți profesorii de la facultate, deoarece comanda rezultată ar selecta și acest lucru:

Într-un puzzle ce utilizează SQL Injection, un flag ar putea necesita astfel accesarea informațiilor la care un utilizator nu ar trebui să aibă access prin intermediul unei aplicații cu securitate slabă.

Binary exploitation (“exploatarea binarelor”) este un alt tip de slăbiciune informatică care este des întâlnită în problemele de tip CTF. Aceasta se referă la găsirea unui vulnerabilități care te ajută să manipulezi un program compilat, executabil în interesul tău, prin accesarea memoriei interne a aplicației și eventual rescrierea acesteia.

Un exemplu mai specific de binary exploitation este buffer overflow. În general, programele își alocă o zonă de memorie unde rețin anumite valori pentru stocare. Dimensiunea acestui buffer este de obicei definită în program – de exemplu, char input[10]. Câteva funcții precum gets (în limbajul C) nu verifică dacă inputul are dimensiunea cerută și pot fi exploatate prin metoda aceasta. Dacă dimensiunea așteptată este depășită la introducerea inputului, programului îi pot fi transmise comenzi care îl forțează să execute anumite părți de cod, care nu sunt accesibile în mod normal.

După cum am învățat la ACSO, fiecare instrucțiune are o adresă specifică, care poate fi vizualizată cu ajutorul unui disassembler. Există multe scenarii în care buffer overflow poate fi folosit și modalitatea utilizării diferă de la program la program. Unul dintre scenarii este următorul –  dacă transmitem un input prea mare, urmat de o adresă din cod, acesta va sări la instrucțiunea aflată la adresa respectivă. 

Alt scenariu simplu este cel în care suprascriem o variabilă care este declarată după bufferul care va primi overflow, precum în exemplul de mai jos:

Dacă vi se pare interesant, ați putea încerca și voi să spargeți acest program.

În concluzie, mai sunt și alte tipuri de probleme de care ați putea să vă loviți în concursuri de tip CTF, dar acestea sunt cele mai comune. Dacă acest articol ți-a stârnit interesul pentru domeniul acesta, avem câteva pagini web utile care te vor ajuta să exersezi și să înveți mai multe – Capture The Flag With Google, picoCTF, OverTheWire, hacker101.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *