Ідентифікація утиліт ICMP, Локальні мережі, статті

Мережеві рішення

В даний час існує декілька спеціальних утиліт, які дозволяють створювати ICMP датаграми із заданими параметрами. Вони можуть використовуватися для різних цілей: власне детектування хоста (У тому числі більш просунуте, ніж просто ping), ідентифікація ОС і т.д. У даній статті будуть розглядатися особливості утиліт, за допомогою яких створюються різні ICMP-датаграми. Якщо ми зможемо визначити використовувану в конкретному випадку утиліту, то відповідно зможемо визначити і тип ОС, на якій вона виконується (особливості ОС так чи інакше будуть впливати на її роботу).

В наше поле зору потраплять наступні утиліти ICMP:
– ‘Ping’, з набору iputils, що йде разом з RedHat Linux (kernel 2.2.14)
– HPING2 beta 54 від antirez (http://sourceforge.net/projects/hping2)
– Nemesis v1.1 від obecian (http://www.packetfactory.net/Projects/Nemesis) (http://www.packetninja.net/nemesis/)
– Icmpenum v1.1.1, від Simple Nomad (http://razor.bindview.com)
– SING v1.0 від Alfredo Andres Omella (http://www.sourceforge.net/projects/sing)
Тип ICMP-повідомлення, який ми будемо визначати у всіх утилітах – ICMP Echo. Всі утиліти в прикладах будуть виконуватися під RedHat Linux, кernel 2.2.14.

Запит ICMP Echo

RFC 792 – Internet Control Message Protocol (http://www.ietf.org/rfc/rfc0792.txt) – визначає способи посилки запитів ICMP Echo. Посилає сторона ініціалізує ідентифікатор (він використовується для унікальної ідентифікації ЕCHO-запитів) і sequence number (у разі якщо один хост паралельно пінгуєтся декількома пакетами), крім того в в поле даних пакета додаються деякі дані (взагалі кажучи, довільні), далі пакет відправляється на конкретний хост. Хосту-одержувачу необхідно тільки змінити тип датаграми на Echo reply і повернути її відсилаємо її хосту (а також контрольну суму ICMP-заголовка).

Відмінності між утилітами

Тип Запитів Echo, які використовує утиліта Linux ping.
Нижче наводиться результат запиту Echo, який генерує утиліта ping з набору iputils (Redhat Linux based on Kernel 2.2.14):

[root@godfather sbin]# ping -c 2 y.y.y.y 
PING y.y.y.y (y.y.y.y) from x.x.x.x : 56(84) bytes of data. 
64 bytes from hostname (y.y.y.y): icmp_seq=0 ttl=255 time=0.1 ms 
64 bytes from hostname (y.y.y.y): icmp_seq=1 ttl=255 time=0.1 ms 
 
--- y.y.y.y ping statistics --- 
2 packets transmitted, 2 packets received, 0% packet loss 
round-trip min/avg/max = 0.1/0.1/0.1 ms 
[root@godfather sbin]#

Дамп, який видає сніфер snort:

11/01-23:09:51.398772 x.x.x.x —> y.y.y.y 
ICMP TTL:64 TOS:0x0 ID:38 
ID:1037   Seq:0  ECHO 
9F 86 00 3A 85 15 06 00 08 09 0A 0B 0C 0D 0E 0F  ...:............ 
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F  ................ 
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F   !"#$%&'()*+,-./ 
30 31 32 33 34 35 36 37                          01234567 
 
11/01-23:09:51.398819 y.y.y.y -> x.x.x.x 
ICMP TTL:255 TOS:0x0 ID:39 
ID:1037   Seq:0  ECHO REPLY 
9F 86 00 3A 85 15 06 00 08 09 0A 0B 0C 0D 0E 0F  ...:............ 
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F  ................ 
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F   !"#$%&'()*+,-./ 
30 31 32 33 34 35 36 37                          01234567

Нижче наведено посилається ICMP запит:

11/01-23:09:52.391176 x.x.x.x —> y.y.y.y 
ICMP TTL:64 TOS:0x0 ID:40 
ID:1037   Seq:1  ECHO 
A0 86 00 3A EB F7 05 00 08 09 0A 0B 0C 0D 0E 0F  ...:............ 
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F  ................ 
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F   !"#$%&'()*+,-./ 
30 31 32 33 34 35 36 37                          01234567 
 
11/01-23:09:52.391220 y.y.y.y -—> x.x.x.x 
ICMP TTL:255 TOS:0x0 ID:41 
ID:1037   Seq:1  ECHO REPLY 
A0 86 00 3A EB F7 05 00 08 09 0A 0B 0C 0D 0E 0F  ...:............ 
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F  ................ 
20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F   !"#$%&'()*+,-./ 
30 31 32 33 34 35 36 37                          01234567

Необхідно пам’ятати кілька важливих фактів, які використовуються для ідентифікації ОС. Ping (також як інші утиліти в unix) використовує поле даних довжиною 56 байт, тому загальна довжина IP-датаграми складає 84 байта. Початкове значення ICMP sequence number – 0 і приріст береться рівним одиниці. Ping використовує за умовчанням 64 в якості значення для поля TTL в запиті ICMP echo.
Крім того, слід враховувати те, як визначаються значення IP ID. Трасування використовувалася безпосередньо після завантаження системи. Перше значення IP ID, яке було використано – двозначне десяткове число. Приріст – 1. ICMP ID утиліти ping визначається рівним ID процесу, який породжується під час запуску ping.

HPING2

Утиліта HPING2 дозволяє генерувати спеціальні ICMP пакети та переглядати відповіді пінгуемого хоста в стилі звичайного утиліти ping. HPING2 підтримує фрагментацію, дозволяє визначати розмір і вміст тіла пакета і може використовуватися для передачі файлів по підтримуваним протоколам (для Linux і * BSD).
Далі призведе приклад echo запиту, що генерується HPING2:

— [root@godfather sbin]# hping2 -1 -c 2 y.y.y.y 
— default routing not present 
— HPING y.y.y.y (y.y.y.y): icmp mode set, 28 headers + 0 data bytes 
— 28 bytes from y.y.y.y: icmp_seq=0 ttl=255 id=36 rtt=0.8 ms 
— 28 bytes from y.y.y.y: icmp_seq=1 ttl=255 id=37 rtt=0.7 ms 
 
--- y.y.y.y hping statistic --- 
2 packets tramitted, 2 packets received, 0% packet loss 
round-trip min/avg/max = 0.7/0.7/0.8 ms 
[root@godfather sbin]#

Відповідно дамп сніфера snort:

By Martin Roesch (roesch@clark.net, www.snort.org)

11/01-23:08:48.338644 x.x.x.x -> y.y.y.y 
ICMP TTL:64 TOS:0x0 ID:14546 
ID:1032   Seq:0  ECHO 
 
11/01-23:08:48.338691 y.y.y.y -> x.x.x.x 
ICMP TTL:255 TOS:0x0 ID:36 
ID:1032   Seq:0  ECHO REPLY

Зверніть увагу на той факт, що в тілі пакету echo-запиту, що генерується HPING2, за замовчуванням не міститься даних. За замовчуванням загальний розмір пакета – 28 байт. Як і звичайний ping, HPING2 використовує ID свого процесу в якості значення поля ICMP ID.

[root@godfather /root]# ps aux | grep hping 
root   4826  0.0  0.4  1200  512 pts/1   S   19:57   0:00 [root@godfather /root]# 
 
11/04-19:57:44.846703 x.x.x.x -> y.y.y.y 
ICMP TTL:64 TOS:0x0 ID:57750 
ID:4826   Seq:20  ECHO 
In the sendicmp.c the program states: icmp ->un.echo.id = getpid();

Вище було наведено лише перший запит ICMP echo. Як же виглядатиме другий?

11/01-23:08:49.331187 x.x.x.x -> y.y.y.y 
ICMP TTL:64 TOS:0x0 ID:19756 
ID:1032   Seq:1  ECHO 
 
11/01-23:08:49.331233 y.y.y.y —> x.x.x.x 
ICMP TTL:255 TOS:0x0 ID:37 
ID:1032   Seq:1  ECHO REPLY 
 
23:08:49.331187 > x.x.x.x > y.y.y.y: icmp: echo request (ttl 64, id 19756) 
	4500 001c 4d2c 0000 4001 2fb3 xxxx xxxx 
	yyyy yyyy 0800 eefb 0804 0100

Порівнюючи першу пару ICMP echo пакетів запит-відповідь з другою парою можна помітити, що вони не ідентичні. Різниця присутній за наступними параметрами:
– Різні ідентифікаційні номери в IP пакетах;
– Використовувані sequence numbers та їх приріст відносно один одного;
– Контрольна сума ICMP заголовка (змінюється оскільки змінюється sequence number).
Можна також зробити висновок, що значення поля IP ID не синхронізується з ID процесу ОС. У наведених вище прикладах, HPING2 використовує для IP ID значення 14546 і 19756, у той час як ОС, відповідності, – 36 і 37 (це легко перевірити на локальній системі через loopback і переконатися, що значення IP ID обчислюється випадково)
Таким чином дійсно корисний факт, що стосується HPING2, той, що поле даних має нульовий розмір.

Nemesis

Nemesis – набір утиліт для генерації пакетів TCP / UDP / ICMP / ARP / DNS / RIP / IGMP / OSPF із заданими властивостями (Linux, xBSD, Solaris).
Відповідно наводиться запит ICMP echo, який генерується однією з утиліт набору. Додатково використовуються опції-vv (verbose mode – додаткова інформація),-с (ICMP code value – значення, яким буде забиватися поле даних)

[root@godfather /root]# nemesis-icmp -vv -i 8 -c 0 -S x.x.x.x -D y.y.y.y

ICMP Packet Injection -=- The NEMESIS Project 1.1(c) 1999, 2000 obecian

[IP]  x.x.x.x > y.y.y.y 
[Type] ECHO REQUEST 
[Sequence number] 0 
[IP ID] 0 
[IP TTL] 254 
[IP TOS] 0x18 
[IP Frag] 0x4000 
Wrote 48 bytes

ICMP пакет згенерований. Трасування, отримана за допомогою tcpdump:

00:27:16.153322 > x.x.x.x > y.y.y.y: icmp: echo request (DF) [tos 0x18]  (ttl 254, id 29) 
	4518 0030 001d 4000 fe01 7e95 xxxx xxxx 
	yyyy yyyy 0800 f7ff 0000 0000 0000 0000 
	0000 0000 0000 0000 0000 0000 0000 0000 
 
00:27:16.153375 > y.y.y.y > x.x.x.x: icmp: echo reply [tos 0x18]  (ttl 255, id 30) 
	4518 0030 001e 0000 ff01 bd94 yyyy yyyy 
	xxxx xxxx 0000 ffff 0000 0000 0000 0000 
	0000 0000 0000 0000 0000 0000 0000 0000

Цікавить нас інформація, яку можна испльзовать для ідентифікації Nemesis:
• значення поля TOS (type of service) встановлено в 0x18 (за замовчуванням долно використовуватися 0x00);
• біт DF;
• значення поля TTL – 254 (ОС, ктор ми іспользуетм в нашому випадку, використовує за замовчуванням значення 64 для пакетів ICMP echo);
• значення поля ідентифікатора ICMP дорівнює нулю (ICMP_ID = 0);
• значення поля ICMP Sequence Number дорівнює нулю (ICMP_Seq = 0);
• обсяг поля даних дорівнює 20 байтам (у той час як Linux та інші unix клони використовують 56 байт, а Microsoft Windows – соответствено 32). Це означає, що за замовчуванням, довжина датаграми, яку генерує Nemesis для запитів ICMP echo, – 48 байт. Всі 20 байт поля даних дорівнюють нулю.

Далі приведена друга пара запитів ICMP echo:

00:27:23.294060 > x.x.x.x > y.y.y.y: icmp: echo request (DF) [tos 0x18]  (ttl 254, id 31) 
	4518 0030 001f 4000 fe01 7e93 xxxx xxxx 
	yyyy yyyy 0800 f7ff 0000 0000 0000 0000 
	0000 0000 0000 0000 0000 0000 0000 0000 
00:27:23.294097 > y.y.y.y > x.x.x.x: icmp: echo reply [tos 0x18]  (ttl 255, id 32) 
	4518 0030 0020 0000 ff01 bd92 yyyy yyyy 
	xxxx xxxx 0000 ffff 0000 0000 0000 0000 
	0000 0000 0000 0000 0000 0000 0000 0000

Як можна помітити, друга пара ідентична першої за винятком значення ідентифікатора IP (який використовується самої ОС) Контрольна сума ICMP заголовка однакова в обох випадках, оскільки ICMP sequence number та ідентифікатор ICMP одні й ті ж.
Obecian обіцяє скоро випустити нову версію (v2.0) Nemesis, в якій істотно розширяться можливості створення специфічних пакетів.

Icmpenum

Icmpenum – демонстраційна утиліта, написана Simple Nomad. З її допомогою можна генерувати основні типи ICMP запитів: Echo, TimeStamp, Information.

Дамп ICMP echo:

[root@godfather /root]# ./icmpenum -i 1 IP_Address 
 
11/04-19:40:22.256600 x.x.x.x -> y.y.y.y 
ICMP TTL:255 TOS:0x0 ID:666 
ID:39426   Seq:0  ECHO 
 
11/04-19:40:22.256662 y.y.y.y -> x.x.x.x 
ICMP TTL:255 TOS:0x0 ID:18 
ID:39426   Seq:0  ECHO REPLY 
 
19:40:22.256600   > x.x.x.x > y.y.y.y: icmp: echo request (ttl 255, id 666) 
	4500 001c 029a 0000 ff01 bb44 xxxx xxxx 
	yyyy yyyy 0800 f565 029a 0000

Таким чином, можна зробити висновок, що розмір генерованого пакета завжди дорівнює 28 байтам, причому поле даних – пусте. Зробимо інший запит ICMP echo:

11/04-19:40:43.826947 x.x.x.x -> y.y.y.y 
ICMP TTL:255 TOS:0x0 ID:666 
ID:39426   Seq:0  ECHO 
 
11/04-19:40:43.826992 y.y.y.y -> x.x.x.x 
ICMP TTL:255 TOS:0x0 ID:19 
ID:39426   Seq:0  ECHO REPLY

Значення IP ID завжди дорівнює 0х029a (десяткове 666). ICMP sequence number завжди дорівнює 0. IP TTL – 255. Таким чином, уже цих даних досить для ідентифікації icmpenum.

SING (Send ICMP Nasty Garbage)

SING – “швейцарський ніж” ICMP. Дана утиліта дозволяє дуже гнучко визначати параметри пакетів протоколу ICMP (Linux, * BSD, Solaris). Ось приклад відпрацювання запиту ICMP:

[root@godfather /root]# sing -c 4 y.y.y.y 
SINGing to y.y.y.y (y.y.y.y): 16 data bytes 
16 bytes from y.y.y.y: seq=0 ttl=255 TOS=0 time=0.169 ms 
16 bytes from y.y.y.y: seq=1 ttl=255 TOS=0 time=0.155 ms 
16 bytes from y.y.y.y: seq=2 ttl=255 TOS=0 time=0.136 ms 
16 bytes from y.y.y.y: seq=3 ttl=255 TOS=0 time=0.136 ms 
 
--- y.y.y.y sing statistics --- 
4 packets transmitted, 4 packets received, 0% packet loss 
round-trip min/avg/max = 0.136/0.149/0.169 ms 
[root@godfather /root]#

А ось дамп вступників пакетів:

00:24:59.011868 > x.x.x.x > y.y.y.y: icmp: echo request (ttl 255, id 13170) 
	4500 0024 3372 0000 ff01 8a64 xxxx xxxx 
	yyyy yyyy 0800 7cad 3c04 0000 2be6 e039 
	332e 0000 
 
00:24:59.011908 > y.y.y.y > x.x.x.x: icmp: echo reply (ttl 255, id 25) 
	4500 0024 0019 0000 ff01 bdbd yyyy yyyy 
	xxxx xxxx 0000 84ad 3c04 0000 2be6 e039 
	332e 0000

Наступна інформація може використовуватися для ідентифікації SING.
• IP TTL – 255 (для нашої Linux за замовчуванням IP TTL одно 64)
• ідентифікатор ICMP – 0x3c04 (1084). ICMP ID дорівнює значенню ID процесу SING
• використовуються тільки 8 байт в поле даних, вони в свою чергу використовуються для обчислення RTT. Отже, загальна довжина датаграми з ICMP echo – 36 байт.
Трасування tcpdump другої пари пакетів запит-відповідь:

00:25:00.004593 > x.x.x.x > y.y.y.y: icmp: echo request (ttl 255, id 13170) 
	4500 0024 3372 0000 ff01 8a64 xxxx xxxx 
	yyyy yyyy 0800 d6c9 3c04 0100 2ce6 e039 
	d711 0000 
 
00:25:00.004630 > y.y.y.y > x.x.x.x: icmp: echo reply (ttl 255, id 26) 
	4500 0024 001a 0000 ff01 bdbc yyyy yyyy 
	xxxx xxxx 0000 dec9 3c04 0100 2ce6 e039 
	d711 0000

Друга пара запитів ICMP Echo дозволяє зробити висновок, що:
• значення IP ID використовується одне і теж;
• sequence number відрізняються (приріст залишається рівним одиниці), тому контрольна сума ICMP заголовка різна.

Способи ідентифікації ОС, на якій виконувалася утиліта (на прикладі SING)

Якщо ви не хочете заглиблюватися в вихідні тексти, тоді необхідно врахувати кілька фактів, які допоможуть проідентифікувати ОС, на якій виконувалися різновиди утиліти ping. Розглянемо ці факти на прикладі SING. Коли SING запускається з під Linux або xBSD, то вона використовує як IP ID константу 0x3372. В даному випадку виняток становить Solaris, оскільки ця ОС не дозволяє визначати IP ID для пакета. Таким чином існує простий спосіб ідентіфіцікаціі SING, коли вона виконується на Solaris.
Крім того, можна використовувати той факт, що за замовчуванням Solaris встановлює в запиті ICMP біт DF (і в даному випадку SING не виняток).
Значення поля ICMP ID визначається ID процесу SING в конкретній ОС. Якщо ми зможемо для різних ОС приблизно уявити діапазон значень виділяються процесу SING, то це також наблизить нас до вирішення поставленої завдання. Наприклад, в Linux безпосередньо після завантаження значення ICMP ID одно 3c04, FreeBSD cоответственно – 1b03 і Solaris – 7330 hex.

Інші типи запитів ICMP

Ми розглянули тільки один вид запитів ICMP – echo. Якщо взяти до уваги інші типи, то це дозволить додатково підвищити точність ідентифікації конкретної використовуваної утиліти, але при цьому необхідно враховувати, що echo – це єдиний тип ICMP-повідомлень, який підтримують практично всі ОС.

Різні опції в різних утилітах

Іноді, проглядаючи дамп трасування ICMP датаграм, можна впевнено слелать висновок, що значення для будь-якого поля було спеціально підібрано. Чи можна на основі цього ідентифікувати використовувану утиліту?
У більшості випадків – так. При цьому неважливо, який конкретно тип ICMP-запиту використовується, оскільки маніпуляції зі значеннями полів залишаються специфічними для кожної конкретної утиліти.

Мімікрія під різні ОС

Єдина утиліта, що володіє даної здатністю, яку я бачив, – це SING.

Шаблони сніфера snort

Далі наводяться шаблони snort для ідентифікації описаних в даній статті утиліт. Використання поля TOS додано в останній версії snort (при цьому біт DF до сих пір не враховується):

alert icmp !$HOME_NET any -> $HOME_NET any 
(msg:"SING Echo from LINUX/*BSD"; id:13170;  itype: 8; dsize: 8;) 
 
alert icmp !$HOME_NET any -> $HOME_NET any 
(msg:"SING Echo from Sun Solaris"; itype: 8; dsize: 8;) 
 
alert icmp !$HOME_NET any -> $HOME_NET any 
(msg:"Nemesis v1.1 Echo"; content:"|0000000000000000000000000000000000000000|"; 
itype: 8;icmp_id: 0; icmp_seq: 0; dsize: 20;) 
 
alert icmp !$HOME_NET any -> $HOME_NET any 
(msg:"icmpenum v1.1.1"; id: 666; itype: 8;icmp_id: 666; icmp_seq: 0; dsize: 0;) 
 
alert icmp !$HOME_NET any -> $HOME_NET any 
(msg:"HPING2 Echo from LINUX/*BSD"; itype: 8; dsize:0;)

Інформація даної статті вперше була представлена ​​на конференції Black Hat 2000 Amsterdam, 23-25 ​​жовтня 2000 і доступна на сайті Black Hat:
www.blackhat.com .

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*