12.03.2007

Sebek 3: как отследить злоумышленника, часть 2

image

В этой статье мы рассмотрим наиболее эффективные способы установки клиентов Sebek в сети Honeynet GenIII, а также обновление “write” для Sebek. Это обновление позволяет следить за всеми действиями злоумышленника в реальном времени.

Автор: Raul Siles, GSE, перевод Logos

Введение

В первой части статьи мы рассмотрели текущую версию Sebek и её интеграцию с сетями Honeynet GenIII (третьего поколения). В этой статье мы сделаем шаг дальше и рассмотрим наиболее эффективные способы установки клиентов Sebek в сети Honeynet GenIII, а также обновление “write” для Sebek. Это обновление позволяет следить за всеми действиями злоумышленника в реальном времени.

Практические советы по установке и настройке клиентов Sebek

 

В этой статье мы рассмотрим наиболее эффективные способы установки и настройки клиентов Sebek третьей версии в сетях Honeynet GenIII, а также некоторые особенности клиентов Sebek для ОС Linux и Windows.

Процесс установки клиентов Sebek третьей версии очень похож на процесс установки предыдущих версий. На Рис. 1 показана стандартная процедура для сборки и установки Sebek в Linux:

Build process:
# ./configure
# make
# make install    (optional)

Configuration process:
# vi sbk_install.sh

Clean up process:
# cd ..; rm -rf sebek*
# rm -f /usr/local/bin/sbk_install.sh /usr/local/bin/gen_fudge.pl
Рис. 1. Процесс сборки, настройки и уборки за собой клиента Sebek для Linux.

В процессе компиляции образуется tar-файл (sebek-linux-3.0.3-bin.tar или sebek-lin26-3.1.2b-bin.tar.gz), который следует скопировать на целевой honeypot. Этот архив содержит скрипты (parameters.sh и sbk_install.sh) и ядерные модули, необходимые для установки Sebek.

Рекомендуется компилировать ядерный модуль на отдельной машине с такой же версией ядра, что и на клиенте, и устанавливать Sebek с помощью tar-файла. Это делается для того, чтобы сократить количество следов, оставляемых при установке Sebek. Если всё же вы устанавливаете Sebek на honeypot’е с помощью “make install”, удалите директорию с исходными файлами Sebek и два установочных скрипта, как было показано на Рис. 1. К тому же файлы истории команд для многих оболочек (типа Bash) хранят команды, которые были исполнены в процессе установки. Удалите и их.

Для того, чтобы установить Sebek в ОС Windows, перепишите два исполняемых файла, “Configuration Wizard.exe” и “Setup.exe”, на honeypot. Установщик системного драйвера, “Setup.exe”, поможет вам во время процесса установки. Установщик по умолчанию устанавливает драйвер в стандартный каталог Windows, C:\WINDOWS\system32\drivers для WinXP и C:\winnt\system32\drivers для Windows 2000, используя стандартное имя драйвера Sebek – SEBEK.SYS. С точки зрения безопасности, рекомендуем запустить установщик с ключом “/N=NAME”, чтобы указать другое имя драйвера.

На Рис. 2 показан процесс установки клиента Sebek с использованием нестандартного имени драйвера, SCSICTRL. Как и в случае с Linux, удалите установочные файлы после завершения установки.


Рис. 2: Процесс установки Sebek в ОС Windows.

Следующие рекомендации детализируют наиболее эффективные настройки для сетей Honeynet GenIII с точки зрения безопасности. В ОС Linux Sebek настраивается редактированием скрипта sbk_install.sh, который содержит переменные Sebek: DESTINATION_IP и DESTINATION_MA. Эти переменные должны содержать IP и MAC-адреса основного шлюза. Если злоумышленник случайно получить настройки Sebek, то они не раскроют адреса сервера Sebek. К тому же, если злоумышленник перехватит пакеты Sebek, они не будут выглядеть подозрительно. В сетях Honeynet GenIII скрытый Honeywall, выступающий в роли шлюза, будет собирать весь трафик Sebek, вне зависимости от значений этих переменных.

