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/ ∞