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

Статья посвящена защите FreeBSD от удаленного определения типа ОС. /* Подробная статья об алгоритмах анализа удаленной системы, в частности об определении типа и версии удаленной ОС (OS fingerprinting) на основе поведения стека TCP/IP удаленного хоста, публиковалась в «Сетевых Решениях» № 11 за 2000 год. с названием «Определение операционной системы удаленного хоста» */

исходные данные

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

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

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

Всего проводится 9 тестов:

- Tseq - определение закона изменения sequence number;
- T1 – SYN-пакет с TCP-опциями на открытый порт;
- T2 – NULL-пакет с опциями на открытый порт;
- T3 - SYN|FIN|URG|PSH-пакет с опциями на открытый порт;
- T4 – ACK-пакет с опциями на открытый порт;
- T5 – SYN-пакет с опциями на закрытый порт;
- T6 – ACK-пакет с опциями на закрытый порт;
- T7 - FIN|PSH|URG-пакет с опциями на закрытый порт;
- PU – UDP-пакет на закрытый порт.

Запускаем nmap со следующими опциями:

# nmap -O -vv ip_address

настройка FreeBSD

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

# 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’ом:

# 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 ошибается.

Следующий шаг дан в ознакомительных целях. Его использование не всегда оправдано, и его невозможно реализовать с помощью других файрволлов. В 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 блокируются, соответственно невозможно определить открытые порты тип ОС.



Александр Гончаров


Сетевые решения. Статья была опубликована в номере 10 за 2006 год в рубрике sysadmin

©1999-2024 Сетевые решения