IDS против Nmap и Queso

Toby Miller
20.05.2005 | 14:02

1.1 Цель данной статьи - помочь аналитикам IDS и администраторам, занимающимся настройкой firewall'ов, идентифицировать nmap и queso сканирование. Это не развернутый анализ, а пример методики ориентированный на администраторов систем, которым необходимо более глубокое понимание работы этих сканеров для борьбы с ними.

1.2 Вступление
Сканер портов - утилита используемая как администраторами систем, так и атакующими эти системы с целью идентификации уязвимостей. Путем посылки специальным образом сгенерированных пакетов и анализа ответов тестируемых систем.

1.3 Nmap и Queso

1.3.1 Nmap
Nmap - свободно распространяемый сканер портов, разработанный и поддерживаемый Fyodor'ом. Он портирован на многие ОС (Linux, FreeBSD, Open BSD, Solaris и даже NT) и, вероятно ,является самым распространенным бесплатным сканером. Вследствие своей простоты в использование он может использоваться как новичком , так и экспертом. Поэтому возникает справедливый вопрос, как специалисты по IDS и Firewall'ам могут идентифицировать nmap сканирование. Это не является простой задачей. Nmap обладает множеством опциий настройки сканирования (их полное описание выходит за рамки данной статьи). Мы рассмотрим только некоторые из них:

  • sS This switch performs a SYN scan.
  • sX This switch performs XMAS scan.
  • sF This switch performs a Fin scan.
  • O This switch performs Operating System detection.
Здесь приведен лог сканирования с опцией -sS вместе с соответствующей сигнатурой, которую оставляет nmap.
12:19:04.981033 attacker.com > victim.com: 
icmp: echo request (ttl 40, id 28524)
                        4500 001c 6f6c 0000 2801 2573 xxxx xxxx
                        xxxx xxxx 0800 e152 16ad 0000
12:19:04.981207 victim.com > attacker.com: 
icmp: echo reply (ttl 255, id 0)
                        4500 001c 0000 0000 ff01 bdde xxxx xxxx
                        xxxx xxxx 0000 e952 16ad 0000
12:19:04.981574 attacker.com.58397 > victim.com.www: 
ack 0 win 3072 (ttl 54, id 47895)
                        4500 0028 bb17 0000 3606 cbb6 xxxx xxxx
                        xxxx xxxx e41d 0050 5720 0003 0000 0000
                        5010 0c00 6a41 0000
12:19:04.981687 victim.com.www > attacker.com.58397: 
R 0:0(0) win 0 (ttl 255, id 1)
                        4500 0028 0001 0000 ff06 bdcc xxxx xxxx
                        xxxx xxxx 0050 e41d 0000 0000 0000 0000
                        5004 0000 cd70 0000
12:19:05.065741 attacker.com.58377 > victim.com.1531: 
S 1899041970:1899041970(0) win 3072 (ttl 54, id 22525)
                        4500 0028 57fd 0000 3606 2ed1 xxxx xxxx
                        xxxx xxxx e409 05fb 7131 14b2 0000 0000
                        5002 0c00 35f8 0000
12:19:05.065924 victim.com.1531 > attacker.com.58377: 
R 0:0(0) ack 1899041971 win 0 (ttl 255, id 2)
                        4500 0028 0002 0000 ff06 bdcb xxxx xxxx
                        xxxx xxxx 05fb e409 0000 0000 7131 14b3
                        5014 0000 41e5 0000
12:19:05.066228 attacker.com.58377 > victim.com.522: 
S 1899041970:1899041970(0) 
win 3072 (ttl 54, id 45591)
                        4500 0028 b217 0000 3606 d4b6 xxxx xxxx
                        xxxx xxxx e409 020a 7131 14b2 0000 0000
                        5002 0c00 39e9 0000
Разберем несколько общих сигнатур. Сначала nmap пингует жертву echo пакетом (выделено зеленым), чтобы убедиться, что хост жив. Следующая синнатура - одинокий ACK пакет, в котором 32-bit значение поля ACK равно 0 (выделено красным). В то время , как значение поля ACK всегда должно быть всегда > 1, когда отсылается ACK пакет. Зачем это сделано? Причина для такой установки значения поля ACK проста -"stealth". Почему nmap отошлет в любом случае два ACK пакета? RFC 793 поможет пролить свет на этот вопрос. RFC 793 pp.64 описывает то, как TCP/IP стек реагирует на специфические пакеты.Эта реакция основана на двух состояниях - Closed и Listen. Когда порт находится в состоянии Closed, работают следущие правила:
  • входящие пакеты с установленным RST флагом отбрасываются.
  • ответом на пакет с неустановленным RST флагом (т.е. SYN,FIN и ACK пакеты) будет RST пакет
