В борьбе с журнальными бестиями Иван Скляров (www.sklyaroff.ru) Хакер, номер #078, стр. 078-100-3 [как скрыть информацию от who] Вообще способов сокрытия записей от таких администраторских утилит, как who, w и так далее, существует великое множество. Например, можно внедрить модуль ядра, который будет перехватывать системные вызовы. Можно подменить сами файлы who и w, чтобы они показывали только часть информации. Наконец, можно с помощью systrace блокировать некоторые syscalls для изменения поведения утилит. Но так как сейчас мы рассматриваем непосредственно файлы wtmp, utmp и lastlog, то разберем, как можно скрыть нужную информацию путем модификации самих этих логов. Существуют функции updwtmp() и logwtmp() для добавления новых записей к текущему файлу wtmp. А как происходит удаление записей из бинарных логов? Как правило, записи в файлах utmp, wtmp и lastlog удаляет та программа, которая их вносила, например login. Причем на самом деле записи не удаляются — в соответствующей структуре очищаются поля с входным именем пользователя и именем хост-машины, а значение, которое было в поле времени (ut_time), изменяется на время выхода. В файлах utmp и wtmp дополнительно производится модификация типа записи (ut_type) с USER_PROCESS на DEAD_PROCESS. Определения для ut_type, взятые из utmp.h: #define EMPTY 0 /* Отсутствие пользовательской информации */ #define RUN_LVL 1 /* Системный уровень выполнения */ #define BOOT_TIME 2 /* Время загрузки системы */ #define NEW_TIME 3 /* Время после изменения системного времени */ #define OLD_TIME 4 /* Время, когда системное время было изменено */ #define INIT_PROCESS 5 /* Процесс, порожденный вызовом init */ #define LOGIN_PROCESS 6 /* Процесс зарегистрировавшегося в системе пользователя */ #define USER_PROCESS 7 /* Нормальный процесс */ #define DEAD_PROCESS 8 /* Завершенный процесс */ #define ACCOUNTING 9 /* Системный учет */ Таким образом, можно удалить информацию из логов двумя способами: 1. Найти по имени пользователя (имени хоста, названию терминала и т.д.) нужную запись в лог-файле и очистить поля с входным именем пользователя и именем хост-машины или просто с помощью вызова memset() или bzero() обнулить все поля структуры. 2. Скопировать из логов всю информацию, кроме той, которую нужно скрыть, во временный файл, а потом заменить содержимым очищенного файла первоначальный лог. Уже написано много утилит-клинеров (logs cleaner), которые модифицируют тем или иным способом файлы utmp, wtmp и lastlog. Наиболее известными из них являются: marry, logcloak, cloack2, remove, zap2, vanish, wipe (с исходниками лежат на www.packetstormsecurity.nl). [как написать свою утилиту-клинер] Сейчас я расскажу, как написать свой клинер с реализацией первого способа, то есть с затиранием информации нулями. Минусом этого способа является то, что многие утилиты обнаружения атак проверяют файлы utmp/wtmp/lastlog на наличие нулевых структур. Поэтому в реальности лучше воспользоваться вторым способом, но я специально оставляю место для творчества, так как если ты поймешь реализацию первого способа, то со вторым проблем возникнуть не должно. Кроме того, я ограничусь только операционной системой Linux. Для других *nix-систем ты сам сможешь оптимизировать программу. Исходник на страницах журнала я не привожу, ты сможешь взять его на компакт-диске (я назвал его who_dead.c). Остановимся только на ключевых моментах. |