Защита 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 <other> 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 блокируются, соответственно невозможно определить

открытые порты тип ОС.

Обновлено: 12.03.2015