Анализ трояна Snojan
Источник: https://medium.com/@jacob16682/snojan-analysis-bb3982fb1bb9
Автор статьи — Jacob Pimental, для лаконичности используется изложение от первого лица, но на самом деле, «я» - это Jacob Pimental.
Итак, это мой анализ вредоносной программы snojan. Моя цель в этих статьях — написать о различных образцах вредоносного ПО, которые я собрал в моей приманке (honeypot). Мне не нравится, когда я ищу анализы для добытых образов, но в результате оказывается, что никто не нашёл времени, чтобы толком заглянуть в них. И вот так я заполняю эти пробелы.
Я добыл этот образец с сервера Dionaea Honeypot. Если вы не знаете что такое Dionaea Honeypot, по сути, это сервер, который имитирует уязвимые процессы и приложения в надежде поймать вредоносное ПО. Он в основном ловит интернет-червей, которые нацелены на случайные IP-адреса, в последнее время он получил много образцов вымогателей Wannacry.
Первую вещь, которую я делаю когда анализирую новый образец вредоносной программы, это проверяю его по VirusTotal, чтобы увидеть, чем он может быть и некоторую базовую информацию о нём. Некоторые производители антивирусов пометили его как “snojan”, поэтому я тоже буду использовать это имя. VirusTotal Также сказал нам, что время создания этого файла 5 мая 2017 года, но дата может быть легко подделана. Если это правда, то это не самый новый троян, но, тем не менее, интересный.
Следующую вещь, которую я делаю, я использую rabin2, которая поставляется с radare2, чтобы увидеть, какого рода этот файл. Если вы не знаете, что такое radare2 или rabin2, то для ознакомления вы можете прочитать мои первые статьи, где я объясняю, что они из себя представляют и как их использовать.
rabin2 -I 867e7c4917795399040f367575550ae4 arch x86 binsz 13315 bintype pe bits 32 canary false class PE32 cmp.csum 0x00006b4d compiled Fri May 5 07:02:08 2017 crypto false endian little havecode true hdr.csum 0x0000b009 linenum true lsyms true machine i386 maxopsz 16 minopsz 1 nx false os windows overlay true pcalign 0 pic false relocs false signed false static false stripped false subsys Windows CUI va true
Из этого мы можем увидеть, что это файл Windows Portable Executable (PE), он 32-битный (PE32) и использует Command Line Interface (CUI) (интерфейс командной строки), а не graphical interface (GUI) (графический интерфейс). Если мы в Linux запустим команду file, то мы можем увидеть более подробно тип этого файла.
file 867e7c4917795399040f367575550ae4 867e7c4917795399040f367575550ae4: PE32 executable (DLL) (console) Intel 80386 (stripped to external PDB), for MS Windows
Мы можем видеть, что это файл Windows DLL, это означает, он он должен иметь некоторые экспорты (exports), с которыми он хочет, чтобы мы его запускали. Rabin2 может помочь нам идентифицировать эти экспорты.
rabin2 -E 867e7c4917795399040f367575550ae4 [Exports] vaddr=0x6d981760 paddr=0x00000b60 ord=000 fwd=NONE sz=0 bind=GLOBAL type=FUNC name=aaa.dll_DllMain@12 1 exports
Итак, этот dll экспортирует функцию DllMain@12. Мы можем предположить, что этот dll вероятно вызывается использованием Windows команды rundll и использует эту функцию как параметр. Мы также можем предположить, что имя файла скорее всего aaa.dll, а не md5sum 867e7c4917795399040f367575550ae4.
Теперь, когда у нас есть базовая информация о файле, вы можем закинуть его в Radare2 и посмотреть, как выглядит код ассемблера. Мне нравится использовать команду “afll” после того, как radare2 проанализирует бинарный файл, поскольку она показывает все функции в цветном графе. Мы можем видеть интересную функцию на 0x6d981760.
Это та же самая функция, которую мы видели раньше в качестве экспорта. Возможно нам следует изучить получше, что она делает.
Итак, похоже что она сравнивает аргумент с числом 1, если выражение ложно, тогда мы возвращаемся и, скорее всего, программа завершается. Тем не менее, если выражение истинно, мы вызываем функцию CreateThread с fcn.6d981710 в качестве параметра. Это создаст поток, который должен запустить то, что делает fcn.6d981710. Затем вызывается таинственная функция и происходит выход. Следующим шагом может быть выяснение, что это за таинственная функция и что она делает.
Эта функция вызывает функцию WSAStartup, которая запускает процесс, необходимый для использования библиотеки Socket для Windows. Это говорит нам, что dll должен подключаться к некому серверу через открытый порт. Если WSAStartup терпит неудачу, то выводится сообщение “WSAStartup failed: %d\n” вместе с возвращаемым значением WSAStartup в стек и вызывается функция fcn.6d982600. Если мы рассмотрим эту функцию, мы можем увидеть, что это указатель на printf. Иногда radare2 и другие дизассемблеры не могут идентифицировать базовые функции, такие как printf. Это стандарт и прямо сейчас это не особо важно. Если мы хотим изменить имя функции, нам просто следует найти адрес и использовать команду:
afn printf
Если процесс завершиться удачно, тогда он вызовет функцию fcn.6d9814c0.
Мы можем видеть, что эта функция создаёт сокет. Если сокет создан успешно, тогда она передаёт IP адрес 62.210.204.58 и порт 443 и выполняет подключение. Если нет, тогда вновь через printf выводится ошибка, и выполняется выход из программы. Мы могли бы использовать этот IP адрес и порт в качестве основанного на сети идентификатора для обнаружения этой вредоносной программы.
Если наш сокет может подключиться к серверу, тогда он создаст новый файл с именем 3165616.exe на диске C: инфицированного компьютера, который может использоваться как основанный на хосте идентификатор для этого вредоносного ПО. Если это завершается неудачей, тогда мы получаем другую ошибку. После этого программа зацикливается на отправке данных серверу и сохранении полученных данных в исполнимый файл, который был создан. Когда всё проходит удачно, программа запускает этот исполнимый файл.
Миниграф, иллюстрирующий цикл, который заполняет исполнимый файл данными:
Миниграф, иллюстрирующий вызов WinExec на созданном исполнимом файле:
Мы можем предположить, что этот dll является всего лишь дроппером для реального трояна, который будет установлен в систему.
Дроппер — это программа, функция которой заключается и ограничивается скачиванием другой вредоносной программы — именно так, как показано выше. Зачем нужно использовать промежуточное звено для скачивания вредоносной программы? Дроппер обладает более простой функциональностью и поэтому благодаря маленькому размеру может быть полностью включён в полезную нагрузку, размер которой лимитирован. Также дроппер благодаря его простоте можно чаще модифицировать, чтобы избегать антивиросов.
Во время написания анализа я мог получить исполнимый файл с сервера с помощью команды curl, но во время написания, видимо, автор вредоносной программы изменил сервера или отключил их. Я мог запускать эту программу в Windows окружении для анализа событий, до того как сервер ушёл в офлайн.
Вначале вы можете видеть пакет ответа, который вернул сервер на 62.210.204.58, он подтверждает наши подозрения, что закидывается исполнимый файл Windows. Для тех, кто не знаком с Magic in binaries (Магия в двоичных файлах), поясню: первые подсвеченные MZ за захваченном пакете означают, что это Windows Binary. Далее мы можем подтвердить это строкой “This program cannot be run in DOS mode”, которая популярна в приложениях Windows. Мы также можем увидеть PE что означает “Portable Executable” (Портативный исполняемый файл).
Если того, как этот исполнимый файл загружен и запущен, он связывается с 3click.click/install/start, который давал команды выполнения. Он создал wininit.exe, который находился в папке C:\WINDOWS\Fonts (что мне показалось интересным). Процесс получил бы данные с сайта icanhazip.com чтобы узнать мой внешний IP адрес, затем он отправил бы его автору вредоносной программы.
Захваченные пакеты показывают общение между icanhazip.com и моим компьютером:
Он также закрывает процесс explorer если обнаружит его открытым. Вдобавок ко всему он подключается к файлу 3click.click/report.lua, который представляет собой систему отчётности для вредоносных программ, чтобы общаться с автором о моем компьютере. Анализом этого закинутого исполнимого файла я занимался не слишком долго. Это базовый троян, который легко выдаёт себя, что он находится в системе, закрывая приложения и показывая окна командной строки во время выполнения им команд.
Здесь также Hybrid-Analysis (гибридный анализ) этого файла. Он также дал множество информации. Хотя для этой статьи я и сам запуска вредоносный файл в Windows XP VM.
Спасибо за чтение и счастливого ревёрсинга!
Связанные статьи:
- Анализ вредоносной программы под Linux: плохое самодельное шифрование (100%)
- Обратный инжиниринг с использованием Radare2 (Reverse Engineering) (94%)
- Обратный инжиниринг с использованием Radare2 (Reverse Engineering) (часть 2) (94%)
- Отладка приложения в Windows с Radare2 (87.1%)
- Деобфускация JavaScript кода (56.9%)
- Как узнать тип файла без расширения (в Windows и Linux) (RANDOM - 50%)