Обзор
Это мой анализ для AtomSilo Ransomware.
AtomSilo использует стандартную схему гибридной криптографии RSA-512 и AES для шифрования файлов и защиты своих ключей.
Поскольку он не использует многопоточность и использует алгоритм DFS для обхода каталогов, шифрование AtomSilo довольно медленное.
Вредоносное ПО относительно короткое и простое для анализа, поэтому это определенно удобный выбор для тех, кто хочет заняться анализом программ-вымогателей!
IOCS
Этот образец представляет собой 64-разрядный исполняемый файл Windows.
MD5: 81f01a9c29bae0cfa1ab015738adc5cc
SHA256: 7a5999c54f4588ff1581d03938b7dcbd874ee871254e2018b98ef911ae6c8dee
Сэмпл: https://bazaar.abuse.ch/sample/7a5999c54f4588ff1581d03938b7dcbd874ee871254e2018b98ef911ae6c8dee/
Записка с требованием выкупа
Содержимое записки о выкупе хранится в виде открытого текста в исполняемом файле AtomSilo. Зашифрованный открытый ключ RSA жертвы добавляется в конец заметки перед тем, как файлы будут сброшены в систему.
Имя файла с примечанием о выкупе имеет вид README-FILE-[Имя компьютера]-[Отметка времени начала].hta или index.html.
Статический анализ кода
Настройка криптографических ключей
AtomSilo использует простой гибридный криптографический подход с использованием RSA и AES из библиотеки CryptoPP (https://github.com/weidai11/cryptopp) для шифрования файлов. Вредоносное ПО сначала случайным образом генерирует пару открытого и закрытого ключей для жертвы и сохраняет их в глобальных переменных.
Затем он шифрует открытый ключ жертвы, используя свой собственный жестко закодированный открытый ключ RSA, и стирает сгенерированный открытый ключ жертвы из памяти. Поскольку код CryptoPP для этого неприятный, лучший способ проанализировать эти функции, вероятно, будет извлекать сигнатуры функций из Lumina и делать предположения, основанные на вызываемых функциях.
Поскольку открытый ключ жертвы требуется для последующей расшифровки файлов, AtomSilo очищает его в памяти после шифрования и сохранения результата, чтобы избежать восстановления ключа из памяти.
Ниже приведен жестко запрограммированный открытый ключ RSA AtomSilo.
Однократный мьютекс
AtomSilo вызывает CreateMutexA, чтобы проверить, существует ли уже мьютекс с именем "8d5e957f297893487bd98fa830fa6413", и если это так, вредоносное ПО немедленно завершает работу. Это делается для того, чтобы избежать одновременного запуска нескольких экземпляров вредоносного ПО.
Запуск потоков шифрования
AtomSilo пытается использовать многопоточность для ускорения обхода и шифрования файлов в системе. Он перебирает список имен дисков от "a: " до "z: " и создает новый поток для шифрования каждого.
Идея многопоточности определенно есть, но создание потоков таким образом неэффективно, поскольку общая пропускная способность и скорость будут смещены в сторону диска, на котором находится больше всего файлов.
Потоки шифрования
Помещение записки о выкупе
Для каждого обнаруженного каталога AtomSilo оставляет в нем записку с требованием выкупа.
Сначала вредоносное ПО расшифровывает следующую строку стека и форматирует ее, как показано ниже.
Имена файлов записки с требованием выкупа используются в зависимости от её места. Когда AtomSilo встречает какой-либо файл с расширениями .php, .asp, .jsp или .html, он использует [Имя каталога]\index.html в качестве имени файла с запиской о выкупе. Для любого другого каталога используется [Имя каталога]\README-FILE-[Имя компьютера]-[Отметка времени начала].hta.
Наконец, AtomSilo записывает содержимое записки о выкупе в следующем формате.
[Ransom Note Content]<asf>[Victim Encrypted RSA Public Key]</asf><csf>3</csf><bsf>[Computer Name]</bsf></span></body></html>
Обход DFS
Каждый поток использует DFS для обхода переданного ему каталога. Во-первых, для поиска всех файлов и подкаталогов он использует стандартные вызовы API FindFirstFileA и FindNextFileA.
AtomSilo хранит список имен, чтобы избежать шифрования в памяти для повторения и проверки каждого обнаруженного файла/каталога. Если имя файла/каталога есть в списке, оно пропускается и не шифруется.
Список имен файлов/каталогов, которых следует избегать, показан ниже.
Если AtomSilo встречает подкаталог, вредоносное ПО добавляет свое имя к текущему пути к каталогу, помещает внутрь записку с требованием выкупа и передает путь своей функции обхода для рекурсивного обхода. Мне нет нужды обсуждать, какой прирост скорости получит программа-вымогатель.
Если AtomSilo встречает файл, вредоносная программа проверяет, содержит ли имя файла следующие расширения.
Если это так, файл пропускается и не шифруется.
Как обсуждалось выше, когда AtomSilo встречает любой файл с расширениями .php, .asp, .jsp или .html, он помещает примечание о выкупе по пути [Имя каталога]\index.html.Наконец, он передает путь к файлу функции для его шифрования.
Шифрование файлов
Для каждого файла, подлежащего шифрованию, AtomSilo случайным образом генерирует 32-байтовый ключ AES. Во-первых, он получает текущее системное время и использует его как начальное значение для генератора псевдослучайных чисел C++ через srand. Используя это, вредоносная программа генерирует случайную строку из 32 символов, и каждый символ случайным образом выбирается как строчная буква, заглавная буква или число от 0 до 9.
Затем ключ AES шифруется с помощью закрытого ключа RSA жертвы.
Затем AtomSilo открывает файл с помощью CreateFileA и сопоставляет его с адресным пространством текущего процесса для прямого чтения и записи с помощью CreateFileMappingA и MapViewOfFile.
Перед шифрованием файла вредоносное ПО записывает зашифрованный ключ AES в последние 0x210 байт в конце файла.
Наконец, AtomSilo шифрует файл с помощью ключа AES с реализацией AES от CryptoPP, закрывает дескриптор сопоставления файлов и добавляет ".ATOMSILO" в конец имени файла.
Как расшифровать
Зашифрованный открытый ключ RSA жертвы добавляется в конец записки о выкупе, которая зашифрована с помощью открытого ключа RSA AtomSilo. Следовательно, для расшифровки открытого ключа RSA жертвы требуется закрытый ключ RSA AtomSilo.
Чтобы расшифровать файл, зашифрованный AtomSilo, зашифрованный ключ AES можно извлечь из конца файла. Поскольку ключ AES зашифрован с использованием закрытого ключа RSA жертвы, его можно расшифровать с помощью открытого ключа RSA жертвы.
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://chuongdong.com/reverse engineering/2021/10/13/AtomSiloRansomware/
Это мой анализ для AtomSilo Ransomware.
AtomSilo использует стандартную схему гибридной криптографии RSA-512 и AES для шифрования файлов и защиты своих ключей.
Поскольку он не использует многопоточность и использует алгоритм DFS для обхода каталогов, шифрование AtomSilo довольно медленное.
Вредоносное ПО относительно короткое и простое для анализа, поэтому это определенно удобный выбор для тех, кто хочет заняться анализом программ-вымогателей!
IOCS
Этот образец представляет собой 64-разрядный исполняемый файл Windows.
MD5: 81f01a9c29bae0cfa1ab015738adc5cc
SHA256: 7a5999c54f4588ff1581d03938b7dcbd874ee871254e2018b98ef911ae6c8dee
Сэмпл: https://bazaar.abuse.ch/sample/7a5999c54f4588ff1581d03938b7dcbd874ee871254e2018b98ef911ae6c8dee/
Записка с требованием выкупа
Содержимое записки о выкупе хранится в виде открытого текста в исполняемом файле AtomSilo. Зашифрованный открытый ключ RSA жертвы добавляется в конец заметки перед тем, как файлы будут сброшены в систему.
Имя файла с примечанием о выкупе имеет вид README-FILE-[Имя компьютера]-[Отметка времени начала].hta или index.html.
Статический анализ кода
Настройка криптографических ключей
AtomSilo использует простой гибридный криптографический подход с использованием RSA и AES из библиотеки CryptoPP (https://github.com/weidai11/cryptopp) для шифрования файлов. Вредоносное ПО сначала случайным образом генерирует пару открытого и закрытого ключей для жертвы и сохраняет их в глобальных переменных.
Затем он шифрует открытый ключ жертвы, используя свой собственный жестко закодированный открытый ключ RSA, и стирает сгенерированный открытый ключ жертвы из памяти. Поскольку код CryptoPP для этого неприятный, лучший способ проанализировать эти функции, вероятно, будет извлекать сигнатуры функций из Lumina и делать предположения, основанные на вызываемых функциях.
Поскольку открытый ключ жертвы требуется для последующей расшифровки файлов, AtomSilo очищает его в памяти после шифрования и сохранения результата, чтобы избежать восстановления ключа из памяти.
Ниже приведен жестко запрограммированный открытый ключ RSA AtomSilo.
Однократный мьютекс
AtomSilo вызывает CreateMutexA, чтобы проверить, существует ли уже мьютекс с именем "8d5e957f297893487bd98fa830fa6413", и если это так, вредоносное ПО немедленно завершает работу. Это делается для того, чтобы избежать одновременного запуска нескольких экземпляров вредоносного ПО.
Запуск потоков шифрования
AtomSilo пытается использовать многопоточность для ускорения обхода и шифрования файлов в системе. Он перебирает список имен дисков от "a: " до "z: " и создает новый поток для шифрования каждого.
Идея многопоточности определенно есть, но создание потоков таким образом неэффективно, поскольку общая пропускная способность и скорость будут смещены в сторону диска, на котором находится больше всего файлов.
Потоки шифрования
Помещение записки о выкупе
Для каждого обнаруженного каталога AtomSilo оставляет в нем записку с требованием выкупа.
Сначала вредоносное ПО расшифровывает следующую строку стека и форматирует ее, как показано ниже.
Имена файлов записки с требованием выкупа используются в зависимости от её места. Когда AtomSilo встречает какой-либо файл с расширениями .php, .asp, .jsp или .html, он использует [Имя каталога]\index.html в качестве имени файла с запиской о выкупе. Для любого другого каталога используется [Имя каталога]\README-FILE-[Имя компьютера]-[Отметка времени начала].hta.
Наконец, AtomSilo записывает содержимое записки о выкупе в следующем формате.
[Ransom Note Content]<asf>[Victim Encrypted RSA Public Key]</asf><csf>3</csf><bsf>[Computer Name]</bsf></span></body></html>
Обход DFS
Каждый поток использует DFS для обхода переданного ему каталога. Во-первых, для поиска всех файлов и подкаталогов он использует стандартные вызовы API FindFirstFileA и FindNextFileA.
AtomSilo хранит список имен, чтобы избежать шифрования в памяти для повторения и проверки каждого обнаруженного файла/каталога. Если имя файла/каталога есть в списке, оно пропускается и не шифруется.
Список имен файлов/каталогов, которых следует избегать, показан ниже.
Если AtomSilo встречает подкаталог, вредоносное ПО добавляет свое имя к текущему пути к каталогу, помещает внутрь записку с требованием выкупа и передает путь своей функции обхода для рекурсивного обхода. Мне нет нужды обсуждать, какой прирост скорости получит программа-вымогатель.
Если AtomSilo встречает файл, вредоносная программа проверяет, содержит ли имя файла следующие расширения.
Если это так, файл пропускается и не шифруется.
Как обсуждалось выше, когда AtomSilo встречает любой файл с расширениями .php, .asp, .jsp или .html, он помещает примечание о выкупе по пути [Имя каталога]\index.html.Наконец, он передает путь к файлу функции для его шифрования.
Шифрование файлов
Для каждого файла, подлежащего шифрованию, AtomSilo случайным образом генерирует 32-байтовый ключ AES. Во-первых, он получает текущее системное время и использует его как начальное значение для генератора псевдослучайных чисел C++ через srand. Используя это, вредоносная программа генерирует случайную строку из 32 символов, и каждый символ случайным образом выбирается как строчная буква, заглавная буква или число от 0 до 9.
Затем ключ AES шифруется с помощью закрытого ключа RSA жертвы.
Затем AtomSilo открывает файл с помощью CreateFileA и сопоставляет его с адресным пространством текущего процесса для прямого чтения и записи с помощью CreateFileMappingA и MapViewOfFile.
Перед шифрованием файла вредоносное ПО записывает зашифрованный ключ AES в последние 0x210 байт в конце файла.
Наконец, AtomSilo шифрует файл с помощью ключа AES с реализацией AES от CryptoPP, закрывает дескриптор сопоставления файлов и добавляет ".ATOMSILO" в конец имени файла.
Как расшифровать
Зашифрованный открытый ключ RSA жертвы добавляется в конец записки о выкупе, которая зашифрована с помощью открытого ключа RSA AtomSilo. Следовательно, для расшифровки открытого ключа RSA жертвы требуется закрытый ключ RSA AtomSilo.
Чтобы расшифровать файл, зашифрованный AtomSilo, зашифрованный ключ AES можно извлечь из конца файла. Поскольку ключ AES зашифрован с использованием закрытого ключа RSA жертвы, его можно расшифровать с помощью открытого ключа RSA жертвы.
Переведено специально для xss.pro
Автор перевода: yashechka
Источник: https://chuongdong.com/reverse engineering/2021/10/13/AtomSiloRansomware/