Вы находитесь на странице: 1из 6

>> pc_zone

sslstrip

ss
l st
rip
ПРИНЦИП ДЕЙСТВИЯ
SSLSTRIP

АНТОН ЖУКОВ
/ ANTITSTER@GMAIL.COM /

ВСКРЫВАЕМ SSL
Перехват данных в защищенных соединениях

Используя мейл, админку или систему электронного банкинга


для управления своим счетом, мы полностью доверяемся серверу.
Если все данные передаются по защищенному 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), которые также используются для под- невозможно.

026 XÀÊÅÐ 05 /125/ 09


>> pc_zone

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-трафик. В каждой пере- предупреждений и даже не подозревает,

XÀÊÅÐ 05 /125/ 09 027


>> pc_zone

что использует незащищенное соединение. А мы?


А мы перехватываем весь трафик :).
WARNING
НЕСКОЛЬКО УЛОВОК
Чтобы еще больше создать иллюзию, что все безопас-
warning но, будем отслеживать запросы favicon (это иконка,
• Если верить раз- отображающаяся в адресной строке браузера непо-
работчику sslsniff средственно перед адресом). И когда получаем такой
Moxie Marlinspike,— запрос для защищенного соединения, то подсовываем
некоторые браузе- иконку с замочком, которая в обычно й ситуации ука-
ры по-прежнему зывает на то, что соединение осуществляется по безо-
не утруждают себя пасному каналу.
проверкой поля СОЗДАНИЕ ПРАВИЛА В IPTABLES
Basic Constraints. def replaceSecureFavicon(self, data): ДЛЯ ПЕРЕНАПРАВЛЕНИЯ HTTP-ТРАФФИКА
iterator = re.finditer( НА ПОРТ 8080
• Вся информация self.iconExpression,
представлена ис- data, re.IGNORECASE)
ключительно в озна- • с безопасными кукисами, которые не передают
комительных целях. for match in iterator: по незащищенному соединению;
В случае использо- link = match.group(1) • с банально закешированными страницами, в которых
вания ее в противо- link.replace('http://', 'https://') мы не можем сделать замену.
законных целях Как быть?
ни автор, ни редак- if not link.startswith('http://'): В кукисах нам потребуется убирать флаг security bit
ция ответственности link = 'http://' + self.serverHost + link в поле в Set-Cookie, чтобы плюшки стали передавать-
не несут. ся по обычному HTTP. От сжатия контента придется
self.secureLinkListener.\ отказаться, удалив в хедерах HTML параметр content
addSecureFavicon(link) encodings (отключаем сжатие), а также if-modified-
self.secureLinkListener.addLink(link) since (принудительно заставляем сервер отдавать
страницу, даже если на ней не было изменений).
return data Другая проблема — сессии. Пропуская этап авторизации,
HTTP://WWW мы можем остаться без логина и пароля. Решение следую-
Проблемы с подменой ссылок могут возникнуть в сле- щее: сессию тоже надо убивать, но нужна осторожность,
• links дующих случаях: чтобы не вызвать подозрений. Сессии имеют свойство
• Домашняя странич- • с компрессированным контентом, который сложно истекать (заканчиваться), причем не всегда ясно, когда
ка Moxie Marlinspike: парсить; это произойдет. Одно можно сказать почти наверняка: они
thoughtcrime.org.
• sslsniff:
thoughtcrime. ПОЛЕ СЕРТИФИКАТА «BASIC CONSTRAINTS» СО ЗНАЧЕНИЕМ ПАРАМЕТРА «CA=FALSE»
org/software/sslsniff.
•sslstrip:
thoughtcrime.org/
software/sslstrip.
• arpspoof:
arpspoof.sourceforge.net.

DVD

dvd
• Все упомянутые
в статье утилиты ты
найдешь на нашем
DVD-приложении.
• На диске ищи не-
большую демонстра-
цию возможностей
sslstrip.

028 XÀÊÅÐ 05 /125/ 09


>> pc_zone

ПОДПИСЫВАЕМ СЕРТИФИКАТ
PAYPAL.COM ИМЕЮЩИМСЯ
НА РУКАХ СЕРТИФИКАТОМ
Root CA ДЛЯ XAKEP.RU

Intermediate

Root CA

Intermediate

Intermediate

Intermediate

