Intro
В этой статье речь поведется о том , что нужно делать , чтоб обмануть некоторые программы для удаленного определения
операционной системы (os fingerprinting). Тема безусловно тертая , и очень хорошо освещенная , но думаю новичкам
пейпер
будет полезен. Итак , приступим. Каждая операционная система обладает определенными характеристиками , которые дают
возможность ее опознать. Удаленное определение системы базируется на некоторых параметрах стека TCP/IP (например TTL) , которые могут быть различными в разных OS. Которые однако можно изменить так , что программа для определения
(Nmap,Xprobe2,p0f) опознает нашу систему неправильно.
Немного об инструментах
Nmap - самая известная программа для скана сети , в которую включены также различные функции fingerprinting.
Xprobe2 - программа для определения операционной системы работающая в основном с протоколом ICMP , реализованная с
поддержкой алгоритма fuzzy logic.
p0f - программа использующая пассивный метод определения.
Вот наиболее известные инструменты для OS fingerprinting , базирующиеся на стеке протокола TCP/IP. Рассмотрим более
подробно , как они работают по порядку.
-Nmap
Использует активный метод определения , который базируется на анализе пакетов , полученных в ответ от анализируемой
машины.
Программа подвергает машину 9 тестам (с условием что на удаленной машине есть хотя бы один открый порт), входе
которых
посылает :
-Пакет TCP с флагом SYN и ECE на открытый порт.
-Пакет NULL (т.е со всеми флагами = 0) на открытый порт TCP.
-Пакет TCP с флагами SYN,FIN,URG,PSH на открытый порт TCP.
-Пакет TCP с флагом ACK на открытый порт TCP.
-Пакет TCP с флагом SYN на закрытый порт TCP.
-Пакет TCP с флагом ACK на закрытый порт TCP.
-Пакет TCP с флагами FIN,URG,PSH на закрытый порт TCP.
-Пакет UDP на закрытый порт UDP.
-6 пакетов TCP с флагом SYN на открытый порт TCP.
Более подробно все освещено в документе nmap-fingerprinting-article.txt который идет вместе с кодом программы. Также
там
описаны параметры, на базе которых и определяется операционная система.
-Xprobe2
Также как и Nmap использует активный метод , подвергая машину 6 тестам , в которых использует преимущественно пакеты
ICMP.
Посылает на удаленную машину :
-ICMP echo request (т.е простой ping)
-ICMP timestamp request.
-ICMP address mask request.
-ICMP information request.
-Пакет UDP на закрытый порт UDP.
-Пакет TCP с флагом SYN на открытый порт TCP.
-p0f
В отличии от Xprobe2 и Nmap использьзует пассивный метод , который основан на "отлове"
входяших пакетов , и их последующем анализе. Вот некоторые анализируемые программой характеристики :
-Размер окна.
-Значение TTL.
-Присутствие флага DF в заголовке IP.
Я в своих тестах использовал p0f 2.0.3
Методы маскировки системы
Итак, предположим что мы являемся целью программы для fingerprinting. Какие варианты защиты у нас имeются?
Первый - это спрятать наши данные , т.е например не отвечать на пакeты с флагами SYN,FIN ,типичные для Nmap.
И второй - это отправить в ответ фальшивые данные о системе. Большинство опeрaционных систем позволяет изменять
параметры стека TCP/IP , и программа получив неверную информацию не сможет правильно проанализировать и определить
тип
системы. Ну и конечно же никто не запрещает совместить оба метода.Перейдем к демонстрации техник маскировки.
Я использовал для этих целей Linux 2.4.22 , Xprobe2 0.2,Nmap 3.50.
От теории к практике
Итак, для простоты ситуации предположим , что на нашем компьютере активен всего один сервис - SSH. Адрес машины -
10.0.0.222 и его имя linux. Для начала запустим Nmap :
# nmap -sS -p 22 -o -v 10.0.0.222
И вот что получаем :
Device type: general purpose
Running: Linux 2.4.x|2.5.x
OS details: Linux
Kernel 2.4.0 - 2.5.20
Как видно , результат не очень точен , теперь мы знаем что на машине крутится "какой-то Linux на ядре 2.4.0-2.5.20".
Посмотрим что нам даст Xprobe2 :
# xprobe2 -p \
tcp:22:open 10.0.0.222
...
[ + ] Primary guess:
[ + ] Host 10.0.0.222
Running OS:
"Linux Kernel 2.4.19"
(Guess probability: 100%)
И наконец p0f , но в этом случае будем действовать немного по другому - сначала запустим p0f на машине с которой мы
реализуем fingerprinting :
# p0f "host 10.0.0.222"
...
p0f: listening (SYN)
on 'etho', 206 sigs
(12generic), rule:
'host 10.0.0.222'.
А с анализируемого компьютера установим коннект с машиной с запущенным p0f. Для этого потребуется всего один SYN
пакет :
# telnet 10.0.0.200
Trying 10.0.0.200...
telnet: connect to address
10.0.0.200 : connection refused
Так как telnet порт закрыт , мы получили в ответ "connection refused". А в это время , p0f проанализировал
пойманный SYN пакет и опознал отправителя :
10.0.0.222:1036
- Linux 2.4/2.6
[hight throughput]
(up: 2 hrs)
После трех тестов , мы можем заключить , что на машине установлен Linux 2.4.x. Как уже было сказано в описании Nmap ,
его тесты заключаются в посылке TCP пакетов , которые с легкостью могут быть опознаны и заблокированны файрволлом ,
так как было бы бессмысленным присуствие таких пакетов в нормальном internet соединении. Рассмотрим простой скрипт
файрволла , базирующийся на iptables. Так как нам нужен всего один сервис SSH , наш файрволл позволит создавать
коннекты только с условием что они будут адресованы на SSH порт. Также мы желаем чтобы наш компьютер мог посылать
пакеты ICMP , и пакеты TCP только с флагом SYN (это позволит обойти 3-4 тест Nmap).
#!/bin/sh
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT
iptables -P INOUT DROP
iptables -P OUTPUT ACCEPT
# ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# established connection
iptables -A INPUT -m state --state ESTABILISHED,RELATED -j ACCEPT
# SSH
iptables -A INPUT -m state --state NEW -p tcp \
--dport ssh --tcp-flags ALL SYN -j ACCEPT
Запустим его
# ./fw.sh
Посмотрим на результаты теста Nmap :
Device type: general purpose
|media device|broadband router
Running: Linux 2.4.x,
Pace embedded, Panasonic embedded
OS details: Linux 2.4.6 - 2.4.21,
Pace digital cable TV receiver,
Panasonic IP Technology
Broadband Networking Gateway,
KX-HGW200
Система была опознана как "возможно Linux" , но программа также допускает что это может быть какой-то девайс марки
Panasonic. Посмотрим какими были ответы , запустив Nmap с опцией -vv :
OS Fingerprint:
Tseq(Class=RI%gcd=1%SI=35
BA0E%IPID=Z%TS=100hz)
T1(Resp=Y%DF=Y%W=16AO%ACK=S++
%Flags=AS%Ops=MNNTNW)
T2(Resp=N)
T3(Resp=N)
T4(Resp=N)
T5(Resp=N)
T6(Resp=N)
T7(Resp=N)
PU(Resp=N)
Как мы видим,в большинстве ответов значится (Resp=N) , это значит что Nmap не получил ответа с анализируемой машины.
Исключением являются лишь тесты 3 и 9 , в ходе которых он посылает пакет с флагами SYN,ECE и 6 пакетов с флагом SYN
(реализованные "правильно" и поэтому незаблокированные файрволлом).Посмотрим как файрволл подействует на Xprobe2 :
[ + ] Primary guess:
[ + ] Host 10.0.0.222
Running OS:
"Linux Kernel 2.4.21"
(Guess probability: 67%)
Как видно , файрволл не спасет нас от Xprobe2 , процент вероятности с которой программа опознала систему высок - 67%.
Ну и конечно же , файрволл никоим образом не воздействует на fingerprinting с использованием p0f.
Стоит заметить , что как Xprobe2 , так и p0f анализируют значение TTL отправленного в заголовке IP. В Linux это
значение по дефолту 64 , но его можно очень легко сменить :
# echo 128 > \
/proc/sys/net/ipv4/ip_default_ttl
Значение 128 используется в операционных системах семейства Windows NT. Посмотрим теперь на результат Xprobe2 :
[ + ] Primary guess:
[ + ] Host 10.0.0.222
Running OS:
"Linux Kernel 2.4.6"
(Guess probability: 64%)
Процент вероятности снизился на 3 процента. Как себя поведет p0f?
10.0.0.222:1038 - UNKNOWN
[S4:128:1:60:M1460,S,T,N,W0:.:?:?]
[high throughput] (up: 2 hrs)
Итак , изменяя значение TTL нам удалось обмануть p0f , ну и в какой то мере Xprobe2.Этот трюк однако не подействует
на Nmap - он не смотрит на значение TTL. Все три программы в ходе теста анализируют опции TCP в пакетах исходящих от
анализируемой машины. В Linux активизированны опции window scaling и timestamp. Отключаются они так :
# echo 0 > \
/proc/sys/net/ipv4/tcp_window_scaling
# echo 0 > \
/proc/sys/net/ipv4/tcp_timestamp
Посмотрим что на этот раз нам скажет Nmap :
Device type:
firewall|general purpose
Running (JUST GUESSING) :
Checkpoint Windows NT/2K/XP (92%),
Linux 2.4.x|2.6.x (91%)
Очень сложно засчитать этот результат как правильный , особенно если принимать во внимание то , что программа сама
сказала (JUST GUESSING). Результаты Xprobe2 :
[ + ] Primary guess:
[ + ] Host 10.0.0.222
Running OS:
"FreeBSD 3.5.1"
(Guess probability: 52%)
Экзамен провален , система опознана как старая версия FreeBSD с вероятностью 52%.
p0f :
10.0.0.222:1047
- Windows XP/2000
[hight throughput]
[GENERIC]
Kак говорится - результат на лицо. Как и было продемонстрировано - для того чтобы не дать себя опознать достаточно
средств которые имеются в системе. Но существуют также альтернативные средства для маскировки системы. Очень часто
они представлюят из себя патчи к ядру , или модули. Самый известный из них , пожалуй , это stealth patch. Патч имеет
несколько плюсов в себе :
- блокировка подделанных ACK пакетов.
- блокировка пакетов с неправильными флагами.
- блокировка пакетов с флагами SYN,FIN.
- "Отброс" ICMP сообщений.
Также стоит обратить внимание на инструмент IP Personality. Это ничто иное , как патчи для ядра и для iptables ,
которые позволяют изменять поведение стека TCP/IP , и как следствие симулировать другие OS. К сожалению IP
Personality больше не разрабатывается , и последняя версия была выпущена для ядра 2.4.20.
-----------------------
Author : NonexistenT-aka-Zak
e-mail : zak@pc-r00m.net
www : pc-r00m.net
Сбт Май 7 15:31:35 CEST 2005
В этой статье речь поведется о том , что нужно делать , чтоб обмануть некоторые программы для удаленного определения
операционной системы (os fingerprinting). Тема безусловно тертая , и очень хорошо освещенная , но думаю новичкам
пейпер
будет полезен. Итак , приступим. Каждая операционная система обладает определенными характеристиками , которые дают
возможность ее опознать. Удаленное определение системы базируется на некоторых параметрах стека TCP/IP (например TTL) , которые могут быть различными в разных OS. Которые однако можно изменить так , что программа для определения
(Nmap,Xprobe2,p0f) опознает нашу систему неправильно.
Немного об инструментах
Nmap - самая известная программа для скана сети , в которую включены также различные функции fingerprinting.
Xprobe2 - программа для определения операционной системы работающая в основном с протоколом ICMP , реализованная с
поддержкой алгоритма fuzzy logic.
p0f - программа использующая пассивный метод определения.
Вот наиболее известные инструменты для OS fingerprinting , базирующиеся на стеке протокола TCP/IP. Рассмотрим более
подробно , как они работают по порядку.
-Nmap
Использует активный метод определения , который базируется на анализе пакетов , полученных в ответ от анализируемой
машины.
Программа подвергает машину 9 тестам (с условием что на удаленной машине есть хотя бы один открый порт), входе
которых
посылает :
-Пакет TCP с флагом SYN и ECE на открытый порт.
-Пакет NULL (т.е со всеми флагами = 0) на открытый порт TCP.
-Пакет TCP с флагами SYN,FIN,URG,PSH на открытый порт TCP.
-Пакет TCP с флагом ACK на открытый порт TCP.
-Пакет TCP с флагом SYN на закрытый порт TCP.
-Пакет TCP с флагом ACK на закрытый порт TCP.
-Пакет TCP с флагами FIN,URG,PSH на закрытый порт TCP.
-Пакет UDP на закрытый порт UDP.
-6 пакетов TCP с флагом SYN на открытый порт TCP.
Более подробно все освещено в документе nmap-fingerprinting-article.txt который идет вместе с кодом программы. Также
там
описаны параметры, на базе которых и определяется операционная система.
-Xprobe2
Также как и Nmap использует активный метод , подвергая машину 6 тестам , в которых использует преимущественно пакеты
ICMP.
Посылает на удаленную машину :
-ICMP echo request (т.е простой ping)
-ICMP timestamp request.
-ICMP address mask request.
-ICMP information request.
-Пакет UDP на закрытый порт UDP.
-Пакет TCP с флагом SYN на открытый порт TCP.
-p0f
В отличии от Xprobe2 и Nmap использьзует пассивный метод , который основан на "отлове"
входяших пакетов , и их последующем анализе. Вот некоторые анализируемые программой характеристики :
-Размер окна.
-Значение TTL.
-Присутствие флага DF в заголовке IP.
Я в своих тестах использовал p0f 2.0.3
Методы маскировки системы
Итак, предположим что мы являемся целью программы для fingerprinting. Какие варианты защиты у нас имeются?
Первый - это спрятать наши данные , т.е например не отвечать на пакeты с флагами SYN,FIN ,типичные для Nmap.
И второй - это отправить в ответ фальшивые данные о системе. Большинство опeрaционных систем позволяет изменять
параметры стека TCP/IP , и программа получив неверную информацию не сможет правильно проанализировать и определить
тип
системы. Ну и конечно же никто не запрещает совместить оба метода.Перейдем к демонстрации техник маскировки.
Я использовал для этих целей Linux 2.4.22 , Xprobe2 0.2,Nmap 3.50.
От теории к практике
Итак, для простоты ситуации предположим , что на нашем компьютере активен всего один сервис - SSH. Адрес машины -
10.0.0.222 и его имя linux. Для начала запустим Nmap :
# nmap -sS -p 22 -o -v 10.0.0.222
И вот что получаем :
Device type: general purpose
Running: Linux 2.4.x|2.5.x
OS details: Linux
Kernel 2.4.0 - 2.5.20
Как видно , результат не очень точен , теперь мы знаем что на машине крутится "какой-то Linux на ядре 2.4.0-2.5.20".
Посмотрим что нам даст Xprobe2 :
# xprobe2 -p \
tcp:22:open 10.0.0.222
...
[ + ] Primary guess:
[ + ] Host 10.0.0.222
Running OS:
"Linux Kernel 2.4.19"
(Guess probability: 100%)
И наконец p0f , но в этом случае будем действовать немного по другому - сначала запустим p0f на машине с которой мы
реализуем fingerprinting :
# p0f "host 10.0.0.222"
...
p0f: listening (SYN)
on 'etho', 206 sigs
(12generic), rule:
'host 10.0.0.222'.
А с анализируемого компьютера установим коннект с машиной с запущенным p0f. Для этого потребуется всего один SYN
пакет :
# telnet 10.0.0.200
Trying 10.0.0.200...
telnet: connect to address
10.0.0.200 : connection refused
Так как telnet порт закрыт , мы получили в ответ "connection refused". А в это время , p0f проанализировал
пойманный SYN пакет и опознал отправителя :
10.0.0.222:1036
- Linux 2.4/2.6
[hight throughput]
(up: 2 hrs)
После трех тестов , мы можем заключить , что на машине установлен Linux 2.4.x. Как уже было сказано в описании Nmap ,
его тесты заключаются в посылке TCP пакетов , которые с легкостью могут быть опознаны и заблокированны файрволлом ,
так как было бы бессмысленным присуствие таких пакетов в нормальном internet соединении. Рассмотрим простой скрипт
файрволла , базирующийся на iptables. Так как нам нужен всего один сервис SSH , наш файрволл позволит создавать
коннекты только с условием что они будут адресованы на SSH порт. Также мы желаем чтобы наш компьютер мог посылать
пакеты ICMP , и пакеты TCP только с флагом SYN (это позволит обойти 3-4 тест Nmap).
#!/bin/sh
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT
iptables -P INOUT DROP
iptables -P OUTPUT ACCEPT
# ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# established connection
iptables -A INPUT -m state --state ESTABILISHED,RELATED -j ACCEPT
# SSH
iptables -A INPUT -m state --state NEW -p tcp \
--dport ssh --tcp-flags ALL SYN -j ACCEPT
Запустим его
# ./fw.sh
Посмотрим на результаты теста Nmap :
Device type: general purpose
|media device|broadband router
Running: Linux 2.4.x,
Pace embedded, Panasonic embedded
OS details: Linux 2.4.6 - 2.4.21,
Pace digital cable TV receiver,
Panasonic IP Technology
Broadband Networking Gateway,
KX-HGW200
Система была опознана как "возможно Linux" , но программа также допускает что это может быть какой-то девайс марки
Panasonic. Посмотрим какими были ответы , запустив Nmap с опцией -vv :
OS Fingerprint:
Tseq(Class=RI%gcd=1%SI=35
BA0E%IPID=Z%TS=100hz)
T1(Resp=Y%DF=Y%W=16AO%ACK=S++
%Flags=AS%Ops=MNNTNW)
T2(Resp=N)
T3(Resp=N)
T4(Resp=N)
T5(Resp=N)
T6(Resp=N)
T7(Resp=N)
PU(Resp=N)
Как мы видим,в большинстве ответов значится (Resp=N) , это значит что Nmap не получил ответа с анализируемой машины.
Исключением являются лишь тесты 3 и 9 , в ходе которых он посылает пакет с флагами SYN,ECE и 6 пакетов с флагом SYN
(реализованные "правильно" и поэтому незаблокированные файрволлом).Посмотрим как файрволл подействует на Xprobe2 :
[ + ] Primary guess:
[ + ] Host 10.0.0.222
Running OS:
"Linux Kernel 2.4.21"
(Guess probability: 67%)
Как видно , файрволл не спасет нас от Xprobe2 , процент вероятности с которой программа опознала систему высок - 67%.
Ну и конечно же , файрволл никоим образом не воздействует на fingerprinting с использованием p0f.
Стоит заметить , что как Xprobe2 , так и p0f анализируют значение TTL отправленного в заголовке IP. В Linux это
значение по дефолту 64 , но его можно очень легко сменить :
# echo 128 > \
/proc/sys/net/ipv4/ip_default_ttl
Значение 128 используется в операционных системах семейства Windows NT. Посмотрим теперь на результат Xprobe2 :
[ + ] Primary guess:
[ + ] Host 10.0.0.222
Running OS:
"Linux Kernel 2.4.6"
(Guess probability: 64%)
Процент вероятности снизился на 3 процента. Как себя поведет p0f?
10.0.0.222:1038 - UNKNOWN
[S4:128:1:60:M1460,S,T,N,W0:.:?:?]
[high throughput] (up: 2 hrs)
Итак , изменяя значение TTL нам удалось обмануть p0f , ну и в какой то мере Xprobe2.Этот трюк однако не подействует
на Nmap - он не смотрит на значение TTL. Все три программы в ходе теста анализируют опции TCP в пакетах исходящих от
анализируемой машины. В Linux активизированны опции window scaling и timestamp. Отключаются они так :
# echo 0 > \
/proc/sys/net/ipv4/tcp_window_scaling
# echo 0 > \
/proc/sys/net/ipv4/tcp_timestamp
Посмотрим что на этот раз нам скажет Nmap :
Device type:
firewall|general purpose
Running (JUST GUESSING) :
Checkpoint Windows NT/2K/XP (92%),
Linux 2.4.x|2.6.x (91%)
Очень сложно засчитать этот результат как правильный , особенно если принимать во внимание то , что программа сама
сказала (JUST GUESSING). Результаты Xprobe2 :
[ + ] Primary guess:
[ + ] Host 10.0.0.222
Running OS:
"FreeBSD 3.5.1"
(Guess probability: 52%)
Экзамен провален , система опознана как старая версия FreeBSD с вероятностью 52%.
p0f :
10.0.0.222:1047
- Windows XP/2000
[hight throughput]
[GENERIC]
Kак говорится - результат на лицо. Как и было продемонстрировано - для того чтобы не дать себя опознать достаточно
средств которые имеются в системе. Но существуют также альтернативные средства для маскировки системы. Очень часто
они представлюят из себя патчи к ядру , или модули. Самый известный из них , пожалуй , это stealth patch. Патч имеет
несколько плюсов в себе :
- блокировка подделанных ACK пакетов.
- блокировка пакетов с неправильными флагами.
- блокировка пакетов с флагами SYN,FIN.
- "Отброс" ICMP сообщений.
Также стоит обратить внимание на инструмент IP Personality. Это ничто иное , как патчи для ядра и для iptables ,
которые позволяют изменять поведение стека TCP/IP , и как следствие симулировать другие OS. К сожалению IP
Personality больше не разрабатывается , и последняя версия была выпущена для ядра 2.4.20.
-----------------------
Author : NonexistenT-aka-Zak
e-mail : zak@pc-r00m.net
www : pc-r00m.net
Сбт Май 7 15:31:35 CEST 2005