Вооружись своим руткитом Докучаев Дмитрий aka Forb Xakep, номер #069, стр. 069-064-3 Дождись, пока соберутся все сетевые утилиты. После этого переходи в каталог src и открой файл netstat.c. Процедура, в которую мы внедрим посторонний код, называется tcp_do_one(). Она вызывается для каждого сетевого процесса в tcp_info(). Встаем на начало кода и объявляем макрос PATH_IP_FILE. Его значение оформи в виде пути к айпишникам, которые скрываются файрволом (убьешь двух зайцев сразу), либо к отдельному конфигу. В начале кода появятся новые переменные чарового типа save_addr, hide_addr, целочисленный hide и файловый sfile. В принципе, подобный набор юзался в патче к файрволу, поэтому объяснять предназначение каждой переменной я не буду. Обращу внимание, что, помимо переменных, необходимо объявить две структуры для превращения хоста в читабельный ip-адрес: struct in_addr check_addr; struct aftype *ap; Теперь найди строку strcat(rem_addr, ":");. Она, по всей вероятности, приписывает к rem_addr двоеточие, а затем номер порта. Дело в том, что если админ не укажет ключик –n к команде netstat, то адрес не резолвнется из символьного имени в числовое, соответственно, в списке подключений отобразится твой хост, а не ip-адрес. Чтобы сделать патч универсальным для всех флагов, придется принудительно резолвнуть хост в айпишник, а только потом сравнивать с адресом в конфиге. Именно для этого я вставил строку strcpy(save_addr, rem_addr) перед вышеназванной командой. Эта функция сохранит значение rem_addr в шпионской переменной save_addr. Двигайся далее, пока не увидишь вывод инфы о конкретном TCP-соединении. Перед распечаткой оформи резолв хоста в ip-адрес: h = (struct hostent *)gethostbyname(save_addr); memcpy(&check_addr, h-> h_addr_list[0], sizeof(struct in_addr)); sprintf(save_addr,"%s",inet_ntoa(check_addr)); Данный код был честно спионерен из проекта sshd :). Это еще раз подтверждает, что тебе совсем необязательно знать Си (кто запрещает юзать код из других приложений?). В элемент массива h-> h_addr_list заносятся все ip-адреса, прикрепленные к конкретному хосту. Затем в переменную check_addr копируется указатель на первый айпишник (в бинарном режиме), а потом происходит его преобразование в читабельный адресок. Следующие строки по содержанию очень похожи на патч для iptables. Открывается файл PATH_IP_FILE, затем в цикле сравниваются две переменные (текущая и эталонная), и в случае положительного результата вводится переменная hide. От значения последней решается, выводить состояние на экран или нет. Осторожно! Процессы! Если говорить о процессах, то пропатчить /bin/ps так сходу не получится. В коде procps юзается обработка бинарных данных, которая, к сожалению, мне не по зубам :(. Впрочем, я обошелся более красивым вариантом защиты своих процессов от посторонних глаз. Для этого мне пришлось перенести оригинальную версию бинарника ps в другое место (скажем, в /usr/bin/ps_list). Затем я написал небольшой perl-скрипт, который смотрит файл со скрываемыми процессами и сравнивает каждый из них с выводом /usr/bin/ps_list. Если строки совпали – на экран они никогда не попадут :). Невероятно, но эта утилитка находится на многих «моих» серверах, и мало админов обратили на нее внимание. Конечно, держать перловый скрипт в каталоге /bin стремно, поэтому приходится компилировать его в бинарный файл при помощи perlcc. Зацени простой код сценария на скриншоте либо скачивай его с сайта http://kamensk.net.ru/forb/1/x/ps.tar.gz. |