Инструментальные средства обеспечения безопасности

       

OpenSSL


Любая Web-атака, которая осуществляется поверх 80 порта, может также быть произведена поверх порта 443, используемого по умолчанию протоколом SSL. Большинство утилит, программ взлома и скриптов используют 80 порт, чтобы уклониться от потерь, связанных с программами шифрования и поддержки сертификатов. OpenSSL-прокси позволяет перенаправить обычный HTTP-трафик через SSL-соединение с исследуемым сервером.

Реализация

Модуль OpenSSL обладает наиболее подходящим набором функциональностей, большую часть которых мы не будем использовать. Если вы наберете в командной строке openssl без параметров, вы сможете попасть в псевдоинтерпретатор OpenSSL.

$ openssl OpenSSL

Очевидно, что OpenSSL имеет больше функций, чем нам необходимо для настройки прокси. Нас интересует SSL/TLS-клиент и параметр s_client. Вы не сможете получить дополнительную информацию, набрав s_client -h, но ее можно почерпнуть из страниц описания (man pages). Теперь мы можем соединиться напрямую с SSL-сервером при помощи команды s_client. Параметр -quiet уменьшит объем информации об ошибках.

$ openssl s_client -quiet -connect www.victim.com:443 depth=0 /C=fr/ST=idf/L=paris/Email=webmaster@victim.com verify error:num=18:self-signed certificate verify return:1 depth=0 /C=fr/ST=idf/L=paris/Email=webmaster@victim.com verify error:num=18:self-signed certificate verify return:1 HEAD / HTTP/1.0 Date: Tue, 26 Feb 2002 05:44:54 GMT Server: Apache/1.3.19 (Unix) Content-Length: 2187 Connection: close Content-Type: text/html

Когда мы вводим строку HEAD/HTTP/1.0, сервер возвращает информацию из заголовка. Это означает, что SSL-соединение установлено успешно. Строки, предшествующие команде HEAD показывают сертификационную информацию и статус. Она включает в себя характерное имя (DN для энтузиастов LDP-протокола) и адрес электронной почты персоны, создавшей сертификат. OpenSSL также показывает, что сертификат является самоподписанным - т.е. он не подтверждается и не генерируется третьей стороной, уполномоченной поддерживать службу сертификации.
В большинстве случаев мы игнорируем эти ошибки, поскольку можем установить SSL-соединение.

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

Теперь мы можем сохранять ввод, перенаправив запрос HEAD на вход команде s_client.

$ echo -e "HEAD / HTTP/1.0\n\n" | \ > openssl s_client -quiet -connect www.victim.com:443

Теперь мы находимся в шаге от того, чтобы сделать запрос к HTTPS-серверу, но это не решает проблемы использования утилиты вроде arirang для сканирования SSL-сервера. Чтобы сделать это, необходимо запустить команду s_client с прокси. В предыдущем примере s_client соединялся с SSL-сервером, посылал HTTP-запрос, принимал HTTP-ответ и затем соединение закрывалось. Arirang или Stealth могут осуществлять более 6000 запросов. Очевидно, что нам требуется несколько более существенная автоматизация.

Программа inetd для Unix (и Cygwin) решает эту проблему. Демон inetd выполняется в системе и прослушивает заданные TCP- и UDP-порты. Как только другой хост посылает запрос на соединение на один из прослушиваемых портов, inetd выполняет быструю проверку и затем пересылает правильный запрос на соединение другому демону. Например, большинство FTP-серверов для Unix работает с использованием демона inetd. Файл /etc/inetd.conf содержит строки, определяющие для inetd, как обрабатывать FTP-запрос.

# /etc/inetd.conf example content ftp stream tcp nowait root /usr/libexec/ftpd ftp -US

Первая колонка, в данном случае ftp, представляет номер порта, который прослушивает служба. Значение ftp можно заменить на 21 - порт FTP по умолчанию, и все останется по-прежнему. Как это может помочь нам настроить SSL-прокси? Мы всего лишь создадим новый сервис, который будет прослушивать TCP-порт по нашему выбору. Затем, вместо вызова FTP-демона, мы вызовем команду s_client.

# /etc/inetd.conf SSL proxy example content 80 stream tcp nowait root /home/istari/ssl_proxy.sh





Файл /home/istari/ssl_proxy.sh содержит две строки.

#!/bin/sh openssl s_client -quiet -connect www.victim.com:443 2 /dev/null Примечание. Установка SSL-прокси на сервере, обращенном в интернет, может иметь неожиданные негативные последствия. Всегда ограничивайте доступ к SSL-прокси с использованием файлов /etc/hosts.allow и /etc/hosts.deny, или их эквивалентов для Unix.

После установки соединения с локальным хостом (localhost) по 80 порту, соединение перенаправляется поверх SSL на адрес www.victim.com по порту 443. Любое соединение, которое вы установите с выбранным сервером, будет осуществляться с локальным хостом (или IP-адресом прокси-сервера). Таким образом, выполняются все правила сканирования arirang для хоста https://www.victim.com.