Intermediate
Leaf
(xakep.ru)
Leaf
(xakep.ru)

КРАЙНИМ ЗВЕНОМ В ЦЕПОЧКЕ Leaf


ЯВЛЯЕТСЯ СЕРТИФИКАТ САЙТА (paypal.com)
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).
переходим к следующему сертификату в
Делается это следующей командой:
цепочке.

#bt echo "1" > /proc/sys/net/


Программа, ipv4/ip_forward
проверяющая
сертификат «ПРОЦЕДУРА ПРОВЕРКИ Затем настроим iptables для перенаправле-
СЕРТИФИКАТОВ» ния http-трафика:

XÀÊÅÐ 05 /125/ 09 029


>> pc_zone

ПРИМЕР ЛОГА SSLSTRIP С ПЕРЕХВАЧЕННЫМИ ПАРОЛЯМИ

«ВСЕ, ЧТО ТРЕБОВАЛАСЬ #bt sslstrip -a -l 8080 -w /root/log.txt

ДЛЯ РАБОТЫ — ЭТО Параметр '-a' означает, что мы будем логировать весь проходящий
http-трафик, '-l' указывает порт, который будем слушать, а '-w'
ПРЕДОСТАВИТЬ SSLSNIFF ДЕЙ- задает путь к лог-файлу. Остался последний штрих — заставить жерт-
ву поверить, что мы и есть тот самый шлюз в интернет. Провернем
СТВИТЕЛЬНЫЙ СЕРТИФИКАТ. это с помощью утилитки arpspoof:

К СОЖАЛЕНИЮ, С 2002-ГО, arpspoof -i <yourNetworkdDevice> -t <yourTarget>

КОГДА БЫЛА ОПУБЛИКОВАНА


<theRoutersIpAddress>

УТИЛИТА, БРАУЗЕРЫ СТАЛИ


<yourNetworkdDevice> — èìÿ íàøåé ñåòåâîé êàðòû
(â íàøåì ñëó÷àå eth0),

УМНЕЕ И ТАКОЙ ПРОВЕРКОЙ


<yourTarget> — àäðåñ æåðòâû,
<theRoutersIpAddress> — àäðåñ øëþçà

БОЛЬШЕ НЕ ПРЕНЕБРЕГАЮТ»
#bt arpspoof -i eth0 -t 192.168.1.3 192.168.1.1

Дождись, пока жертва полезет в инет, и проверяй логи, пример


которых можешь увидеть на одном из скринов. Все замечательно
#bt iptables -t nat -A PREROUTING -p tcp работает!
--destination-port 80 -j REDIRECT --to-port
<yourListenPort> НУЛЕВАЯ БЕЗОПАСНОСТЬ
Как видишь, безопасность SSL можно свести до нуля и превратить
где <yourListenPort> — порт, которых будет слушать sslstrip; устано- защищенное соединение в незащищенное, добавив на участке
вим его в 8080, например. до пользователя коннект по обычному http-протоколу.
Теперь можно запустить и сам sslstrip: Узнав, насколько это просто реализовать, думаю, ты с особой вни-

030 XÀÊÅÐ 05 /125/ 09


>> pc_zone

ИНСТАЛЛЯЦИЯ SSLSTRIP

ЗАПУЩЕННЫЙ SSLSTRIP И ARPSPOOF ЗА РАБОТОЙ

ХИТРОСТИ
URL

ПОДДЕЛЬНЫЙ АДРЕС GMAIL, СОЗДАННЫЙ С ПО-


