Сокрытие внутри пользовательских функций
Первое, что приходит в голову, для обхода песочницы и динамического анализа — отложенное выполнение шелл-кода или использование детектора песочницы, по результатам работы которого выполняется та или иная ветка алгоритма. С другой стороны, в большинстве случаев из-за ограничений по размерам мы не можем добавить лишние участки кода в PE-файл. Кроме того, реализация техник антидетектирвоания на низком уровне требует много времени и сил.
Этот метод использует функции, требующие действий пользователя. Перенаправление выполнения внутри подобных функций будет срабатывать только в том случае, если пользователь работает в программе. Если данная техника будет реализована корректно, успех практически гарантирован, и, к тому же, не будет увеличен размер бэкдора.
По нажатию кнопки «Open» из графической оболочки запускается функция проверки установленного IP-адреса.
Рис. 8.27. Графическая оболочка для настройки putty
Если поле IP-адреса не пустое, и значение корректное, запускается функция для соединения с указанным IP-адресом.
Если клиент успешно создал ssh-сессию, появится новое окно для ввода имени пользователя и пароля.
Рис. 8.28. Окно для ввода учетных сведений
Именно в этом месте произойдет перенаправление. Поскольку антивирусные продукты не настолько продвинуты для анализа такого рода механизмов, внедренный бэкдор, скорее всего, не будет обнаружен при помощи динамического анализа.
При помощи несложных методов реверс-инжиниринга, предназначенных для работы со строками и ссылками на строки, будет не сложно найти адрес функции соединения после того, как клиент установил соединение с назначенным IP-адресом. Строка «login as:», появляющаяся во всплывающем окне, поможет нам найти адрес функции соединения. В поисках ссылок на строки нам поможет IDA Pro.
Для нахождения строки «login as:» в IDA Pro открываем Views->Open Subviews->Strings on IDA.
Puc. 8.29. Ссылка на строку «login as:»
После нахождения нужной строки дважды кликаем и переходим местонахождению. Внутри секций данных IDA находит все перекрестные ссылки на строки. Для вывода всех перекрестных ссылок нажимаем комбинацию клавиш «Ctrl+Х».
На рисунке ниже показана ссылка внутри функции, которая выводит строку «login as:».
Puc. 8.30. Ссылки внутри функции, которая выводит строку «login as:»
На рисунке ниже показана инструкция, которую мы будем изменять. После выполнения кода бэкдора, эта инструкция будет использоваться вновь.
Puc. 8.31. Инструкция, которую мы будем менять
После изменения инструкции PUSH 467С7С на JMP 0x47А478 процесс перенаправления потока выполнения можно считать завершенным. Важно не забывать, что адрес следующей инструкции будет использоваться как адрес возврата после выполнения кода вредоноса. Следующий шаг — инжектирование кода бэкдора.
8.7.5. Внедрение кода программного трояна
Первая мысль, которая приходит в голову при внедрении (ин-жинировании) бэкдора, — сохранение регистров перед выполнением вредоносного кода. Каждое значение внутри регистров — чрезвычайно важно для выполнения программы. Поместив инструкции PUSHAD и PUSHPD в начале code cave, мы сможем сохранить все регистры и флаги регистров внутри стека. Эти значения будут возвращены после выполнения кода вредоноса, и программа продолжит выполнение без каких-либо проблем.
Как было упомянуто ранее, наш бэкдор представляет собой обратный tcp-шелл-код под meteipreter, взятый из проекта metasploit.
Puc. 8.32. Помещение инструкций PUSHAD и PUSHFD перед code cave
Однако потребуется некоторые изменения внутри шелл-кода. Обычно обратный tcp-шелл-код пытается подсоединиться к обработчику некоторое количество раз, и если соединиться не удалось, процесс закрывается посредством вызова API-функции ExitProcess.
Читать дальше
Конец ознакомительного отрывка
Купить книгу