Скажи логам нет! Докучаев Дмитрий aka Forb Xakep, номер #069, стр. 069-080-1 (forb@real.xakep.ru) Принцип работы современных логвайперов Ты никогда не задумывался, почему админы быстро вычисляют непрофессиональных хакеров? Причина кроется в том, что неопытный взломщик забывает почистить после себя логи, а если и чистит, то делает это так криво, что даже неопытный сисадмин легко догадается об атаке. Чтобы этого не произошло, тебе необходимо знать алгоритмы работы лучших чистильщиков для известных операционных систем. В unix-системах логи делятся на две принципиально разные части: бинарные и текстовые. Основное их отличие в том, что из бинарных журналов данные так просто не получить. Обращаться к ним можно только через специальную структуру utmp, функции которой описаны в заголовочном файле utmp.h. Что касается текстовых логов, с ними работать проще и удобнее (как для админа, так и для хакера ;)). Для удаления данных достаточно отфильтровать строку обычным grep’ом. Бинарная обработка Особый интерес изо всех логов представляют именно бинарные журналы. Во многих современных операционных системах их три. Это /var/log/wtmp, /var/run/utmp и /var/log/lastlog. Сейчас я расскажу, зачем они вообще нужны. Первый лог служит для записи информации обо всех входах в систему. Скажем, вошел хакер под сбрученным аккаунтом, и демон, обслуживающий вход (sshd, например), его записал. Стоит администратору выполнить команду last xakep, и он сразу же увидит информацию о последнем входе взломщика, включая хост и время пребывания. Второй журнал необходим для логирования информации о пользователях, которые находятся непосредственно за консолью. Если ты сидишь за терминалом на хакнутом сервере, то администратор может посмотреть вывод команды w (или who, users) и определить твое присутствие. Надо заметить, что запись из utmp стирается сразу же после покидания консоли. Что касается wtmp, инфа в логе остается навсегда (по крайней мере, до твоего непосредственного вмешательства ;)). И наконец, /var/log/lastlog нужен для хранения информации о последнем заходе пользователя. В журнале хранятся данные по каждому системному юзеру (хост, терминал, время захода, имя пользователя), которые могут быть предоставлены администратору по команде finger либо lastlogin. С назначением логов мы разобрались. Перед тем как рассматривать работу конкретного логклинера, давай познакомимся с бинарным режимом работы. Как я уже сказал, для обращения к подобным журналам используются специальные функции, описываемые в /usr/include/utmp.h. Вот список основных: * utmpname(). Эта функция принимает единственный параметр – указатель на бинарный файл, который должен быть просмотрен/отредактирован. Само собой, в качестве такого файла может использоваться любой из вышеназванных журналов. * setutent(). Функция вызывается без параметров в начале процесса обработки журнала. Ее суть заключается в установке указателя в самое начало журнала. В случае, когда обработка завершена, необходимо вызвать endutent(). Данная функция корректно закроет журнал. * getutent(). Данная процедура позволяет искать запись в журнале в определенном его участке. Эта функция возвращает заполненную данными структуру. В ней при желании можно найти все необходимые поля: имя пользователя, хост, с которого юзер залогинился, а также время захода. |