Нестандартные backdoor-ы в *nix. Как создать свой необычный backdoor

Xakep, номер #046, стр. 046-054-2


Вариант два - пропатчить не саму программу, а библиотечную функцию, вызываемую ps'ом. Сделаем еще одно небольшое лирическое отступление о том, как работает ps. Для того чтобы получить список процессов, работающих в системе, ps "спрашивает" об этом ядро операционной системы, то есть делает системный вызов. Фишка же в том, что ps обращается не напрямую к ядру, а к какой-нибудь библиотечной функции, которая, в свою очередь, "перенаправляет" этот запрос к ядру. Ядро же, обработав запрос, возвращает список процессов библиотечной функции, а она передает его обратно ps'у. Поэтому нам ничто не мешает пропатчить не сам ps, а библиотечную функцию таким образом, чтобы она обрабатывала список процессов так же, как ps в первом варианте. Реализация точно такая же, как и с ps'ом.

Итак, ps мы пропатчили, библиотеку - тоже. Остается ядро. Ядро можно также успешно (правда немного более гиморно), как мы делали это раньше, пропатчить, но существует более простой способ - написать LKM (Loadable Kernel Module) или, попросту говоря: модуль для ядра (драйвер), модифицирующий структуры данных, связанные с процессом, который нам надо скрыть.

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

Способы скрытия такие же, как и с ps'ом: можно пропатчить netstat (саму программу, выводящую коннекты), либу и, наконец, ядро. Еще один способ - воспользоваться raw-сокетами. Дело в том, что ядро по запросу netstat'а выдает только информацию о соединениях, полностью обрабатывающихся TCP/IP стеком, а при использовании raw-сокетов мы просто обходим стандартную обработку данных этой приблудой. Следовательно, информация о пакетах, сформированных при помощи raw-сокетов, просто не передается netstat'у, и все наши коннекты оказываются успешно скрытыми.

Прячем тело бэкдора

Для начала разберемся, что будет собой представлять бэкдор. Он может быть просто набором патчей для таких прог, как ftpd, su, login, ps, netstat и т.д. Он будет давать нам доступ к машине после ввода ключевого слова или скрывать наши соединения и процессы. Если это действительно так, то админ может его легко вычислить: просто проверит даты модификации, размер и контрольную сумму пропатченных файлов. Но не бывает ничего невозможного: есть способы обойти и эти проверки. Один из них - подгрузить в ядро код, который бы модифицировал функции ядра, работающие vnode'ами таким образом, чтобы, допустим, при read(), write(), getdirentries() и тому подобных системных вызовах, затрагивающих смодифицированный файл, использовался vnode старого файла, а при exec() - пропатченного.

Назад на стр. 046-054-1  Содержание  Вперед на стр. 046-054-3