МОЩЬЮ ОМОГРАФИЧЕСКОЙ АТАКИ (НА САМОМ
SSLSTRIP В ДЕЙСТВИИ. ДЕЛЕ ЭТОТ САЙТ ЯВЛЯЕТСЯ ПРОСТЫМ ПОДДО-
АТАКУЮЩИЙ ПЕРЕХВАТИЛ ЗАПРОС НА БЕЗОПАС- МЕНОМ *.IJJK.CN)
НОЕ СОЕДИНЕНИЕ И ПОДМЕНИЛ ЕГО, ЧТО ХОРОШО
ВИДНО ПО АДРЕСНОЙ СТРОКЕ — ВМЕСТО HTTPS
ТАМ СТОИТ HTTP Òåõíèêó sslstrip âïîëíå ðåàëüíî ñîâìåñòèòü ñ òàê íàçûâàåìûìè
îìîãðàôè÷åñêèìè àòàêàìè. Ýòî àòàêè, ïðè êîòîðûõ ñîçäàåòñÿ
ñõîæåå èìÿ äîìåíà ñ èñïîëüçîâàíèåì áóêâ àëôàâèòà äðóãîãî
мательностью будешь относиться к сообщениям браузера об исполь- ÿçûêà — ñ öåëüþ ââåñòè ïîëüçîâàòåëåé â çàáëóæäåíèå è ñîçäàòü
зовании защищенного соединения и посматривать на адресную âïå÷àòëåíèå, ÷òî îíè ïåðåõîäÿò íà ðàçðåøåííûé âåá-ñàéò.
строку. Ни в коем случае не воспринимай статью, как побуждение Â 2005-ì Eric Johanson çàðåãèñòðèðîâàë äîìåííîå èìÿ
к действию! Она лишь призвана показать основные ошибки SSL p&#1072;ypal.com, êîòîðîå èñïîëüçóåò ‘a’ èç êèðèëëèöû è âû-
и HTTP. z ãëÿäèò êàê paypal.com. ×òî íàñ íå óñòðàèâàåò â òàêîé àòàêå?
Íó, âî-ïåðâûõ, îíà îðèåíòèðîâàíà íà îäèí êîíêðåòíûé ñàéò,
÷òî îãðàíè÷èâàåò ðàäèóñ äåéñòâèÿ. À âî-âòîðûõ, áðàóçåðû íàó÷è-
ëèñü ïðàâèëüíî îòîáðàæàòü IDN (Internationalized Domain Names
— Èíòåðíàöèîíàëèçîâàííûå Äîìåííûå Èìåíà) è äîáàâëÿþò

НЕМНОГО ê èìåíè òàê íàçûâàåìûé Punycode — ïðåôèêñ «xn--». Ôàëüøèâûé


paypal.com ïðåîáðàçóåòñÿ â http://xn--pypal-4ve.com.

СТАТИСТИКИ Èòàê, ìû íå ìîæåì èñïîëüçîâàòü .com èëè ëþáîé äðóãîé äîìåí


ïåðâîãî óðîâíÿ, èáî áðàóçåðû äîáàâÿò ê íåìó Punycode. Ïðèêè-
íåì, êàêèå ñèìâîëû ÷àùå âñåãî âñòðå÷àþòñÿ â URL[S2]? Ïðàâèëü-
Moxie Marlinspike çàïóñòèë sslstrip íà tor óçëå è çà 24 ÷àñà íî: «. / & ?». Äàâàé ýòèì âîñïîëüçóåìñÿ. Çàðåãèñòðèðóåì äîìåí
ñëîâèë íåõèëûé óðîæàé ó÷åòíûõ çàïèñåé: ijjk.cn è ïîëó÷èì ñåðòèôèêàò äëÿ *.ijjk.cn. À ïîòîì ïðèìåíèì
• login.yahoo.com — 114 ñòàðûé òðþê ñ áóêîâêàìè èç äðóãîãî àëôàâèòà, î÷åíü ïîõîæèìè
• Gmain — 50 íà / è ? äëÿ ñîçäàíèÿ ôàëüøèâûõ URL’îê. Ñíîâà çàïóñêàåì sslsniff,
• ticketmaster.com — 42 òîëüêî íà ýòîò ðàç, âìåñòî ïîäìåíû https íà http, áóäåì ïîäìåíÿòü
• rapidshare.com — 14 URL íà ñâîè ëèïîâûå ïîääîìåíû. Òàê, https://www.gmail.com/
• Hotmail — 13 accounts/ServiceLogin ñòàíîâèòñÿ https://www.google.com/
• paypal.com — 9 accounts/ServiceLogin?!f.ijjk=. Íèêàêîãî Punycode â ïîñëåäíåé
• linkedin.com –9 ññûëêå íå íàáëþäàåòñÿ. Ïëþñ êî âñåìó, ìû îáëàäàåì äåéñòâè-
• facebook.com — 3 òåëüíûì ñåðòèôèêàòîì äëÿ äàííîãî äîìåíà. Çàìåòèòü ðàçíèöó
ïðàêòè÷åñêè íåâîçìîæíî.

XÀÊÅÐ 05 /125/ 09 031