CARBANAK Рідкісний випадок: Частина перша

Вашій увазі, хочемо представити першу частину з серії публікацій про шкідливе програмне забезпечення CARBANAK.

CARBANAK - є одним з найбільш повнофункціональних бекдорів. Вони використовувалися для вчинення фінансових злочинів, що завдали збитків на мільйони доларів. У 2017 році Том Беннетт і Баррі Венгерік опублікували статтю «За спиною CARBANAK», який був результатом глибокого та широкого аналізу, що тривав протягом декількох років, зразків CARBANAK та FIN7. За цією публікацією Нік Карр виявив декілька архівів RAR, що містять вихідний код CARBANAK та інші утіліти розробників: (обидва доступні у VirusTotal: kb3r1p і apwmie).

Запити на аналіз шкідливих програм у FLARE зазвичай обмежені кількома десятками файлів. Вихідний код CARBANAK був 20 МБ, що складався з 755 файлів, з 39 двійковими файлами і 100 000 рядків коду. Метою було знайти інформацію про загрози, яка була пропущена в попередніх аналізах.

Кодування файлів та мова

Метою цього аналізу було виявлення недоліків розвідки загроз і кращого захисту наших клієнтів. Для початку, вони хотіли зібрати перехресні посилання на файли вихідних кодів і поняття, що представляють особливий інтерес.

Читання вихідного коду спричинило за собою два кроки: відображення файлів в коректному кодуванні і вивченні достатнього вмісту російської, що може бути небезпечним. Зображення 1 ілюструє вихідний код CARBANAK в текстовому редакторі без правильного кодування.

Зображення 1: Файл без належного декодування

Було зроблено припущення, що кодування файлів є UTF-8 і кодова сторінка 1251 (кирилиця). Файли в основному представлені у 1251, як ілюстровано на зображені 2.

Зображення 2: Кодування сторінки 1251 (кирилиця)

Зображення 2 - це файл заголовка C ++, що визначає значення помилок, що беруть участь у виконанні команд бекдора. Більшість ідентифікаторів були англійською, але деякі з них не були особливо описані. Таким чином, другий і більш важкий крок вивчення російської мови, щоб отримати вигоду з контексту, запропонованого коментарями вихідного коду.

FLARE володіє російською мовою. З цією метою спеціалістами fireeye був написаний скрипт, щоб пройти через файли і створити розташований за пріоритетами список словника. Скрипт, доступний у сховищі файлів FireEye vocab_scraper GitHub, пробігає по усім каталогам та знаходтть всі послідовності символів за межами нижнього діапазону ASCII: десяткові значення 32 (пробіл) до 126 (символ тильди “~”) включно. Скрипт додає кожне слово до Python defaultdict_ і збільшує його кількість. Нарешті, скрипт упорядковує цей словник за частотою виникнення і виводить його до файлу.

Результатом були 3 400 списків словника, частково ілюстрованих на зображені 3.

Зображення 3: Топ-19 послідовностей кириличних символів з вихідного коду CARBANAK

При написані даної статті спеціалісти fireeye описують, цитуємо “Провівши декілька годин на веб-сайтах з вивченням вимови кирилиці та російських слів. Потім, після перегляду топ-600 слів і створили невеликий словник. Було додано введення російської мови до аналітичної віртуальної машини і використав екранну клавіатуру Microsoft (osk.exe) для навігації по розкладці кириличної клавіатури та пошуку визначень. Корисним ефектом навчання символів кирилиці стало відкриття розпізнавання англійських запозичених слів (слова, які запозичуються з англійської мови та транслітеруються до кирилиці). Маленький словник дозволить читати багато коментарів, нічого не шукаючи. Таблиця 1 показує коротку вибірку деяких англійських запозичених слів.

Таблиця 1: Вибірка англійських запозичених слів у вихідному коді CARBANAK

Крім коментарів вихідного коду, розуміння використання кирилиці знадобилося також для перекладу в дампі вихідного коду CARBANAK. Зображення 4 ілюструє C2 призначений для інтерфейсу користувача CARBANAK, що було перекладено.

Зображення 4: Перекладений графічний інтерфейс користувача C2

Ці інтерфейси включали програми управління відео, як ілюстровано на зображенні 5, 6.

