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

Анализ вредоносов

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
Подробнее..

Старый конь борозды не испортит как стилер 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-канала не включен код-пароль приложения, то злоумышленникам не составит труда восстановить сессию и сменить владельца канала. Так что вывод прост: не открывать подозрительные сообщения, архивы и ссылки и не пользоваться ОС, где стилеры чувствуют себя как дома.

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

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

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

Подробнее..

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

02.04.2021 12:23:26 | Автор: admin

Недавно мы расследовали АРТ-атаку на одну российскую компанию и нашли много занятного софта. Сначала мы обнаружили продвинутый бэкдор PlugX, популярный у китайских группировок, АРТ-атаки которых обычно нацелены на похищение конфиденциальной информации, а не денег. Затем из скомпрометированной сети удалось вытащить несколько других схожих между собой бэкдоров (nccTrojan, dnsTrojan, dloTrojan) и даже общедоступных утилит.


Программы, используемые в этой преступной кампании, не отличаются сложностью, за исключением, может быть, PlugX. К тому же три из четырех вредоносов использовали при запуске давно известную технику DLL hijacking. Тем не менее, как показало наше исследование, даже при таких условиях злоумышленники могут годами оставаться в скомпрометированных сетях.


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


PlugX


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


Запуск PlugX


PlugX, как правило, распространяется в виде самораспаковывающихся архивов, содержащих:


  • невредоносный исполняемый файл (EXE), подписанный цифровой подписью (нам попадались подписи McAfee, Kaspersky, Support.com);
  • вредоносную динамическую библиотеку (Dynamic Link Library DLL);
  • зашифрованную основную нагрузку файлы с произвольными именем и расширением.

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



Рис. 1. Наглядное представление техники DLL hijacking


Рассмотрим в качестве примера один из экземпляров PlugX, характеристики которого приведены в табл. 1.


Табл. 1. Свойства файлов одного из образцов PlugX
Свойство EXE DLL Зашифрованная нагрузка
Имя файла mcut.exe mcutil.dll mcutil.dll.bbc
Тип файла PE32 executable (EXE) PE32 executable (DLL) None
Размер (в байтах) 140 576 4 096 180 358
Время компиляции 13 июня 2008 года 02:39:28 9 декабря 2014 года 10:06:14
MD5 884d46c01c762ad6ddd2759fd921bf71 e9a1482a159d32ae57b3a9548fe8edec 2d66d86a28cd28bd98496327313b4343
SHA-1 d201b130232e0ea411daa23c1ba2892fe6468712 a2a6f813e2276c8a789200c0e9a8c71c57a5f2d6 7bcf4f196578f2a43a2cd47f0b3c8d295120b646
SHA-256 3124fcb79da0bdf9d0d1995e37b06f7929d83c1c4b60e38c104743be71170efe 2f81cf43ef02a4170683307f99159c8e2e4014eded6aa5fc4ee82078228f6c3c 0c831e5c3aecab14fe98ff4f3270d9ec1db237f075cd1fae85b7ffaf0eb2751

Вот что происходит при запуске невредоносного исполняемого файла (EXE) из пакета.


Сначала одна из импортируемых им библиотек (отдельная DLL) заменяется вредоносной. После загрузки в память процесса DLL открывает третий файл из пакета PlugX, который обходит средства защиты за счет отсутствия видимого исполняемого кода. Тем не менее он содержит шелл-код, после исполнения которого в памяти расшифровывается еще один дополнительный шелл-код. Он с помощью функции RtlDecompressBuffer() распаковывает PlugX (DLL). При открытии мы видим, что сигнатуры MZ и PE в исполняемом файле PlugX заменены на XV (рис. 2) скорее всего, это тоже нужно, чтобы скрыть модуль от средств защиты.



Рис. 2. Исполняемый файл PlugX в распакованном виде с измененными сигнатурами MZ и PE


Наконец, запускается распакованная вредоносная библиотека, и управление передается ей.


В другом экземпляре PlugX мы обнаружили интересную особенность: малварь пыталась скрыть некоторые библиотечные вызовы от песочниц. При восстановлении импортов вместо адреса импортируемой функции сохранялся адрес тремя байтами ранее. Результат для функции SetFileAttributesW() виден на рис. 3.



Рис. 3. При получении адреса функции SetFileAttributesW() сохраняется адрес 0x7577D4F4


В табл. 2 приведены характеристики этого экземпляра.


Табл. 2. Свойства файлов образца вредоносной программы PlugX, который пытался скрыть вызовы от песочниц
Свойство EXE DLL Зашифрованная нагрузка
Имя файла mcut.exe mcutil.dll mcutil.dll.bbc
Тип файла PE32 executable (EXE) PE32 executable (DLL) None
Размер 140 576 4 096 179 906
MD5 884d46c01c762ad6ddd2759fd921bf71 12ee1f96fb17e25e2305bd6a1ddc2de9 e0ae93f9cebcba2cb44cec23993b8917
SHA-1 d201b130232e0ea411daa23c1ba2892fe6468712 bf25f1585d521bfba0c42992a6df5ac48285d763 f0efdb723a65e90afaebd56abe69d9f649ca094c
SHA-256 3124fcb79da0bdf9d0d1995e37b06f7929d83c1c4b60e38c104743be71170efe 97ad6e95e219c22d71129285299c4717358844b90860bb7ab16c5178da3f1686 81e53c7d7c8aa8f98c951106a656dbe9c931de465022f6bafa780a6ba96751eb

На рис. 4 представлен фрагмент кода PlugX, где встречается функция SetFileAttributesW(), и листинг из одной из песочниц.



а)



б)
Рис. 4. Фрагмент декомпилированного кода (а) и соответствующий ему фрагмент листинга перехваченных инструкций (б), где встречается вызов функции SetFileAttributesW()


В листинге из песочницы мы не видим вызов функции SetFileAttributesW(). Впрочем, вызовы функций LoadLibrary() и GetProcAddress(), которые были импортированы аналогичным образом, мы тоже не видим.


Основная нагрузка PlugX не сохраняется в расшифрованном виде на диске.


Работа PlugX


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


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


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


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


Режим работы вредоносной программы зависит от значения флага конфигурации mode_flag, которое может быть равно 0, 2, 3 или 4.


Если значение mode_flag равно 0, вредоносная программа закрепляется в системе (подробнее в разделе Закрепление в системе). Затем она переходит к инициализации плагинов и взаимодействию с сервером управления (подробнее в разделе Функциональность плагинов и исполнение команд).


Если значение mode_flag равно 2, вредоносная программа сразу переходит к инициализации плагинов и взаимодействию с сервером управления.


Если значение mode_flag равно 3, вредоносная программа внедряет шелл-код в Internet Explorer. Передача управления вредоносному коду осуществляется с помощью функции CreateRemoteThread(). Также производится инициализация плагинов, и создается именованный пайп, через который вредоносная программа получает команды, предназначенные для исполнения плагинами.


Если значение mode_flag равно 4, устанавливается перехват некоторых функций библиотеки wininet.dll. В функции-перехватчике извлекаются логины и пароли для подключения к прокси-серверу. Полученные данные будут сохранены в файле в рабочей директории вредоносной программы. При этом имена файлов, создаваемых малварью в процессе функционирования, генерируются на основе серийного номера диска и некоторого уникального для каждого файла значения. Перехватываются следующие функции:


  • HttpSendRequestA(),
  • HttpSendRequestW(),
  • HttpSendRequestExA(),
  • HttpSendRequestExW().

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


Если конфигурация PlugX предусматривает закрепление вредоноса в зараженной системе, то в ней прописан каталог, в который будут скопированы компоненты малвари.


Анализируемый образец выбирает одну из следующих директорий в зависимости от разрядности малвари:


  • %SystemRoot%\System32\winssxs,
  • %SystemRoot%\SysWOW64\winssxs.

