Konferencja Mega Sekurak Hacking Party w Krakowie – 26-27 października!
Adminie… Czy znamy Twoje grzechy? ;-) Sprawdź!
Konferencja Mega Sekurak Hacking Party w Krakowie – 26-27 października!
Adminie… Czy znamy Twoje grzechy? ;-) Sprawdź!
W maju br. White Hat Security opublikowało bardzo ciekawe zestawienie różnych statystyk na temat bezpieczeństwa aplikacji webowych. Wśród nich znalazły się informacje, że w roku ubiegłym 86% stron klientów White Hat Security zawierało przynajmniej jedną poważną podatność, czyli taką która pozwala na:
a średni czas załatania takiej dziury wynosił 193 dni, licząc od pierwszego powiadomienia.
Natomiast Imperva w swoim lipcowym raporcie o bezpieczeństwie aplikacji webowych donosi, że w ciągu pół roku aplikacje były poważnie atakowane średnio co 12 dni.
To daje nam 16 udanych ataków o poważnych konsekwencjach przed naprawieniem podatności.
Wiadomo, że oficjalne naprawy mogą być powolne, a nieoficjalne mogą kosztować nas utratę gwarancji. W tym momencie z pomocą może przyjść nam WAF (ang. Web Application Firewall), czyli zapora sieciowa dedykowana ochronie aplikacji webowych.
Tu może nasunąć się jednak pytanie: „Ale jest przecież IPS, to po co mi ten WAF?”.
Przyjrzyjmy się zatem każdemu z nich z osobna.
IPS (ang. Intrusion Prevention System) to system wykrywający i przeciwdziałający potencjalnym zagrożeniom w sieci lub systemie komputerowym. Dzieli się on na kilka rodzajów, np.:
Dla najpopularniejszego wariantu – NIDS-a – wykrywanie niebezpieczeństw polega na wyszukiwaniu:
Przykładowe IDSy: Snort (NIPS), OSSEC (HIPS), Motorola AirDefense (WIPS).
WAF jest dedykowany do ochrony aplikacji webowych i można go znaleźć np. pod postacią modułu do danego serwera webowego. Pozwala kontrolować ruch od i do naszej aplikacji, wykorzystując przy tym wcześniej przygotowane zasady, które mogą być tworzone na dwa sposoby:
Dzięki modelowi negatywnemu możemy, bez ingerencji w strukturę naszej aplikacji, w łatwy i szybki sposób naprawić odkryte podatności. Natomiast model pozytywny lepiej blokuje nieznane ataki, ponieważ konkretyzuje dozwolone treści, co wymaga więcej pracy przy jego wdrożeniu.
Przykładowe WAFy: ModSecurity (rozbudowany, obsługuje wiele rodzajów serwerów webowych), NAXSI (prosty moduł serwera Nginx).
IPS zapewnia nam szeroką wielopoziomową ochronę naszej sieci oraz znajdujących się w niej maszyn. Możemy równocześnie chronić naszą aplikację webową i inne usługi przed różnymi próbami ataku.
WAF jest wyspecjalizowanym narzędziem skupiającym się na ochronie konkretnych aplikacji webowych. Pozwala zabezpieczyć podatną aplikację bez ingerencji w nią samą, co jest bardzo przydane w sytuacjach, kiedy np. obejmuje nas umowa gwarancyjna i należy czekać na serwisanta lub oprogramowanie nie jest już wspierane.
Przejdźmy zatem do konkretnego przykładu.
NAXSI (ang. Nginx Anti XSS & SQL Injection) to darmowy moduł WAF serwera webowego Nginx. Cechuje go prosta, ale skuteczna metoda działania.

