24 października 2010

I Ty możesz zostać łowcą błędów!

Spore zainteresowanie wzbudziła wczorajsza informacja o nastolatku, który zdołał odnaleźć krytyczną lukę w Firefoksie. Dziś postaram się więc was przekonać, że odkrywcą błędu w popularnym oprogramowaniu może się stać praktycznie każdy użytkownik komputera! Wystarczy tylko trochę chęci, nieco czasu na przeprowadzenie naszych prywatnych testów oraz skorzystanie z odpowiednich narzędzi. Spójrzmy więc, w jak prosty sposób możemy odnaleźć lukę obecną w najnowszej wersji pewnego programu za pomocą nieocenionego Metasploita.

Rozwój projektu Metasploit Framework jest naprawdę fascynujący. Niemal każdego dnia osoby zainteresowane przeprowadzaniem praktycznych testów bezpieczeństwa, otrzymują do swej dyspozycji nowe moduły. Nierzadko są to nawet exploity zdolne do wykorzystania podatności typu Zero Day. Mimo że właśnie z tego typu exploitami najczęściej kojarzymy samego Metasploita, to jednak w jego ramach znajdziemy również wiele modułów o nieco innym charakterze. Spójrzmy przykładowo na jeden z najnowszych modułów, pozwalający na automatyczne wyszukiwanie błędów w aplikacjach za pomocą techniki znanej jako fuzzing.

Fuzzing to technika, która w znacznym stopniu zrewolucjonizowała dziedzinę automatycznego wyszukiwania błędów w gotowych już aplikacjach i to bez konieczności dostępu do kodu źródłowego (a nawet samego programu, tak jak to ma miejsce np. w przypadku usług sieciowych). Sam pomysł jest stosunkowo prosty i sprowadza się w praktyce zazwyczaj do zautomatyzowanego bombardowania działającej aplikacji określonymi losowymi lub wybranymi nietypowymi danymi. Jeśli tylko dojdzie do awaryjnego zakończenia pracy testowanej przez nas aplikacji, to prawdopodobnie udało nam się wykryć błąd obecny w aplikacji. Oczywiście dalsza analiza takiego błędu (na podstawie znajomości konkretnych danych, które spowodowały awarię), mająca docelowo pozwolić na utworzenie exploita zdolnego do skutecznego wykorzystania podatności, wymaga już dalszej niełatwej pracy. Niemniej jednak, osoby chcące w stosunkowo prosty sposób zapoznać się z tematyką praktycznego fuzzingu, zachęcam do wypróbowania nowego modułu Metasploita o nazwie Simple FTP Client Fuzzer.

Praktyczne wykonanie skutecznego fuzzingu nie jest jednak aż tak proste, jak mogłoby się to na pierwszy rzut oka wydawać. Sprawdzenie wybranego programu przy użyciu wszystkich możliwych kombinacji danych wejściowych jest z oczywistych względów praktycznie niemożliwe. Poza tym, przy takim podejściu, większość prób będzie tylko marnowaniem czasu i zasobów, gdyż zazwyczaj programy dokonują jednak pewnego wstępnego sprawdzania danych wejściowych i odrzucają te zupełnie niepoprawne lub np. niezgodne z określonym protokołem sieciowym. Z tej przyczyny fuzzery, czyli programy pozwalające na przeprowadzanie fuzzingu, przeznaczone są zazwyczaj dla określonej klasy aplikacji lub wybranej technologii. Jak więc sama nazwa wskazuje, moduł Simple FTP Client Fuzzer pozwoli nam na wykonanie fuzzingu aplikacji klienckich FTP.

