Анализ .NET стиллера GrandSteal

Анализ .NET стиллера GrandSteal

Moody

В этом посте я поделюсь с вами своими заметками об анализе одного стиллера, написанного на .NET. Кто - то принял его за Quesar, соответствующе пометив на Any.run. Но после анализа исходного кода, я понял, что он имеет существенные отличия и не принадлежит к вышеназванному семейству вирусов. Поиск по IOC не дал результатов, поэтому, на основании внутренних имен классов, я присвоил ему имя "GrandSteal".

  • Оригинальный сэмпл: 89782B6CDAAAB7848D544255D5FE7002
  • Источник: http://a4.doshimotai[.]ru/pxpx.exe
  • Информация об URL: VxVault URLhaus
  • Автоматически-сгенерированный отчет из песочницы: Открыть
  • Первая загрузка на VirusTotal: 2019-03-18 22:28:20
  • Анализ при помощи Any.Run: Здесь
  • Тэги на Any.Run: Evasion, Trojan, Rat, Quasar
  • Декомпилированный исходный код: Github

Анализ

Loader

  • Сэмпл не имеет цифровой подписи

Сведения:

  • Авторские права: Symantec© 2019
  • Описание: pxpx.exe
  • Название продукта: pxpx.exe
  • Исходное имя файла: pxpx.exe
  • Версия продукта: 7.1.0.0

Лоадер написан на .NET и обфусцирован при помощи ConfuserEx v1.0.0

Распакованные модули

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

Дампим их на жесткий диск и видим, что большинство из них написано, также, как и лоадер, на .NET. Используем dnSpy для декомпиляции и анализа.

Вредонос содержит код для кражи данных из различных продуктов, среди которых:

Chromium Стиллер

Малварь крадет различную информацию из браузеров на Chromium.

Полную реализацию можно посмотреть по ссылке ChromiumManager.cs.

Чтение таблицы с Cookie из базы данных SQLite

Учетные записи

Чтение таблицы с сохраненными учетными записями из базы данных SQLite.

Автозаполнение

Чтение таблицы с данными автозаполнения из базы данных SQLite.

Кредитные карты

Чтение таблицы credit_cards из базы данных SQLite.

Стиллер криптокошельков

Кража файлов "wallet.dat" следующих кошельков:

  • Litecoin: "%appdata%\Litecoin\wallet.dat"
  • Litecoin-Qt: walletpath=read("HKCU\Software\Litecoin\strDataDir"), walletpath + "wallet.dat"
  • Litecoin-Qt: walletpath=read("HKCU\Software\Litecoin-Qt\strDataDir"), walletpath + "wallet.dat"
  • Bitcoin: "%appdata%\Bitcoin\wallet.dat"
  • Bitcoin-Qt: walletpath=read("HKCU\Software\Bitcoin\strDataDir"), walletpath + "wallet.dat"
  • Bitcoin-Qt: walletpath=read("HKCU\Software\Bitcoin-Qt\strDataDir"), walletpath + "wallet.dat"
  • Bytecoin: "%appdata%\bytecoin\*.wallet"
  • Exodus: "%appdata%\Exodus\*"
  • Dash-Qt: walletpath=read("HKCU\Software\Dash\strDataDir"), walletpath + "wallet.dat"
  • Dash-Qt: walletpath=read("HKCU\Software\Dash-Qt\strDataDir"), walletpath + "wallet.dat"
  • Electrum: "%appdata%\Electrum\wallets\*"
  • Ethereum: "%appdata%\Ethereum\wallets\*"
  • Monero: walletpath=read("HKCU\Software\monero-project\wallet_path"), walletpath + "wallet.dat"
  • Monero: walletpath=read("HKCU\Software\monero-core\wallet_path"), walletpath + "wallet.dat"

С исходным кодом можно ознакомиться тут - ColdWalletManager.cs.

Кража файлов из личных директорий

Кража файлов с рабочего стола, избранного и личных папок.

С исходным кодом можно ознакомиться тут - DesktopFileManager.cs.

Discord Стиллер

Вредонос крадет информацию из Discord с помощью любопытного метода. Вызывает API-метод MiniDumpWriteDump из DbgHelp.dll, чтобы создать мини-дамп любого процесса, который содержит слово "Discord" в названии.

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

С исходным кодом можно ознакомиться тут - DiscordManager.cs.

Filezilla

Кража данных из .XML файлов Filezilla.

С исходным кодом можно ознакомиться тут - FileZillaManager.cs.

Gecko Стиллер

Сначала стиллер ищет важные файлы, в которых хранятся пароли, куки, автозаполнения - аналогично Chromium.

После этого восстанавливает учетные данные:

И куки:

С исходным кодом можно ознакомиться тут - GeckoManager.cs.

RDP Стиллер

Малварь может красть сохраненные учетные данные от RDP.

С исходным кодом можно ознакомиться тут - RdpManager.cs.

Telegram стиллер

Пытается найти файлы в директории:

"%appdata%\Telegram Desktop\tdata\D877F783D5D3EF8C\map*"

и восстановить сессию.

С исходным кодом можно ознакомиться тут - TelegramManager.cs.

Набор правил для Yara

rule grandsteal {
strings:
        $s1 = "ws://{0}:{1}/websocket" wide
        $s2 = "GrabBrowserCredentials: " wide
        $s3 = "GrabColdWallets: " wide
        $s4 = "GrabDesktopFiles: " wide
        $s5 = "GrabTelegram: " wide
        $s6 = "ColdWallets parser has been started" wide
        $s7 = "DiscordSession parser has been started" wide
        $s8 = "Rdps parser has been started" wide
        $s9 = "DesktopFiles parser has been started" wide
        $s10 = "FTPs parser has been started" wide
        $s11 = "TelegramSession parser has been started" wide
        $s12 = "ListOfProcesses parser has been started" wide
        $s13 = "ListOfPrograms parser has been started" wide
        $s14 = "card_number_encrypted" wide
        $s15 = "\\Litecoin\\wallet.dat" wide
        $s16 = "\\Bitcoin\\wallet.dat" wide
        $s17 = "\\Exodus\\exodus.wallet" wide
        $s18 = "\\Electrum\\wallets" wide
        $s19 = "\\Ethereum\\wallets" wide
        $s20 = "monero-project" wide
        $s21 = "Discord dump UNKNOWN" wide
        $s22 = "{0}\\FileZilla\\recentservers.xml" wide
        $s23 = "{0}\\FileZilla\\sitemanager.xml" wide
        $s24 = "cookies.sqlite" wide
        $s25 = "password-check" wide
        $s26 = "AppData\\Roaming\\Telegram Desktop\\tdata\\D877F783D5D3EF8C" wide
        $s27 = "%USERPROFILE%\\AppData\\Local\\Temp\\Remove.bat" wide
        $s28 = "taskkill /F /PID %1" wide
        $s29 = "choice /C Y /N /D Y /T 3 & Del %2" wide
        $s30 = "ExtractPrivateKey" wide
        $s31 = "formSubmitURL" wide
        $s32 = "passwordField" wide
        $s33 = "usernameField" wide
        $s34 = "GrabDiscord" wide
        $s35 = "encryptedPassword" wide
        $s36 = "masterPassword" wide
        $s37 = "WalletName" wide
condition:
        (30 of them)
}

Список всех строк из PE - *клик*.

https://t.me/cybred

Report Page