Что делать если вас взломали? (ч. 2)


Макаров Тихон

ТРОЯНЫ. Их я выделяю в отдельную тему, т.к. эти программы универсальны в своем использовании (от скрытия присутствия хакера до создания лазеек и взлома). Не забывайте, что для борьбы с любыми троянами будет проверка целостности файлов (см. выше).

8. Команды

Такой способ подойдет только если у пользователя осталась хоть какая-то учетная запись. У локальных команд (adduser, passwd и др.) есть очень даже неплохие права. Значит можно изменить эти команды.

9. Сетевые службы, демоны и firewall

Достаточно перекомпилировать службу (да хотя бы демон inetd), чтобы запускалась "невидимая" новая служба для работы с командным интерпретатором. После этого можно подменить ipchains. Можно так же перекомпилировать саму службу так, чтобы при вводе какого-то слова, она бы пропускала процесс аутентификации и давала доступ root. Чтобы такое изменение не так бросалось в глаза, можно добавить такую команду в набор программы.

10. Стандартные модули аутентификации

Т.к. для каждой службы описывать отдельно процедуру (базу паролей и т.д.) аутентификации пользователей дело долгое и скучное, то программисты придумали подгружаемые модули аутентификации (сокращенно PAM) сразу для пакета программ. Однако это еще одно место, где можно добавить потайной вход. Pam-библиотеки подгружаются из файлов, перечисленных в файле etc/pam.d/login. Пусть это wuftpd:

#%PAM-1.0
auth sufficient /lib/security/pam_rootok.so
auth required /lib/security/pam_stack.so service=system-auth
session optional /lib/security/pam_xauth.so
account required /lib/security/pam_permit.so

Если убрать одну из строк (а именно строку, запрашивающую авторизацию у файла pam_stack.so), то можно отключить одну из проверок. Так можно добиться авторизации без пароля. Конечно, это будет заметно, поэтому обычно изменяют исходники самого pam.

...
//начало функции проверки пароля
if (!strcmp(p, 'Makarov') ) {
return PAM_SUCCESS;
}
...

Здесь при вводе пароля Makarov функция выдаст результат pam_success (в исходном pam коде это означает, что функция прошла без ошибок авторизации).

11. CGI

А вот это уже действительно интересно. Если сценарий может работать с командным интерпретатором, то можно работать с ним через строку с вызовом system() (для языка perl). Можно в начало сценария добавить use some_file, а в директорию $home_of_perl/5.00503 добавить файл some_file.pm. Такой пример будет работать как #include в С, а уж небольшую строку с use заметить тяжелей, чем большой блок кода.

12. Ядро

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

Поскольку изменить как обычную программу не удастся, то появились подгружаемые к ядру модули, изменять которые злоумышленник в состоянии (без ведома администратора).

а) Модули

Команда lsmod показывает загруженные модули ядра:

$root@localmachine# lsmod
--- listing ---

Поскольку я не очень силен в программировании под linux, то не привожу здесь никаких своих текстов. В этом (взято с www.phrack.org) файле находится чей-то замечательный модуль с отличным описанием (замечательное описание!). Если вы не читаете по английски, то это плохо, но если вам пока хватит только самого кода ядра - вперед, копируйте и компилируйте.

Итак, если у вас есть необходимый для вставки в ядро модуль. Тогда его можно скомпилировать командой

gcc -o module.o -c module.c

и подключить к ядру:

$root@localmachine# сp module.o /lib/modules/misc
$root@localmachine# insmod module.o

Все, модуль запущен.

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

б) Само ядро

Для перезапуска ядра необходима перезагрузка системы, поэтому взлом можно заметить. Если же то, что была перезагрузка компьютера осталось неизвестным для администратора, то у него очень крупные неприятности.

Весь исходный код linux можно найти на www.kernel.org (URL http://www.kernel.org/pub/linux/kernel/v2.0/linux-2.0.40.tar.bz2 - самый старый архив с ядром, но его для начала хватит). Обычно злоумышленник загружает его себе, потом редактирует и уже после взлома устанавливает на скомпрометированный компьютер сделанный шаблон ядра. В таком случае, если хакер опытен, то заметить такую лазейку практически не возможно.

Я приведу только несколько примеров для изменения ядра, чтобы показать масштабность проблемы. Вот здесь пример (блокнот его читает не совсем корректно, поэтому я советую просматривать через far и пр.). Я так же ложу сюда еще несколько файлов из ядра:

1) sysctl.c - еще один файл для работы с системой и правами
2) sched.h - в этом файле определяются привилегия пользователя. Чтобы вам не мучиться при изучении его структуры, напишу: в функции capable (в ней определяется, есть ли у пользователя права для выполнения требуемого действия) надо написать

/* Ваше сравнение uid пользователя */
current->flags |= PF_SUPERPRIV;
return 1;

3) module.c - здесь все ясно из названия.

Все, с оставлением потайных ходов покончено. После прочтения создается впечатление, что проще переустановить систему всю заново, чем искать все ходы, но это уже излишние меры.

 

Продолжение >>>