Для созданной директории и скопированных в нее компонентов программа пытается установить временные метки, совпадающие с временными метками библиотеки ntdll.dll из зараженной системы. Возможно, это нужно для маскировки под компонент ОС. Также PlugX скрывает эти файлы от пользователя, выставляя атрибуты FILE_ATTRIBUTE_SYSTEM и FILE_ATTRIBUTE_HIDDEN. В конфигурации указывается путь к месту, где будут сохраняться скриншоты, сделанные вредоносной программой.


В зависимости от persistence_flag PlugX может закрепляться:


  • как сервис (persistence_flag=1),
  • через реестр (persistence_flag=2),
  • любым из двух способов (persistence_flag=0), сначала попытаться создать сервис, а в случае неудачи закрепиться через реестр.

Помним, что малварь может и не закрепляться вовсе.


Когда вредонос пытается закрепиться как сервис, он маскируется под легитимную программу. Имя службы и ее параметры задаются в конфигурации. Например, в нашем образце создается сервис с именем SSXSS (отображаемое имя SSXS) и описанием McAfee OEM Info Copy Files, а качестве исполняемого файла службы используется невредоносный mcut.exe.


Если закрепиться в качестве службы не удается, программа пытается закрепиться через реестр и перезапускает себя из каталога, в который была скопирована ранее. Для этого она использует ключ реестра HKCU\Software\Microsoft\Windows\CurrentVersion\Run. Ключ реестра и параметр задаются через конфигурацию: в анализируемом образце в параметр, соответствующий отображаемому имени сервиса, программа прописывает путь до того же mcut.exe.


После того, как вредоносная программа закрепилась и перезапустилась, производится внедрение вредоносного кода. В анализируемом образце он работает в памяти легитимного процесса svchost.exe. Имя процесса подтягивается из конфигурации. Если внедрение кода прошло успешно, текущий процесс завершается.


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


Функциональность плагинов PlugX и исполняемые команды


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



Рис. 5. Фрагмент инициализации плагинов PlugX


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


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


Табл. 3. Функциональность PlugX, доступная через плагины


Плагин Команда Функциональные возможности
DISK
0x3000
Собрать информацию по всем дискам (тип и свободное пространство)
0x3001
Перечислить файлы в директории
0x3002
Перечислить файлы
0x3004
Прочитать файл
0x3007
Создать директорию и сохранить в нее файл
0x300A
Создать директорию
0x300C
Создать новый рабочий стол и запустить процесс
0x300D
Копировать, переместить, переименовывать или удалить файл
0x300E
Получить значение переменной окружения
KeyLogger
0xE000
Отправить данные кейлоггера на сервер управления
Nethood
0xA000
Перечислить сетевые ресурсы
0xA001
Установить соединение с сетевым ресурсом
Netstat
0xD000
Получить таблицу TCP
0xD001
Получить таблицу UDP
0xD002
Установить состояние TCP
Option
0x2000
Заблокировать экран компьютера
0x2001
Отключить компьютер (принудительно)
0x2002
Перезагрузить компьютер
0x2003
Отключить компьютер (безопасно)
0x2005
Показать окно с сообщением
PortMap
0xB000
Возможно, запустить маппинг портов
Process
0x5000
Получить информацию о процессах
0x5001
Получить информацию о процессе и модулях
0x5002
Завершить процесс
Regedit
0x9000
Перечислить подразделы ключа реестра
0x9001
Создать ключ реестра
0x9002
Удалить ключ реестра
0x9003
Скопировать ключ реестра
0x9004
Перечислить значения ключа реестра
0x9005
Задать значение ключа реестра
0x9006
Удалить значение из ключа реестра
0x9007
Получить значение из ключа реестра
Screen
0x4000
Использовать удаленный рабочий стол
0x4100
Сделать скриншот
0x4200
Найти скриншоты в системе
Service
0x6000
Получить информацию о сервисах в системе
0x6001
Изменить конфигурацию сервиса
0x6002
Запустить сервис
0x6003
Управлять сервисом
0x6004
Удалить сервис
Shell
0x7002
Запустить cmd-шелл
SQL
0xC000
Получить список баз данных
0xC001
Получить список описаний драйверов
0xC002
Выполнить SQL-команду
Telnet
0x7100
Настроить Telnet

Фрагмент функции обработки команд, полученных от сервера управления приведена на рис. 6.



Рис. 6. Команды сервера управления, которые получает PlugX


Описание команд приведено в табл. 4.


Табл. 4. Команды сервера управления, которые получает PlugX


Команда Описание
0x1 Отправить на сервер управления данные о зараженной системе:
имя компьютера;
имя пользователя;
информация о CPU;
текущее использование памяти системой;
информация об операционной системе;
системные дата и время;
системная информация;
язык системы
0x5 Самоудалиться (удалить службу, очистить реестр)
0x3 Передать команды плагинам со сменой протокола взаимодействия
0x6 Отправить текущую конфигурацию PlugX на сервер управления
0x7 Получить с сервера управления новую конфигурацию и обновить текущую
0x8 Отправить список процессов с внедренным шелл-кодом
default Передать команды плагинам

nccTrojan


Один из обнаруженных нами бэкдоров найден в отчете VIRUS BULLETIN и назван авторами nccTrojan по константному значению в коде основного пейлоада. Характеристики попавшегося нам образца малвари приведены в табл. 5.


Табл. 5. Свойства анализируемого образца nccTrojan
Свойство EXE DLL
Имя файла instsrv.exe windowsreskits.dll
Тип файла PE32 executable (EXE) PE32 executable (DLL)
Размер (в байтах) 83 968 514 048
Время компиляции 18 декабря 2019 года 03:13:03 21 марта 2020 года 15:19:04
MD5 c999b26e4e3f15f94771326159c9b8f9 056078b1c424667e6a67f9867627f621
SHA-1 ec12c469463029861bd710aec3cb4a2c01907ad2 5bd080285a09c0abf742fb50957831310d9d9769
SHA-256 07d728aa996d48415f64bac640f330a28e551cd565f1c5249195477ccf7ecfc5 3be516735bafbb02ba71d56d35aee8ce2ef403d08a4dc47b46d5be96ac342bc9

Запуск nccTrojan


Вредоносная программа состоит из двух файлов: EXE и DLL, но в данном случае техника DLL hijacking не используется. После запуска вредоносный EXE-файл (MD5: c999b26e4e3f15f94771326159c9b8f9) регистрирует библиотеку windowsreskits.dll (MD5: 056078b1c424667e6a67f9867627f621) в качестве сервиса. В зависимости от разрядности библиотеки ее файл копируется в одну из директорий:


  • %SystemRoot%\System32;
  • %SystemRoot%\SysWOW64 .

В результате создается сервис с именем WindowsResKits, работающий в контексте процесса svchost.exe.


Работа nccTrojan


nccTrojan расшифровывает конфигурацию, хранящуюся по определенному смещению в оверлее. Конфигурация зашифрована с помощью алгоритма AES-CFB-256, он же используется для шифрования взаимодействия с сервером управления. Пары ключ шифрования + вектор инициализации захардкоржены и различны для шифрования конфигурации и взаимодействия с сервером управления.


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


***news.niiriip.com|#|none|#|none|#|443|#|none|#|none|#|passwd|#|ncc|#|v2.2[Service]***


Строка v2_2[Service], вероятнее всего, характеризует версию вредоносной программы и также используется в качестве имени при создании мьютекса.


В зависимости от конфигурации nccTrojan может иметь до трех серверов управления. В исследуемом экземпляре вредоносной программы задан лишь один сервер управления news.niiriip[.]com, а поля конфигурации под оставшиеся два заполнены none.


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


Если соединение установлено, то на сервер управления отправляется следующая информация:


  • имя компьютера,
  • контрольная сумма от отправляемых данных,
  • имя пользователя,
  • уровень привилегий пользователя в системе (SYSTEM, Administrator или User),
  • IP-адреса зараженной системы,
  • идентификатор версии операционной системы,
  • язык системы.

