2014-02-02:

Rok CTFów z Dragon Sector

ctf:hacking:security
Pierwszego lutego ubiegłego roku założyliśmy z Mateuszem Jurczykiem i Adamem Iwaniukiem team CTFowy "Dragon Sector". Wczoraj minął rok naszej regularnej gry i jest to dobry powód by coś o tym napisać.

CTF?

(jeśli wiesz, czym jest CTF, możesz spokojnie pominąć ten punkt)
CTF (ang. Capture The Flag) to drużynowy turniej, podczas którego drużyny starają się rozwiązać jak najwięcej zadań z kategorii powiązanych z security/hackingiem, takich jak: web (bezpieczeństwo aplikacji webowych), pwn (exploitacja low-level / bezpieczeństwo aplikacji natywnych), RE (crackme / ogólno pojęty reverse engineering), crypto (kryptoanaliza), forensics (informatyka śledcza), stegano (steganografia), ppc/programming (programowanie/algorytmika), itp.
CTFy odbywają się średnio co 2 tygodnie (jest ich około 30 w roku), trwają typowo od 12 do 48 godzin i bierze w nich udział od 100 do 2000 drużyn (wliczając w to drużyny jednoosobowe) z całego świata.

O ile same turnieje są ze sobą niepowiązane, to ich wyniki są agregowane w serwisie CTFTime.org, który od kilku lat prowadzi również ranking ogólny (aka klasyfikację generalną).

Patrz także: CTF? WTF? oraz wpis na wiki.

Początki Dragon Sector

Pierwszym turniejem w którym wzięliśmy udział, jako trzy osobowy zespół, był indyjski HackIM 2013 - był to 48-godzinny CTF typu jeopardy z 34 zadaniami z kategorii web/RE/crypto/trivia/logs/forensics/ppc w którym wzięło udział 321 drużyn (licząc tylko drużyny, które rozwiązały przynajmniej jedno zadanie). Ostatecznie rozwiązaliśmy 31 z 34 zadań i zakończyliśmy turniej na trzecim miejscu.



W ciągu kolejnych kilku miesięcy nasz team (do którego dołączyło jeszcze kilka osób) trafił na trzecie miejsce podium jeszcze dwa razy:

Pierwsze zwycięstwo

7 lipca wygraliśmy swój pierwszy CTF - 48-godzinny SIGINT organizowany przez CCCAC.



