Отпечатки пальцев HTTPАндрей Комаров (komarov@itdefence.ru) Не надо быть телепатом, чтобы узнать, какой софт установлен на удаленной машине. Уверенное знание матчасти и несколько хитрых приемов позволяют многое выяснить о своей жертве. Сегодня мы займемся HTTP-протоколом и его особенностями, которые позволяют удаленно определить, какой демон работает на сервере. HTTP (англ. HyperText Transfer Protocol, протокол передачи гипертекста) — протокол прикладного уровня для передачи данных в первую очередь в виде текстовых сообщений. Основой HTTP служит технология «клиент-сервер»: предполагается существование клиентов, которые инициируют соединение и посылают запрос, и серверов, которые ожидают соединения для получения запроса, производят необходимые действия и возвращают обратно сообщение с результатом. Общение происходит по простой и понятной схеме «запрос-ответ». Реакция различных HTTP-демонов (конечных приложений, установленных на сервере) на различные запросы (исполняемые методы) зачастую неодинакова. Вызвано это тем, что разработчик сам проектирует поведение демона и отнюдь не всегда придерживается стандарта, а иногда даже не поддерживает некоторые из них. Поэтому существует большое количество методов для определения WEB-сервера и его конкретной версии. Все эти методы, объединившись воедино, носят название «HTTP-printing» (аналогия «fingerprinting»). Большинство из них основано на внимательном анализе ответов сервера на различные запросы. Перед тем, как перейти к изучению таких приемов, предлагаю разобраться с протоколом HTTP. HTTP изнутриКак уже было сказано, общение между клиентом HTTP и сервером происходит посредством отправки запросов и получения ответов. Каждый HTTP-запрос состоит из четырех частей, которые передаются в указанном порядке:
Заголовки и тело сообщения могут отсутствовать, но стартовая строка является обязательным элементом, так как указывает на тип запроса/ответа. Запрос GET. Наиболее популярный и знакомый всем метод. Именно GET применяется при открытии любого ресурса или скачивании файла. Метод используется для запроса конкретного объекта на конкретном ресурсе. Различают conditional GET (зависит от выполнения определенных условий) и partitional GET (если часть информации уже имеется и закэширована и требуется докачать недостающее). Запрос OPTIONS. Метод служит для опроса сервера о его возможностях. Позволяет клиенту определить опции и/или требования, связанные с ресурсом, а также информацию о возможных способах общения клиента и сервера. Как правило, доступные методы на сервере можно получить путем анализа поля Allow. Ниже – пример с Netcat: nc www.victim.com 80 HTTP/1.1 200 OK Это очень удобно, так как избавляет тебя от проверки всех возможных вариаций и получения кодов ответа после их выполнения. О доступных методах важно знать, потому что некоторые из них небезопасны. К примеру, с методами TRACK/TRACE есть возможность произвести хищение куков с использованием известного приема Cross-Site Tracing. Впрочем, это уже разговор для отдельной статьи. Запрос HEAD. Перед нами клон GET с той лишь разницей, что сервер будет возвращать только специальную служебную информацию, связанную с запрошенным документом, а тело сообщения будет отсутствовать. В хакерских целях метод используется для проверки наличия директорий на удаленном сервере. Для этого требуется подготовить список директорий и закидывать сервер по следующему алгоритму: посылаем HEAD с указанием пути искомой директории, ждем выполнения запроса, проверяем статус ответа: если он равен 200 (ОК) и мета-данные присутствуют, то директория с большой долей вероятности существует на сервере. Запрос POST. Этот метод используется в случаях отправки сообщений и передачи данных. Тело запроса передается серверу, и тот интерпретирует его в зависимости от URI запроса. URI – это стандарт формата, используемого для определения извлекаемого ресурса. В подмножество URI входит URL/URN. Запрос PUT. Метод PUT используется для создания нового объекта с заданным в запросе URI. Если ресурс с таким URI уже существует, то тело запроса рассматривается как его обновленная версия. Один из примеров использования – простая выгрузка файла на сервер (создание нового файла, замена существующего). Запрос DELETE. Метод DELETE используется для удаления ресурса под заданный URI. В этой ситуации сервер часто просит подтверждения действия. Запрос CONNECT. Имя этого метода зарезервировано для прокси-серверов, которые могут динамически становиться туннелями (к примеру, SSL). Техника HTTP-printingПриемов для определения WEB-сервера и его конкретной версии довольно много. Из основных можно выделить:
Подробнее рассмотрим некоторые из них. Анализ поля «Server» в ответе сервера (пример ответа можно увидеть выше) — это самый простой вариант, однако администратору ничего не стоит заменить информацию в этом поле. Но если верить стандарту, то в этом поле содержится информация об используемом программном обеспечении в том виде, в котором это указывает сам WEB-сервер. Например, известный HTTP-демон Apache имеет несколько видов отдачи информации о себе: Prod (Apache), Min (Apache/1.3.0), Major (Apache/1), Minor (Apache/1.3), OS (Apache/1.3.0 (UNIX)), Full (Apache/1.3.0 (UNIX) mod_fastcgi/2.4.2 mod_perl/2.0.2 Perl/v5.8.7). Стоит заметить, что в конфигурационных файлах можно отключить отображение названия и версии демона. До версии 2.0.44 такая директива называлась ServerSignature и находилась в httpd.conf. В старших версиях этой ветки, директива носит название ServerTokens. В статье «Сетевой камуфляж» приводились примеры и способы скрытия демонов, в том числе распространяющиеся на WEB-серверы. Коды ошибок (они же – статусы выполнения) – еще один способ узнать некоторые данные о сервере. Метод, который считается очень точным, может служить в качестве дополнительного эвристического теста. Нарушить детектирование можно с помощью редактирования исходных кодов или конфигов. WEB-сервер Apache имеет для этого следующие директивы: LimitRequestBody, LimitRequestFields, LimitRequestFieldSize, LimitRequestLine. Хотя, конечно, их прямое назначение заключается совсем в другом: они нужны для снижения вероятности DDoS-атак на сервер с помощью аномальных запросов. Иконка сервера – деталь, казалось бы, незаметная. Но и она способна выдать тот или иной демон. При первоначальной установке многие WEB-сервисы по умолчанию устанавливают тестовый сайт, где отображается автоматическое приветствие и favicon. Почему бы это не проанализировать? Предварительно можно написать небольшой скрипт для получения хэш-суммы favicon. Натравить его на иконку из локального пакета и затем сравнивать с хеш-суммами иконок с удаленных серверов, где администраторы из-за рассеянности забыли удалить тестовую иконку и страницы документации. Вот пример подобного скрипта на Python: import md5 Практика показывает, что таким образом можно отличить продукты одной семьи, но разных версий (или предназначенные для разных платформ): 226ffc5e483b85ec261654fe255e60be - Netscape 4.1 31aa07fe236ee504c890a61d1f7f0a97 - Apache 2.2.4 Юзаем специальный софтК сожалению, на сегодняшний день средства для HTTP-printing’а не столь разнообразны. Из инструментов наиболее известны HTTPrint (net-square.com/httprint/) и HMAP (ujeni.murkyroc.com/hmap/). Создатели первого заявляют, что их проект способен распознавать сервера даже с измененной версией. Здесь используется целый ряд эвристических тестов, некоторые из которых были описаны в этой статье. А пакет HMAP на текущий момент является плагином к известному сканеру безопасности NESSUS, бесплатный форк которого называется OpenVAS (Open Vulnerability System). Создатели обоих инструментов сильно заморачивались, чтобы добиться как можно более четкого и правдоподобного определения удаленного веб-сервера. Но далеко не всегда подобный софт сможет помочь при анализе наиболее интересных и защищенных ресурсов. Тогда придется действовать вручную, используя вспомогательные инструменты типа Tamper Data (tamperdata.mozdev.org), Ratproxy (code.google.com/p/ratproxy). Иногда серьезную помощь могут оказать всевозможные веб-сервесы. К примеру, сервис NetCraft ведет статистику об используемых продуктах на различных хостах во всем мире. Естественно, это нам на руку. Допустим, сервер ЦРУ (cia.gov) режет все аномальные запросы к нему и не выдает ни одного баннера сервиса. Как быть? Вбиваем адрес амеров в вышеназванную ссылку и получаем следующие данные за один из годов: Solaris 8, Netscape-Enterprise/4.1. Словом, способы могут быть самые разные! Где искать веб-серверПеред началом анализа WEB-сервера неплохо выяснить, на каком порту он установлен. Ведь работать он может не только на стандартном 80 порту. Если картина с самого начала не ясна, лучше просканировать порты удаленного сервера. Варианты следующие: http 80/tcp Расширения HTTPКроме HTTP-методов, описанных в RFC, существует и множество других. Самые интересные связаны с расширениями HTTP. Например, одно из них – WebDav, предоставляющее удобные механизмы для доступа к файлам и коллекциям, добавляет следующие заголовки и методы:
MKCOL /xakep/ HTTP/1.1
Любое появление в Allowed methods и разумное использование этих методов сразу же палит mod_dav – даже если администратор хорошенько запрятал его! DVDУпомянутые программы и стандарты RFC выложены на нашем диске. WARNINGБудь осторожен с экспериментами: администратору узла твои исследования могут не понравиться. |