J3qx

Просто еще один WordPress.com блог

Os Fingerprinting: Теория И Практика

Опубликовал j3qx на Январь 8, 2009

Os Fingerprinting : Теория И Практика

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.

(С) damagelab.org

Ответить

XHTML: Вы можете использовать эти метки: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>