Кража данных через IPv6 (перевод)
Тестирование возможностей IPv6 и того, как вредоносное ПО может им воспользоваться.
Что такое эксфильтрация?
Эксфильтрация — это несанкционированный экспорт конфиденциальных данных из сети путем подключения к внешнему адресату и/или использования скрытых каналов. Последний обычно используется для кражи информации, оставаясь незамеченной, или для избежания каких-либо мер по остановке миграции данных. По этой теме проводились многочисленные исследования, и даже по сей день кража данных в результате взлома всегда находится в центре внимания.
Для эксфильтрации данных обычно используются сетевой и транспортный уровни (показанные на рисунке 1), а также низкоуровневые уровни, которые потребуют глубокой проверки пакетов для поиска происшествий или определения того, что происходит при эксфильтрации. Они также предоставляют поля и части данных в заголовках пакетов, которые обычно не используются или обнуляются. Эти разделы могут использоваться для хранения частей данных и могут оставаться незамеченными при анализе захваченных пакетов.

Инструменты для получения данных
Существует несколько инструментов для эксфильтрации через сетевой стек IPv6. Мы опишем IPv6teal и IPv6DNSExfil и то, как эти инструменты используются для эксфильтрации данных через IPv6.
IPv6teal
IPv6teal состоит из скрипта получателя и отправителя (эксфильтрации). Этот инструмент использует flow метки, которые используются для обозначения последовательности пакетов и имеют фиксированный размер 20 бит (подробно на рис.2). Он использует это конкретное поле, потому что оно может изменятся и содержать настраиваемые биты, не влияя на то, что пакет достигает места назначения. Эта деталь является хорошим кандидатом для хранения данных, которые могут безопасно достигать конечной точки, будучи скрытыми в обычном трафике.

Чтобы уместить больше данных в меньшее количество пакетов, автор решил использовать сжатие GZIP. В наших тестах на отправку через Интернет простого текстового файла, содержащего строку THISISASECRET, потребовалось около двух секунд и 15 пакетов. Информация передается с magic значением, которое отмечает начало и конец потока данных. Эти magic значения также добавляют дополнительную информацию о передаваемых данных.
Поток пакетов для нашего теста в итоге строится следующим образом:
Пакеты построены на двух верхних уровнях: уровне IPv6 и «raw» уровне, который представляет собой только данные, добавленные к последнему уровню. Raw уровень содержит magic значения, обсуждавшиеся ранее, и сообщает получателю, когда начинается передача, сколько бит будет передано и сколько пакетов будет передано, не считая пакета, заканчивающего передачу.
Другой метод эксфильтрации на более высоком уровне модели OSI выполняется через записи DNS AAAA. AAAA записи были разработаны для использования с адресами IPv6. Когда клиент запрашивает IPv6-адрес домена, он будет использовать эту запись, чтобы получить ее от DNS-сервера. Хотя для этого обычно использовались записи TXT, поскольку они могут содержать данные как для человека, так и для машинного чтения, запросы к записям TXT менее распространены и могут быть быстро обнаружены во время исследования сетевого потока.
IPv6DNSExfil
Такие инструменты, как IPv6DNSExfil, используют этот метод для хранения секрета в формате псевдо-IPv6-адреса в течение короткого периода времени в записях AAAA. Он использует инструмент nsupdate для динамического создания упомянутых записей AAAA и передачи их на вышестоящий DNS-сервер, таким образом, удаляя информацию. Запись, созданная таким образом с использованием того же секрета, который мы использовали ранее, будет выглядеть так:
После того, как запись установлена, злоумышленники могут использовать эти данные по своему усмотрению, либо используя их в качестве C&C ( как предлагает автор ), либо просто передавая информацию от одной конечной точки к другой с помощью DNS-запросов к этому конкретному серверу.
Пользовательские методы эксфильтрации
Такие библиотеки, как scapy для Python, упрощают разработчикам взаимодействие с сетевыми абстракциями на более высоком уровне. Например, всего с двумя строчками кода мы можем отправить созданный пакет в конечную точку IPv6:
Проснифив другую конечную точку, мы видим, что пакет достигает пункта назначения с дополнительным необработанным слоем, в который мы включили строку «test»:
Используя тот же подход, мы можем начать генерировать трафик динамически, используя scapy, вместо того, чтобы просто отправлять пакеты без верхнего транспортного уровня. В одном случае будет использоваться протокол ICMPv6 , который является улучшенной версией своего родственника IPv4. «Классический» метод эксфильтрации, использующий этот протокол, заключается в использовании сообщений эха и ответа (обычно используемых сетевым инструментом ping6 ) для отправки данных за пределы сети без установления соединения, такого как TCP. Таким образом, мы можем отправлять определенные фрагменты данных по IPv6 через эхо-запросы ICMPv6 на удаленный хост, отслеживающий сеть. Взгляните на этот код, например:
Этот скрипт будет использовать секретную строку, которую мы отправляли ранее, зашифрует ее с помощью шифра XOR и отправит каждые два байта этой секретной зашифрованной строки через эхо-запрос ICMPv6 с определенным идентификатором. Эти два байта скрыты в поле последовательности, которое является коротким целочисленным полем, и могут быть расшифрованы получателем. Кроме того, мы настраиваем пакет с определенным идентификатором (в данном случае 0x1337), потому что мы хотим легко распознать пакет как один из наших среди потока сетевого трафика. Итак, пришлем секрет!
С другой стороны будет приемник. Получатель проверяет идентификатор эхо-запроса ICMPv6 и, если он совпадает, декодирует данные, отправляемые через поле последовательности. Код выглядит так:
После его запуска скрипт будет прослушивать сеть, в частности, на предмет пакетов IPv6 и ICMPv6. Этот сетевой анализ основан на фильтрах tcpdump, которые будут обрабатывать пакеты, которые могут быть нам интересны. Как только пакет захвачен, он обрабатывается функцией pkt (), которая проверяет идентификатор ICMPv6, и если он совпадает с идентификатором, который мы ищем, он расшифровывает информацию и выводит ее на экран:
Проще этот процесс можно объяснить с помощью следующего потокового графа:

Выделенное здесь доказательство концепции заняло то же время, что и, например, IPv6teal с 2 секундами для передачи секретной строки и имитации (почти) нормального ICMPv6, создаваемого ping6 . Мы провели тест с 1 килобайтом данных, которые должны быть переданы с использованием этой техники через Интернет, и на выполнение задачи потребовалось 8 минут 42 секунды .
В итоге
Популярность IPv6 растет, а также растет потребность в большем адресном пространстве. Хотя процент внедрения IPv6 во всем мире ниже 35% в основном потому, что он по-прежнему требует больших усилий и инвестиций от компаний и организаций. Это означает, что инструменты и методы, продемонстрированные в этой статье, потребуют времени для полного внедрения или использования, оставляя место для дальнейшей разработки новых идей и методологий.