При этом из собранных данных формируется строка, которая дальше зашифровывается и отправляется на сервер управления. Формат создаваемой строки:


passwd|#|<check_sum>|#|<computer_name>|#|<user_name>|#|<user_privilege>|#|<ip_addr_1 / ip_addr_2 / ...>|#|None|#|v2.2[Service]|#|<os_version_ID>|#|<language_ID>


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


Табл. 6. Команды, исполняемые nccTrojan


Команда Назначение
0x2 Запустить сmd-шелл
0x3 Выполнить команду через cmd-шелл
0x4 Записать данные в файл
0x5 Получить информацию о дисках C-Z (тип, свободный объем памяти)
0x6 Получить информацию о файлах
0x8 Запустить процесс
0xA Удалить файл или директорию
0xC Прочитать файл
0xF Проверить наличие файла
0x11 Сохранить файл
0x13 Получить список запущенных процессов
0x15 Завершить процесс
0x17 Скопировать файл
0x1A Переместить файл
0x1D Запустить cmd-шелл с правами пользователя

dnsTrojan


Следующий бэкдор мы обнаружили впервые: на момент расследования мы не нашли упоминаний о нем в отчетах других экспертов. Его отличительная особенность общение с сервером управления через DNS. В остальном по своей функциональности вредоносная программа схожа с бэкдором nccTrojan. Чтобы сохранить единообразие в названиях найденной малвари, назвали ее dnsTrojan.


В рамках инцидента обнаружен CAB-архив, содержащий вредоносный исполняемый файл (MD5: a3e41b04ed57201a3349fd42d0ed3253). Характеристики образца, который мы вытащила в ходе расследования, приведены в табл. 7.


Табл. 7. Свойства анализируемого образца dnsTrojan
Свойство EXE
Имя a.exe.ok
Тип файла PE32 executable (EXE)
Размер (в байтах) 417 280
Время компиляции 13 октября 2020 года 20:05:59
MD5 a3e41b04ed57201a3349fd42d0ed3253
SHA-1 172d9317ca89d6d21f0094474a822720920eac02
SHA-256 826df8013af53312e961838d8d92ba24de19f094f61bc452cd6ccb9b270edae5

Запуск dnsTrojan


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


  • b"30" ('0') вредоносная программа работает в своей текущей директории, в реестр не прописывается, по завершении исполнения все созданные в процессе функционирования файлы: LiveUpdate.exe, ccL100U.dll и сам исполняемый файл удаляются (конфигурация анализируемого образца);
  • b"31" ('1') вредоносная программа работает в %AppData%\Sep, прописывается в реестре, по завершении исполнения удаляется только сам исполняемый файл.

Подстрока d3d3MS5kb3RvbWF0ZXIuY2x1Yjsw представляет собой закодированную в base64 конфигурацию сервера управления www1.dotomater.club;0.


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


  • LiveUpdate.exe (MD5: 1a7f595ba8c28974619582040dcad404),
  • ccL100U.dll (MD5: 0697433432d209c1ed95f6f75a111234).

Далее запускается файл LiveUpdate.exe, имеющий цифровую подпись Symantec Corporation.


В этом случае злоумышленники снова используют технику DLL hijacking: легитимная DLL заменяется на вредоносную ccL100U.dll. В результате исполнения кода библиотеки из ее ресурсов извлекается и распаковывается код самого бэкдора, который внедряется и исполняется в памяти легитимного процесса dllhost.exe. Для внедрения кода применяется техника Process Hollowing.


Если вредоносная программа прописывается в реестр, в ключ реестра HKCU\Environment добавляется параметр UserInitMprLogonScript со значением %AppData%\Roaming\Sep\LiveUpdate.exe.


Работа dnsTrojan


Все свои действия вредоносная программа логирует в файл %ProgramData%\logD.dat, при этом записанные данные похожи на отладочную информацию для злоумышленников (рис. 7).



Рис. 7. Фрагмент файла logD.dat


Закодированная в base64 конфигурация содержит адреса сервера управления и DNS-сервера. В текущем семпле раскодированная конфигурация выглядит так: www1.dotomater.club;0, то есть адрес конкретного DNS-сервера злоумышленников отсутствует, а для взаимодействия с сервером управления используется DNS-сервер зараженной системы.


Взаимодействие с сервером управления осуществляется с использованием DNS-туннелирования. Данные передаются серверу управления в виде DNS-запроса TXT-записи в зашифрованном виде.


Сразу после запуска на сервер управления отправляются следующие данные:


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

Из них формируется сообщение вида 8SDXCAXRZDJ;O0V2m0SImxhY;6.1.1;1;00-13-d2-e3-d6-2e;2020113052831619.


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


  • шифруются с помощью алгоритма AES-128-CBC, ключ шифрования вырабатывается из константной строки dadadadadadadada с помощью функции CryptDeriveKey();
  • кодируются в base64.

При формировании домена, для которого запрашивается TXT-запись, после каждого 64-го символа ставится точка. Запросы, отправляемые вредоносной программой, можно увидеть на рис. 8.



Рис. 8. Пример трафика вредоносной программы dnsTrojan

В ответ на запрос, отправленный на предыдущем шаге из TXT-записей, dnsTrojan получает команды сервера и может исполнить их (табл. 8).


Табл. 8. Команды, исполняемые dnsTrojan
Команда Назначение
0x1 Получить онлайн-данные
0x2 Запустить сmd-шелл
0x3 Выполнить команду через cmd-шелл
0x4 Получить информацию о дисках CZ (тип, свободный объем памяти) или файлах
0x6 Прочитать файл
0x7 Скопировать файл
0x8 Удалить файл
0x9 Проверить наличие файла
0xA Сохранить файл
0xB Установить время бездействия программы (в минутах)
0xD Самоудалиться (очистить реестр)

dloTrojan


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


В процессе исполнения кода расшифровывается строка dlo, поэтому по аналогии с предыдущими двумя программами мы назвали ее dloTrojan.


Характеристики файлов исследуемого нами образца приведены в табл. 9.


Табл. 9. Свойства анализируемого экземпляра dloTrojan
Свойство EXE DLL
Имя ChromeFrameHelperSrv.exe chrome_frame_helper.dll
Тип файла PE32 executable (EXE) PE32 executable (DLL)
Размер (в байтах) 82 896 240 128
Время компиляции 12 июля 2013 года 19:11:41 14 сентября 2020 года 16:34:44
MD5 55a365b1b7c50887e1cb99010d7c140a bd23a69c2afe591ae93d56166d5985e1
SHA-1 6319b1c831d791f49d351bccb9e2ca559749293c 3439cf6f9c451ee89d72d6871f54c06cb0e0f1d2
SHA-256 be174d2499f30c14fd488e87e9d7d27e0035700cb2ba4b9f46c409318a19fd97 f0c07f742282dbd35519f7531259b1a36c86313e0a5a2cb5fe1dadcf1df9522d

Запуск dloTrojan


На сцену опять выходит DLL hijacking.


Итак, вредоносная программа dloTrojan состоит из двух компонентов:


  • ChromeFrameHelperSrv.exe невредоносный исполняемый файл (EXE), имеющий цифровую подпись Google Inc.,
  • chrome_frame_helper.dll вредоносная динамическая библиотека (DLL).

После запуска исполняемого EXE-файла подгружается код вредоносной DLL. При этом библиотека проверяет имя процесса, в который она загружена, и оно должно соответствовать имени ChromeFrameHelperSrv.exe. В противном случае, вредоносный код завершит свое исполнение.


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


Работа dloTrojan


Вредоносная программа пытается получить данные значения с именем TID из одного из двух ключей реестра (это зависит от имеющихся привилегий в системе):


  • HKLM\Software\VS,
  • HKCU\Software\VS.

Если же значение в реестре отсутствует, создается один из указанных ключей реестра. В параметре TID прописывается строка из 16 произвольных символов, которую в дальнейшем можно рассматривать как ID зараженной системы.


