sslstrip
ss
l st
rip
ПРИНЦИП ДЕЙСТВИЯ
SSLSTRIP
АНТОН ЖУКОВ
/ ANTITSTER@GMAIL.COM /
ВСКРЫВАЕМ SSL
Перехват данных в защищенных соединениях
Простая истина: передавать данные в откры- В любой сертификат входят следующие поля: писи Site Certificate, однако, в отличие
том виде — небезопасно. В этом случае они от CA Certificate, не гарантируют легитим-
легко могут стать добычей злоумышленника, • ïîëíîå (óíèêàëüíîå) èìÿ âëà- ность сайта и не встраиваются в браузер.
которому не составит труда перехватить, äåëüöà ñåðòèôèêàòà; Получается, что в самом простом случае
модифицировать и даже подменить их. Вот • îòêðûòûé êëþ÷ âëàäåëüöà; вся цепочка состоит из следующих звеньев:
почему логины и пароли, а также другие • äàòà âûäà÷è öèôðîâîãî ñåðòèôè- «CA Certificate — Intermediate CA — Site
конфиденциальные данные по обычному êàòà; Certificate», однако промежуточных серти-
HTTP не передаются. Вместо этого использу- • äàòà îêîí÷àíèÿ äåéñòâèÿ ñåðòè- фикатов может быть больше. Так или иначе,
ется защищенный HTTPS, который работает ôèêàòà; проверка подлинности сайта осуществляется
медленнее, но зато упаковывает данные • ïîëíîå (óíèêàëüíîå) èìÿ èçäàòå- с помощью простой рекурсивной процедуры:
в криптографический протокол SSL — и те ëÿ (èñòî÷íèêà ñåðòèôèêàòà); • сначала проверяется, чтобы крайний
передаются уже в зашифрованном виде. • öèôðîâàÿ ïîäïèñü èçäàòåëÿ. в цепочке сертификат был выписан на имя
сайта, к которому идет обращение;
КАК УСТРОЕН SSL? Существует несколько видов сертификатов. • проверяется, не просрочен ли сертификат;
Алгоритм работы SSL построен на исполь- Чтобы удостовериться в подлинности кон- • в конце проверяется подпись, с помощью
зовании пары асимметричных ключей. кретного сайта, используется специально которой он подписан.
Открытый ключ раздается всем желающим, выписанный для него сертификат (Site Подпись может принадлежать или корневому
и с его помощью шифруются необходимые Certificate). Для проверки подлинности таких сертификату, и это значит, что сертификату
данные, которые далее можно дешифровать сертификатов в свою очередь существуют можно 100% доверять, или же некоторому
только с помощью закрытого ключа (он есть сертификаты центра сертификации (CA промежуточному сертификату. В последнем
на сервере). Открытый ключ предоставля- Certificate); они обладают максимальным случае необходимо подняться на уровень
ется сервером клиенту, причем выдается доверием и встраиваются непосредственно выше и выполнить проверку еще раз —
в составе сертификата (подписывается тре- в браузер (их также называют корневы- и так, пока не будет найдена подпись кор-
тьей уполномоченной стороной — так назы- ми — Root CA). Помимо этого, существуют невого сертификата. Или не будет, что озна-
ваемым центром сертификации: certificate промежуточные сертификаты (Intermediate чает: удостовериться в подлинности сайта
authority — CA). CA), которые также используются для под- невозможно.
sslsniff
ss
l st
rif
f
СХЕМА РАБОТЫ
SSLSNIFF
SSLSNIFF, ИЛИ • со своей стороны устанавливала обыч- хваченной ссылке на защищенной ресурс
КАК ВСЕ НАЧИНАЛОСЬ ное HTTPS-соединение с нужным сервером выполняется замена «https://» на «http://»,
Представим такую картину: у нас есть и выступала своеобразной проксей, снифая а исходная и измененная URL заносятся
сертификат для нашего сайта xakep.ru; весь трафик. в таблицу соответствия.
он является последним звеном в цепочке Все, что требовалась для работы — это
«Root CA — Intermediate CA — Intermediate предоставить sslsniff действительный def replaceSecureLinks(self, data):
CA — xakep.ru». Почему бы не попро- сертификат. К сожалению, с 2002-го, когда data = DataShuffler.replaceSecureLinks
бовать сделать сертификат сайта проме- была опубликована утилита, браузеры (self, data)
жуточным и не подписать с его помощью стали умнее и такой проверкой больше data = self.replaceSecureCookies(data)
другой ресурс, например, paypal.com? не пренебрегают. Увы, такой способ нам data = self.replaceCssLinks(data)
Все условия проверки для цепочки (Root уже не поможет! data = self.replaceSecureFavicon(data)
CA — Intermediate CA — Intermediate CA —
xakep.ru — paypal.com) при этом останутся ПРОДОЛЖЕНИЕ iterator = re.finditer(
выполненными: ИСТОРИИ — SSLSTRIP self.linkExpression,
• подписи всех сертификатов действи- Чтобы разобраться с другим спосо- data,
тельны; бом, вспомни, как мы обычно попадаем re.IGNORECASE)
• ни один сертификат не просрочен; на защищенные страницы. Допустим, ты
• корневой сертификат встроен в браузер захотел проверить свой почтовый ящик for match in iterator:
и обладает полным доверием. Gmail. Просто набираешь в адресной стро- link = match.group(9)
Тут одна лишь загвоздка: как же мы выда- ке mail.google.com и попадаешь на защи-
дим сертификат? щенную страницу авторизации. Никто if not link.startswith('http'):
У каждого сертификата есть неприметное не набирает http://, а уж тем более https://. logging.debug("Found relative
поле Basic Constraints, которое определяет, Получается, что пользователь попадает link in secure transmission: " + link)
принадлежит ли он центру сертификации на защищенную страницу двумя путями: absoluteLink = "http://" +
или нет. Что удивительно, далеко не все кликая на ссылки/кнопки или через реди- self.serverHost + link
центры ранее выставляли ему значе- ректы. Переход на защищенные ресурсы absoluteLink = absoluteLink.replace
ние CA=FALSE. Более того, большинство осуществляется посредством обычного ('&', '&')
браузеров даже не утруждались проверкой http-протокола, а его, как я уже говорил, self.secureLinkListener.
значения этого поля. Получается, имея легко перехватить. addLink(absoluteLink);
на руках действительный сертификат, Липовый сертификат «на лету» создать
можно было создать и подписать сертифи- уже не выйдет. Так, может, обойдемся return data
кат для любого другого домена — и браузе- вовсе без сертификата? Зачем его созда-
ры даже не заподозрили бы неладное! вать, если есть шанс перехватить запрос Как только клиент посылает запрос
Несмотря на многочисленные заявления, на защищенное соединение с сервером на соединение с защищенным URL, мы
что эксплуатировать это невозможно, раз- и заставить пользователя общаться с нами подсовываем ему липовую ссылку, а сами,
работчик Moxie Marlinspike опубликовал по самому обычному HTTP? Именно эта тем временем, устанавливаем настоящее
рабочую утилиту sslsniff, которая реали- идея и легла в основу программы sslstrip, HTTPS-соединение, выполняя запрос
зовывала простую атаку MITM (Man in the которую на недавней конференции Black от своего имени. Получив ответ от сервера
middle), перехватывая весь трафик. Смысл Hat DC 2009 представил все тот же хакер и опять выполнив замены в линках, отдаем
сводился к следующему: Moxie Marlinspike. контент пользователю по обычному HTTP-
• прога перехватывала клиентские запро- Предлагаю рассмотреть ее более под- соединению.
сы на соединение с защищенным HTTPS- робно. Помимо описания, я буду при- В результате получается замечатель-
сайтом; водить небольшие отрывки исходников ная картинка. Серверу, отдающему весь
• сама создавала сертификат для сайта, на Python’е. В основе, опять же, лежит контент по защищенному каналу, нет
к которому коннектится клиент, и подпи- принцип MITM, позволяющий вклиниться никакого дела, от кого приходит под-
сывала его с помощью уже имеющегося между сервером и клиентом, просматривая ключение, а клиент не получает никаких
сертификата; проходящий HTTP-трафик. В каждой пере- предупреждений и даже не подозревает,
DVD
dvd
• Все упомянутые
в статье утилиты ты
найдешь на нашем
DVD-приложении.
• На диске ищи не-
большую демонстра-
цию возможностей
sslstrip.
ПОДПИСЫВАЕМ СЕРТИФИКАТ
PAYPAL.COM ИМЕЮЩИМСЯ
НА РУКАХ СЕРТИФИКАТОМ
Root CA ДЛЯ XAKEP.RU
Intermediate
Root CA
Intermediate
Intermediate
Intermediate
Intermediate
Leaf
(xakep.ru)
Leaf
(xakep.ru)
не истекают посреди активной работы. Поэтому ется, она уже долго работает и, если мы ее при- и пароли. Опыты мы будем проводить
сразу после начала MITM-атаки начинаем бьем, то подозрений это, скорее всего, не вызо- на виртуальных машинах. Итак, у нас есть
модифицировать трафик, проходящий через вет. Вот, в общем-то, и все секреты успеха. небольшая локальная сеть, состоящая
нас, но не трогаем Cookies в течение какого- из машины жертвы (192.168.1.3), нашей
то промежутка времени (например, 5 минут). ИСПЫТАЕМ машины (192.168.1.5) и машины, служа-
Ждем эти 5 минут, и запоминаем все сессии, SSLSTRIP В ДЕЛЕ щей шлюзом в интернет (192.168.1.1).
которые видели за это время. Если после Но довольно лирики. Посмотрим, реаль- Теперь подготовим плацдарм для атаки.
5 минут появляется какая-то новая, то получа- но ли утащить чьи-нибудь логины В качестве ОС на своей машине будем
использовать популярный дистрибутив
Доверенный центр BackTrack3 (все то же самое можно проде-
Root CA
сертификации сертификат лать и под Виндой, поставив необходимые
программы и настроив систему, но зачем
делать лишнюю работу, если кто-то уже
сделал ее за тебя?). Итак, загружаем систе-
Проверяем срок действия сертификата. му и устанавливаем sslstrip:
Неизвестный центр 1-й Он подписан Root CA. Root CA является
сертификации сертификат доверенным, на этом проверка заканчи-
CA #bt python setup.py install
вается. Подлинность сайта установлена.
В принципе, можно даже не устанавливать,
Проверка срока действия сертификата. а запускать sslstrip сразу:
Неизвестный центр 2-й Узнаем, что CA2 подписан сертифика-
сертификации сертификат том CA1, который опять же не является #bt python ./sslstrip.py -h —
CA доверенным. Проверяем следующий ïîêàæåò ñïèñîê ïàðàìåòðîâ.
сертификат.
Чтобы все заработало, нам нужно
Проверяем срок действия сертификата немножко подконфигурировать систему.
... и узнаем, что он подписан сертификатом
Сперва включим на машине режим пере-
CA2. Т.к. тот не является доверенным,
направления пакетов (forwarding mode).
переходим к следующему сертификату в
Делается это следующей командой:
цепочке.
ДЛЯ РАБОТЫ — ЭТО Параметр '-a' означает, что мы будем логировать весь проходящий
http-трафик, '-l' указывает порт, который будем слушать, а '-w'
ПРЕДОСТАВИТЬ SSLSNIFF ДЕЙ- задает путь к лог-файлу. Остался последний штрих — заставить жерт-
ву поверить, что мы и есть тот самый шлюз в интернет. Провернем
СТВИТЕЛЬНЫЙ СЕРТИФИКАТ. это с помощью утилитки arpspoof:
БОЛЬШЕ НЕ ПРЕНЕБРЕГАЮТ»
#bt arpspoof -i eth0 -t 192.168.1.3 192.168.1.1
ИНСТАЛЛЯЦИЯ SSLSTRIP
ХИТРОСТИ
URL