Nmap widzi przez iptables?
Napisał: Patryk Krawaczyński
23/11/2013 w Bezpieczeństwo Brak komentarzy. (artykuł nr 423, ilość słów: 609)
Z
ałóżmy, że na moim serwerze posiadam zainstalowany tylko serwer MySQL, który nasłuchuje na wszystkich interfejsach (zewnętrzny / wewnętrzny / lokalny). Jednak za pomocą netfilter ograniczam do niego dostęp tylko do interfejsu zwrotnego, a w przyszłości wybiorę kolejne adresy IP, które będą mogły się z nim łączyć. Wydaje proste polecenie iptables:
iptables -A INPUT -p tcp --dport 3306 ! -s 127.0.0.1 -j DROP
A więc mój firewall wygląda następująco:
[root@darkstar ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere DROP tcp -- !localhost.localdomain anywhere tcp dpt:mysql Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere
Z innego serwera za pomocą klienta MySQL próbuje się połączyć z serwerem, aby upewnić się, że połączenie zostanie odrzucone. I tak jest. Dla spokoju ducha za pomocą nmap sprawdzam, jak wygląda to z jego punktu widzenia:
intruder:~# nmap -v darkstar.com Starting Nmap 5.00 ( http://nmap.org ) at 2013-11-23 21:10 CET NSE: Loaded 0 scripts for scanning. Initiating Ping Scan at 21:10 Scanning 12.34.56.78 [4 ports] Completed Ping Scan at 21:10, 0.03s elapsed (1 total hosts) Initiating Parallel DNS resolution of 1 host. at 21:10 Completed Parallel DNS resolution of 1 host. at 21:10, 0.00s elapsed Initiating SYN Stealth Scan at 21:10 Scanning darkstar.com (12.34.56.78) [1000 ports] Completed SYN Stealth Scan at 21:10, 1.23s elapsed (1000 total ports) Host darkstar.com (12.34.56.78) is up (0.00036s latency). Interesting ports on darkstar.com (12.34.56.78): Not shown: 999 closed ports PORT STATE SERVICE 3306/tcp filtered mysql Read data files from: /usr/share/nmap Nmap done: 1 IP address (1 host up) scanned in 1.33 seconds
Upewniłem się, że mój firewall blokuje dostęp do serwera MySQL, ale nie za bardzo pasuje mi to, że nmap przez proste skanowanie portów jest w stanie powiedzieć, że na moim serwerze teoretycznie zainstalowany jest serwer MySQL. Jak to jest możliwe? Odpowiedź tkwi w sposobie, w jaki firewall odpowiada na żądanie połączenia. Jeśli reguła łańcucha trafia w sposób postępowania typu DROP
– przychodzący pakiet po prostu jest ignorowany. Jest to zupełnie inny sposób niż ten, który wykonywany jest przez system operacyjny, gdy żadna aplikacja nie nasłuchuje na danym porcie – wówczas system odpowiada na żądanie pakietem TCP RST
. Dlatego dość sprytny skaner portów jest w stanie odróżnić, który port jest nieużywany, a który zwyczajnie filtrowany. Jeśli chcemy, aby nasz firewall zachował się identycznie jak system operacyjny wystarczy w/w regułę zastąpić następującym wpisem:
iptables -A INPUT -p tcp --dport 3306 ! -s 127.0.0.1 -j REJECT --reject-with tcp-reset
Powtarzając skanowanie skanerem nmap – wyniki są następujące:
intruder:~# nmap -v darkstar.com Starting Nmap 5.00 ( http://nmap.org ) at 2013-11-23 21:18 CET Nmap scan report for darkstar.com (12.34.56.78) Host is up (0.000015s latency). All 1000 scanned ports on darkstar.com (12.34.56.78) are closed Read data files from: /usr/share/nmap Nmap done: 1 IP address (1 host up) scanned in 16.96 seconds
Więcej informacji: Filtered: NMAP Port Scanner Sees Through IPtables Firewall, NMAP vs IPTables