Blokowanie skanera w00tw00t za pomocą fail2ban

  • Data: 2015

Fail2Ban już świeżo po instalacji gotowy jest do współpracy z wieloma najpopularniejszymi usługami sieciowymi (m.in. ssh, ftp, smtp, http(s), pop3, imap). Nie można jednak z góry przewidzieć ataków, które pojawią się w przyszłości i tu uwidacznia się uniwersalność omawianego narzędzia. Drugim przypadkiem jest aplikacja generująca logi, które nie są zdefiniowane w standardowych filtrach. Sami możemy tworzyć nowe definicje filtrów lub szukać ich w Internecie.

Dobrym przykładem będzie blokada popularnego i zarazem upierdliwego skanera w00tw00t.at.ISC.SANS.DFind:) testującego serwery www (apache, nginx, lighttpd...) pod kontem zabezpieczeń a raczej ich braku.

W tym przykładzie użyty został jako serwer www - Nginx, natomiast równie dobrze mogłby być to Apache, ponieważ oba mają kompatybilny format logów, chyba że zmieniliśmy domyślny format. Dokonują takiej zmiany musimy sami stworzyć odpowiednie reguły filtrowania.

Zakładają, że juz mamy zainstalowane narzędzie Fail2Ban, dodanie blokady na skaner w00tw00t.at.ISC.SANS.DFind:) lub w00tw00t.at.ISC.SANS.Win32:) sprowadza się do kilku kroków:

  • Definiujemy odpowiedni filtr: nano /etc/fail2ban/filter.d/scanner-w00tw00t.conf i wklejamy poniższą zawartość:
  • [Definition]
    
    # Option:  failregex
    # Notes.:  regex to match the w00tw00t scan messages in the logfile. The
    #          host must be matched by a group named "host". The tag "" can
    #          be used for standard IP/hostname matching.
    # Values:  TEXT
    failregex = ^ .*"GET \/w00tw00t\.at\.ISC\.SANS\..+\:\).*?"
    # Option:  ignoreregex
    # Notes.:  regex to ignore. If this regex matches, the line is ignored.
    # Values:  TEXT
    ignoreregex =
    
  • Tworzymy w sekcji [JAILS] pod HTTP servers wpis scanner-w00tw00t w pliku /etc/fail2ban/jail.local
  • #
    # HTTP servers
    #
    
    [apache]
    
    enabled = false
    port    = http,https
    filter  = apache-auth
    ...
    ...
    ...
    
    [scanner-w00tw00t]
    enabled  = true
    port      = http,https # jeśli https jeśli nasz serwer www nasłuchuje na 443
    filter   = scanner-w00tw00t
    action   = iptables-allports[name=scanner-w00tw00t]
    #logpath  = /var/log/nginx/access.log
    logpath = /var/log/nginx/*.access.log
    maxretry = 1
    bantime  = 86400
    
  • Kilka słów wyjaśnień odnośnie opcji logpath, która odpowiedzialna jest za ścieżkę dostępu do pliku z logami. Na pozór nie nic skomplikowanego, natomiast spotkałem się już z problemem, kiedy fail2ban blokował wybiórczo skanowanie naszego serwera. Powodem zaistniałej sytuacji był podział logów na oddzielne pliki względem wirtualny hostów / obsługi kilku domen. Częstym błędem jest podawanie głównego pliku z logami w przypadku nginx: access.log, kiedy my chcemy żeby wszystkie strony utrzymywane na serwerze były chronione. Rozwiązaniem jest użycie trywialnego wręcz wyrażenia regularnego: "*.access.log", którego raczej nie trzeba tłumaczyć.
  • Po zrestartowaniu fail2ban sprawdzamy czy obyło się bez żadnych błędów wyświetlając logi: cat /var/log/fail2ban, mniej więcej powinno być tak:
  • 2013-11-22 13:55:52,754 fail2ban.server : INFO   Exiting Fail2ban
    2012-12-12 12:12:12,372 fail2ban.server : INFO   Changed logging target to /var/log/fail2ban.log for Fail2ban v0.8.x
    2012-12-12 12:12:12,374 fail2ban.jail   : INFO   Creating new jail 'ssh'
    2012-12-12 12:12:12,374 fail2ban.jail   : INFO   Jail 'ssh' uses poller
    ...
    ...
    2012-12-12 12:12:12,632 fail2ban.jail   : INFO   Jail 'scanner-w00tw00t' uses poller
    2012-12-12 12:12:12,635 fail2ban.filter : INFO   Added logfile = /var/log/nginx/domena.pl.access.log
    2012-12-12 12:12:12,637 fail2ban.filter : INFO   Added logfile = /var/log/nginx/subdomena1.domena.pl.access.log
    2012-12-12 12:12:12,639 fail2ban.filter : INFO   Added logfile = /var/log/nginx/subdomena2.domena.pl.access.log
    2012-12-12 12:12:12,641 fail2ban.filter : INFO   Added logfile = /var/log/nginx/domena.org.access.log
    2012-12-12 12:12:12,643 fail2ban.filter : INFO   Added logfile = /var/log/nginx/sudomena1.domena.org.access.log
    2012-12-12 12:12:12,648 fail2ban.filter : INFO   Added logfile = /var/log/nginx/sudomena2.domena.org.access.log
    2012-12-12 12:12:12,646 fail2ban.filter : INFO   Added logfile = /var/log/nginx/main.access.log
    2012-12-12 12:12:12,653 fail2ban.filter : INFO   Set maxRetry = 1
    2012-12-12 12:12:12,659 fail2ban.filter : INFO   Set findtime = 600
    2012-12-12 12:12:12,660 fail2ban.actions: INFO   Set banTime = 86400
    ...
    ...
    2012-12-12 12:12:12,689 fail2ban.jail   : INFO   Jail 'scanner-w00tw00t' started
    
  • Teraz tylko zostaje nam przetestowanie tego rozwiązania oczywiście z maszyny, która nie jest uwzględniona w ignoreip. Mając pod ręką dostęp do jakiegoś innego shella wystarczy posłużyć się poleceniem: curl http://nasze IP/w00tw00t.at.ISC.SANS.Win32:\) lub skorzystać z przeglądarki w telefonie. Prawidłową reakcję zaobserwujecie oczywiście w /var/log/fail2ban:
  • 2013-12-12 14:14:14,167 fail2ban.actions: WARNING [scanner-w00tw00t] Ban 80.50.50.200
Powrót »