Также важно, чтобы основной шлюз не выдавал сообщений ICMP “порт недоступен” – это насторожит злоумышленника. Ниже следует краткое описание основных переменных:

  • DESTINATION_PORT: все honeypot’ы в одной сети honeynet должны использовать одинаковый порт назначения. Потому что этот порт используется сервером Sebek для опознания интересного трафика и клиентами Sebek для сокрытия трафика других honeypot’ов.
  • MAGIC_VAL: магическая переменная используется вместе с портом назначения для определения пакетов, которые необходимо скрыть в сети honeynet. Значение должно быть трудно предсказуемым.
  • KEYSTROKE_ONLY: это значение должно быть равно 0 (по умолчанию 1) для того, чтобы перехватывать все системные вызовы “read” и восстанавливать целые файлы, передаваемые, например, через SCP. При работе в этом режиме, на Honeywall должно быть достаточно свободного дискового пространства.
  • SOCKET_TRACKING: мониторинг активности сокетов должен быть включен (по умолчанию), чтобы система Walleye (рассмотрена в первой части статьи) могла составить отношения между процессами и сетевой активностью.
  • TESTING: в рабочей среде эта переменная должна быть равна 0 (по умолчанию), чтобы скрыть модуль Sebek и запретить его удаление.
  • MODULE_NAME: имя модуля Sebek не должно вызывать подозрений (пример: SCSICTRL – ядерный модуль контроллера SCSI). Установка имени вручную лучше чем, если вы оставите эту переменную пустой – в этом случае выберется случайное имя, которое может вызвать подозрения.
  • WRITE_TRACKING: эта опция доступна только в ядрах Linux версии 2.6 (клиент Sebek 3.1.2b). Она позволяет включить экспериментальный режим Sebek, доступный после установки обновления “write”, которое рассмотрено далее в статье.

Некоторые переменные, например INTERFACE или SOURCE_PORT, не были рассмотрены выше, так как нет каких-либо советов, связанных с ними и касающихся безопасности.

В ОС Windows Sebek устанавливается с помощью графического инсталлятора “Configuration Wizard.exe”. Этот инсталлятор поможет вам настроить и задать все необходимые переменные Sebek. Эти переменные схожи с переменными Linux клиента Sebek, рассмотренными выше, за исключением некоторых деталей, рассмотренных на Рис. 3. Режимы KEYSTROKE, SOCKET, WRITE и TESTING отсутствуют. Помимо этого, Windows версия Sebek не позволяет задать SOURCE_PORT (порт источника). По умолчанию используется значение “1101”.

Клиент Sebek для Windows позволяет задать дополнительную переменную, содержащую имя процесса, у которого есть доступ к драйверу Sebek. После установки, драйвер прячется и может быть доступен и настроен только с помощью специальной программы, указанной в этой переменной. Рекомендуем изменить значение переменной по умолчанию, “Configuration Wizard.exe”, на нестандартное.

На Рис. 3 показаны основные различия между клиентами Sebek для Windows и Linux:

Sebek версии 3

Linux 2.4

Linux 2.6

Windows

Переживает перезагрузки?

Нет

Нет

Да

Дополнительные настройки:

  • WRITE_TRACKING (эксперимент.)
  • SRC_PORT
  • KEYSTROKE_ONLY
  • SOCKET_TRACKING
  • TESTING

 

Да (с патчем)
Да
Да
Да
Да

 
Да
Да
Да
Да
Да

 
Нет
Нет (1101)
Нет
Нет
Нет

Возможности руткита к скрытию (*)

Нет

Нет

Да

Требуется скрывающий модуль

Да (cleaner.o)

Нет (встроен)

Нет (встроен)

Вариант, не заменяющий реализацию raw socket (во время компиляции)

Нет

Да

Нет

Дополнительная настроечная программа

Нет

Нет

Да


(*) Эти возможности были удалены из начальных версий Sebek для Linux, для предотвращения неправильного использования. Sebek основан на рутките уровня ядра Adore.

Рис. 3: Различия между версиями Sebek для Linux и Windows

Как можно понять из этой таблицы, обе версии клиента нуждаются в доработках. Было бы желательно, если бы клиенты Linux переживали перезагрузки, а клиенты Windows имели бы больше настроек и опций.

После того, как клиент был установлен и настроен, Sebek запускается скриптом “sbk_install.sh” в Linux или перезагрузкой honeypot’a в Windows.

Практические советы по запуску сервера Sebek

Сервер Sebek версии 3 (3.0.3) устанавливается и настраивается по умолчанию на Roo Honeywall, поэтому подробности компиляции мы рассматривать не будем. Это стандартный процесс сборки в Linux.