Когда порт находится в состоянии Listen, работают следущие правила:
  • входящие пакеты с установленным RST флагом отбрасываются.
  • ответом на пакет с неустановленным RST флагом (т.е. SYN,FIN и ACK пакеты) будет RST пакет
    Если установлен бит SYN, то
    1. если установление соединения запрещено, то отсылается RST пакет.
    2. иначе в ответ отсылается SYN|ACK (вторая часть 3-х шагового handshake)
Теперь, зная это,можно заключить ,что два ACK пакета отсылаются для проверки на то, что сканируемый хост жив.
Другая общая сигнатура nmap - использование высоких значений для порта-источника.Обычно nmap использует в качестве источника порты выше 20000(это может быть изменено опцией -p).Причина использования таких значений портов в том, что некоторые IDS и firewall не рассматривают входящие пакеты с этих портов как попытки сканирования.В большинстве же случаях большие значения портов источника указывают администраторам IDS и firewall на то ,что их сканируют.
  • sS - первая опция , которую мы рассмотрим . Nmap c выставленной -sS отсылает SYN пакет(ы) и ожидает ответа. Ответ може быть или SYN|ACK,если порт открыт, или RST|ACK в противном случае. Этот способ сканирования называется "half-scan". Таким образом определяется состояние порта(закрыт или открыт). Если nmap посылает пакет на открытый порт, то ответом будет SYN|ACK.Как только это становится так, nmap сразу отвечает RST пакетом, который обрывает соединение и в некоторых случаях в логи на сканируемом хосте ничего не пишется.
  • Опция -sX включает другой метод сканирования - Xmas tree.Следствием необычной установки флагов (FIN,PSH,URG -одновременно) является то, что некоторые плохо сконфигурированные firewall'ы пропускают такие пакеты. Что же происходит странного, если флаги FIN,PSH и URG установлены одновременно? Посмотрим, что делает каждый флаг.
  • FIN - указание на то, что посылающий хост прекращает передачу данных.
  • PHS - хост-получатель должен передать данные, содержащиеся в пакете, приложению как можно быстрее.
  • URG - включает указатель на то, что данные - срочные, "указывает сам себе, что срочные данные в некоторой виде были помещены в поток данных".
12:07:47.251547 attacker.com > victim.com: 
icmp: echo request (ttl 52, id 57064)
                       4500 001c dee8 0000 3401 a9f6 xxxx xxxx
                       xxxx xxxx 0800 98d3 5f2c 0000
12:07:47.251720 victim.com > attacker.com: 
icmp: echo reply (ttl 255, id 2136)
                       4500 001c 0858 0000 ff01 b586 xxxx xxxx
                       xxxx xxxx 0000 a0d3 5f2c 0000
12:07:47.252111 attacker.com.40335 > 
attacker.com.www: . ack 0 win 2048 (ttl 53, id 1254)
                       4500 0028 04e6 0000 3506 82e8 xxxx xxxx
                       xxxx xxxx 9d8f 0050 1b98 0003 0000 0000
                       5010 0800 f057 0000
12:07:47.252225 victim.com.www > 
attacker.com.40335: R 0:0(0) win 0 (ttl 255, id 2137)
                       4500 0028 0859 0000 ff06 b574 xxxx xxxx
                       7f00 0001 0050 9d8f 0000 0000 0000 0000
                       5004 0000 13ff 0000
12:07:47.336218 attacker.com.40315 > 
victim.com.824: FP 0:0(0) win 2048 urg 0 (ttl 53, id 43059)
                       4500 0028 a833 0000 3506 df9a xxxx xxxx
                       xxxx xxxx 9d7b 0338 0000 0000 0000 0000
                       5029 0800 0906 0000
12:07:47.336392 victim.com.824 > 
attacker.com.40315: R 0:0(0) ack 0 win 0 (ttl 255, id 2138)
                       4500 0028 085a 0000 ff06 b573 xxxx xxxx
                       xxxx xxxx 0338 9d7b 0000 0000 0000 0000
                       5014 0000 111b 0000

