Активное исследование стека
Вероятно, одним из наиболее надежных и оригинальных методов определения операционной системы является отправка специально подготовленных IP-пакетов исследуемому компьютеру и анализ полученных ответов. В обычных случаях работа стека протоколов TCP/IP строго регламентирована. Однако при получении некорректно сформированных пакетов ответы не всегда идентичны. Кроме того, можно отправить фрагменты TCP-пакетов, которые не имеют реального значения. В таких случаях различные системы ведут себя по-разному (хотя часто и в пределах установленных стандартов), что позволяет определить тип и версию используемой операционной системы.
Определение операционной системы с помощью nmap
Утилита nmap (читайте статью – «Обзор возможностей и базовых приемов применения сканера nmap»), обладает встроенной возможностью идентификации типа сканируемой операционной системы. В настоящее время nmap позволяет осуществить наиболее точное определение типа и версии операционной системы. Список сигнатур операционных систем регулярно обновляется. В том случае, когда утилита не обнаруживает точного соответствия с сохраненными сигнатурами, она предоставляет список действий, необходимых для сохранения новой сигнатуры в базе данных. После этого в будущих версиях утилиты новая сигнатура будет доступна всем желающим. На данный момент в базе данных nmap хранилось более 600 сигнатур, описывающих буквально все — от сетевого оборудования до проигрывателей МРЗ. Для определения типа операционной системы nmap использует внушительный список тестов:
- изучение начальной последовательности;
- отправка SYN-пакета на открытый порт с набором различных параметров TCP;
- отправка NULL-пакета (без установленных флагов) с набором различных параметров на открытый порт;
- отправка пакета с установленными флагами SYN | FIN | URG | PSH и набором различных параметров TCP на открытый порт;
- отправка ACK-пакета с набором различных параметров TCP на открытый порт;
- отправка SYN-пакета на закрытый порт с набором различных параметров TCP;
- отправка ACK-пакета с набором различных параметров TCP на закрытый порт;
- отправка пакета с установленными флагами FIN, PSH, URG и набором различных параметров TCP на закрытый порт;
- отправка UDP-пакета на закрытый порт.
Для идентификации типа операционной системы с помощью nmap в консоли достаточно указать параметр –O:
# nmap -vv -sS -O localhost Starting Nmap 5.21 ( http://nmap.org ) at 2010-11-03 22:32 EET Warning: Hostname localhost resolves to 2 IPs. Using 127.0.0.1. Initiating SYN Stealth Scan at 22:32 Scanning localhost (127.0.0.1) [1000 ports] Discovered open port 3306/tcp on 127.0.0.1 Discovered open port 139/tcp on 127.0.0.1 Discovered open port 80/tcp on 127.0.0.1 Discovered open port 445/tcp on 127.0.0.1 Discovered open port 22/tcp on 127.0.0.1 Discovered open port 631/tcp on 127.0.0.1 Completed SYN Stealth Scan at 22:32, 0.09s elapsed (1000 total ports) Initiating OS detection (try #1) against localhost (127.0.0.1) Nmap scan report for localhost (127.0.0.1) Host is up (0.000066s latency). Hostname localhost resolves to 2 IPs. Only scanned 127.0.0.1 rDNS record for 127.0.0.1: localhost.localdomain Scanned at 2010-11-03 22:32:04 EET for 1s Not shown: 994 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 139/tcp open netbios-ssn 445/tcp open microsoft-ds 631/tcp open ipp 3306/tcp open mysql Device type: general purpose Running: Linux 2.6.X OS details: Linux 2.6.17 - 2.6.24 TCP/IP fingerprint: OS:SCAN(V=5.21%D=11/3%OT=22%CT=1%CU=34487%PV=N%DS=0%DC=L%G=Y%TM=4CD1C6C6%P= OS:i686-pc-linux-gnu)SEQ(SP=CB%GCD=1%ISR=D2%TI=Z%CI=Z%II=I%TS=U)OPS(O1=M400 OS:C%O2=M400C%O3=M400C%O4=M400C%O5=M400C%O6=M400C)WIN(W1=8018%W2=8018%W3=80 OS:18%W4=8018%W5=8018%W6=8018)ECN(R=Y%DF=Y%T=40%W=8018%O=M400C%CC=N%Q=)T1(R OS:=Y%DF=Y%T=40%S=O%A=S+%F=AS%RD=0%Q=)T2(R=N)T3(R=Y%DF=Y%T=40%W=8018%S=O%A= OS:S+%F=AS%O=M400C%RD=0%Q=)T4(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R OS:=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F OS:=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N% OS:T=40%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD OS:=S) Network Distance: 0 hops TCP Sequence Prediction: Difficulty=203 (Good luck!) IP ID Sequence Generation: All zeros Read data files from: /usr/share/nmap OS detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 2.61 seconds Raw packets sent: 1019 (45.598KB) | Rcvd: 2047 (87.048KB) |
В разделе отчета TCP/IP fingerprint отображается подробная информация, полученная nmap в ответ на выполненные тесты. Если nmap не в состоянии найти соответствие с сигнатурами из базы данных, то она выдает адрес URL, на который можно отправить полученную сигнатуру для ее добавления в новые версии nmap.
Кроме того, nmap проверяет не только открытые, но и закрытые порты. Поэтому результаты выполнения nmap более подробны и надежны. Да, и потому, что nmap является средством сканирования, нет необходимости задавать определенные порты для тестирования, nmap определит их самостоятельно.
Единственной проблемой при идентификации операционной системы с помощью nmap является распознавание версии Windows.
Утилита xprobe
Принцип работы утилиты xprobe, предназначенной для определения версии операционной системы удаленного хоста, которая вместо протокола TCP для определения операционных систем использует возможности IСМР.
В первую очередь утилита xprobe отправляет UDP-пакет на порт с большим номером (по умолчанию на порт 32132) тестируемого хоста. Предполагается, что этот порт не используется никакой службой и тестируемый хост возвратит ICMP-пакет с сообщением об ошибке. По полученным битам этого ответного пакета xprobe может сузить круг возможных операционных систем. Дополнительные пакеты позволяют уточнить тип и версию операционной системы удаленного хоста. Отправка новых пакетов осуществляется до тех пор, пока у xprobe не останется никаких правил, по которым бы можно было отличить конкретную операционную систему.
# xprobe2 -v localhost Xprobe2 v.0.3 Copyright (c) 2002-2005 fyodor@o0o.nu, ofir@sys-security.com, meder@o0o.nu [+] Target is localhost [+] Loading modules. [+] Following modules are loaded: [x] [1] ping:icmp_ping - ICMP echo discovery module [x] [2] ping:tcp_ping - TCP-based ping discovery module [x] [3] ping:udp_ping - UDP-based ping discovery module [x] [4] infogather:ttl_calc - TCP and UDP based TTL distance calculation [x] [5] infogather:portscan - TCP and UDP PortScanner [x] [6] fingerprint:icmp_echo - ICMP Echo request fingerprinting module [x] [7] fingerprint:icmp_tstamp - ICMP Timestamp request fingerprinting module [x] [8] fingerprint:icmp_amask - ICMP Address mask request fingerprinting module [x] [9] fingerprint:icmp_port_unreach - ICMP port unreachable fingerprinting module [x] [10] fingerprint:tcp_hshake - TCP Handshake fingerprinting module [x] [11] fingerprint:tcp_rst - TCP RST fingerprinting module [x] [12] fingerprint:smb - SMB fingerprinting module [x] [13] fingerprint:snmp - SNMPv2c fingerprinting module [+] 13 modules registered [+] Initializing scan engine [+] Running scan engine [-] ping:tcp_ping module: no closed/open TCP ports known on 127.0.0.1. Module test failed [-] ping:udp_ping module: no closed/open UDP ports known on 127.0.0.1. Module test failed [-] No distance calculation. 127.0.0.1 appears to be dead or no ports known [+] Host: 127.0.0.1 is up (Guess probability: 50%) [+] Target: 127.0.0.1 is alive. Round-Trip Time: 0.00013 sec [+] Selected safe Round-Trip Time value is: 0.00025 sec [-] fingerprint:tcp_hshake Module execution aborted (no open TCP ports known) [-] fingerprint:smb need either TCP port 139 or 445 to run [-] fingerprint:snmp: need UDP port 161 open [+] Primary guess: [+] Host 127.0.0.1 Running OS: "Linux Kernel 2.4.22" (Guess probability: 100%) [+] Other guesses: [+] Host 127.0.0.1 Running OS: "Linux Kernel 2.4.23" (Guess probability: 100%) [+] Host 127.0.0.1 Running OS: "Linux Kernel 2.4.21" (Guess probability: 100%) [+] Host 127.0.0.1 Running OS: "Linux Kernel 2.4.20" (Guess probability: 100%) [+] Host 127.0.0.1 Running OS: "Linux Kernel 2.4.19" (Guess probability: 100%) [+] Host 127.0.0.1 Running OS: "Linux Kernel 2.4.24" (Guess probability: 100%) [+] Host 127.0.0.1 Running OS: "Linux Kernel 2.4.25" (Guess probability: 100%) [+] Host 127.0.0.1 Running OS: "Linux Kernel 2.4.26" (Guess probability: 100%) [+] Host 127.0.0.1 Running OS: "Linux Kernel 2.4.27" (Guess probability: 100%) [+] Host 127.0.0.1 Running OS: "Linux Kernel 2.4.28" (Guess probability: 100%) [+] Cleaning up scan engine [+] Modules deinitialized [+] Execution completed. |
С помощью отправки ICMP-запроса об отметке времени (Timestamp) утилита xprobe смогла определить, что интересующий компьютер, скорее всего, работает под управлением Linux Kernel 2.4.22, но не исключаются и другие версии. В данном случае ОС определена не верно, как мне кажется по одной единственно причине — обновление сигнатур закончилось в 2005 году, хотя в репозиториях она до сих есть, зачем даже не знаю.
Работа утилиты xprobe невозможна без получения ответа на начальный UDP-пакет, так как она использует результаты этого теста для предварительных выводов об операционной системе удаленного хоста.
Не исключаю и других способов определения операционной системы.
Как бороться с активным исследованием стека
При установке брандмауэра перед компьютером все программы определения операционной системы будут получать сведения об операционной системе самого брандмауэра, которая может отличаться от операционной системы искомого хакером компьютера.
Для защиты от действий утилиты xprobe будет достаточно заблокировать отправку ответных ICMP-сообщений при получении UDP-пакетов на закрытый порт. Правда, это может привести к блокированию работы других служб. Поэтому этот метод не рекомендуется применять при широком использовании программного обеспечения, базирующегося на возможностях протокола UDP.
Средства наподобие iPLog (программа-регистратор пакетов), доступные на сайте ojnk.sourceforge.net (см. ojnk.sourceforge.net), позволяют отправлять ответные пакеты, которые предназначены для дезинформации утилиты nmap, что приведет к ошибочному определению операционной системы. Чтобы обмануть все известные программы активного исследования стека, можно установить программу iPPersonality (доступна по адресу ippersonality.sourceforge.net (см. ippersonality.sourceforge.net) только для версии ядра 2.4), которая, взаимодействуя с утилитами netfilter и iptables, позволяет имитировать любую операционную систему.
очень хорошая статья, спасибо!
Оказывается так легко посмотреть какая ОС стоит на нужном компе, и не нужны не какие сервисы для определение