Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #78, ИЮНЬ 2005 г.

В борьбе с журнальными бестиями

Иван Скляров (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). Остановимся только на ключевых моментах.

Назад на стр. 078-100-2  Содержание  Вперед на стр. 078-100-4