Зображення 5: Перекладене відео менеджмент застосування інтерфейсу
Зображення 6: інтерфейс користувача для відтворення відео
Зображення 7: Перекладений інтерфейс користувача додатка розробника бекдора, який містився в RAR архіві

Архів оператора RAR також містив мануал по експлуатації, пояснюючи семантику всіх команд бекдора. Зображення 8 показує перші кілька команд в цьому керівництві.

Коли наявність вихідного коду не допомагає

У більш простих бекдорів єдина функція оцінює командний ідентифікатор, отриманий від сервера C2, і забезпечує управління коректною функцією для виконання команд. Наприклад, бекдор міг би попросити у сервера C2 команду та отримати відповідь ID 0x67. Функція відправки в бекдор перевірить команду ID по декількома різними значеннями, включаючи 0x67. Зображення 9 показує графік потоку управління такої функції, яку бачимо в IDA Pro. Кожен блок коду перевіряє по команді ID і передає управління до відповідного коду обробки команди або йде далі для перевірки на наступну команду ID.

Зображення 9: Графік потоку керування для простої функції обробки команд

В цьому відношенні CARBANAK є абсолютно різним. Він  використовує механізм Windows Named Pipes як засіб повідомлення і координації через всі потоки, процеси та плагіни під керуванням бекдора. Коли CARBANAK, проводить управління завданнями для компонента, то отримує команду та спрямовує на Named Pipes, куди його переміщають через кілька різних функцій, які обробляють повідомлення, можливо пише його в один або кілька додаткових іменованих канали, поки не прибуде до свого місця призначення, де зазначена команда нарешті обробляється. Обробники команд можуть навіть визначити свій власний named pipe, щоб запросити більше даних з сервера C2. Коли сервер C2 повертає дані, CARBANAK пише результат в цей допоміжний named pipe, і функція зворотного виклику для обробки даних працює асинхронно. Заснований на іменованому каналі компонент управління завданнями CARBANAK досить гнучкий для управління відпрацьованими командами і плагінами. Це також допускає можливість для локального клієнта відправити команди CARBANAK без використання мережі. Насправді, ми не писали такому клієнтові для допомоги в аналізі і тестуванні, але такий клієнт, названий botcmd.exe, також був присутній у вихідному дампі.

Анти-аналітичні механізми в вихідному коді

Виконуваний код CARBANAK має логіку, яка виводить шістнадцятирічні числа до тієї ж функції, за якою слідує непрямий виклик значення, що повертається. Це легко розпізнати, як обфускована функція імпорту, де CARBANAK використовує хеш простого рядка, відомий як PJW (названий на честь його автора, P.J. Weinberger) для визначення місця розташування Windows API functions, не розкриваючи їх імена. Реалізацію Python та хешу PJW вказано на зображені 10.

Зображені 10: Хеш PJW

Це використовується декілька сотень разів в зразках CARBANAK і перешкоджає розумінню функціональності шкідливого програмного забезпечення. На щастя, інвертори можуть використовувати скрипт flare-ida scripts, як ілюстровано на зображені 11.

Зображення 11

Автори CARBANAK досягли цієї обфускації по усьому бекдору з відносною простотою за допомогою C препроцесора макроса, і сканування вихідного коду перед компіляцією для обчислення функціональних хешів. Зображення 12 показує визначення відповідного API макросу і пов'язаного обладнання.

Зображення 12: API макросу

API макросу дозволяє автору вводити API (SHLWAPI, PathFindFileNameA) (...) і замінювати його на GetApiAddrFunc (SHLWAPI, hashPathFindFileNameA) (...). SHLWAPI є символьним макросом.

Вихідний код CARBANAK має утиліту, який сканує вихідний код для викликів API макросу для створення заголовку, що визначає хеш послідовності для всіх назв Windows API функцій по всій кодовій базі. Зображення 13 показує вихідний код для цієї утиліти поруч з її вихідним файлом, api_funcs_hash.h.

Зображення 13: Вихідний код та вивід з утиліти хешування рядків

 

Висновок

Вихідний код CARBANAK яскраво ілюструє, як автори цього шкідливого ПЗ використали процедуру обфускації.

Джерело: FIREEYE