Łukasz Przywarty 171018 Wrocław, 30.10.2012 r. Grupa: WT/N 11:15-14:00 Sprawozdanie z zajęć laboratoryjnych: Skanowanie sieci Prowadzący: mgr inż. Mariusz Słabicki 1 / 6
1. Treść zadania laboratoryjnego W ramach zajęć należało wykonać trzy zadania. Pierwsze z nich polegało na skanowaniu sieci lokalnej w poszukiwaniu serwerów usług HTTP, HTTPS, SSH, FTP, SMTP oraz usług logowania interaktywnego TELNET, RLOGIN, RSH. Kolejne zadanie wymagało napisania skryptu, który pośród usług szuka niebezpiecznych wersji serwerów. Program ma pomagać administratorowi lokalizować dziurawe serwery (uruchamiane przez użytkowników) w jego własnej sieci lokalnej. Ostatnie zadanie zakładało utworzenie skryptu sprawdzającego, czy w lokalnej sieci znajdują się otwarte serwery pocztowe (takie serwery, które pozwalają nielokalnemu użytkownikowi wysłać pocztę poza sieć lokalną). 2. Realizacja zadań laboratoryjnych 2.1 Zadanie pierwsze W celu wykonania pierwszego zadania należało zainstalować program nmap, który służy do eksploracji sieci oraz audytów bezpieczeństwa. Obsługa narzędzia jest bardzo prosta i sprowadza się do uruchomienia programu z odpowiednimi parametrami. Właściwie skonstruowane polecenie przedstawia listing 1. Listing 1: Komenda służąca do listowania serwerów konkretnych usług nmap -sv -p T:80,8080,443,22,25,110,21,23,107,513,514 156.17.40.0/24 Warto zwrócić uwagę na poszczególne parametry: sv opcja wykrywa usługi na otwartych portach, p skanowanie tylko konkretnych portów, T:80,... - tablica portów, które będą skanowane, 156.17.40.0/24 specyfikacja celu, w tym przypadku adres IP (może być również nazwa hosta, lub na przykład zakres adresów IP). 2 / 6
Polecenie wypisuje na standardowe wyjście (w tym przypadku konsolę) listę wszystkich serwerów usług. Fragment listy prezentuje listing 2. Listing 2: Efekt wykonania nmap Starting Nmap 5.21 ( http://nmap.org ) at 2012-10-23 13:31 CEST ( ) Interesting ports on defect.ict.pwr.wroc.pl (156.17.40.27): PORT STATE SERVICE VERSION 21/tcp open ftp Solaris ftpd 22/tcp open ssh SunSSH 1.0.1 (protocol 2.0) 23/tcp open telnet Sun Solaris telnetd 25/tcp closed smtp 80/tcp open http 107/tcp closed unknown 110/tcp closed pop3 443/tcp closed https 513/tcp open login 514/tcp open tcpwrapped 8080/tcp closed http-proxy Service Info: OS: Solaris Interesting ports on lak.ict.pwr.wroc.pl (156.17.40.28): PORT STATE SERVICE VERSION 21/tcp open tcpwrapped 22/tcp open ssh OpenSSH 5.3p1 Debian 3ubuntu6 (protocol 2.0) 80/tcp open http Apache httpd 2.2.14 ((Ubuntu)) ( ) Service detection performed. Please report any incorrect results at http://nmap.org/submit/. Nmap done: 256 IP addresses (35 hosts up) scanned in 94.20 seconds Jak widać, program analizuje konkretne porty poszczególnych hostów. W momencie gdy narzędzie rozpoznaje wersję serwera usługi odpowiednia informacja pojawia się w kolumnie VERSION. Niestety wiele serwerów usług nie zostaje rozpoznanych i mimo, że port jest otwarty nie wiadomo, jaka usługa z niego korzysta. 2.2 Zadanie drugie Rozwiązanie zaprezentowane w punkcie 2.1 jest ogólne, co znaczy, że administrator otrzymuje cały wachlarz informacji na temat usług uruchomionych w jego sieci lokalnej. Aby wyłuskać z listy usług serwery niebezpieczne, należało napisać skrypt analizujący wyjście narzędzia nmap. Efektem działania skrypu powinnna być lista hostów, na których uruchomione są niebezpieczne serwery usług. Próbę rozwiązania problemu widać na listingu 3. 3 / 6
Listing 3: Skrypt wypisujące serwery usług niebezpiecznych 1. #!/usr/bin/perl 2. 3. use Term::ANSIColor; 4. 5. my @dangerousservices =( 6. "SunSSH 1.0.1", "SunSSH 1.0", "SunSSH 1.1", "SunSSH 1.2", 7. "Apache httpd 1.3", "Apache httpd 2.0", "Apache httpd 2.1", "Apache httpd 2.2", 8. "Exim smtpd 4.69", "Exim smtpd 4.72", 9. "OpenSSH 3.3", "OpenSSH 3.4" 10. ); 11 12. my $hosts = `nmap -sv -p T:80,8080,443,22,25,110,21,23,107,513,514 13. 156.17.40.0/24`; 14. 15. @hoststable = split(/\n\n/, $hosts); 16. 17. foreach(@hoststable) { 18. my $host = $_; 19. foreach(@dangerousservices) { 20. if($host =~ m/([\s\s]+?)$_([\s\s]+?)/g) { 21. use Term::ANSIColor qw(:constants); 22. print BOLD, RED, "Uwaga podejrzane usługi na hoscie: $_\n", RESET; 23. print "$host\n\n"; 24. } 25. } 26. } Największym wyzwaniem okazało się zdefiniowanie wszystkich niebezpiecznych serwerów usług. Można dojść do wniosku, że każda starsza wersja oprogramowania (sprzed roku, dwóch) będzie bardziej niebezpieczna, niż wersja aktualna, jednak nie jest to regułą. Niektóre wersje serwerów mimo aktualizacji, posiadają luki bezpieczeństwa. Czasem zdarza się również, że starsza wersja oprogramowania jest bardziej stabilna niż nowa. Napisany skrypt posiada ograniczoną funkcjonalność (lista niebezpiecznych serwerów jest niekompletna). Pośród serwerów szuka tylko tych wersji, które zawarte są w tablicy dangerousservices. Dalsze objaśnienia dotyczące kodu znajdują się poniżej: Linia 3 dołączenie biblioteki posiadającej funkcje do kolorowania tekstu (skrypt oznacza niebezpieczne serwery czerwonym kolorem), Linia 5 deklaracja tablicy niebezpiecznych wersji serwerów, Linia 12 wywołanie narzędzia nmap z parametrami, 4 / 6
Linia 15 zauważono, że każdy host razem z jego listą usług jest oddzielony od drugiego znakiem podwójnej spacji. Pozwala to umieścić dane dotyczące konkretnego hosta w jednej komórce tabeli hoststable. Linia 17 w każdym wierszu tabeli program szuka ciągu znaków oznaczającego niebezpieczną wersję serwera, Linia 22 w przypadku, gdy na hoście jest uruchomiona niebezpieczna usługa, cały wiersz tabeli zostaje wypisany na wyjście a usługa oznaczona kolorem czerwonym. Program poprawnie filtruje listę hostów i wyświetla tylko te, które są potencjalnie niebezpieczne. 2.3 Zadanie trzecie Korzystając z listy serwerów uzyskanej za pomocą narzędzia nmap można wyodrębnić serwery poczty wychodzącej SMTP (działającej na porcie 25). Podczas trwania zajęć sprawdzono mechanizm wysyłania poczty przy użyciu programu netcat. Ze względu na duże opóźnienia w sieci proces sprawdzania otwartości serwera nie został zautomatyzowany. Skrypt testowy przedstawia listing 4. Listing 4: Skrypt wysyłający wiadomość za pośrednictwem konkretnego serwera pocztowego 1. #!/usr/bin/perl 2. 3. my $date = `date "+%a, %d %b %Y %H:%M:%S %z"`; 4. chomp($date); 5. 6. my $hostname = 'actina.eka.pwr.wroc.pl'; 7. 8. my $msg = 'EHLO '. $hostname. ' 9. MAIL FROM: lukasz@przywarty.com 10. RCPT TO: przywarty@yahoo.com 11. DATA 12. From: A tester <lukasz@przywarty.com> 13. To: <przywarty@yahoo.com> 14. Date: '. $date. ' 15. Subject: A test message 16. 17. Lucas 18.. 19. QUIT'; 20. 21. open(my $fh, '>', 'mail.txt') or die "Could not open file"; 22. say $fh $msg; 23. close $fh; 24. 25. my $sending = `ncat -C "$hostname" 25 < mail.txt`; 26. print $sending; 5 / 6
Objaśnienia: Linia 3 do 4 uzyskania aktualnej daty w odpowiednim formacie (data jest jednym z pól wysyłanej wiadomości), Linia 6 deklaracja hosta, który będzie pośredniczył w wysyłaniu wiadomości, Linie 8 do 15 deklaracja wiadomości email o ustalonej z góry strukturze, Linie 21 do 23 zapisanie wiadomości do pliku tekstowego, Linia 25 wywołanie narzędzie ncat z odpowiednimi parametrami: nazwą hosta, portem oraz plikiem wejściowym (wiadomością). Efekt działania programu prezentuje listing 5. Listing 5: Efekt działania skryptu wysyłającego wiadomość 220 actina ESMTP Postfix (Ubuntu) 250-actina 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH LOGIN PLAIN 250-AUTH=LOGIN PLAIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN 250 2.1.0 Ok 554 5.7.1 <przywarty@yahoo.com>: Relay access denied 554 5.5.1 Error: no valid recipients 221 2.7.0 Error: I can break rules, too. Goodbye. Aby zakończyć zadanie należałoby wyłuskiwać adresy hostów z otwartymi portami numer 25, a następnie (wg procedury przedstawionej w listingu 4) sprawdzać, czy proces wysyłania wiadomości kończy się sukcesem. 6 / 6