źródło: Naxsi performance measurment.
Przyjęte żądanie jest analizowanie i dzielone na odrębne strefy:
Każdą z tych stref można porównać z krótką ogólnoserwerową blacklistą, która w zależności od zawartości nadaje żądaniu określoną liczbę punktów w kategoriach:
Następnie sprawdzana jest whitelista dla konkretnej lokalizacji, w której mogą znaleźć się bardziej szczegółowe instrukcje nakazujące zignorowanie uprzednio wybrane reguły oraz nadanie przez nie punktacje. Na końcu podsumowane są punkty z każdej kategorii i jeżeli przekroczony został ustalony pułap, żądanie zostaje zablokowane. Oznacza to, że zostaje ono przesłane do DeniedURL, gdzie znajdują się dalsze instrukcje.
Tak zbudowany model jest w stanie bardzo szczegółowo określić, co zostanie odebrane przez naszą aplikację, zapewniając jej maksymalną ochronę. Jak widać możliwości są szerokie, co wcale nie oznacza, że zadanie jest trudne.
Twórcy NAXSI dostarczają nam stworzoną przez nich blacklistę (naxsi_core.rules), zawierającą większość znanych wzorców ataków, oraz plik (naxsi.rules) z podstawowymi ustawieniami i określonym przez nich progiem punktowym.
Przyjrzyjmy się składni tzw. reguł głównych znajdujących się w blackliście:
MainRule „str:wzorzec” [„rx:wzorzec1|wrorzec2”] „msg:komentarz” „mz:strefy” „s:kategoria:punktacja” id:numer;
1. str:wzorzec – (string) występowanie ciągu znaków „wzorzec” uaktywni regułę;
2. rx:wzorzec1|wzorzec2 – (regular expresion) wyrażenie regularne stosowane do tworzenia większej liczby wzorców dla jednej reguły (wzorce rozdzielane są „|”), działa na tej samej zasadzie co „str”.
3. msg:komentarz – (message) przy wywołaniu reguły tekst o treści „komentarz” zostanie umieszczony w logach.
4. mz:strefy – (matchzones) reguła dotyczy konkretnych stref, argumentów lub nagłówków (rozdzielane „|”):
5. s:kategoria:punktacja – (score) określa liczbę punktów, która zostanie przydzielona w jednej z ww. kategorii:
6. id:numer – (identification number) unikalny numer reguły.
Dla lepszego zrozumienia przeanalizujmy jedną regułę z pliku naxsi_core.rules:
MainRule „rx:select|union|update|delete|insert|table|from|ascii|hex|unhex” „msg:sql keyword” „mz:BODY|URL|ARGS|$HEADERS_VAR:Cookie” „s:$SQL:4” id:1000;
Reguła o numerze 1000 przydzieli 4 punkty w kategori SQL Injection każdemu żądaniu, które w argumentach GET lub POST, w URL, lub w ciasteczku będzie zawierało ciąg znaków „select”, „union”, „update”, „delete”, „insert”, „table”, „from”, „ascii”, „hex” albo „unhex”, dodatkowo w logach opisze je komentarzem „sql keyword”.
Przejdźmy do składni reguł podstawowych znajdujących się w whiteliście, które wyglądają podobnie jak reguły główne:
BasicRule wl:ID [mz: [$URL:target_url] | [match_zone] | [$ARGS_VAR:varname] | [$BODY_VARS:varname] | [$HEADERS_VAR:varname] ];
1. wl:ID – (WhiteList:ID) określa, które reguły zostają zignorowane, np.:
2. mz: – w tym miejscu określa się warunki jakie muszą być spełnione by dana reguła została ignorowana, składnia jest identyczna jak w przypadku reguł głównych.
Dla wyjaśnienia przyjrzyjmy się kilku przykładom:
Widzimy, że pisanie whitelisty nie jest trudne, ale może być pracochłonne. Na szczęście twórcy NAXSI pomyśleli o tym i nasz WAF domyślnie uruchamiany jest w trybie “nauki”, co w praktyce oznacza, że zamiast blokować ew. próby ataku, będzie je odnotowywał w logach (error.log), z których to możemy wygenerować odpowiedni zbiór zasad dla naszej aplikacji. Należy pamiętać, że wymaga to od nas dostarczenia zaufanego ruchu, np. z wcześniej przygotowanego automatu testującego.
W analizie logów pomaga nam przygotowany i dostępny na stronie twórców NAXSI skrypt nx_util. Pozwala on nie tylko wygenerować whitelistę, ale również przenieść nasze logi do bazy danych SQLite oraz wygenerować raport aktywności w postaci pliku html. Może on analizować dane z konkretnej ścieżki, strumienia wejściowego (stdin) albo spakowane gzipem.
nx_util.py [-hoi] [-l Plik_logów] [-H Plik_html] [-d Baza_danych] [-f Filtr]
Dla przykładu:
cat /var/log/nginx/error.log | nx_util.py -l -f 'ip =~ 192.*' -H logs.html
Wygeneruje nam raport o aktywności hostów o adresach ip zaczynających się na 192.
A wygląda on mniej więcej tak:
Teoria teorią, ale warto by sprawdzić jak NAXSI spisuje się w praktyce.
W tym celu nasz WAF (pracujący na domyślnych ustawieniach – oczywiście z wyłączonym trybem „nauki”) uruchomimy na skonfigurowanym przez nas serwerze pośredniczącym (reverse proxy).
Koncepcja serwera pośredniczącego jest powszechnie stosowana. Pozwala ona odciążyć serwer lub grupę serwerów docelowych, np. przez:
Ustawiamy nasze proxy dla strony Altoro Mutual, która została stworzona przez firmę IBM w celu pokazania działania ich skanera podatności AppScan (wynik starcia „AppScan vs. NAXSI” można zaleźć tutaj). My jednak użyjemy darmowego programu Subgraph Vega, wykrywającego takie popularne podatności jak XSS, SQL Injection, LFI itp., i wspomożemy go jednym z najgroźniejszych narzędzi w sieci, przeglądarką Mozilla Firefox, by sprawdzić czy wykryte podatności można wykorzystać.
Jak widać nasz skaner wykrył całkiem sporo dziur. Zobaczmy jak poradzi sobie z tym problemem WAF.
NAXSI, tak jak przewidywaliśmy, ochroniło stronę, redukując liczbę wykrytych krytycznych podatności. Przyjrzyjmy się temu, co zostało:
Za cel weźmiemy podstronę default.aspx i jej parametr content, oczywiście chwilowo wyłączamy WAF, by nie przeszkadzał nam w potwierdzaniu podatności. Szybko dowiadujemy się, że ten parametr przyjmuje tylko nazwy plików z rozszerzeniem „htm” lub „txt”.
Zatem podajmy mu plik, który najprawdopodobniej nie istnieje, np.: „lubiewafle.htm”, i zobaczmy, co się stanie.
Dostaliśmy błąd, który nie tylko informuje nas, że nie znaleziono naszego pliku, ale podaje również pełną ścieżkę dostępu do katalogu, w którym powinienem znajdować się nasz plik. Mając tą wiedzę, możemy spróbować w dość nietypowy sposób otworzyć dowolną podstronę i zobaczyć, czy to samo żądanie zostanie zaakceptowane, kiedy włączymy WAF.
Pokazaliśmy tym samym, że nawet bardzo podatną aplikację można zabezpieczyć, nie ingerując w jej strukturę. Może się więc zdarzyć, że podatność zostanie wykryta, ale wszelkie próby jej wykorzystania zostaną zablokowane.
— Daniel Iziourov (daniel.iziourov<sekurak>gmail.com)
[1] https://www.whitehatsec.com/assets/presentations/stats2013_infograph_large.jpg
[2] http://www.imperva.com/docs/HII_Web_Application_Attack_Report_Ed4.pdf
[3] https://www.owasp.org/index.php/Web_Application_Firewall
[4] http://csrc.nist.gov/publications/nistpubs/800-94/SP800-94.pdf
[5] http://code.google.com/p/naxsi/
[6] http://naxsi.googlecode.com/svn/wiki/paper.pdf/
Dzięki. W końcu jakiś fajny art w jęz. polskim w tym temacie ;)
Nie zapominajmy o zbblock :)