Далее dloTrojan проверяет наличие подключения к сети в зараженной системе. Для этого она пытается установить соединение с www.microsoft[.]com.


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


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


Теперь dloTrojan устанавливает соединение с сервером управления. Если подключиться к серверу не удалось, малварь пытается найти настроенные прокси-серверы одним из способов:


  • вызывает функцию InternetQueryOptionA() с параметром INTERNET_OPTION_PROXY и получает список доступных прокси-серверов;
  • достает из реестра HKEY_USERS\<user_SID>\Software\Microsoft\Windows\CurrentVersion\Internet Settings из параметра ProxyServer.

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


  • имя компьютера,
  • имя пользователя;
  • IP-адреса зараженной системы,
  • сведения о версии операционной системы,
  • принадлежность компьютера к рабочей группе или домену,
  • идентификатор оригинального производителя оборудования результат работы функции GetOEMCP(),
  • ID, хранимый в реестре.

Данные передаются на сервер управления в зашифрованном виде.


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


Перечень возможных команд приведен в табл. 10.


Табл. 10. Команды, исполняемые dloTrojan


Команда Назначение
0x1 Получить количество миллисекунд, прошедших с момента запуска системы
0x2 Запустить сmd-шелл
0x3 Выполнить команду через cmd-шелл
0x4 Закрыть cmd-шелл
0x5 Проверить существование файла. Если файла нет, создать его
0x6 Создать файл
0x7 Получить данные файла (размер, временные метки)
0x8 Прочитать файл
0x9 Получить информацию о дисках CZ (тип, объем свободной памяти)
0xA Перечислить файлы
0xB Удалить файл
0xC Переместить файл
0xD Запустить процесс
0xE Сделать скриншот
0xF Перечислить сервисы
0x10 Запустить сервис
0x11 Перечислить процессы и модули
0x12 Завершить процесс, затем перечислить процессы и модули
0x13 Закрыть сокет

И еще несколько программ, которые мы раскопали в ходе расследования


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


GetPassword


GetPassword предназначена для получения паролей из зараженной системы. Раньше исходный код утилиты лежал в репозитории MimikatzLite, но сейчас его почему-то удалили. Можем только поделиться скриншотом на рис. 9.



Рис. 9. Скриншот работы утилиты GetPassword


Quarks PwDump


Еще одна утилита для извлечения паролей из ОС Windows.


Исходный код можно найти в репозитории 0daytool-quarkspwdump. Скриншот утилиты приведен на рис. 10.



Рис. 10. Скриншот работы утилиты Quarks PwDump


wpmd v 2.3 (beta)


wpmd (windows password and masterkey decrypt) также предназначена для получения паролей в ОС Windows. Увы, источник мы не нашли, поэтому можем только показать скриншот (рис. 11).



Рис. 11. Скриншот работы утилиты wpmd v 2.3 (beta)


os.exe