Zdobycie pierwszego miejsca zmotywowało nas (w końcu) do publikacji rozwiązań zadań z CTFów (http://blog.dragonsector.pl/). Z samego SIGINT powstały 4 write-upy:Dodatkowo na swój kanał na YouTube wrzuciłem dwa inne rozwiązania zadań z SIGINT w formie video:Dodam, że w tamtym momencie nasz team liczył 9 osób - dołączyli do nas: fel1x, Mawekl, mak, vnd, valis oraz Redford - a kilka kolejnych osób grywało czasami z nami gościnnie.

Wpadając w dygresję, IMHO optymalną wielkością teamu jest około 15 osób (przy czym zazwyczaj tylko połowa z nich bierze udział w danym CTFie; w końcu wyrwać sobie 24 — 48h z życia nie jest łatwo). Jeśli chodzi o zasady samych CTFów, to rzadko kiedy są limity na wielkość drużyny (w zasadzie zdarza się to tylko na finałach offline) - w rozgrywkach tego typu prowadzonych przez internet i tak trudno byłoby wyegzekwować taką zasadę. Zamiast tego stosuje się inne podejście: na początku turnieju udostępniane jest tylko kilka zadań i co kilka godzin odblokowywane są kolejne - dzięki temu duże drużyny nie mają specjalnej przewagi względem mniejszych, ponieważ i tak nie mogą zrównoleglić rozwiązywania zadań ponad pewną granicę.

Wracając do tematu... w 9 osób graliśmy prawie do końca roku (w październiku dołączył do nas jeszcze KeiDii) i na podium wracaliśmy jeszcze 6 razy, ale niestety nie udało nam się powtórzyć wyczynu z SIGINT. Niemniej jednak większość sezonu byliśmy w okolicach trzeciego miejsca w rankingu ogólnym.

Attack-Defense

Pod koniec roku mieliśmy pierwsze podejście do CTFów typu Attack-Defense. W przeciwieństwie do typu Jeopardy (w które do tej pory graliśmy), w A-D punkty zdobywa się nie poprzez rozwiązywanie zadań, a poprzez ochronę własnej, przygotowanej przez organizatorów, maszyny wirtualnej z zestawem serwisów oraz atakowanie maszyn (serwisów) innych drużyn. CTFy tego typu trwają zazwyczaj dużo krócej (8-12h) i są dużo bardziej dynamiczne - trzeba jednocześnie szukać bugów w serwisach, patchować je, monitorować ruch sieciowy, pisać skrypty do masowego atakowania i exploity na znalezione bugi, etc.

Pierwszy A-D ukończyliśmy na 29 miejscu, ale kolejny już na 15.



Online A-D odbywają się jednak rzadko (w 2013 były bodajże 3 ogólnodostępne + 1 tylko dla studentów), niemniej jednak jest to ważna kategoria w przypadku finałów dwuetapowych CTFów - bardzo często kwalifikacje są w stylu Jeopardy a finały właśnie A-D; przykładem może być choćby znany DEF CON CTF.

Finał sezonu 2013

Ostatni CTF w sezonie/roku 2013 odbył się 27-29 grudnia podczas odbywającej się w Hamburgu konferencji 30th Chaos Communication Congress (zazwyczaj jej nazwa jest skracana do 30C3). Przed samym CTFem znajdowaliśmy się na czwartym miejscu rankingu CTFTime.org i właśnie od wyników 30C3 CTF zależało, czy skończymy na podium, czy poza nim.



Walka o trzecie miejsce miała się odbyć pomiędzy nami, a holenderskim zespołem Eindbazen [profil CTFTime.org]; inne drużyny były albo daleko przed nami (PPP, MSLC), albo daleko za nami rankingu. Jeśli chodzi o samo Eindbazen, to w przeciwieństwie do nas, jest to doświadczony team z kilkuletnim stażem - w sezonie 2012 zajęli trzecie miejsce w rankingu, a w 2011 szóste.

Aby wskoczyć na podium musieliśmy w 30C3 CTF być przed Eindbazen i zdobyć pierwsze lub drugie miejsce (w innym wypadku dostalibyśmy za mało punktów do ogólnego rankingu).

Krótko mówiąc, finał był pełen emocji.

Ciekawie zrobiło się w ostatni dzień turnieju (niedzielę) o ósmej rano, kiedy to inna drużyna - European Nopsled Team - zakończyła udział rozwiązując wszystkie zadania i zajmując pierwsze miejsce. Drugie miejsce okupowaliśmy my, ale brakowało nam trzech zadań - DOGE2 (pwn za 400 pkt; zadania zazwyczaj są od 100 pkt - łatwe, do 500 pkt - trudne), HolyChallenge (pwn za 500 pkt), oraz cableguy (za 100 pkt z kategorii "różności").

O 10:47 uporaliśmy się zarówno z DOGE2 jak i z HolyChallenge i zostało nam nieszczęsne cableguy - zadanie z pogranicza elektroniki, teorii sygnałów i programowania (na marginesie: opis jego rozwiązania można znaleźć np. w nowym numerze Programisty). Eindbazen natomiast zostały jeszcze cztery zadania do rozwiązania, więc byliśmy w miarę spokojni.

Trzy godziny później, o 14:00, nadal nie mieliśmy rozwiązania do cableguy, natomiast Holendrzy nadrobili stratę i zostało im jedno zadanie - HolyChallenge; zrobiło się więc trochę nieciekawie.

W końcu 10 minut później Redford wpadł na poprawne kodowanie sygnału i o 14:48:57 mieliśmy rozwiązanie, i tym samym sami zakończyliśmy turniej, na drugim miejscu - a więc top3 sezonu należało do nas!

Niecałe 6 minut później, o 14:54:28, Eindbazen rozwiązało HolyChallenge.

Ostatecznie, po pewnej dyskusji na temat zasad CTFTime.org z adminem serwisu oraz Eindbazen, uznaliśmy, że trzecie miejsce w sezonie należy się obu naszym drużynom (m.in. z uwagi na minimalną różnicę w punktach).



Początek 2014

W sezonie 2014 odbyły się już 3 CTFy, i so far so good - jeden z CTFów wygraliśmy, a w dwóch pozostałych zajęliśmy drugie i trzecie miejsce (co ciekawe, dwa z tych CTFów odbywały się na raz - indyjski HackIM 2014 oraz rosyjski PHD CTF Quals 2014).



W rankingu ogólnym obecnie jesteśmy na drugim miejscu z minimalną różnicą punktów względem pierwszego miejsca (250 vs 244 pkt); ale oczywiście do końca sezonu jeszcze daleko.

Do DS dołączyły również trzy kolejne osoby (q3k, tkd oraz jagger), tak więc powoli zbliżamy się do optymalnej wielkości teamu. Pozwala to optymistycznie patrzeć w przyszłość ;>

Strefa CTF w Programiście

Jeśli chodzi o write-upy, to kilka miesięcy temu zaproponowaliśmy redakcji magazynu Programista utworzenie "Strefy CTF" - działu, w którym co miesiąc pojawiałby się opis rozwiązania zadania z minionego turnieju. Redakcja poprosiła o opinię czytelników (odzew był pozytywny) i, rozpoczynając od numeru 11/2013, można w Programiście można znaleźć artykuły o wspólnym tytule "Zdobyć flagę...".



Póki co rozwiązania podsyłamy jedynie my, ale założeniem Strefy jest jej otwartość - tj. jeśli Wasz team chce opublikować rozwiązanie, to jest to bardzo mile widziane :)

