FreeBSD : Защита FreeBSD от OS Fingerprinting с использоанием PF firewall

Введение

Статья посвящена защите FreeBSD от удаленного определения типа ОС. Самый
популярный сетевой сканер и средство для активного определения типа ОС
это nmap, поэтому будем использовать его
для проверки нашей защиты.


Используемая ОС: FreeBSD 6.1-RELEASE-p10. Firewall PF. Предполагается
что вы знаете TCP/IP, умеете работать с FreeBSD и знакомы с PF.
Большинство описанных ниже методов можно реализовать не только в PF, но
и в других firewall. PF дан для примера, т.к. я использую его на своей
системе.

При определении ОС nmap посылает различные пакеты и анализирует
приходящие ответы.

Всего 9 тестов:
* Tseq is the TCP sequenceability test
* T1 is a SYN packet with a bunch of TCP options to open port
* T2 is a NULL packet w/options to open port
* T3 is a SYN|FIN|URG|PSH packet w/options to open port
* T4 is an ACK to open port w/options
* T5 is a SYN to closed port w/options
* T6 is an ACK to closed port w/options
* T7 is a FIN|PSH|URG to a closed port w/options
* PU is a UDP packet to a closed port


Запускаем nmap со следующими опциями
# nmap -O -vv ip_address



Настройка FreeBSD.

Начальная ситуация: есть сетевые сервисы и соответственно открытые
порты, firewall отсутствует, дополнительные настройки ОС не
производились.

# nmap -O -vv ip_address
...
Running: FreeBSD 5.X
OS details: FreeBSD 5.3
OS Fingerprint:
TSeq(Class=TR%IPID=I%TS=1000HZ)
       T1(Resp=Y%DF=Y%W=FFFF%ACK=S++%Flags=AS%Ops=MNWNNT)
       T2(Resp=N)
       T3(Resp=Y%DF=Y%W=FFFF%ACK=S++%Flags=AS%Ops=MNWNNT)
       T4(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=)
       T5(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=)
       T6(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=)
       T7(Resp=Y%DF=Y%W=0%ACK=S%Flags=AR%Ops=)
       PU(Resp=Y%DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=0%ULEN=134%DAT=E)
...
IPID Sequence Generation: Incremental



Практически все тесты работают.


Меняем переменные sysctl.
# sysctl net.inet.ip.random_id=1
# sysctl net.inet.tcp.blackhole=2
# sysctl net.inet.udp.blackhole=1



Система не будет отвечать на пакеты пришедшие на закрытый порт.

# nmap -O -vv ip_address
...
Running: FreeBSD 5.X
OS details: FreeBSD 5.2.1 (SPARC)
OS Fingerprint:
TSeq(Class=TR%IPID=RD%TS=1000HZ)
       T1(Resp=Y%DF=Y%W=FFFF%ACK=S++%Flags=AS%Ops=MNWNNT)
       T2(Resp=N)
       T3(Resp=Y%DF=Y%W=FFFF%ACK=S++%Flags=AS%Ops=MNWNNT)
       T4(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=)
       T5(Resp=N)
       T6(Resp=N)
       T7(Resp=N)
       PU(Resp=N)
...
IPID Sequence Generation: Randomized



Таким образом решена половина задачи. Остаются только 1-ый, 3-ий, 4-ый
тесты nmap.


В конфиг PF добавляем
scrub in all fragment reassemble



Нормализация трафика отбрасывает пакеты с нестандартными опциями.
# nmap -O -vv ip_address
...
Running: FreeBSD 5.X
OS details: FreeBSD 5.3
OS Fingerprint:
TSeq(Class=TR%IPID=RD%TS=1000HZ)
       T1(Resp=Y%DF=Y%W=FFFF%ACK=S++%Flags=AS%Ops=MNWNNT)
       T2(Resp=N)
       T3(Resp=N)
       T4(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=)
       T5(Resp=N)
       T6(Resp=N)
       T7(Resp=N)
       PU(Resp=N)
...
IPID Sequence Generation: Randomized


Запретим прохождение ACK пакета на открытый порт. Для этого добавляем в PF keep state правило для открытых портов. Теперь ACK пакеты проходят только для установленных соединений.
pass in quick proto tcp from to $my_ip port $ports flags S/SA synproxy state block quick all



Получаем
# nmap -O -vv ip_address
...
Running (JUST GUESSING) : Linux 1.X (85%)
Aggressive OS guesses: Linux 1.3.20 (x86) (85%)
No exact OS matches for host (test conditions non-ideal).
TCP/IP fingerprint:
TSeq(Class=TR%IPID=RD%TS=U)
       T1(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AS%Ops=ME)
       T2(Resp=N)
       T3(Resp=N)
       T4(Resp=N)
       T5(Resp=N)
       T6(Resp=N)
       T6(Resp=N)
       T7(Resp=N)
       PU(Resp=N)


На этом этапе уже невозможно достоверно определить ОС и nmap ошибается.


Следующий шаг дан в ознакомительных целях. Его использование не всегда оправдано и его невозможно реализовать в других firewall кроме PF.

В PF есть уникальная возможность фильтрации по операционным системам. Механизм определения ОС основан на passive os fingerprinting.

Важно то, что nmap имеет довольно специфические сигнатуры. Итак, в начало правил PF добавляем
block in quick from any os NMAP



Теперь в pf.os необходимо добавить сигнатуры nmap. Там уже есть, но не  все. По моим наблюдениям nmap имеет сигнатуру *:*:0:44:M1460: в
обозначениях p0f. Но * нельзя указывать во втором поле, которое  обозначает TTL, поэтому создаем строки типа
*:64:0:40:.:                                 NMAP:scan:0:NMAP scan
*:1:0:44:M1460:                           NMAP:scan:0:NMAP scan
...................
*:255:0:44:M1460:                        NMAP:scan:0:NMAP scan



Первая строка также позволит блокировать пакеты от программы hping.

Минус решения в том, что есть ОС, имеющие подобные сигнатуры, правда они малораспространены. Соответственно с этих ОС к вам не смогут подключиться. А именно:
SunOS:4.1::SunOS 4.1.x
Tru64:5.1:noRFC1323:Tru64 6.1 (no RFC1323) (or QNX 6)
TOPS-20:7::TOPS-20 version 7
ExtremeWare:4.x::ExtremeWare 4.x
SymbianOS:6048::SymbianOS 6048 (on Nokia 7650?)
Sega:Dreamcast:3.0:Sega Dreamcast Dreamkey 3.0



Смотрим результат
# nmap -O -vv ip_address
...
Warning:  OS detection will be MUCH less reliable because we did not find at least 1 open and 1 closed TCP port
All 1680 scanned ports on 10.17.16.11 are filtered
Too many fingerprints match this host to give specific OS details



Все пакеты от nmap блокируются, соответственно невозможно определить открытые порты тип ОС.
Вы только посетили наш сайт, КОММЕНТИРОВАНИЕ будет доступно через несколько минут.
возможно у Вас отключен javascript, если включен - просто обновите страницу