Архитектура исходного кода этого вредоноса достаточно интересна. Функциональность поделена на модули, собираемые в единый “binpack” на этапе компиляции. Процесс компиляции также включает в себя подпись исполняемых файлов сертификатом из файла tric.pfx, который отсутствует в архиве.
Не менее любопытна и сетевая активность Pegasus, который, после заражения, пытается распространиться внутри домена и умеет проксировать данные между машинами, используя пайпы и транспорт Mailslot. Мы сфокусировались на изучении особенностей сетевой активности трояна и оперативно добавили детекты для Pegasus в продукт PT Network Attack Discovery. Это позволит всем его пользователям своевременно обнаруживать активность этого трояна и его модификаций в своей сети. В этой статье я дам подробное описание механизмов распространения по сети и взаимодействия между копиями Pegasus.
![](https://habrastorage.org/webt/yn/sn/-u/ynsn-udu1ai9y-xbrolf4fubrta.png)
Intro
Попав на машину, главный модуль InstallerExe внедряет код в svchost.exe при помощи техники Process Hollowing и, после инициализации главных модулей, Pegasus запускает несколько параллельных процессов:
- Domain Replication — занимается разведкой внутри сети и попытками распространиться на другие Windows машины.
- Mailslot Listener слушает широковещательные mailslot сообщения, при помощи которых Pegasus рассылает добытые учетные записи. Имя слота генерируется во время компиляции.
- Pipe Server Listener слушает Windows Pipe с именем, генерируемым от имени машины. Эти пайпы используются в основном для обнаружения других копий Pegasus в сети и их взаимодействия
- Logon Passwords периодически раз в несколько минут пытается сдампить данные учетных записей модулем из Mimikatz.
- Network Connectivity отвечает за связь с CnC сервером и периодический обмен сообщениями.
// start transports which links data with our CB-manager
pwInitPipeServerAsync(dcmGetServerCallback());
mwInitMailslotServer(dcmGetServerCallback());
...
// start broadcasting creds to other machines
cmStartupNetworkBroadcaster();
Domain Replication
Одна из подсистем в Pegasus отвечает за горизонтальное распространение (Lateral Movement) в Windows сети. Распространение делится на два важных этапа:
- Обнаружение соседних машин.
- Попытка репликации на машину.
Обнаружение соседних машин в домене осуществляется через два API вызова:
![](https://habrastorage.org/webt/-p/6f/sj/-p6fsjb6pe8v-rdjacycwncholk.png)
Все обнаруженные в домене машины подлежат проверке, если они уже заражены. Pegasus опрашивает сгенерированное имя пайпа раз в 200 миллисекунд более чем 20 раз подряд. Такое аномальное поведение было использовано нами в качестве одного из индикаторов активности Pegasus в домене. Не обнаружив признаков заражения, зловред переходит к следующему шагу — попытке репликации.
![](https://habrastorage.org/webt/j0/nw/yl/j0nwylxgv6mvqzd8krxwf2su2x8.png)
Алгоритм определения архитектуры основывается на заголовках PE файлов на удаленной машине. В качестве такого файла Pegasus пытается прочитать первые 4 килобайта notepad.exe из папки %windir%. Неочевидный недостаток такого метода заключается в том, что на Windows Server 2012 блокнот находится по пути %windir%\System32.
Местоположение notepad.exe на Windows 7:
C:\Users\Administrator>where notepad.exe
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe
На Windows Server 2012:
C:\Users\Administrator>where notepad.exe
C:\Windows\System32\notepad.exe
Не обнаружив notepad.exe, Pegasus не может заразить сервер, даже имея данные учетной записи с необходимыми правами. Простое отсутствие блокнота в %windir% может остановить распространение Pegasus на Windows Server 2012. Использование regedit.exe в этом плане более надежно.
После успешного определения архитектуры целевого сервера, Pegasus загружает небольшой дроппер RSE (Remote Service Exe) размером около 10 килобайт, задача которого — загрузить binpack из модулей от Pegasus через пайп в открытом виде и передать управление на модуль Shellcode. Имя дроппера составляется псевдослучайным образом и состоит из строки шестнадцатеричных символов длинной от 8 до 15 символов. Псевдослучайный генератор инициализируется в зависимости от имени целевой машины и будет одинаковым между запусками для избежания возможного замусоривания %windir% прошлыми копиями дроппера.
![](https://habrastorage.org/webt/pu/qb/hf/puqbhf_9-i8k7civefzklrqegxk.png)
Дроппер проверяется на целостность и возможное удаление антивирусом, после чего запускается одним из двух реализованных механизмов — SCM или WMI, причем в в первую очередь Pegasus предпринимает попытку запуска RSE через механизм WMI, а только потом при помощи Service Control Manager (SCM). Делается это по той причине, что SCM оставляет больше следов в журналах Windows. В планах создателей Pegasus были и другие методы распространения — Wsh Remote, Powershell remoting, Task Scheduler, а модуль для исполнения команд через RDP находился в стадии разработки.
Как было упомянуто выше, после успешного запуска дроппер проверяет и открывает пайп на прослушивание и передает управление на пришедшую полезную нагрузку.
![](https://habrastorage.org/webt/od/zt/to/odztto9o8_yrp0galq3-9_owej4.png)
Поскольку код Pegasus инжектируется методом Process Hollowing в процесс svchost.exe, на диске не должно остаться ни первоначального модуля InstallerExe в случае первичного заражения, ни дроппера RSE в случае распространения. Если дроппер всё ещё доступен по известному пути, Pegasus удаляет его собственным способом:
- перезапись содержимого файла случайными данными;
- перезапись пустыми данными (нулями);
- переименование файла;
- удаление файла.
![](https://habrastorage.org/webt/up/ti/uy/uptiuydt0vx1zc9lz29l2kcdy80.png)
После успешного заражения процесс распространения Domain Replication начинается снова.
Mailslot works
![](https://habrastorage.org/webt/z1/oa/hu/z1oahuoskry5bzymotu4d6n_9kk.png)
Поскольку механизм Mailslot накладывает ограничение на максимальный размер пакета, рассылается за раз только одна УЗ по принципу последнего времени рассылки: среди всех имеющихся УЗ по домену рассылается та, чья дата последней рассылки самая старая.
![](https://habrastorage.org/webt/e6/rw/wt/e6rwwt8svxdb_yzrszemgjeonlk.png)
Период рассылки Mailslot сообщений в релизной версии колеблется от 20 секунд до 11 минут.
// some random wait before making next step
DbgPrint("going to sleep");
#ifdef _DEBUG
// debug - 2-5 s
Sleep(rg.rgGetRnd(&rg, 2000, 5000));
#else
// release - 20 - 650 s
//Sleep(rg.rgGetRnd(&rg, 2000, 65000) * 10);
Sleep(rg.rgGetRnd(&rg, 2000, 15000));
#endif
Кроме обмена учетными записями, механизм Mailslot используется для поиска зараженной машины с доступом в интернет и анонсирование доступа в интернет. Конверт NetMessageEnvelope хранит в себе тип рассылаемого сообщения. Сам обмен данными между машиной без доступа и машиной с доступом в интернет осуществляется через пайпы.
Pipe works
Для двусторонней связи или передачи больших объёмов данных копии Pegasus используют пайпы в качестве канала общения. Имя пайпа, хоть и тоже генерируется псевдослучайным генератором, но зависит от имени машины и билда и, тем самым, позволяет клиентской и серверной части использовать одно и то же имя.
При одностороннем общении, например, передаче binpack во время репликации на другую машину, данные не шифруются и передаются в открытом виде. Binpack начинается со структуры SHELLCODE_CONTEXT длинной 561 байт.
![](https://habrastorage.org/webt/qf/ja/89/qfja89-eipqz2lncisi7fkcuqbe.png)
Во время двусторонней передачи, например, проксирования данных между копией Pegasus без доступа в интернет и CnC сервером, используется та же структура конверта NetMessageEnvelope с XOR шифрованием, как и в случае Mailslot, т.к. она позволяет различать разные типы сообщений в поле id.
Архитектурно проксирование данных выполняется через запрос на передачу порции данных (PMI_SEND_QUERY), получения id запроса в ответ и опроса состояния задачи по id (PMI_CHECK_STATUS_QUERY). Как правило, в качестве нагрузки передается другая Envelope структура, добавляющая различные функциональные возможности и ещё один слой шифрования.
Кроме того, работа с пайпами не заканчивается на взаимодействии между зараженными машинами. Модуль mod_KBRI_hd инжектит в процессы cmd.exe код, перехватывающий вызовы MoveFileExW и анализирующий все копируемые данные, поскольку это часть механизма проведения платежей. Если копируемый файл содержит интересные злоумышленникам данные — данные с платежами, нотификация об этом отправляется на CnC сервер. Общение между инжектируемым в cmd.exe модулем mod_KBRI и копией Pegasus осуществляется внутри зараженной машины через пайп, имя которого не генерируется, а жестко задано в исходном коде:
\.\pipe\pg0F9EC0DB75F67E1DBEFB3AFA2
![](https://habrastorage.org/webt/xr/eh/uj/xrehuj7ia40r-g4ka-osjtq9gjc.png)
CnC traffic
За непосредственный обмен данных с CnC сервером отвечает отдельный поток, который раз в несколько минут проверяет очередь чанков данных от внутренних процессов или от других копий вредоноса и отправляет их на сервер.
Во время инициализации модуля mod_NetworkConnectivity он проводит многоступенчатую проверку работоспособности сетевого подключения:
1) Обнаружение настроек прокси сервера и попытка соединения с www.google.com:
- В ветке реестра \\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings.
- Через WPAD (вызов WinHttpGetProxyForUrl).
- Через конфигурацию прокси-сервера для текущего пользователя (вызов WinHttpGetIEProxyConfigForCurrentUser).
2) Проверка соединения с серверами обновлений Microsoft и возвращаемых данных (authrootseq.txt, authrootstl.cab, rootsupd.exe)
3) Тестирование HTTPS соединений с одним из 6и адресов:
- safebrowsing.google.com
- aus3.mozilla.org
- addons.mozilla.org
- fhr.data.mozilla.com
- versioncheck-bg.addons.mozilla.org
- services.addons.mozilla.org
Только по прохождении всех проверок Pegasus считает, что имеет необходимый доступ во внешнюю сеть и может анонсировать это по домену Mailslot сообщением. Причем Pegasus может маскироваться и общаться с CnC сервером только в рабочие часы — с 9 до 19и часов по местному времени.
Чанки данных, обернутых в конверт с подсчетом хеш суммы, Pegasus посылает в зашифрованном виде с использованием DES шифрования в режиме CRYPT_MODE_CBC/PKCS5_PADDING. Ключ шифрования зависит только от переменной во время компиляции, и таким образом мы можем расшифровывать трафик между зловредом и сервером зная только его BUILDCHAIN_HASH. В исходных кодах внутри архива эта переменная имела значение 0x7393c9a643eb4a76. Скрипт для расшифровки отстука (Check-in) на сервер и пример такого пакета можно найти тут: скрипт, PCAP.
Такой контент (структура INNER_ENVELOPE) он передает на CnC сервер во время Check-in, либо вместе с какими-либо данными. Вначале находятся 28 байт конверта с полем длины и SHA1 суммой.
![](https://habrastorage.org/webt/po/zs/7s/pozs7shklsxh653kgnbxkgnmgl0.png)
Те же самые данные передаются между машинами во время проксирования через пайпы, но завернутые внутрь известного нам конверта NetMessageEnvelope с хэш суммой и XOR шифрованием.
Оператор CnC может рассылать команды для исполнения на копии Pegasus и сообщения с командами или другими данными, например EID_CREDENTIALS_LIST могут содержать свои собственные слои шифрования полей, как мы уже видели на примере широковещательной рассылки учетных записей.
Detection
В первую очередь нас интересовало обнаружение активности Pegasus в сети и, после тщательного изучения исходных кодов и запуска в тестовом окружении, мы обнаружили те сетевые аномалии и артефакты, которые явно говорят о присутствии этого сложного вредоноса в сети. Pegasus действительно можно назвать разносторонним — он активно использует протокол SMB для рассылки сообщений и установления связи с другими копиями, распространяется на другие машины и коммуницирует с CnC сервером на свой особый лад. Устанавливая одноранговую сеть в домене, копии Pegasus прокладывают путь до внешней сети и общаются с CnC сервером проксируя трафик через друг друга. Использование сертификатов для подписи исполняемых файлов и обращение к ресурсам компании Microsoft и Mozilla во время проверки соединения затрудняет выявление его активности и обнаружение на хосте.
Проект исходного кода Pegasus достаточно хорошо структурирован и описан, поэтому в скором будущем можно ожидать заимствование частей его кода другими вредоносными программами и появления модификаций.
Многие из механизмов удаленного исполнения команд и поиска данных учетных записей остались нереализованными, разработчики также собирались добавить возможность изменения шеллкода во время внедрения в процесс на лету. И это не все их задумки.
Мы разработали несколько сигнатур для PT NAD и IDS Suricata, позволяющих выявить специфичную для Pegasus активность в сети на разных стадиях, начиная с самых первых секунд его активности. Найти открытые сигнатуры для Suricata IDS можно на нашем github и Twitter, они автоматически попадут к вашей Suricata, если вы используете механизм обновлений suricata-update.
То, как срабатывают сигнатуры на активность Pegasus можно посмотреть на скриншоте ниже. Это наш новый продукт PT Network Attack Discovery, выявляющий инциденты и помогающий в их расследовании:
![](https://habrastorage.org/webt/cc/ok/ou/ccokou2rr1ed01valiivylk6prs.png)
Кроме того, для обнаружения можно использовать следующие индикаторы компрометации (IC):
MAILSLOT\46CA075C165CBB2786 pipe\pg0F9EC0DB75F67E1DBEFB3AFA2 hxxp://denwer/pegasus/index.php hxxp://mp3.ucrazy.org/music/index.php hxxp://support.zakon-auto.net/tuning/index.asp hxxp://video.tnt-online.info/tnt-comedy-tv/stream.php
Автор: Кирилл Шипулин из команды @attackdetection, Twitter | Telegram
Комментарии (5)
Busla
24.07.2018 15:56Почему это троян?
teecat
25.07.2018 12:31А кто еще? Заражения файлов не видно, значит не вирус. Основной функционал не включает функции червя. Чистой воды троян.
Busla
25.07.2018 13:55Это типичный компьютерный вирус — самораспространяющееся вредоносное ПО. Вы же, видимо, подразумеваете «файловый вирус» (или другой частный случай?). Троянская программа — это ПО двойного действия — помимо полезного известного пользователю/администратору функционала делает ещё что-то.
Конечно, сложно определить основной функционал модульного конструктора, но больше как раз похож на сетевого червя.teecat
25.07.2018 14:10Нет. Вирус/троян/червь — тип распространения. Вирус заражает файлы, их можно лечить. Так как заражает, то может сам распространяться. Бывает не для всех систем. Скажем для Андроид вирусов нет. Троян файлы не заражает и потому сам не распространяется. Лечить его нельзя, только удалить. Червь это по факту троян с возможностью переползания из одной системы в другую
Троян как правило не имеет невредоносного функционала. Я бы сказал, что случаи маскировки под известные редкость — заметная доля только под Андроид
Особняком стоят бестелесные и эксплойты — по сути код, который куда-то засовывают.
Бывают редкости. Скажем вредоносный код в картинке. Реально встречается такое
Бывает, что вредоносное ПО имеет загрузчик/конфигуратор, который определяет какой модуль в систему скачать. Обычно там трояны и бестелесные
Для интереса. Недавно смотрел статистику по вирусам — в топ пять единственный вирус и древний как не знаю что — новость по нему мы выпустили аж в 2007м году
rt3879439
Последний скриншот похож по выдаваемой информации на Suricata+ELK.