$ arirang -G -h localhost -p80 -r unix.uxe

Принципиальное ограничение этого приема состоит в том, что сканирование всегда осуществляется для одного хоста. SSL-прокси - не настоящий прокси, в том смысле, что он осуществляет трансляцию протокола от произвольного хоста к произвольному хосту (конфигурация "многие ко многим"). Вместо этого он передает запрос от любого хоста к заданному хосту (конфигурация "многие к одному"). Следовательно, вы не можете сканировать интервал IP-адресов через SSL-прокси, но, по крайней мере, вы можете тестировать сервер, у которого запущена только HTTP-служба. Конечно, если вы используете whisker, то можно не беспокоиться.

Пример из жизни. Альтернатива Inetd

Inetd не единственный метод запуска службы. У него есть преимущество, т.к. он способен применять TCPWrappers, метод, позволяющий или запрещающий доступ к порту на основе IP-адреса. Не все операционные системы используют inetd, а операционная система Windows определенно не имеет данной функции.

Cygwin. Если ваши друзья по-прежнему дразнят вас, потому что вы пользуетесь какой-либо версией Windows, не мучайтесь. В среде Cygwin есть демон inetd и программа OpenSSL, которая позволяет запускать SSL proxy. Cygwin жалуется на использование 80 в качестве имени службы.


Файл /etc/inetd.conf должен содержать следующее.

# /etc/inetd. conf Cygwin SSL proxy example www stream tcp nowait root /home/ssl_proxy.sh ssl_proxy.sh

Затем вы можете запустить inetd в командной строке. Мы обычно запускаем его с -d, отладочной опцией, чтобы все работало корректно.

$ /usr/sbin/inetd.exe -d /etc/inetd.conf

Теперь proxy ожидает на порте 80 и направляет соединения к цели, обозначенной в сценарии ssl_proxy.sh.

Инсталляция inetd в качестве родной для Windows службы требует больше манипуляций. Есть два метода создания этой службы. Предпосылкой для каждого является переменная среды Windows PATH, содержащая C:\cygwin\bin или любое место, где находится директория cygwin\bin. Inetd может установить себя как службу.

$ /usr/sbin/inetd.exe -install-as-service /etc/inetd.conf

Чтобы удалить его, используйте опцию -remove-as-service.

Встроенные утилиты Cygwin также инсталлируют и запускают службу inetd.

cygrunsrv -I inetd -d "CYGWIN inetd" -p /usr/sbin/inetd -a -d -e CYGWIN=ntsec

cygrunsrv -S inetd

Опция -R удаляет службу inetd.

Xinetd. Xinetd добавляет еще немного к демону inetd. Он улучшает регистрацию, управление соединениями и администрирование. В системах, которые поддерживают xinetd, дефиниции служб обычно находятся в директории /etc/xinetd.d. Создайте службу SSL proxy, используя синтаксис xinetd.

#default: off #description: OpenSSL s_client proxy to www.victim.com service 80 { socket_type = stream wait = no protocol = tcp user = root server = /root/ssl_proxy.sh only_from = 127.0.0.1 disable = no }

Как всегда, опасайтесь запускать службы с root-привилегиями и службы, к которым должны иметь доступ только вы.

Netcat (sort of). Для одноразовых соединений, таких как запуск компилированного взлома, который обычно работает на порте 80, Netcat экономит день. Возможно, вы не сможете запустить сканирование whisker корректно, но одноразовое соединение будет успешно достигнуто. У Whisker есть преимущество работы с системами Unix и Windows, обеспеченное, если установлен комплект OpenSSL.


Netcat pseudo-proxy подходит для одной команды:

$ nc -w -L -p 80 -e "openssl s_client -quiet \ -connect www.victim.com:443"

Опция -L ("слушай внимательнее") дает инструкцию Netcat продолжать прослушивание, даже если клиент закрыл соединение. Опция -e содержит команду s_client для соединения с целью. Затем присоединяйтесь к порту 80 ожидающего хоста, чтобы получить доступ к SSL-серверу вашей цели (например, www.victim.com).

Для этого вам придется использовать оригинальную версию Netcat. Например, на OpenBSD опция -L заменена на -k, а опция -e не имеет смысла, поскольку Unix поддерживает конвейеры (|).

Команда OpenBSD выглядит следующим образом.

$ nc -w -k -l 80 | openssl s_client -quiet \ -connect www.victim.com:443

Конечно, не имеет смысла добавлять дополнительный шаг использования Netcat. У вас должно получиться провести отчет о взломе непосредственно в команду s_client, пропустив шаг. Затем снова могут быть сценарии, в которых строгий сетевой контроль или спутанная среда операционных систем действительно делает это полезным.


Содержание раздела