Инструменты сервера Sebek (http://www.honeynet.org/tools/sebek/) управляют трафиком, перехваченным клиентами Sebek. Главный инструмент управления называется “sbk_extract”, и он основан на библиотеке libpcap. (http://www.tcpdump.org) Он просто прослушивает трафик случайном режиме (promiscuous mode) через внутренний интерфейс Honeywall’a, фильтруя данные по порту назначения. Весь Sebek-трафик будет перехвачен сервером Sebek, независимо от того, кому он предназначен. Отчеты Sebek обрабатываются этим инструментом, и их двоичное представление направляется на стандартный выход. Эти выходные данные обычно передаются по каналу (pipe) на вход инструменту “sbk_ks_log.pl”, который их обрабатывает и пишет детальные отчеты о нажатых клавишах в стандартный выход. Это показано на Рис. 4:

.
Рис. 4: Использование инструментов Sebek: sbl_extract и sbk_ks_log.pl.

Другой инструмент, “sebekd.pl”, позволяет загрузить данные Sebek в базу данных MySQL, доступную, например, в Roo Honeywall. Этот инструмент внутренне вызывает “sbk_extract” и вставляет выходные данные в базу данных. “Sebekd.pl” заменяет “sbk_upload.pl” в предыдущих версиях Sebek.

Для того чтобы не стать жертвой уязвимостей libpcap и самих инструментов и чтобы не зависеть от реализаций клиентов, рекомендуем принять меры предосторожности для защиты сервера Sebek и минимизировать возможность компрометации Sebek.

С точки зрения безопасности, “sbk_extract” следует запускать в среде chroot. На Рис. 5 показано, как запустить инструмент в chroot. Для того чтобы предотвратить выход root из среды chroot, следует воспользоваться ключами “-c” и “-u”. (http://www.bpfh.net/simes/computing/chroot-break.html и http://www.unixwiz.net/techtips/chroot-practices.html)

# sbk_extract -i eth1 -p 29905 -u eric -c /tmp/chroot | sbk_ks_log.pl

Рис. 5: Сервер Sebek в среде chroot.

Дополнительно, среда должна быть защищена приложением, контролирующим политику системных вызовов, например, Systrace (http://www.systrace.org), и приложениями, защищающими стек, например, “stack randomization” (http://kerneltrap.org/node/5783) и ExecShield (http://www.dummies.com/WileyCDA/DummiesArticle/id-2900.html и http://www.redhat.com/f/pdf/rhel/WHP0006US_Execshield.pdf). Эти два механизма защиты стека включены по умолчанию в Roo Honeywall Linux с ядром 2.6, основанном на дистрибутиве Fedora Core 3.

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

Перхват системного вызова “write”. Патч ядра.

Sebek является самым продвинутым инструментом сбора информации в сетях honeynet. Однако в первой части статьи мы обмолвились об одном недостатке Sebek: мы можем видеть, что злоумышленник печатает (т. е. какие данные передает системе), но не видим ответа от системы.

Специально для этого был разработан патч, задача которого – показать полную картину взаимодействия злоумышленника с системой. Обновленная версия Sebek позволяет видеть не только вводимые злоумышленником данные (перехватывая вызов “read”), но и ответ, полученный злоумышленником от системы (перехватывая вызов “write”). Этот патч перехватывает следующие системные вызовы “write”: “__NR_write”, “__NR_writev” и “__NR_pwrite”.

Патч был разработан для текущей Linux 2.4 версии Sebek, 3.0.3, и соответствующей версии сервера, 3.0.3. Экспериментальная возможность перехвата вызовов “write” была включена в Linux 2.6 версию Sebek, 3.1.2b. В этой версии имеется специальная переменная WRITE_TRACKING, включающая и отключающая возможность перехвата вызовов “write”.

После скачивания патча (http://www.raulsiles.com/docs/Sebek_write_patch.html), он устанавливается стандартной процедурой установки патча в Linux. В архиве находятся два патча для клиента и сервера Sebek. Для установки патча клиента нужно скопировать имеющиеся четыре файла с исходными кодами в стандартную директорию клиента Sebek, “sebek-linux-3.0.3”, и выполнить команды, показанные на Рис. 6.

# tar xvzf sebek-linux-3.0.3-write.tar.gz
# cp sebek-linux-3.0.3-write/sebek* sebek-linux-3.0.3
# cd sebek-linux-3.0.3
# patch -p0 < sebek_write.h.patch
# patch -p0 < sebek_write.c.patch

Рис. 6:  Установка патча для клиента Sebek.

На Roo Honeywall, который выполняет роль сервера Sebek, новое приложение для анализа данных, “sbk_viewer.pl”, следует скопировать в “/usr/sbin”, где находятся инструменты Sebek. Это приложение находится в архиве патча для сервера Sebek. В архиве также содержатся патчи для исходных кодов сервера, но они не требуются, если используется GenIII Roo Honeywall. На Рис. 7 показан процесс настройки сервера Sebek.

# tar xvzf sebekd-3.0.3-write.tar.gz
# cp sebekd-3.0.3-write/sbk_viewer.pl /usr/sbin
# chmod 550 /usr/sbin/sbk_viewer.pl
# sbk_extract -i eth1 -p 29905 | sbk_viewer.pl

Рис. 7:  Установка патча для сервера Sebek.

Как только стандартный клиент Sebek для Linux пропатчен, и новое приложение добавлено в Honeywall, возможность перехвата “write” можно включить добавлением ядерного модуля Sebek на honeypot’e и запуском нового приложения на Honeywall. Приложение использует тот же метод, что и другие стандартные приложения, когда выходные данные приложения “sbk_extract” передаются по каналу скрипту “sbk_viewer.pl”, как показано на Рис. 7.

На Рис. 8, внизу, показано, как приложение, подобно видеокамере, позволяет специалисту по безопасности видеть всё происходящее на honeypot’e, сидя за консолью Honeywall. По умолчанию вводимые злоумышленником данные показаны красным цветом, а ответ системы – синим.


Рис. 8: Наблюдаем за действиями злоумышленника с помощью “sbk_viewer.pl”.

Приложение позволяет настроить вид отображаемой информации с помощью аргументов командной строки. Можно наблюдать за всеми “read” и “write” вызовами (а не только за “stdout”, “stdin” и “stderr”), если использовать ключ “-v” (verbose). С помощью ключа “-V” можно получать дополнительную информацию о вызовах “open” и “socket”. Можно использовать оба этих ключа одновременно. На Рис. 9 можно увидеть результат применения этих ключей, т.е. набранные команды, полученные ответы и их соответствия с временем, клиентскими системами, пользователями, идентификаторами, процессами, файлами и т.п.:


Рис. 9: вывод “sbk_viewer.pl” с применением ключей “-v” и “-V”.

Клиент Sebek перехватывает все системные вызовы, выполняемые на honeypot’e; следовательно, все данные, передаваемые и отображаемые скриптом “sbk_viewer.pl”, могут содержать информацию от различных пользователей и связанных с ними процессов. На Рис. 10 показана активность двух различных сеансов, инициированных злоумышленником на одном honeypot’e. То же самое происходит, когда несколько злоумышленников проникли на один honeypot, и их активность обрабатывается одновременно.


Рис. 10: вывод “sbk_viewer.pl” при обработке параллельных сеансов.

В этом случае, если используются стандартные аргументы командной строки, невозможно определить, к какому из сеансов относятся выводимые данные. Чтобы избежать этого, приложение предоставляет несколько возможностей фильтрования данных в зависимости от определенных событий. Это позволяет уменьшит объем отображаемой информации и выделить информацию, связанную с конкретным пользователем или процессом.

Чтобы задать эти фильтры, приложение нужно запустить с ключом “-v”, как было показано на Рис. 9. Выводимая при этом информация позволяет задавать необходимые условия фильтрования, например идентификатор процесса PID. Как только получен нужный идентификатор, можно на другой консоли Honeywall запустить параллельный процесс “sbk_viewer.pl”, который будет фильтровать PID с помощью ключа “-p”. На Рис. 11 показано, как с помощью этого ключа фильтровать вызовы “read” и “write”, соответствующие конкретному процессу, например оболочке, которую использует злоумышленник (bash):


Рис. 11: фильтрование по идентификатору процесса PID (1176).

Эта же процедура применяется и для других механизмов фильтрования. Возможно фильтровать информацию по типу системного вызова (ключ “-t”) или по выполняемой команде (ключ “-c”). На Рис. 12 показано фильтрование по вызову “read” (тип 0). Приложении просто показывает то, что злоумышленник вводит с клавиатуры, подобно приложению “sbk_ks_log.pl”:


Рис. 12: фильтрование по типу системного вызова (тип 0, read).

Ниже, на Рис. 13, показано фильтрование по выполняемой команде, когда отображаются данные только от процессов, связанных с оболочкой “bash”. Этот фильтр можно использовать для анализа отдельно взятых уязвимых процессов, например Web-сервера, связанного со всеми процессами “httpd”.


Рис 13: фильтрование по выполняемой команде (bash).

Все три вышеперечисленных фильтра могут быть использованы одновременно. Приложение использует логический оператор “И” (AND) для создания составного фильтра. Можно, например, фильтровать все вызовы “read”, соответствующие процессу с PID 1176: “sbk_viewer.pl –p 1176 –t 0”.

Текущая версия патча вызова “write” имеет некоторые ограничения. Главное из них то, что повышаются требования к производительности системы, на которой установлен клиент Sebek. Пропатченая версия работает нормально на Linux без графической оболочки. Если он будет запущен в среде X-Windows, работа по перехвату и передаче данных по сети всех событий “write” на уровне ядра просто остановит систему. Патч вызова “write” для Linux 2.6 все еще находится в бета-тестировании из-за проблем с неустойчивостью и нестабильностью системы.

Наконец, было бы неплохо увидеть функциональность патча вызова “write” в официальном релизе Honeywall. Было бы удобно иметь интегрированный патч “write” с графическим анализатором данных, описанном в первой части статьи.

Заключение

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

или введите имя

CAPTCHA