W trakcie wykonywania fuzzingu przykładowego klienta FTP, skorzystamy z interfejsu msfconsole (z podstawami obsługi Metasploit Framework w środowisku systemu BackTrack 4 można się zapoznać tutaj). W systemie BackTrack 4, dostęp do interfejsu msfconsole uzyskamy wykonując po prostu polecenie msfconsole lub też wybierając z głównego systemowego menu opcję Backtrack/Penetration/Framework Version 3/msfconsole. Z poziomu msfconsole możemy rozpocząć nasze praktyczne testy. Zanim jednak zaczniemy na dobre, zaktualizujmy jeszcze całe środowisku Metasploit za pomocą polecenia msfupdate:
Następnie musimy przygotować do pracy moduł auxiliary/fuzzers/ftp/client_ftp. Przy zachowaniu domyślnych ustawień zrobimy to za pomocą zaledwie dwóch poleceń:
  • use auxiliary/fuzzers/ftp/client_ftp
  • run
W ten sposób nasz fuzzer rozpocznie pracę pod postacią lokalnego serwera FTP. Spróbujmy podłączyć się do niego za pomocą przykładowego klienta, np. aplikacji FileZilla:
Natychmiast po połączeniu z serwerem, nasz moduł rozpocznie testowanie klienta, co zauważymy po licznych wpisach pojawiających się w wyświetlanym na bieżąco logu:
W jaki sposób działa nasz fuzzer? Tak jak to możemy zauważyć na zrzutach przedstawiających program FileZilla oraz sam log, fuzzer wysyła nietypowe (np. wyjątkowo długie) odpowiedzi na komendy przekazywane przez klienta, przesyła pliki i listuje katalogi o bardzo nietypowych i długich nazwach. W taki sposób możliwe jest przykładowo wykrycie błędów przepełnienia bufora. FileZilli udało się jednak przetrwać domyślne testy.

Przetestujmy teraz innego klienta FTP, program FTPShell. Podłączmy się do serwera utworzonego przez metasploitowy moduł i zobaczmy co stanie się tym razem:
Bingo! Wygląda na to, że za pomocą fuzzingu właśnie znaleźliśmy nasz pierwszy błąd w aplikacji FTPShell Client! Warto podkreślić, że spowodowanie awarii nie wymagało jakiejkolwiek ingerencji ze strony użytkownika aplikacji klienckiej (poza nawiązaniem połączenia z naszym serwerem). Spójrzmy na log utworzony przez moduł client_ftp:
Ostatni wpis to Sending directory list via data connection i właśnie ta czynność wyzwoliła awaryjne zakończenie pracy testowanego programu. Teraz pozostaje nam już tylko sprawdzenie tego, czy odkryta luka pozwala na ewentualne automatyczne wykonanie kodu w systemie użytkownika korzystającego z tego konkretnego klienta FTP i wreszcie utworzenie odpowiedniego exploitu PoC dowodzącego takiej możliwości w praktyce. Te czynności wymagają już jednak znacznie większej wiedzy i umiejętności praktycznych, m.in. z zakresu inżynierii wstecznej (ang. reverse engineering) oraz programowania.

W taki oto sposób, praktycznie każdy użytkownik komputera może w takiej czy innej aplikacji odnaleźć potencjalnie bardzo niebezpieczne luki. Oczywiście nie mamy co liczyć na to, że twórcy programu FTPShell w jakiś sposób wynagrodzą nam nasze odkrycie. Niemniej jednak w bardzo podobny sposób (z wykorzystaniem fuzzingu) odnajdowane są również błędy w bardzo znanych aplikacjach, takich jak np. popularne przeglądarki internetowe. W Internecie oraz w samym środowisku Metasploit dostępnych jest wiele gotowych fuzzerów, zdolnych do odnajdowania luk w wielu różnych klasach oprogramowania oraz aplikacjach internetowych. Zainteresowanych tą tematyką zachęcam więc do własnych testów praktycznych. Natomiast wszystkich, którym udało się kiedykolwiek odkryć błąd w jakiejkolwiek aplikacji, zachęcam do podzielenia się swymi doświadczeniami za pośrednictwem komentarzy.