Коротко, комбинация FIN,PSH,URG говорит ,что надо разорвать соединение, переслать данные в пакете как можно скорее и поместить их в обычный поток данных. Из моего опыта это, как правило, не имеет смысла (пока вы не пытаетесь сканировать сети).Таким образом следующая сигнатура nmap (при использованиии опции Xmas) - urgent pointer всегда установлен в 0(выделено синим).

Наконец, посмотрим на опцию -sF в паре с -O. Опция -sF сканирует хост с пакетами с установленным флагом FIN.-O - знаменитая опция ОС fingerprinting. Перед компиляцией бинарника nmap посмотрите на файл figerprinting. Это впечатляющая коллекция TCP/IP сигнатур ОС, которая действительно изумила меня. Приведенный ниже лог демонстрирует -sF сканирование дополнительно с опцией -O:

11:00:09.360631 attacker.com.49044 > victim.com.219: 
F 0:0(0) win 4096 (ttl 59, id 45102)

11:00:09.361056 attacker.com.49044 > victim.com.48: 
F 0:0(0) win 4096 (ttl 59, id 30876)

11:00:12.820777 attacker.com.49051 > victim.com.sunrpc: 
S 561959278:561959278(0) win 4096
 
(ttl 59, id 11173)

11:00:12.821526 victim.com.sunrpc > attacker.com.49051: 
S 2988831197:2988831197(0) ack
561959279 win 16165 
(DF) (ttl 64, id 3059)

11:00:12.821923 attacker.com.49052 > victim.com.sunrpc: 
. win 4096  (ttl 59, id 25812)

11:00:12.822090 attacker.com.49053 > victim.com.sunrpc: 
SFP 561959278:561959278(0)
win 4096 urg 0  (ttl 59, id 10538)

11:00:12.822519 attacker.com.49054 > victim.com.sunrpc: 
. ack 0 win 4096  (ttl 59, id 36725)

11:00:12.822795 attacker.com.49055 > victim.com.34459: 
S 561959278:561959278(0) win 4096
 (ttl 59, id 36400)

11:00:12.823071 attacker.com.49056 > victim.com.34459: 
. ack 0 win 4096  (ttl 59, id 46890)
             4500 003c b72a 0000 3b06 ca8f xxxx xxxx
             xxxx xxxx bfa0 869b 217e d16e 0000 0000
             a010 1000 81fb 0000 0303 0a01 0204 0109
             080a 3f3f 3f3f 0000 0000 0000

11:00:12.823347 attacker.com.49057 > victim.com.34459: 
FP 561959278:561959278(0) win 4096
urg 0  (ttl 59, id 733)
             4500 003c 02dd 0000 3b06 7edd xxxx xxxx
             xxxx xxxx bfa1 869b 217e d16e 0000 0000
             a029 1000 81e1 0000 0303 0a01 0204 0109
             080a 3f3f 3f3f 0000 0000 0000

11:00:12.823642 atttacker.com.49044 > victim.com.34459: 
udp 300 (ttl 57, id 60791)
             4500 0148 ed77 0000 3911 952b xxxx xxxx
             xxxx xxxx bf94 869b 0134 40db 6060 6060
             6060 6060 6060 6060 6060 6060 6060 6060
             6060 6060 6060 6060 6060 6060 6060 6060

11:00:12.823746 victim.com > attacker.com: 
icmp: victim.com udp port 34459 unreachable [tos 0xc0]
(ttl 255, id 3067) 
             45c0 0164 0bfb 0000 ff01 afdb xxxx xxxx
             xxxx xxxx 0303 fc44 0000 0000 4500 0148
             ed77 0000 3911 952b 7f00 0001 7f00 0001
             bf94 869b 0134 40db 6060 6060 6060 6060

Теория этого вида сканирования довольно проста - все крутится вокруг флагов TCP и открытых, закрытых портов.

1. если порт закрыт, и посылается FIN пакет ответом будет RST.
2. если порт открыт, то FIN будет просто отброшен и ответа не последует.

Этот метод рассчитан на уязвимость очень ограниченного числа IDS и firewall, поскольку только немногие следят исключительно за FIN|ACK пакетами, не обращая внимания на просто FIN пакеты.

1.3.2 Queso (by savage@apostols.org)
Хотя queso не столь популярен и отточен как nmap, он все еще представлляет определенный интерес, и соответсвенно существует необходимость в анализе его работы. Обычно он отсылает 7 пакетов за раз, что указано в файле документации. Эти пакеты следущие:

