|
| Защита 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 со следующими опциями
Настройка 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 блокируются, соответственно невозможно определить
открытые порты тип ОС. | | Author: [Aleksandr S. Goncharov |
| |