CTFy z mojego punktu widzenia

Ostatnim tematem, który chciałem dzisiaj poruszyć, jest udział w CTFach z mojego punktu widzenia, a konkretniej, jakie widzę tego wady i zalety.

Zaczynając od wad, a w zasadzie pojedynczej wady: udział (full-time) w CTFie zjada zazwyczaj 48 godzin czasu (i to w weekend) - jest to czas, którego nie można poświęcić na odpoczynek, rodzinę czy inne aktywności/projekty. Jest to jeden z powodów dla których uważam, że warto dążyć do kilkunastoosobowego teamu - część teamu gra, a część może odpocząć/zająć się (pomijając niektóre CTFy / grając part-time). Udział w każdym CTFie full-time jest na dłuższą metę wyczerpujący.

Jeśli chodzi o zalety, to przede wszystkim jest to 48 produktywnie spędzonych godzin (minus kilka godzin na sen), podczas których cały czas się analizuje, researchuje, reversuje, szuka bugów, programuje, wymyśla różne podejścia do problemów i wprowadza się je w życie, etc. Co za tym idzie, można się dużo nowych rzeczy nauczyć i je przećwiczyć. Część z tych rzeczy prawdopodobnie nigdy się nie przyda w bezpośredniej postaci, a inne można na następny dzień wykorzystywać przy innych projektach.

Niezależnie od tego czy temat się przyda czy nie, część z nich jest po prostu bardzo ciekawa i niespotykana w (moich) codziennych aktywnościach - ot taka miła odmiana. Kilka przykładów moim zdaniem ciekawych tematów/zadań:
  • PCAP z USB-over-TCP, z którego było trzeba wyciągnąć pakiety USB "bulk" (de facto SCSI) i bazując na pakietach odczytu i zapisu, odtworzyć część zawartości pendriva. W wyniku tego otrzymywało się partycję FAT, na której można było znaleźć dwa pliki z flagą (w postaci video).
  • Crackme napisane w QBASIC i skompilowane do EXE (raczej niecodzienny cel do RE), crackme w ocamlu (w formie ELFa), albo crackme w postaci gry na NES.
  • SQL injection, w którym kontrolowany ciąg jest de facto kryptogramem zaszyfrowanym AES-CBC-128, a my kontrolujemy zarówno plaintext jak i klucz, ale nie IV (write-up).

  • Crackme w postaci Python bytecode z załączonym interpreterem Pythona, który okazał się być zmodyfikowany (tj. opcody były pozmieniane).
  • Exploitacja stack-based buffer overflow programu napisanego w HolyC (sic!) działającego na systemie TempleOS (write-up).
  • Jailbreak na systemie/platformie wymyślonej od zera przez organizatorów (wszystko, od architektury CPU, poprzez custom bytecode, aż do implementacji mini-systemu), gdy ma się jedynie dostęp do shella z kilkoma poleceniami i można zobaczyć dump rejestrów w przypadku wyjątków.
  • Plik PNG, w którym jest ukryty GIF, w którym jest ukryty BMP, w którym jest ukryty JPG.
  • I tak dalej...