Queso позволяет спуфить IP, выбирать порты для сканирования а также сам случайно выбирает в качестве порта источника значения от 4000 до 65000.Следующий лог показывает как выглядит скан queso:

17:24:43.328743 attacker.com.19909 > victim.com.sunrpc: 
S 1567977113:1567977113(0) win 4660
(ttl 255, id 51246)
                        4500 0028 c82e 0000 ff06 6095 xxxx xxxx
                        xxxx xxxx 4dc5 006f 5d75 6e99 0000 0000
                        5002 1234 f05f 0000
17:24:43.352137 attacker.com.19910 > victim.com.sunrpc: 
S 1567977113:1567977113(0) ack 0 win
4660 (ttl 255, id 51247)
                        4500 0028 c82f 0000 ff06 6094 xxxx xxxx
                        xxxx xxxx 4dc6 006f 5d75 6e99 0000 0000
                        5012 1234 f04e 0000
17:24:43.370082 attacker.com.19911 > victim.com.sunrpc: 
F 1567977113:1567977113(0) win 4660
(ttl 255, id 51248)
                        4500 0028 c830 0000 ff06 6093 xxxx xxxx
                        xxxx xxxx 4dc7 006f 5d75 6e99 0000 0000
                        5001 1234 f05e 0000
17:24:43.390301 attacker.com.19912 > victim.com.sunrpc: 
F 1567977113:1567977113(0) ack 0 win
4660 (ttl 255, id 51249)
                        4500 0028 c831 0000 ff06 6092 xxxx xxxx
                        xxxx xxxx 4dc8 006f 5d75 6e99 0000 0000
                        5011 1234 f04d 0000
17:24:43.410079 attacker.com.19913 > victim.com.sunrpc: 
SF 1567977113:1567977113(0) win 4660
(ttl 255, id 51250)
                        4500 0028 c832 0000 ff06 6091 xxxx xxxx
                        xxxx xxxx 4dc9 006f 5d75 6e99 0000 0000
                        5003 1234 f05a 0000
17:24:43.430076 attacker.com.19914 > victim.com.sunrpc: 
P win 4660 (ttl 255, id 51251)
                        4500 0028 c833 0000 ff06 6090 xxxx xxxx
                        xxxx xxxx 4dca 006f 5d75 6e99 0000 0000
                        5008 1234 f054 0000
17:24:43.450082 attacker.com.19915 > victim.com.sunrpc: 
S 1567977113:1567977113(0) win 4660
(ttl 255, id 51252)

SYN=2
SYN|ACK=1
PSH=1
SYN|FIN=1
FIN=1
FIN|ACK=1
TOTAL=7
                        4500 0028 c834 0000 ff06 608f xxxx xxxx
                         xxxx xxxx 4dcb 006f 5d75 6e99 0000 0000
                        50c2 1234 ef99 0000

В логе присутсвуют все 7 пакетов. Первая сигнатура - одинокий FIN пакет. Что же вызывает появление этих пакетов, если еще не было установлено соединения и FIN не содержит ACK . В то время как установление соединения TCP - 3-x шаговый процесс, разрыв - является 4-х шаговым и выглядит так:

Здесь мы видим установленный PSH флаг ,это может вызвать удивление,так как в TCP PSH флагу должен сопутствовать ACK флаг (пока соединение установлено). Мы идим, что queso устанавливает SYN|FIN флаги, которые указывают хосту-получателю, что необходимо открыть и сразу же закрыть соединение.

n/a n/a urg ack psh rst svn fin
8 4 2 1 8 4 2 1

Cамая интересная сигнатура ,которую отсылает queso - один SYN пакет, в котором установлены зарезервированные биты (выделено розовым в табл.4) .Табл. 5 показывает как выглядит 13 байт в TCP заголовке. Последние 2 бита слева (помеченные n/a -not available)- зарезервированны и соответсвенно не должны быть установлены. Теперь уже просто установить, что если вы видите значение "c2" в 13 байте TCP заголовка, то кто-то имееет злые намерения относительно вашей сети.

1.4 Заключение
Toby Miller в настоящий момент работает в SYTEX Inc.,расположенной в Пенсильвании. Он имеет сертификат GIAC(Certified Intrusion Analyst) и Microsoft Certified Professional и обладает большим опытом администрирования NT, Unix, firewall и мэйнфреймов.