23.01.2012

Особенности поведения нового стека TCP/IP Windows

image

Начиная с Windows Vista, компания Microsoft в своих операционных системах перешла на новый сетевой стек ¬– Next Generation TCP/IP Stack. Стек включает в себя множество различных плюшек: Windows Filtering Platform, масштабируемое TCP-окно и прочие вкусности, однако речь пойдет совсем не о них, а об одной конкретной особенности поведения нового сетевого стека.

Всякий уважающий себя сетевой сканер должен уметь определять ОС сканируемого узла, при этом чем больше параметров используется, тем более точный ожидается результат. Например, сетевой сканер Nmap использует для определения операционной системы весьма широкий набор метрик: разнообразные TCP-метрики (поведение значений timestamp, переупорядочивание TCP-опций), IP-метрики (алгоритм генерации порядкового номера пакета, обработка флагов IP-пакета) и иные метрики.

Мы в Positive Technologies тоже занимаемся сбором метрик и определением версии ОС, поэтому хотелось бы рассказать о недавно обнаруженной мною метрике, позволяющей идентифицировать Windows-системы с новым стеком. Способ основан на анализе ответов ICMP Timestamp. Временные метки ICMP (ICMP Timestamps) – это дальний предок протоколов синхронизации времени, позволяющий запросить время, установленное на удаленной системе. Структура запроса и ответа ICMP Timestamp приведена на рисунке 1.

Рисунок 1 – Структура ответа на запрос ICMP Timestamp

Красным выделен стандартный ICMP-заголовок, далее идут поля временных меток момента отправления запроса, момента получения запроса пользователем, действующим удаленно, и момента посылки ответа этим пользователем. Временные метки – количество миллисекунд, прошедших с полночи по UTC. Если же хост не обладает возможностью передать данные о своем времени с точностью до миллисекунд, то тогда он должен выставить старший бит в единицу и передать хоть какие-то данные о времени. Нас интересует последняя метка. Все дело в том, что компания Microsoft, как это часто бывает, весьма фривольно подошла к реализации RFC: вместо сетевого порядка байт Windows посылает временную метку с порядком байт хоста и не выставляет старший бит в единицу, несмотря на то, что посылает временные метки с точностью до секунды. Мало того, начиная с Vista, по причинам, о которых можно только догадываться, системы Windows творят с временными метками странное.

Ожидаемое поведение временных меток изображено на рисунке 2. На графиках синие точки отвечают за полученные с сервера временные метки, а красным отмечен график серверного времени. По оси абсцисс на графиках отложено время от начала эксперимента, по оси ординат отложено значение временных меток в секундах. Строка <applied translation> обозначает, что был выполнен перевод из сетевого порядка байт в хостовой.

Рисунок 2 – Нормальное поведение меток времени

Однако на деле наблюдалась картина, изображенная на рисунке 3 (в более высоком временном разрешении).

Рисунок 3 – Поведение меток времени в крупном масштабе

Видно, что с периодом в одну секунду значение посылаемой временной метки возрастает от истинного до превышающего истинное на 10000 секунд. Видимые же на графике разрывы являются всего лишь следствием того, что планировщик Windows решал, что пора прервать выполнение нашей программы.

Вероятно, такими временными метками Windows хочет запутать злоумышленника, пытающегося узнать время на удаленном хосте. Такое поведение наблюдается только для систем Windows с новым стеком, что позволяет реализовать новый способ определения этих систем.

Спасибо за внимание.


Источники:
http://technet.microsoft.com/library/bb878108
http://www.insidepro.com/kk/180/180r.shtml
http://nmap.org/book/osdetect.html


или введите имя

CAPTCHA