Rozwiązanie sporej ilości takich różnorodnych zadań daje IMHO pewną elastyczność + wiedzę jak podejść w szybki i wystarczająco efektywny sposób do nieznanego/nowego tematu.

Ostatnia zaletą, o której chciałem wspomnieć, są ludzie. Po pierwsze, samo rozwiązywanie zadań w kilka osób pozwala popatrzeć ciekawe triki / zobaczyć podejścia/pomysły, na które by się samemu nie wpadło (i dobrze się przy tym bawić). Po drugie, można poznać masę ciekawych osób z innych teamów CTFowych :)

I to chyba na tyle. Zaczął się nowy sezon, czas więc spróbować poprawić wynik z zeszłego roku. Jeśli również gracie / planujecie grać w CTFy - HF GL i do zobaczenia na polu bitwy ;>

Comments:

2014-02-04 20:54:10 = Gynvael Coldwind's fan
{
Bardzo interesujacy i motywujacy wpis, gratulacje niezwykle wysokiego wyniku i powodzenia w tym roku :) Swoja droga to ciekawe, Redforda kojarze chyba z tdhack-a, czyta sie posty sprzed kilku lat i kto by pomyslal, ze teraz to swiatowa czolowka :P
}
2014-02-08 02:25:50 = Szewy
{
"i o 14:48:57 mieliśmy rozwiązanie" [...] "Niecałe 6 minut później, o 15:54:28" ;))
}
2014-02-09 16:21:18 = Nism0
{
Fajnie że panowie się bawicie na skalę światową. To miło że ma kto reprezentować nasz kraj w tego typu zabawach scenowych ;) Bardzo fajnie też, że staracie się rozpowszechnić tą scenę CTFową w PL.

Dużym zaskoczeniem dla mnie okazał się w tym wszystkim skład teamu, kilka młodych, znajomych twarzy ;)
Ciekawi mnie tylko, jak wygląda podział drużyny waszej podczas danego CTF'u. Chodzi mi stricte o to, czy każdy z osobna stara się rozwiązać dane zadanie, czy może po kilku skupiacie się nad jednym zadankiem, ofc mam tu na myśli współpracę online.

GW & keep the fire burning ;)
}
2014-02-10 16:01:51 = 3e9
{
Życzę utrzymania 1 miejsca ;)
}
2014-02-12 13:35:02 = Gynvael Coldwind
{
@Gynvael Coldwind's fan
Thx :)
O, nawet nie wiedziałem, że Redford się bawił w tdhack (to chyba był największy polski hackme, nie?). Na pewno adam_i tam sporo się bawił (z dobrymi wynikami).

@Nism0
W sumie z mojego punktu widzenia CTF (w stylu jeopardy, bo attack-defence rządzi się swoimi prawami) ma dwie fazy:
- Faza pierwsza (mniej więcej do połowy lub ¾ CTF): każdy robi sam zadanka, na zasadzie FCFS. Większość zadań zostaje rozwiązanych w tej fazie.
- Faza druga (do końca CTF): zostały dwa rodzaje zadań: złożone (i jeszcze trwa ich rozwiązywanie), oraz te na które nikt nie ma pomysłu o co w ogóle tam chodzi. Zazwyczaj na tym etapie nad każdym zadaniem pracują dwie lub więcej osób, czy to na zasadzie "ty robisz tą część (np. piszesz exploit) a ja tą (przygotowuje ROP-chain)", czy na zasadzie brainstorm / próbowania bardzo różnych podejść do zadania, żeby znaleźć wektor. Tak wiec druga faza jest strikte zespołowa.

@3e9
Thx :)
}

Add a comment:

Nick:
URL (optional):
Math captcha: 7 ∗ 7 + 5 =