slajdy - Gynvael Coldwind
Transkrypt
slajdy - Gynvael Coldwind
HISPASEC Praktyczne podejście do testowania bezpieczeństwa implementacji obsługi formatów danych by Gynvael Coldwind Dramatis Personæ Gynvael Coldwind - obecnie spec. ds. bezp. IT @ Hispasec - wcześniej ArcaBit - autor kilku artykułów (Hakin9 i Xploit) - prowadzi bloga technicznego (http://gynvael.coldwind.pl) - team Vexillium (http://vexillium.org) Praktyczne podejście... 2 /∞ Menu 1. Budowa aplikacji a wektory ataku 2. Jak szukać błędów? 3. Różnice w interpretacji dokumentacji 4. Case study – BMP 5. Case study – GIF 6. Inne – RAR, ZIP, FTP 7. Podsumowanie Praktyczne podejście... 3 /∞ Budowa aplikacji IN IN OUT OUT IN IN APLIKACJA OUT IN OUT IN IN Praktyczne podejście... 4 /∞ Aplikacja składa się z wielu modułów IN IN OUT OUT IN IN APLIKACJA OUT IN OUT IN IN Praktyczne podejście... 5 /∞ Wejście, przetwarzanie, wyjście NET KEYB HTML SCR DB BMP APLIKACJA NET MP3 ... PHP ... Praktyczne podejście... 6 /∞ Wszystko co pochodzi z zewnątrz stanowi potencjalne zagrożenie NET KEYB HTML SCR DB BMP APLIKACJA NET MP3 ... PHP ... Praktyczne podejście... 7 /∞ Wszystko co pochodzi z zewnątrz stanowi potencjalne zagrożenie NET KEYB HTML SCR DB BMP APLIKACJA NET MP3 ... PHP ... Praktyczne podejście... 8 /∞ Wszystko co pochodzi z zewnątrz stanowi potencjalne zagrożenie NET KEYB HTML SCR DB BMP APLIKACJA NET MP3 ... PHP ... Praktyczne podejście... 9 /∞ Wszystko co pochodzi z zewnątrz stanowi potencjalne zagrożenie NET KEYB HTML SCR DB BMP APLIKACJA NET MP3 ... PHP ... Praktyczne podejście... 10 / ∞ Wszystko co pochodzi z zewnątrz stanowi potencjalne zagrożenie NET KEYB HTML SCR DB BMP APLIKACJA NET MP3 ... PHP ... Praktyczne podejście... 11 / ∞ Wszystko co pochodzi z zewnątrz stanowi potencjalne zagrożenie NET KEYB HTML SCR DB BMP APLIKACJA NET MP3 ... PHP ... Praktyczne podejście... 12 / ∞ Jak szukać błędu ? NET KEYB HTML SCR DB BMP APLIKACJA NET MP3 ... PHP ... Praktyczne podejście... 13 / ∞ Jak szukać błędu ? BMP APLIKACJA Praktyczne podejście... 14 / ∞ Jak szukać błędu ? BMP Praktyczne podejście... 15 / ∞ Jak szukać błędu ? BMP OBSŁUGA BMP Praktyczne podejście... 16 / ∞ Jak szukać błędu ? Metoda A: (app oriented) „Czytając” kod obsługujący format BMP OBSŁUGA BMP Praktyczne podejście... 17 / ∞ Jak szukać błędu ? Metoda B: (data oriented) Analizując format wejściowy BMP OBSŁUGA BMP Praktyczne podejście... 18 / ∞ Jak szukać błędu ? Zorientowanie na format wejściowy pozwala naraz testować kilka-kilkanaście aplikacji OBSŁUGA BMP BMP OBSŁUGA BMP OBSŁUGA BMP Praktyczne podejście... 19 / ∞ Jak szukać błędu ? KROK 1 Wybierz format/protokół który chcesz analizować Metoda 1: mam ulubioną aplikację... Metoda 2: format XYZ brzmi fajnie! Metoda 3: rand() Praktyczne podejście... 20 / ∞ Jak szukać błędu ? KROK 2 Zdobądź dokumentacje! http://www.wotsit.org http://en.wikipedia.org http://www.faqs.org/rfcs/ Use google, Luke! Praktyczne podejście... 21 / ∞ Jak szukać błędu ? KROK 3 Napisz program tworzący prawidłowy pakiet/plik C/C++/Java/Python/etc Praktyczne podejście... 22 / ∞ Jak szukać błędu ? KROK 4 Rozpocznij analizę dokumentacji (o tym za chwilę), modyfikując stworzony wcześniej program tak, aby generował „poprawione” pakiety/pliki Praktyczne podejście... 23 / ∞ Jak szukać błędu ? KROK 5 Sprawdź jak zachowują się wybrane aplikacje gdy „zjedzą” „poprawiony” pakiet/plik (exception monitor, debugger) Praktyczne podejście... 24 / ∞ Różnice w interpretacji Programista vs Bughunter Praktyczne podejście... 25 / ∞ Różnice w interpretacji Programista vs Bughunter ...cytat z dokumentacji... Co myśli programista Co myśli bughunter Praktyczne podejście... 26 / ∞ Różnice w interpretacji Programista vs Bughunter Bezpośrednio po nagłówku znajdują się dane obrazu... Praktyczne podejście... 27 / ∞ Różnice w interpretacji Programista vs Bughunter Bezpośrednio po nagłówku znajdują się dane obrazu... Po nagłówku na pewno będą dane obrazu Praktyczne podejście... 28 / ∞ Różnice w interpretacji Programista vs Bughunter Bezpośrednio po nagłówku znajdują się dane obrazu... Po nagłówku na pewno będą dane obrazu Utnę plik po nagłówku ;F Praktyczne podejście... 29 / ∞ Różnice w interpretacji Programista vs Bughunter Wartość pola SIZE musi być mniejsza lub równa 16 Praktyczne podejście... 30 / ∞ Różnice w interpretacji Programista vs Bughunter Wartość pola SIZE musi być mniejsza lub równa 16 Wartość pola SIZE zawsze będzie <= 16 Praktyczne podejście... 31 / ∞ Różnice w interpretacji Programista vs Bughunter Wartość pola SIZE musi być mniejsza lub równa 16 Wartość pola SIZE zawsze będzie <= 16 Ustawie SIZE na 55 i zobaczę co się stanie... Praktyczne podejście... 32 / ∞ Różnice w interpretacji Programista vs Bughunter Pole NR_KOLOR określa ilość kolorów w palecie Praktyczne podejście... 33 / ∞ Różnice w interpretacji Programista vs Bughunter Pole NR_KOLOR określa ilość kolorów w palecie Wszystkie numery kolorów w obrazie są <= NR_KOLOR Praktyczne podejście... 34 / ∞ Różnice w interpretacji Programista vs Bughunter Pole NR_KOLOR określa ilość kolorów w palecie Powiem że paleta Wszystkie numery ma 20 kolorów, po kolorów w obrazie czym użyje koloru są <= NR_KOLOR numer 55 w obrazie! Praktyczne podejście... 35 / ∞ Różnice w interpretacji Programista vs Bughunter Chunk PALETA zawiera paletę kolorów dla całego obrazu Praktyczne podejście... 36 / ∞ Różnice w interpretacji Programista vs Bughunter Chunk PALETA zawiera paletę kolorów dla całego obrazu Chunk PALETA wystąpi tylko raz, bo nikt nie używa więcej niż jednej palety Praktyczne podejście... 37 / ∞ Różnice w interpretacji Programista vs Bughunter Chunk PALETA zawiera paletę kolorów dla całego obrazu Chunk PALETA wystąpi tylko raz, bo nikt nie używa więcej niż jednej palety Wrzucę 10 palet! Praktyczne podejście... 38 / ∞ Różnice w interpretacji Programista vs Bughunter Chunk PALETA zawiera paletę kolorów dla całego obrazu Chunk PALETA wystąpi tylko raz, bo nikt nie używa więcej niż jednej palety Wrzucę 10 palet! Albo żadnej! Praktyczne podejście... 39 / ∞ Różnice w interpretacji Programista vs Bughunter Implementacja powinna sprawdzać czy XYZ jest poprawne Praktyczne podejście... 40 / ∞ Różnice w interpretacji Programista vs Bughunter Implementacja powinna sprawdzać czy XYZ jest poprawne Nie chcę mi się... Praktyczne podejście... 41 / ∞ Różnice w interpretacji Programista vs Bughunter Implementacja powinna sprawdzać czy XYZ jest poprawne Nie chcę mi się... Ciekawe czy programiście się chciało... Praktyczne podejście... 42 / ∞ Różnice w interpretacji Programista vs Bughunter Pole OFFSET zawiera offset danych w pliku Praktyczne podejście... 43 / ∞ Różnice w interpretacji Programista vs Bughunter Pole OFFSET zawiera offset danych w pliku Wartość OFFSET pokazuje gdzieś w środku pliku na dane Praktyczne podejście... 44 / ∞ Różnice w interpretacji Programista vs Bughunter Pole OFFSET zawiera offset danych w pliku Wartość OFFSET Ustawie OFFSET pokazuje gdzieś ujemne lub większe w środku pliku na od wielkości pliku dane Praktyczne podejście... 45 / ∞ Różnice w interpretacji Programista vs Bughunter Każdy chunk ma pole NEXT które mówi gdzie jest następny chunk Praktyczne podejście... 46 / ∞ Różnice w interpretacji Programista vs Bughunter Każdy chunk ma pole NEXT które mówi gdzie jest następny chunk O! lista chunków! Przejdę sobie po niej w pętli Praktyczne podejście... 47 / ∞ Różnice w interpretacji Programista vs Bughunter Każdy chunk ma pole NEXT które mówi gdzie jest następny chunk O! lista chunków! Przejdę sobie po niej w pętli O! Zapętlona lista chunków! Niech któryś wskazuje sam na siebie! Praktyczne podejście... 48 / ∞ Różnice w interpretacji - podsumowanie Programista vs Bughunter ZDANIE Praktyczne podejście... 49 / ∞ Różnice w interpretacji - podsumowanie Programista vs Bughunter ZDANIE ZDANIE na pewno jest prawdziwe i wszyscy wg niego tworzą pliki / pakiety! Praktyczne podejście... 50 / ∞ Różnice w interpretacji - podsumowanie Programista vs Bughunter ZDANIE ZDANIE na pewno jest prawdziwe i wszyscy wg niego tworzą pliki / pakiety! ← :) Praktyczne podejście... 51 / ∞ Różnice w interpretacji - podsumowanie Co jest złe? Formaty czy implementacje? Praktyczne podejście... 52 / ∞ Enter teh BMP Case study - BMP Praktyczne podejście... 53 / ∞ Enter teh BMP BMP w skrócie: - bardzo prosty format graficzny - brak kompresji lub kompresja RLE - znany z duużych plików - znany z Windowsa :) - obsługuje do 8 bitów z paletą - obsługuje od 16 do 32 bitów RGB Praktyczne podejście... 54 / ∞ Enter teh BMP Budowa BMP BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA Praktyczne podejście... 55 / ∞ Bitmap File Header BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA UINT DWORD UINT UINT DWORD bfType; bfSize; bfReserved1; bfReserved2; bfOffBits; Praktyczne podejście... 56 / ∞ Bitmap File Header BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA UINT DWORD UINT UINT DWORD bfType; bfSize; bfReserved1; bfReserved2; bfOffBits; Specifies the size of the file, in bytes. Praktyczne podejście... 57 / ∞ Bitmap File Header BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA UINT DWORD UINT UINT DWORD bfType; bfSize; bfReserved1; bfReserved2; bfOffBits; Specifies the byte offset from the BITMAPFILEHEADER structure to the actual bitmap data in the file. (demo 001 002) Praktyczne podejście... 58 / ∞ Bitmap File Header BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA DWORD LONG LONG WORD WORD DWORD biSize; (1 of 2) biWidth; biHeight; biPlanes; biBitCount; biCompression; Praktyczne podejście... 59 / ∞ Bitmap File Header BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA DWORD LONG LONG WORD WORD DWORD biSize; (1 of 2) biWidth; biHeight; biPlanes; biBitCount; biCompression; Specifies the width/height of the bitmap, in pixels. (SZ = biWidth * biHeight * biBitCount/8) (memory DoS, Int Overflow, Sig/UnSig) Praktyczne podejście... 60 / ∞ Bitmap File Header BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA DWORD LONG LONG WORD WORD DWORD biSize; (1 of 2) biWidth; biHeight; biPlanes; biBitCount; biCompression; Specifies the number of planes for the target device. This member must be set to 1. Praktyczne podejście... 61 / ∞ Bitmap File Header BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA DWORD LONG LONG WORD WORD DWORD biSize; (1 of 2) biWidth; biHeight; biPlanes; biBitCount; biCompression; Specifies the number of bits per pixel. This value must be 1, 4, 8, or 24. (32 bits?) Praktyczne podejście... 62 / ∞ Bitmap File Header BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA (2 of 2) DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; Praktyczne podejście... 63 / ∞ Bitmap File Header BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA (2 of 2) DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; Specifies the number of color indexes in the color table actually used by the bitmap. […] the biClrUsed member must be set to zero or to the actual size of the color table. Praktyczne podejście... 64 / ∞ Bitmap File Header biClrUsed = 3 00 01 02 03 04 05 Random data 00: #121212 01: #AB1111 02: #009900 Random data Random data #000000 #000000 #000000 #000000 #000000 #000000 Praktyczne podejście... 65 / ∞ Bitmap File Header biClrUsed = 3 00 01 02 03 04 05 Random data 00: #121212 01: #AB1111 02: #009900 Random data Random data 00: #000000 #121212 #000000 #000000 #000000 #000000 #000000 Praktyczne podejście... 66 / ∞ Bitmap File Header biClrUsed = 3 00 01 02 03 04 05 Random data 00: #121212 01: #AB1111 02: #009900 Random data Random data 00: #000000 #121212 01:#000000 #AB1111 #000000 #000000 #000000 #000000 Praktyczne podejście... 67 / ∞ Bitmap File Header biClrUsed = 3 00 01 02 03 04 05 Random data 00: #121212 01: #AB1111 02: #009900 Random data Random data 00: #000000 #121212 01:#000000 #AB1111 02: #000000 #009900 #000000 #000000 #000000 Praktyczne podejście... 68 / ∞ Bitmap File Header biClrUsed = 3 00 01 02 03 04 05 Random data 00: #121212 01: #AB1111 02: #009900 Random data Random data 00: #000000 #121212 01:#000000 #AB1111 02: #000000 #009900 Random #000000 data #000000 #000000 Praktyczne podejście... 69 / ∞ Bitmap File Header biClrUsed = 3 00 01 02 03 04 05 Random data 00: #121212 01: #AB1111 02: #009900 Random data Random data 00: #000000 #121212 01:#000000 #AB1111 02: #000000 #009900 Random #000000 data Random #000000 data #000000 Praktyczne podejście... 70 / ∞ Bitmap File Header Demo 003 Praktyczne podejście... 71 / ∞ RLE BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA Run Length Encoding: biCompression = BI_RLE8 biCompression = BI_RLE4 ... Praktyczne podejście... 72 / ∞ RLE BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA Run Length Encoding: biCompression = BI_RLE8 biCompression = BI_RLE4 AAAAAAAAAABBBBCCCCCABCABCAAAAA Praktyczne podejście... 73 / ∞ RLE BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA Run Length Encoding: biCompression = BI_RLE8 biCompression = BI_RLE4 AAAAAAAAAABBBBCCCCCABCABCAAAAA 10 'A' Praktyczne podejście... 74 / ∞ RLE BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA Run Length Encoding: biCompression = BI_RLE8 biCompression = BI_RLE4 AAAAAAAAAABBBBCCCCCABCABCAAAAA 10 'A' 04 'B' Praktyczne podejście... 75 / ∞ RLE BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA Run Length Encoding: biCompression = BI_RLE8 biCompression = BI_RLE4 AAAAAAAAAABBBBCCCCCABCABCAAAAA 10 'A' 04 'B' 05 'C' Praktyczne podejście... 76 / ∞ RLE BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA Run Length Encoding: biCompression = BI_RLE8 biCompression = BI_RLE4 AAAAAAAAAABBBBCCCCCABCABCAAAAA 10 'A' 04 'B' 05 'C' 00 06 'ABCABC' Praktyczne podejście... 77 / ∞ RLE BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA Run Length Encoding: biCompression = BI_RLE8 biCompression = BI_RLE4 AAAAAAAAAABBBBCCCCCABCABCAAAAA 10 'A' 04 'B' 05 'C' 00 06 'ABCABC' 05 'A' Praktyczne podejście... 78 / ∞ RLE BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA Run Length Encoding: biCompression = BI_RLE8 biCompression = BI_RLE4 AAAAAAAAAABBBBCCCCCABCABCAAAAA 10 'A' 04 'B' 05 'C' 00 06 'ABCABC' 05 'A' 00 01 Praktyczne podejście... 79 / ∞ RLE BITMAPFILEHEADER BITMAPINFOHEADER PALETTE IMAGE DATA Run Length Encoding: biCompression = BI_RLE8 biCompression = BI_RLE4 00 02 XX YY: Delta. The two bytes following the escape contain unsigned values indicating the horizontal and vertical offsets of the next pixel from the current position. Praktyczne podejście... 80 / ∞ RLE 00 02 02 04 Praktyczne podejście... 81 / ∞ RLE 00 02 02 04 00 02 02 04 ??? Praktyczne podejście... 82 / ∞ RLE 00 02 02 04 00 02 02 04 Demo 004 Praktyczne podejście... 83 / ∞ BMP podsumowanie ... Praktyczne podejście... 84 / ∞ Enter teh GIF Case study - GIF Praktyczne podejście... 85 / ∞ Enter teh GIF Krótko o GIF: - bezstratna kompresja (LZW, ?) - 8 bitów, paleta kolorów (>256) - animacje! (WEB 1.0 ;>) - oparty o chunki - logical screen vs image(s) - GIF87 vs GIF89 Praktyczne podejście... 86 / ∞ Enter teh GIF Budowa GIF HEADER LSD GLOBAL PALETTE IMAGE DESC. LOCAL PALETTE IMAGE DATA ... ... ... TRAILER Praktyczne podejście... 87 / ∞ Enter teh GIF ??? Budowa GIF ??? HEADER LSD GLOBAL PALETTE IMAGE DESC. LOCAL PALETTE IMAGE DATA ... ... ... TRAILER Praktyczne podejście... 88 / ∞ Enter teh GIF ??? DEMO 005 ??? HEADER LSD GLOBAL PALETTE IMAGE DESC. LOCAL PALETTE IMAGE DATA ... ... ... TRAILER Praktyczne podejście... 89 / ∞ Enter teh GIF Budowa GIF HEADER LSD GLOBAL PALETTE LZW MIN. CODE SZ. BLOCK SIZE DATA IMAGE DESC. BLOCK SIZE LOCAL PALETTE DATA IMAGE DATA ... ... ... ... ... TERMINATOR TRAILER Praktyczne podejście... 90 / ∞ Enter teh GIF Budowa GIF The output codes are of variable length, starting at <code size>+1 bits per code, up to 12 bits per code. This defines a maximum code value of 4095 (hex FFF). LZW MIN. CODE SZ. BLOCK SIZE DATA BLOCK SIZE DATA ... ... TERMINATOR Praktyczne podejście... 91 / ∞ Enter teh GIF SDL_Image ... unsigned char c; ← code size ... LWZReadByte(src, TRUE, c) Praktyczne podejście... 92 / ∞ Enter teh GIF SDL_Image LWZReadByte(..., int input_code_size) ... static int table[2][(1 << MAX_LWZ_BITS)]; ... set_code_size = input_code_size; ... clear_code = 1 << set_code_size; ... for (i = 0; i < clear_code; ++i) { table[0][i] = 0; table[1][i] = i; } Praktyczne podejście... 93 / ∞ Enter teh GIF SDL_Image – DEMO 006 Praktyczne podejście... 94 / ∞ Escape teh GIF GIF - podsumowanie Praktyczne podejście... 95 / ∞ Inne – FTP, RAR, ZIP FTP – Nazwy plików w listingu LIST (LIST) If the pathname specifies a directory or other group of files, the server should transfer a list of files in the specified directory. Praktyczne podejście... 96 / ∞ Inne – FTP, RAR, ZIP FTP – Nazwy plików w listingu LIST (LIST) If the pathname specifies a directory or other group of files, the server should transfer a list of files in the specified directory. DEMO 007! Praktyczne podejście... 97 / ∞ Inne – FTP, RAR, ZIP RAR, ZIP, etc... (RAR) File name - string of NAME_SIZE bytes size Praktyczne podejście... 98 / ∞ Inne – FTP, RAR, ZIP RAR, ZIP, etc... (ZIP) [local file header 1] VS [central directory] Praktyczne podejście... 99 / ∞ EOF Podsumowanie... Praktyczne podejście... 100/ ∞ The End Dziękuje za uwagę! Czas na pytania ;> -=(* e-mail *)[email protected] [email protected] -=(* blog *)=http://gynvael.coldwind.pl Praktyczne podejście... 101/ ∞