os.exe позволяет определить версию ОС Windows (рис. 12). Источник тоже не найден :(



Рис. 12. Скриншот работы утилиты os.exe


nbtscan 1.0.35


nbtscan утилита командной строки, предназначенная для сканирования открытых серверов имен NETBIOS в локальной или удаленной TCP/IP-сети. Она обеспечивает поиск открытых общих ресурсов (рис. 13). Доступна на ресурсе Unixwiz.net.



Рис. 13. Скриншот работы утилиты nbtscan


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


Напоследок хотим поделиться индикаторами компрометации:

PlugX (SHA256: EXE, DLL, Shell-code)


3124fcb79da0bdf9d0d1995e37b06f7929d83c1c4b60e38c104743be71170efe2f81cf43ef02a4170683307f99159c8e2e4014eded6aa5fc4ee82078228f6c3c0c831e5c3aecab14fe98ff4f3270d9ec1db237f075cd1fae85b7ffaf0eb2751e94004d84edf72720b270a49bf673c98aba2e4da65dc5a8542566cec073ee7812e3fcb055cf50884a192aca2f958f899eb0033c1a1b923deb7d56baaca9d7122d55efc36799631f12f54dfa574aafa1c8e1d4d1b659c159253987d24fecc3218518a98c2d905a1da1d9d855e86866921e543f4bf8621faea05eb14d8e5b23b60c68d58f68591a8306b15de98913897a34bc96ffc6db10e4113144cc54aaa0dda45697c9086fd5abd030ceb937c396c6893ecc8d4a848785fac61ce13d5740edca3124fcb79da0bdf9d0d1995e37b06f7929d83c1c4b60e38c104743be71170efe97ad6e95e219c22d71129285299c4717358844b90860bb7ab16c5178da3f168681e53c7d7c8aa8f98c951106a656dbe9c931de465022f6bafa780a6ba96751eb

PlugX-executor: (SHA256: EXE)


2f73a3c7fa58d93d60d3011724af2c7beddc39469c0613ce097657849ab32e8243f1bd29811393476320542473d6c1dedea172a62ccf1a876a04a53ed876f3a4

nccTrojan (SHA256: EXE, DLL)


07d728aa996d48415f64bac640f330a28e551cd565f1c5249195477ccf7ecfc53be516735bafbb02ba71d56d35aee8ce2ef403d08a4dc47b46d5be96ac342bc9

dnsTrojan (SHA256: EXE)


826df8013af53312e961838d8d92ba24de19f094f61bc452cd6ccb9b270edae5

dloTrojan (SHA256: EXE, DLL)


be174d2499f30c14fd488e87e9d7d27e0035700cb2ba4b9f46c409318a19fd97f0c07f742282dbd35519f7531259b1a36c86313e0a5a2cb5fe1dadcf1df9522d
Подробнее..

Крошка Енот как операторы JS-сниффера FakeSecurity распространяли стилер Raccoon

07.12.2020 12:09:16 | Автор: admin


Летом 2020 года специалисты Group-IB обратили внимание на необычную кампанию по распространению стилера Raccoon. Сам стилер хорошо известен: он умеет собирать системную информацию, данные учетных записей в браузерах, данные банковских карт, а также ищет информацию о крипто-кошельках.

Сюрприз оказался в другом. Никита Ростовцев, аналитик Group-IB Threat Intelligence & Attribution, рассказывает, как в ходе исследования удалось восстановить хронологию вредоносной кампании, установить связи с другими элементами инфраструктуры злоумышленников. Забегая вперед, отметим, что енот оказался прикормленным уже известной нам группой.

Начнем с того, что сам стилер Raccoon распространяется по модели Malware-As-a-Service на одном из даркнет-форумов в связке с Telegram-каналами для того, чтобы обходить блокировку актуальных C&C-серверов.


Мы разделили кампанию на четыре этапа, которые отличаются используемыми инструментами (типом вредоносного ПО, регистраторами для создания инфраструктуры и т.п.):

  • Первая волна: 19 февраля 5 марта 2020 года
  • Вторая волна: 13 марта 22 мая 2020 года
  • Третья волна: 29 июня 2 июля 2020 года
  • Четвертая волна: 24 августа 12 сентября 2020 года


Большинство доменов в рамках исследуемой кампании были зарегистрированы у двух регистраторов Cloud2m и Host Africa. Cloud2m использовался в более ранних атаках. В середине июля 2020 года некоторые из этих доменов переехали на Host Africa.


Таймлайн вредоносных кампаний хакерской группы FakeSecurity

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

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


Схема заражения жертв в кампаниях хакерской группы FakeSecurity

Схема распространения вредоносного ПО напомнила нашим экспертам паттерн, который использовали операторы семейства JS-сниффера FakeSecurity в кампании, описанной в ноябре 2019 года. Помимо сходств в инструментариях двух серий атак, они обе были нацелены на e-commerce-компании. Так, в мае 2020-го эксперты Group-IB обнаружили онлайн-магазины, которые были заражены модифицированным JS-сниффером из кампании FakeSecurity. JS-сниффер был обфусцирован при помощи aaencode, а для хранения кода и сбора украденных данных банковских карт использовались домены, которые были зарегистрированы в период активности второй волны и у тех же регистраторов, что и домены, которые мы обнаружили в исследуемой вредоносной кампании. Таким образом, за компанией по распространению стилеров, как мы считаем, стоят операторы JS-сниффера FakeSecurity.


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

Первая волна


Первая волна регистрации доменов началась в зоне co.za 19 февраля 2020 года. Подозрительные домены содержали ключевые слова cloud, document и Microsoft. Примеры доменов, зарегистрированных в первую волну:

msupdater[.]co.za 2020-02-19
documents-cloud-server[.]co.za 2020-03-05
cloudupdate[.]co.za 2020-02-21

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

Документы с макросами


Уже спустя девять дней после регистрации первого домена, 28 февраля, на VirusTotal через веб-интерфейс из США был загружен файл Bank001.xlsm (SHA1: b1799345152f0f11a0a573b91093a1867d64e119):


Этот файл является документом-приманкой с вредоносными макросами, который при их активации загружает полезную нагрузку из cloudupdate.co[.]za/documents/msofficeupdate.exe.

Частично обфусцированный в Base64 вредоносный макрос группы FakeSecurity

В результате происходит выполнение файла msofficeupdate.exe (SHA1: f3498ba783b9c8c84d754af8a687d2ff189615d9). C&C-сервером данного образца является badlandsparks[.]com. Этот домен был зарегистрирован 27 февраля 2020 года и связан с IP-адресом 185.244.149[.]100. Только к этому домену производят сетевое подключение более 30 файлов.

Связанная c доменом инфраструктура, выстроенная с помощью технологии графого анализа Group-IB Threat Intelligence & Attribution

Среди таких файлов присутствуют 13b7afe8ee87977ae34734812482ca7efd62b9b6 и 596a3cb4d82e6ab4d7223be640f614b0f7bd14af. Эти файлы производят сетевое подключение одновременно к gineuter[.]info, fastandprettycleaner[.]hk и к badlandsparks[.]com. Судя по запросам, которые они выполняют для загрузки библиотек, и данным из открытых источников, файл msofficeupdate.exe и подобные ему являются образцами стилера Vidar. Этот стилер злоумышленники используют для кражи данных из браузеров, в том числе истории просмотров веб-страниц и данных учетных записей, а также данных банковских карт, файлов крипто-кошельков, переписок в мессенджерах и т.д.

Админ-панель стилера Vidar

Сетевое взаимодействие образца SHA1: 596a3cb4d82e6ab4d7223be640f614b0f7bd14af (построено с помощью графа Group-IB TI&A)

Список специфичных для Vidar HTTP-запросов, а также его подробный обзор доступен по ссылке:

/ (i.e 162) <- Config
ip-api.com/line/ <- Get Network Info
/msvcp140.dll <- Required DLL
/nss3.dll <- Required DLL
/softokn3.dll <- Required DLL
/vcruntime140.dll <- Required DLL
/ <- Pushing Victim Archive to C2


Файл BankStatement1.xlsm (SHA1: c2f8d217877b1a28e4951286d3375212f8dc2335) также является документом-приманкой с вредоносными макросами и при их активации загружает файл из download-plugin[.]co.za/documents/msofficeupdate.exe. Загружаемый файл SHA1: 430a406f2134b48908363e473dd6da11a172a7e1 также является стилером Vidar и доступен для загрузки из:

  • download-plugin.co[.]za/documents/msofficeupdate.exe
  • msupdater.co[.]za/documents/msofficeupdate.exe
  • cloudupdate.co[.]za/documents/msofficeupdate.exe

Пример доступности файла 430a406f2134b48908363e473dd6da11a172a7e1 из разных источников

Фишинг-кит Mephistophilus


Вторым исходным вектором в рамках первой волны атак было использование фейковых веб-страниц для распространения вредоносного ПО.

Так, обнаруженные домены msupdater[.]co.za, cloudupdate[.]co.za и documents-cloud-server[.]co.za имели одинаковую А-запись 160.119.253[.]53 в одно и то же время. Судя по данным графового анализа Group-IB, на сайте documents-cloud-server[.]co.za находился фишинг-кит Mephistophilus.

Связанная инфраструктура указанных доменов (построено с помощью графа Group-IB TI&A)

Мы уже писали про этот фишинг-кит в нашей статье на Habr. С самого начала Mephistophilus позиционировался как система для целевых фишинговых атак. Этот фишинг-кит содержит несколько шаблонов фейковых веб-страниц для доставки полезной нагрузки, среди которых:

  • онлайн-просмотрщик документов Microsoft Office 365, Word или Excel
  • онлайн-просмотрщик PDF-файлов
  • страница-клон сервиса YouTube



Административная панель Mephistophilus


Фейковое окно обновления Adobe Reader

На домене documents-cloud-server[.]co.za находится веб-фейк, имитирующий страницу обновления плагина для Adobe Reader. Чтобы продолжить чтение документа, пользователю требуется скачать плагин. После того как жертва кликает Download plugin, загружается вредоносный файл по ссылке www[.]documents-cloud-server[.]co.za/file_d/adobe-reader-update-10.21.01.exe.

<!DOCTYPE html><html><head><title>Statment00810012.pdf</title><link href="http://personeltest.ru/aways/fonts.googleapis.com/css?family=Roboto" rel="stylesheet"><link rel="stylesheet" href="http://personeltest.ru/away/www.documents-cloud-server[.]co.za/view/pdf_v3/css/style.css"><script type="text/javascript" src="http://personeltest.ru/away/www.documents-cloud-server [.]co.za/view/pdf_v3/js/jquery.js"></script></head><body topmargin="0" leftmargin="0"><div class="toolbar"></div><div class="layer"><div class="tab"><table width="100%" height="100%" cellpadding="0" cellspacing="0"><tr><td class="tdo" width="307" valign="top" align="center"><div class="logo"></div><br><br><br><div class="bottom-text" align="center">Copyright  2017 Adobe Systems<br> Software Ireland Ltd. <br>All rights reserved</div></td><td class="tds" width="493" valign="top" align="center"><h2>Plugin update required</h2><span class="text">This document cannot be displayed correctly<br>You are using an older version of Adobe Reader PDF Plugin<br>for Google Chrome<br></span><br><br><br><a class="button" data-url="http://personeltest.ru/away/www.documents-cloud-server[.]co.za/file_d/adobe-reader-update-10.21.01.exe">Download plugin</a><br><br><br><br><div class="bottom-text" align="center"><a href="http://personeltest.ru/aways/www.adobe.com/" target="_blank" class="link">Adobe</a> / <a href="http://personeltest.ru/aways/www.adobe.com/legal/terms.html" target="_blank" class="link">Terms of Use</a> / <a href="http://personeltest.ru/aways/www.adobe.com/privacy.html" target="_blank" class="link">Privacy</a></div></td></tr></table></div></div><script>setTimeout(function(){var width = $(window).width();var height = $(window).height();$('.layer').show();$('.layer').animate({'height':height}, 1000);setTimeout(function(){$('.tab').show();},1200);},1800);$('.button').click(function(){$.post(location.href, {dl:"dlPDF2",cname:"Statement00810011"});var link = $(this).attr("data-url");window.open(link);});$(window).resize(function(){var width = $(window).width();var height = $(window).height();$('.layer').css("width",width);$('.layer').css("height",height);});</script></body></html>

Исходный код фишинговой страницы


Файл с таким же именем adobe-reader-update-10.21.01.exe впервые был загружен на VirusTotal 13 марта 2020 года и был доступен для загрузки по следующим ссылкам:

  • documents-cloud-server5[.]co.za/file_d/adobe-reader-update-10.21.01.exe
  • documents-cloud-server1[.]co.za/file_d/adobe-reader-update-10.21.01.exe
  • documents-cloud-server9[.]co.za/file_d/adobe-reader-update-10.21.01.exe
  • documents-cloud-server8[.]co.za/file_d/adobe-reader-update-10.21.01.exe

Пример доступности файла f33c1f0930231fe6f5d0f00978188857cbb0e90d из разных источников

Другой файл msofficeupdater.exe (SHA1: bdfefdff7b755a89d60de22309da72b82df70ecb) был доступен по следующим путям:

  • documents-cloud-server7[.]co.za/doc/msofficeupdater.exe
  • documents-cloud-server5[.]co.za/doc/msofficeupdater.exe
  • documents-cloud-server7[.]co.za/doc/msofficeupdater.exe
  • documents-cloud-server6[.]co.za/doc/msofficeupdater.exe
  • documents-cloud-server1[.]co.za/doc/msofficeupdater.exe
  • documents-cloud-server6[.]co.za/doc/msofficeupdater.exe
  • documents-cloud-server5[.]co.za/doc/msofficeupdater.exe
  • documents-cloud-server1[.]co.za/doc/msofficeupdater.exe

Пример доступности файла bdfefdff7b755a89d60de22309da72b82df70ecb из разных источников

Вторая волна


Домены, связанные с файлом SHA1: bdfefdff7b755a89d60de22309da72b82df70ecb, вывели нас на еще одну группу доменов, относящихся к инфраструктуре злоумышленников. Эти домены были зарегистрированы в два этапа: первая группа 13 марта 2020 года, вторая 22 мая 2020 года.

Примеры доменов второй волны:

1 группа 2 группа
cloud-server-updater[.]co.za cloud-server-updater17[.]co.za
cloud-server-updater1[.]co.za cloud-server-updater18[.]co.za
cloud-server-updater15[.]co.za cloud-server-updater27[.]co.za
cloud-server-updater16[.]co.za cloud-server-updater28[.]co.za

Эти домены были созданы для распространения стилера Raccoon. Чтобы связать данные группы доменов, можно взглянуть на файлы SHA1: b326f9a6d6087f10ef3a9f554a874243f000549d и SHA1: F2B2F74F4572BF8BD2D948B34147FFE303F92A0F. Эти файлы в процессе работы устанавливают сетевое соединение со следующими ресурсами:

  • cloudupdates[.]co.za
  • cloud-server-updater2[.]co.za
  • cloud-server-updater19[.]co.za

Сетевое взаимодействие файла b326f9a6d6087f10ef3a9f554a874243f000549d (построено с помощью графа Group-IB TI&A)

C доменом cloudupdates[.]co.za связано порядка 50 вредоносных файлов из публичных источников. Их первые загрузки датируются 30 апреля 2020 года, а сам домен похож на найденный ранее cloudupdate.co[.]za. Кроме схожего имени домена, он зарегистрирован через регистратора cloud2m, а в качестве NS-записей у него указаны ns1.host-ww.net и ns2.host-ww.net так же, как и у msupdater[.]co.za и cloudupdate[.]co.za.

Данные из WHOIS-записей трёх доменов

Со всеми доменами второй волны связано порядка 300 файлов из публичных песочниц. Все эти файлы являются документами-приманками, содержащими вредоносные макросы, с названиями MyBankStatement_2436.xlsm, MyBankStatement_3269.xlsm, MyBankStatement_5763.xlsm и т.п.

Образец документа-приманки 6685955C5F006C2D83A92952EB5EB3FB9598C783

Один из таких файлов MyBank_5710.xlsm (SHA1: 6685955C5F006C2D83A92952EB5EB3FB9598C783). После активации макросов в этом документе происходила загрузка файла из cloud-server-updater22[.]co.za/doc/officebuilder. Загруженный файл c SHA1: 3657CF5F2142C7E30F72E231E87518B82710DC1C является стилером Raccoon. Он подключается к своему C&C-серверу (35.228.95[.]80) для эксфильтрации собранной информации, используя инфраструктуру Google для придания легитимности запросам. В свою очередь Raccoon производит сетевое подключение к cloud-server-updater1[.]co.za/doc/officeupdate.exe для загрузки RAT AveMaria (SHA1: a10925364347bde843a1d4105dddf4a4eb88c746), C&C-сервер которого расположен на IP-адресе 102.130.118[.]152.

AveMaria RAT это троян удаленного доступа, который был обнаружен в конце 2018 года, когда он использовался для атак на итальянскую организацию, работающую в нефтегазовом секторе. Функциональные возможности данного RAT:

  • Повышение привилегий, поддержка от Windows 7 до Windows 10;
  • Персистентность;
  • Инжект кода;
  • Кейлоггер;
  • Доступ к камере;
  • Управление процессами;
  • Управление файлами: создание, загрузка, скачивание, удаление;
  • RDP с использованием rdpwrap;
  • Функция инфостилера:

  1. Google Chrome;
  2. Firefox;
  3. Internet Explore;
  4. Outlook;
  5. Thunderbird;
  6. Foxmail.


Последовательность выполнения файла 6685955C5F006C2D83A92952EB5EB3FB9598C783

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

Сетевые запросы файла 3657CF5F2142C7E30F72E231E87518B82710DC1C

Среди этих сетевых запросов присутствует подключение к Telegram-каналу с названием blintick.

Создатели Raccoon использовали Telegram для обхода блокировок C&C-серверов. Так, стилер выполняет запрос к Telegram-каналу, из описания которого получает зашифрованный адрес нового C&C-сервера. Первые образцы, использующие эту технику, начали появляться на VirusTotal уже в конце мая 2020 года.

Сообщение авторов стилера Raccoon

Telegram-канал blintick и его описание:


Несмотря на то, что стилер Raccoon распространяется по модели MaaS, все файлы, распространяемые в рамках второй волны, обращались к одному и тому же Telegram-каналу. Это позволяет предположить, что документы с вредоносными макросами, загружавшими Raccoon, распространялись одной и той же группой.

Третья волна


29 июня 2020 года началась регистрация доменов третьей волны:

  • microsoft-cloud1[.]co.za
  • microsoft-cloud6[.]co.za
  • microsoft-cloud7[.]co.za
  • microsoft-cloud8[.]co.za
  • microsoft-cloud9[.]co.za
  • microsoft-cloud10[.]co.za
  • microsoft-cloud11[.]co.za
  • microsoft-cloud12[.]co.za
  • microsoft-cloud13[.]co.za
  • microsoft-cloud14[.]co.za
  • microsoft-cloud15[.]co.za

Все зарегистрированные домены указывали на IP-адрес 102.130.112[.]195. Первые вредоносные файлы, связанные с этой волной, начали появляться в публичных песочницах уже 2 июля 2020 года. Названия этих документов-приманок почти ничем не отличаются от названия файлов, рассылаемых в прошлом: BankStatement0109_13169.xlsm, My_Statement_4211.xlsm и т.д. С вышеупомянутыми доменами, а также с доменом cloud-server-updater1[.]co.za связано порядка 30 файлов:

Сетевая инфраструктура. Связь файлов с доменами двух волн

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

Пример документа-приманки 618C894C06633E3D7ADD228531F6E775A180A7F7

Один из анализируемых файлов, My_Statement_1953.xlsm (SHA1: 618C894C06633E3D7ADD228531F6E775A180A7F7), во время активации макросов выполняет запрос к серверу для загрузки файла из microsoft-cloud13[.]co.za/msofficeupdate.exe. Данный файл также представляет собой стилер Raccoon. Файл стилера (SHA1: 6639081791A8909F042E4A4197DF7051382B04E5) выполняет серию запросов на свой C&C-сервер 35.198.88[.]195, а также пытается загрузить файл из cloud-server-updater1[.]co.za/doc/officeupdate.exe, но получает в ответ ошибку 302 и редирект на cloud-server-updater1[.]co.za/cgi-sys/suspendedpage.cgi вследствие блокировки оригинального домена. По всей видимости, данный образец пытался загрузить RAT AVEMARIA, как и в предыдущей волне. Кроме того, все файлы данной кампании производили сетевые запросы в том числе и к вышеупомянутому Telegram-каналу telete.in/blintick.

Сетевое взаимодействие Raccoon стилера 6639081791A8909F042E4A4197DF7051382B04E5 (построено с помощью графа Group-IB TI&A)

Использование загрузчиков


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

30 апреля 2020 года на VirusTotal был загружен xls-документ (SHA1: 6c6680659b09d18ccab0f933daf5bf1910168b1a). Во время исполнения вредоносного кода он загружает полезную нагрузку из cloud-server-updater2.co[.]za/doc/buer.exe.

Сетевое взаимодействие файла SHA1:6c6680659b09d18ccab0f933daf5bf1910168b1a (построено с помощью графа Group-IB TI&A)
Кроме того, эти файлы были загружены и на публичный ресурс bazaar.abuse.ch.

Название файлов и проставленные теги относят нас к Buer Loader: bazaar.abuse.ch/sample/bc96c38e3f85c43923a37f57c096eb5b3913b516dbcb11b46cb9cfd0c1d167ce/.

Сетевое взаимодействие файла SHA1:7b1a5d9bb21d852a6dbf3146fabb1cd1ca276ed9
(построено с помощью графа Group-IB TI&A)

В ходе мониторинга инфраструктуры злоумышленников мы выявили группу связанных доменов, которая была зарегистрирована в период с 24 августа по 12 сентября 2020 года. Пример таких доменов:

Domain name Data IP-address
code-cloud[1-6][.]co.za 24.08.2020 102.130.115.44
google-document[.]co.za 24.08.2020 102.130.115.44
azure-cloud[1-4][.]co.za 4.09.2020 102.130.119.232
azure-cloud[1-3].web.za 4.09.2020 102.130.119.232
Updateadobeonline[.]co.za 8.09.2020 102.130.115.44
Updateforadobenew[.]co.za 9.09.2020 102.130.118.209
Oneupdateadobe[1-4][.]co.za 9.09.2020 102.130.118.209
Updateadobe[.]co.za 12.09.2020 102.130.121.74

Схожие WHOIS-записи доменов

WHOIS-записи этих доменов совпадают с WHOIS-записями доменов, ранее замеченных в этой кампании. Уже 26 августа 2020 года на публичных ресурсах начали появляться вредоносные файлы, связанные с доменами code-cloud[1-6][.]co.za и google-document[.]co.za. Один из таких файлов BankStatement_1390868739.doc (SHA1: ed5c20371bae393df0a713be72220b055e5cbdad).

Сетевое взаимодействие файла SHA1: ed5c20371bae393df0a713be72220b055e5cbdad (построено с помощью графа Group-IB TI&A)

В процессе выполнения вредоносного кода этот файл загружает полезную нагрузку из google-document[.]co.za/doc/loader.exe. Сигнатурный анализ показал, что загружаемый файл является образцом Smoke Loader.

Анализ файла loader.exe и проставленный тег Smoke loader

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

Четвертая волна


Часть доменов, зарегистрированных в начале сентября 2020 года, мимикрировала под Adobe в своих названиях. Уже начиная с 14 сентября 2020 года на этих хостах, как и в первой волне, был обнаружен Mephistophilus с идентичным шаблоном.

Связь между Mephistophilus-инфраструктурой кампаний 2019 и 2020 года


Скриншот страницы-приманки Mephistophilus

Нажатие на кнопку Download plugin приводит к загрузке файла SHA1: bcfb45e5451435530156f1f02ddbb9cadf6338e9 из updateforadobenew[.]co.za/file_d/adobe-reader-v13.11.1.3.exe, который является стилером Raccoon.

Результат анализа вредоносного файла из модуля Polygon комплексной системы Group-IB Threat Hunting Framework

Создание матрицы анализируемого файла

Примечание: Примерно в середине июля 2020 года, злоумышленники удалили свой Telegram-канал. Он был восстановлен 14 сентября 2020 года и в описании также содержал зашифрованный адрес актуального C&C-сервера. На момент написания данного исследования канал вновь неактивен.

Содержимое Telegram-канала blintick

Связь с FakeSecurity


Данная вредоносная кампания имеет явное сходство с серией атак с использованием семейства JS-снифферов FakeSecurity, описанной экспертами Group-IB в ноябре 2019 года. Жертвами прошлых атак стали владельцы сайтов онлайн-магазинов, работающих на CMS Magento. В описанной ранее кампании злоумышленники также использовали такие инструменты, как стилер Vidar и фиш-кит Mephistophilus с идентичным шаблоном под обновления для Adobe. Кроме того, в обеих кампаниях злоумышленники регистрировали домены на одних и тех же хостингах.

В кампании 2020 года мы видим использование такого же вектора атак с последующим распространением стилера Raccoon. Кроме того, в ходе исследования этой кампании мы обнаружили письма, отправленные нескольким онлайн-магазинам с email-адресов bezco.quise1988@wp.pl и outtia.lene1985@wp.pl.

При детальном исследовании первой волны распространения вредоносных программ через веб-фейки Mephistophilus мы обнаружили связь между доменами этой кампании, в частности documents-cloud-server*[.]co.za, и кампанией FakeSecurity. В кампании 2020 года веб-фейки были доступны по следующим URL:

Список доменов с идентичной структурой

Согласно ресурсу urlscan[.]io, с похожей структурой было доступно порядка 20 сайтов. Среди них выделяется alloaypparel[.]com. Этот домен использовался в кампании FakeSecurity.
С марта 2020 года специалисты Group-IB начали детектировать заражения онлайн-магазинов JS-сниффером, обфусцированным при помощи алгоритма aaencode (http://personeltest.ru/aways/utf-8.jp/public/aaencode.html). Вредоносный код подгружался с домена get-js[.]com. Домен get-js[.]com имел WHOIS-записи, схожие с ранее использованными доменами этой группы:

  • fiswedbesign[.]com
  • alloaypparel[.]com
  • firstofbanks[.]com
  • magento-security[.]org
  • mage-security[.]org


Связь между инфраструктурой группы FakeSecutiry кампании 2019 года и доменом get-js[.]com

Фрагмент кода JS-сниффера, обфусцированного при помощи алгоритма aaencode

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

Деобфусцированный код модифицированной версии сниффера FakeSecurity

В мае 2020 года специалисты Group-IB обнаружили новые заражения сайтов онлайн-магазинов. В ходе этой кампании снова использовался модифицированный сниффер FakeSecurity, обфусцированный при помощи aaencode. Вредоносный код внедрялся либо по ссылке при помощи тега script, либо путем модификации существующих JavaScript-файлов сайта. С помощью этого сниффера был скомпрометирован 21 онлайн-магазин. Для хранения кода и сбора украденных данных банковских карт в ходе новой кампании использовались следующие домены:

  • cloud-js[.]co.za
  • host-js[.]co.za
  • magento-cloud[.]co.za
  • magento-js[.]co.za
  • magento-security[.]co.za
  • marketplace-magento[.]co.za
  • marketplacemagento[.]co.za
  • node-js[.]co.za
  • node-js[.]co.za
  • payment-js[.]co.za
  • security-js[.]co.za
  • web-js[.]co.za

Дата их создания 24 апреля 2020 года (вторая волна). Эти домены были зарегистрированы у тех же регистраторов, что и домены, использовавшиеся для распространения стилеров Vidar, Raccoon, а также загрузчиков Buer и Smoke.

Формат ссылок на файлы JS-снифферов, а также используемое семейство вредоносного кода позволяют предположить, что за кампанией по заражению сайтов онлайн-магазинов стоят операторы семейства JS-снифферов FakeSecurity.

Кроме того, некоторые домены исследуемой кампании хостили страницу заглушки с надписью test page похожая страница заглушки хостится и на доменах FakeSecurity:

  • urlscan.io/result/0299b3e5-cbba-40be-adce-7ba437e4cb39/ microsoft-cloud10[.]co.za
  • urlscan.io/result/8f244d1b-2186-4db5-9c52-6122584dafa9/ documents-cloud-server[.]co.za





Варианты схожих заглушек test page на гейтах FakeSecurity и исследуемых доменах co.za

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

Рекомендации


Для того, чтобы проверить свои системы защиты на готовность к отражению атак, описанных в нашем блоге, мы приводим матрицу MITRE ATT&CK и MITRE Shield. Все эти технологии защиты реализованы в новом классе решений Group-IB для исследования киберугроз и охоты за атакующими. При возникновении вопросов или подозрений на инцидент обращайтесь на response@cert-gib.com.

Tactics Techniques of adversaries Mitigations & Active Defense Techniques Group-IB mitigation & protection products
Reconnaissance T1595 Active Scanning

T1583. Acquire Infrastructure
M1016. Vulnerability Scanning Security Assessment
Initial Access T1566 Phishing

T1190 Exploit Public-Facing Application
M1049. Antivirus/Antimalware

M1031. Network Intrusion Prevention

M1021. Restrict Web-Based Content

M1017. User Training

M1050. Exploit Protection

M1051. Update Software

M1027. Password Policies

DTE0035. User Training

DTE0019. Email Manipulation

DTE0027. Network Monitoring
Threat Hunting Framework

Threat Intelligence & Attribution

Cyber Education

Red Teaming
Execution T1059. Command and Scripting Interpreter

T1204. User Execution

T1059.007. JavaScript/JScript
M1049. Antivirus/Antimalware

M1038. Execution Prevention

M1021. Restrict Web-Based Content

M1026. Privileged Account Management

DTE0035. User Training

DTE0021. Hunting

DTE0018. Detonate Malware

DTE0007. Behavioral Analytics

DTE0003. API Monitoring

DTE0034. System Activity Monitoring
Threat Hunting Framework

Red Teaming

Incident Response

Fraud Hunting Platform
Defense Evasion T1036. Masquerading

T1027. Obfuscated Files or Information
Credential Access T1056. Input Capture
M1049. Antivirus/Antimalware

DTE0007. Behavioral Analytics

DTE0003. API Monitoring

DTE0034. System Activity Monitoring
Threat Hunting Framework
Collection
Command and Control T1219. Remote Access Software M1038. Execution Prevention

M1031. Network Intrusion Prevention

DTE0021. Hunting

DTE0022. Isolation

DTE0027. Network Monitoring

DTE0003. API Monitoring

DTE0034. System Activity Monitoring

DTE0031. Protocol Decoder
Threat Hunting Framework
Exfiltration T1041. Exfiltration Over C2 Channel

P.S. Автор выражает благодарность Виктору Окорокову, аналитику Group-IB Threat Intelligence & Attribution, за помощь в подготовке данной публикации.

P.P.S. Если ты, также как и мы считаешь, что зло в любом цифровом обличии должно быть наказано, залетай посмотреть наши актуальные вакансии в департаменте Threat Intelligence & Attribution. Group-IB это новое поколение инженеров, воплощающих смелые инновационные идеи предотвращения кибератак, основанные на технологиях хантинга, слежения за атакующими, их тактикой, инструментами и инфраструктурой. Ежедневно мы боремся с международной киберпреступностью, создавая продукты и сервисы, способные защитить людей, бизнес и государства во всем мире. И если твои скилы могут пригодиться для того, чтобы создавать новые решения, пилить крутые интерфейсы, то у нас есть огромное количество вакансий в департаменте разработки. Присоединяйся!

Индикаторы
TG not mal telete[.]in/blintick

8623aq9z046whQWysOHRvL9zM/GAADZbWXUG4TKc3D8n3r00X34-v70

73309q9z046whQWytOHdtItzM+WEADZfJFUetXe10DMG+8VUP7A==26-v30
Raccoon cloud-server-updater[.]co.za

cloud-server-updater1[.]co.za

cloud-server-updater2[.]co.za

cloud-server-updater3[.]co.za

cloud-server-updater4[.]co.za

cloud-server-updater5[.]co.za

cloud-server-updater6[.]co.za

cloud-server-updater7[.]co.za

cloud-server-updater8[.]co.za

cloud-server-updater9[.]co.za

cloud-server-updater10[.]co.za

cloud-server-updater11[.]co.za

cloud-server-updater12[.]co.za

cloud-server-updater13[.]co.za

cloud-server-updater14[.]co.za

cloud-server-updater15[.]co.za

cloud-server-updater16[.]co.za

cloud-server-updater17[.]co.za

cloud-server-updater18[.]co.za

cloud-server-updater19[.]co.za

cloud-server-updater20[.]co.za

cloud-server-updater21[.]co.za

cloud-server-updater22[.]co.za

cloud-server-updater23[.]co.za

cloud-server-updater24[.]co.za

cloud-server-updater25[.]co.za

cloud-server-updater26[.]co.za

cloud-server-updater27[.]co.za

cloud-server-updater28[.]co.za

35.228.95[.]80

35.198.88[.]195

34.105.255[.]170

102.130.113[.]55

34.105.219[.]83

oneupdateadobe.co.za

oneupdateadobe2.co.za

oneupdateadobe3.co.za

oneupdateadobe4.co.za

updateforadobenew.co.za

oneupdateadobe.org.za

oneupdateadobe2.org.za

oneupdateadobe3.org.za

microsoft-cloud1[.]co.za

microsoft-cloud6[.]co.za

microsoft-cloud7[.]co.za

microsoft-cloud8[.]co.za

microsoft-cloud9[.]co.za

microsoft-cloud10[.]co.za

microsoft-cloud11[.]co.za

microsoft-cloud12[.]co.za

microsoft-cloud13[.]co.za

microsoft-cloud14[.]co.za

microsoft-cloud15[.]co.za

cloudupdates[.]co.za
FakeSecurity cloud-js[.]co.za

host-js[.]co.za

magento-cloud[.]co.za

magento-js[.]co.za

magento-security[.]co.za

marketplace-magento[.]co.za

marketplacemagento[.]co.za

node-js[.]co.za

node-js[.]co.za

payment-js[.]co.za

security-js[.]co.za

web-js[.]co.za
Mephistophilus documents-cloud-server1[.]co.za

documents-cloud-server2[.]co.za

documents-cloud-server3[.]co.za

documents-cloud-server4[.]co.za

documents-cloud-server6[.]co.za

documents-cloud-server7[.]co.za

documents-cloud-server8[.]co.za

documents-cloud-server9[.]co.za

documents-cloud-server[.]co.za

oneupdateadobe.co.za

oneupdateadobe2.co.za

oneupdateadobe3.co.za

oneupdateadobe4.co.za

updateforadobenew.co.za

oneupdateadobe.org.za

oneupdateadobe2.org.za

oneupdateadobe3.org.za

oneupdateadobe3.com
Vidar badlandsparks.com

gineuter.info

paunsaugunt.com

precambrianera.com

biscayneinn.com

msupdater[.]co.za

cloudupdate[.]co.za

cloudupdates[.]co.za

securitycloudserver[.]co.za

fastandprettycleaner[.]hk

download-plugin[.]co.za

download-plugins[.]co.za

downloadplugins[.]co.za
Другие индикаторы code-cloud1[.]co.za

code-cloud2[.]co.za

code-cloud3[.]co.za

code-cloud4[.]co.za

code-cloud5[.]co.za

code-cloud6[.]co.za

google-document[.]co.za

azure-cloud1[.]co.za

azure-cloud2[.]co.za

azure-cloud3[.]co.za

azure-cloud4[.]co.za

azure-cloud1.web.za

azure-cloud2.web.za

azure-cloud3].web.za

Updateadobeonline[.]co.za
Подробнее..

Категории

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

  • Имя: Макс
    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