Сети Honeynet третьего поколения (GenIII) предоставляют все необходимые средства для сбора подобного рода информации на самом глубоком уровне. Sebek является основным инструментом сбора данных для третьего поколения сетей Honeynet.
Профессионалам в области компьютерной безопасности приходится постоянно разрабатывать и внедрять новые механизмы обнаружения подозрительной активности, чтобы своевременно отследить и поймать потенциального злоумышленника. Сети Honeynet третьего поколения (GenIII) предоставляют все необходимые средства для сбора подобного рода информации на самом глубоком уровне. Sebek является основным инструментом сбора данных для третьего поколения сетей Honeynet.
В первой части нашей статьи мы рассмотрим, что такое Sebek, и чем он так привлекает специалистов по компьютерной безопасности. Мы начнем с рассмотрения возможностей последней, третьей, версии Sebek, спецификаций протокола Sebek и того, как этот инструмент интегрируется с сетями Honeynet. Вторая часть статьи кратко обсудит установку Sebek на ОС Windows и Linux. В конце мы рассмотрим патч (заплатку, исправление), написанный автором этой статьи, позволяющий не только наблюдать то, что пишет злоумышленник, но и то, что он получает в ответ.
Sebek - инструмент сбора информации, работающий в режиме ядра
После выхода в свет третьего поколения технологий проекта Honeynet (с мая 2005 года), сети Honeynet заметно улучшили свою функциональность. Это последнее поколение основано на новой версии Honeywall, именуемой Roo, и новой, третьей версии, Sebek.
Sebek (http://www.honeynet.org/tools/sebek/) является самым продвинутым и самым сложным инструментом сбора информации в проекте Honeynet. Это open-source приложение, цель которого - получить как можно больше информации об активности злоумышленника. Эту информацию Sebek получает от honeypot’ов посредством перехвата на уровне ядра специфических системных вызовов.
Sebek основан на архитектуре клиент-сервер. Клиент устанавливается на компьютерах-honeypot, а сервер располагается на Honeywall, т.е. на шлюзе, через который проходит весь honeynet-трафик. Клиент использует технологии, сравнимые с теми, которые используют руткиты уровня ядра. Sebek распространяется в виде модуля ядра Linux (LKM), в виде системного драйвера Windows и в виде патча ядра для различных *BSD-систем. Серверный модуль содержит инструменты, позволяющие собирать и отображать захваченную клиентами информацию.
Первый клиент Sebek версии 3 (3.0.3) был выпущен для Linux с версиями ядра 2.4 в мае 2005. Эта версия также содержала сервер Sebek (3.0.3). В октябре 2005 были выпущены клиенты для таких ОС, как Windows (3.0.3), Linux с ядрами 2.6 (3.1.2b) и *BSD (3.0).
Цель этой статьи – обсудить возможности новой, третьей, версии Sebek.
Перехват трафика остается традиционным способом сбора информации о злоумышленнике. Однако, этот способ бесполезен, если злоумышленник шифрует передаваемые данные, и ключ шифра неизвестен.
Первая версия Sebek перехватывала все системные вызовы “read” длиной в 1 байт, что позволяло перехватывать все нажатые злоумышленником клавиши, до того как они будут зашифрованы. Эта изначальная способность Sebek была доработана во 2й версии для перехвата всех “read” вызовов. Также вторая версия позволяла восстанавливать файлы, переписанные с помощью SCP, и сообщения, отправленные по IRC или почте.
Третья версия расширяет эти возможности, перехватывая целый набор системных вызовов. Sebek также восстанавливает идентификатор родительского процесса и inode при любых действиях с файлами. Кроме стандартного перехвата системного вызова “read”, новая версия перехватывает дополнительные вызовы “read”, системный вызов “socket”, системный вызов “open”, а также вызовы “fork” и “clone”. В качестве ссылок мы будем использовать Linux версию Sebek. Эти же принципы относятся и к Windows версии.
Предыдущие версии Sebek перехватывали стандартный вызов “NR_read”. Текущая версия также перехватывает “NR_readv” и “NR_pread” вызовы, что позволяет перехватывать всю “read” активность в системе и противодействовать программам типа “sebekill” (http://ilja.netric.org/files/sebekill.c).
Системный вызов “socket” (NR_socket) отображает сетевую активность по отношению к действующим процессам. Поэтому, Sebek может собирать информацию о любых соединениях и установить их отношения с процессами на honeypot. Эта информация также поможет сопоставить данные, полученные Sebek, с трафиком, перехваченным с помощью Honeywall.
Системный вызов ”open” (NR_open) сопоставляет любые “read” действия с именами файлов и их inode. Это позволяет определить все файлы, к которым обращался злоумышленник. Запись inode требуется для обхода “dup2”-обфускации, используемой в “sepabek” (http://www.secdev.org/c/sepabek.c).
“Fork” (NR_fork и NR_vfork) и “clone” (NR_clone) вызовы следят за идентификаторами процессов (PID) и идентификаторами родительских процессов (PPID). Мониторинг создаваемых процессов позволяет определить взаимодействие между системными процессами и восстановить дерево процессов.
В ответ на появление программ, типа “NoSEBrEaK” (http://md.hudora.de/publications/2004-NoSEBrEaK.pdf), новая версия Sebek пытается предотвратить извлечение своего внутреннего состояния, инициализируя структурные блоки случайными значениями. Также, чтобы не дать удалить себя из системы, Sebek отключает функцию очистки, когда не работает в тестовом режиме.
Windows-версия Sebek использует почти те же приёмы, что и Linux-версия. Новая версия прячет себя из списка запущенных модулей, запросов к файловой системе и реестру. Она обходит некоторые методы обнаружения, используемые “KprocCheck” (http://www.security.org.sg/vuln/sebek215.html, http://www.security.org.sg/code/kproccheck.html).
Windows-модуль также записывает все действия с сокетами, включая такие системные вызовы, как “open”, “accept” и “bind”. Новая версия следит за PPID и PID каждого процесса. Наконец, предыдущие версии Sebek перехватывали только активность в командной строке “cmd.exe”. Текущая версия записывает ввод/вывод всех консольных приложений, даже тех, которые определяют сокет для stdin, stdout или stderr. Одним из главных преимуществ Windows-версий перед Linux-версиями является то, что они переживают перезагрузку системы.
Присутствие модуля Sebek в ОС Linux можно легко определить. Текущий метод сокрытия Sebek отсоединяет модуль из списка присоединенных ядерных модулей. На Рис. 1 показан модуль “module_hunter”, обнаруживающий модуль Sebek по его имени.
# insmod ./module_hunter.o # cat /proc/showmodules address module 0xc880d000 scsi_mod size: 0x1a278 0xc8827000 * size: 0x12 0xc8829000 sd_mod size: 0x348c 0xc882e000 BusLogic size: 0x189bc 0xc8848000 jbd size: 0xcab4 0xc8856000 ext3 size: 0x11480 0xc888a000 cdrom size: 0x83c0 0xc8894000 ide-cd size: 0x8b7c 0xc889e000 ide-scsi size: 0x2fb0 0xc88a2000 sr_mod size: 0x46d8 0xc88a6000 net size: 0x219 0xc88a8000 sg size: 0x8eac 0xc88b2000 ip_tables size: 0x3af8 0xc88b7000 iptable_filter size: 0x96c 0xc88bb000 mii size: 0xf88 0xc88bd000 module_hunter size: 0x5ec 0xc88bf000 ipt_REJECT size: 0xf58 0xc88c1000 pcnet32 size: 0x4740 0xc88c7000 autofs size: 0x33d4 0xc88cc000 sebek size: 0x5e50 #Рис. 1. Определение Sebek Linux 3.0.3 - module_hunter.
C:\>KProcCheck.exe -t KProcCheck Version 0.2-beta2 Proof-of-Concept by SIG^2 (www.security.org.sg) Checks SDT for Hooked Native APIs KeServiceDescriptorTable 80559B80 KeServiceDescriptorTable.ServiceTable 804E2D20 KeServiceDescriptorTable.ServiceLimit 284 Entry 19 - [hooked by unknown at FA881498] Entry 25 - [hooked by unknown at FA881E16] Entry 29 - [hooked by unknown at FA882266] Entry 35 - [hooked by unknown at FA880F8E] Entry 47 - [hooked by unknown at FA882360] Entry 49 - [hooked by unknown at FA881EDE] Entry 74 - [hooked by unknown at FA881D6C] Entry 77 - [hooked by unknown at FA8822E2] Entry 91 - [hooked by unknown at FA881924] Entry AD - [hooked by unknown at FA881A4A] Entry B7 - [hooked by unknown at FA8810EE] Entry C8 - [hooked by unknown at FA881310] Entry D2 - [hooked by unknown at FA8813EA] Entry 112 - [hooked by unknown at FA881146] Number of Service Table entries hooked = 14 C:\>Рис. 2. Определение Sebek Windows 3.0.3 - KProcCheck.
C:\>SDTrestore.exe SDTrestore Version 0.2 Proof-of-Concept by SIG^2 G-TEC (www.security.org.sg) KeServiceDescriptorTable 80559B80 KeServiceDecriptorTable.ServiceTable 804E2D20 KeServiceDescriptorTable.ServiceLimit 284 ZwClose 19 --[hooked by unknown at FA881498]-- ZwCreateFile 25 --[hooked by unknown at FA881E16]-- ZwCreateKey 29 --[hooked by unknown at FA882266]-- ZwCreateThread 35 --[hooked by unknown at FA880F8E]-- ZwEnumerateKey 47 --[hooked by unknown at FA882360]-- ZwEnumerateValueKey 49 --[hooked by unknown at FA881EDE]-- ZwOpenFile 74 --[hooked by unknown at FA881D6C]-- ZwOpenKey 77 --[hooked by unknown at FA8822E2]-- ZwQueryDirectoryFile 91 --[hooked by unknown at FA881924]-- ZwQuerySystemInformation AD --[hooked by unknown at FA881A4A]-- ZwReadFile B7 --[hooked by unknown at FA8810EE]-- ZwRequestWaitReplyPort C8 --[hooked by unknown at FA881310]-- ZwSecureConnectPort D2 --[hooked by unknown at FA8813EA]-- ZwWriteFile 112 --[hooked by unknown at FA881146]-- Number of Service Table entries hooked = 14 WARNING: THIS IS EXPERIMENTAL CODE. FIXING THE SDT MAY HAVE GRAVE CONSEQUENCES, SUCH AS SYSTEM CRASH, DATA LOSS OR SYSTEM CORRUPTION. PROCEED AT YOUR OWN RISK. YOU HAVE BEEN WARNED. Fix SDT Entries (Y/N)? : Y [+] Patched SDT entry 19 to 805675D9 [+] Patched SDT entry 25 to 8057164C [+] Patched SDT entry 29 to 8056F063 [+] Patched SDT entry 35 to 8057F262 [+] Patched SDT entry 47 to 8056F76A [+] Patched SDT entry 49 to 805801FE [+] Patched SDT entry 74 to 805715E7 [+] Patched SDT entry 77 to 805684D5 [+] Patched SDT entry 91 to 80574DAD [+] Patched SDT entry AD to 8057CC27 [+] Patched SDT entry B7 to 80571B30 [+] Patched SDT entry C8 to 8057860F [+] Patched SDT entry D2 to 80585D7D [+] Patched SDT entry 112 to 8057A125 C:\>Рис. 3. Отключение Sebek Windows 3.0.3- SDTrestore.· Данные, доступ к которым осуществляется через системный вызов “mmap”, не могут быть записаны Sebek.· Linux версия Sebek не переживает перезагрузки системы.
Некоторые вышеописанные недостатки (например, выживание после перезагрузки и отключение Sebek через таблицу системных вызовов) могут быть решены внедрением Sebek как патча ядра. Однако выбор LKM против патча ядра является лишь вопросом удобства установки. LKM или драйвер гораздо легче установить. Для honeypot’ов был бы надёжнее патч ядра как средство установки Sebek.
Sebek является open-source приложением, так что каждый может настроить его под свои нужды. Настроенный вручную Sebek снизит вероятность обнаружения в отличие от распространяемого публично.
Новая версия Sebek использует переделанную спецификацию протокола Sebek, которая несовместима с предыдущими версиями. Поэтому для третьего поколения Honeynet требуется третья версия Sebek на Roo Honeywall и на всех honeypot’ах. Рис. 4 показывает формат данных протокола Sebek. Каждая запись содержит 56-байтовый заголовок.
Рис. 4. Заголовок пакета протокола Sebek 3 версии.
Вся эта информация используется новыми инструментами анализа информации новой версии Honeywall, чтобы следить и сопоставлять действия злоумышленника на honeypot.
Ethereal с версии 0.10.0 включает специальный анализатор протокола Sebek. Этот анализатор способен просматривать пакеты протокола Sebek версии 1, но для текущей, третьей версии, такого анализатора не существует.
Сети Honeynet GenIII используют новую модель данных, независимую от источника
данных. Эта модель устанавливает отношения между 4 разными концептуальными
объектами: хосты, представляющие honeypot’ы,
процессы, программы, выполняемые на
хостах, файлы, представляющие данные,
находящиеся на жестком диске, и сетевые
потоки, представляющие соединения между хостами.
Данные Sebek позволяют связать эти разные объекты. Процессы определяются
системными вызовами. Вызовы “read”, “write” и “open” связывают процессы с
файлами, вызов “socket” связывает процессы с сетевыми потоками, а “fork” и
“clone” связывают процессы с другими процессами.
Данные Sebek сопоставляются с данными, перехваченными из сетевого трафика. Сетевая активность собирается Honeywall’ом с использованием снифера tcpdump. Эта активность обрабатывается различными инструментами: IDS Snort выявляет злонамеренный трафик, программа p0f определяет ОС, а Argus контролирует потоки. Данные из всех этих источников объединяются и сопоставляются в реляционной бае данных.
Графический Web-интерфейс Roo, также известный как Walleye, отображает и анализирует все перехваченные данные. Обычно незаконное вторжение обнаруживается через подозрительную сетевую активность. Рис. 5 показывает возможности Walleye.
Рис 5. Сетевые потоки Walleye - системный вызов Sebek "socket".
Рис. 6 показывает уровень детализации, предоставляемый сетями Honeynet GenIII и Sebek, демонстрируя поток системных процессов, связанных с предыдущим сетевым потоком.
Рис. 6. Уменьшенная версия диаграммы потока процессов Walleye – системный
вызов Sebek “fork”.
Вся информация, необходимая для создания диаграммы потока, предоставляется Sebek. Интерфейс Walleye также позволяет получить дополнительные сведения о процессах, собранные Sebek. Используя эти сведения, можно узнать, к каким файлам обращался злоумышленник и какие именно команды он выполнял. Рис. 7 показывает активность, связанную с процессом 2342. Этот процесс открыл некоторые библиотечные файлы, например, "/etc/ld.so.cache" или "lib/libtermcap.so.2.0.8", и выполнил несколько команд, набранных злоумышленником и перехваченных Sebek через системный вызов “read”, например “uname –a”, “id”, “cat /etc/passwd” и “ls –l /”.
Рис. 7. Данные о процессах Walleye – вызовы “read” и “open” Sebek.
В первой части статьи мы рассмотрели возможности и недостатки новой версии Sebek, спецификацию нового протокола Sebek и интеграцию Sebek с сетями Honeynet GenIII. Во второй части статьи мы представим вам более продвинутую версию Sebek, в которой исправлены недостатки текущей версии и добавлены новые возможности.
Вебинар Positive Technologies пройдет 30 января в 14:00
Реклама. Рекламодатель АО «Позитив Текнолоджиз», ИНН 7718668887, 18+