Pull to refresh

Вахтёр: на страже системы

System administration *
«Однажды, в студёную зимнюю пору,
Залили на сервер бэкдорчиков гору...»


Народное админское творчество



Вобщем как то раз на одном из серверов обнаружился php-shell, через который злобные хакеры поломали уютный дневничок™ хорошего человека.
После двухчасового ковыряния в логах Апача нашлась дыра, через которую залили шелл.
Дыру прикрыли, дневничок вернули к жизни из бэкапов, и сели думу думать.

После третьей бутылки пива родилась идея: «А почему бы не отлавливать выполнение системных вызовов из php скриптов?».
Смысл в том, что большинство php-шеллов так или иначе используют функции exec();, system();, shell_exec(); или passthru();. Соответственно выполнение этих функций можно перехватить и тихонько в лог записать, что такого-то числа такой-то скрипт на такой-то строке вызвал функцию exec() с параметром «rm -rf /».
Сказано-сделано. Хорошему человеку kastigar было поставлено тех. задание и работа закипела.
Уж как он расковыривал тонкости Zend Engine я рассказывать не буду, но в конце концов родилось расширение для PHP4/PHP5 под кодовым именем BAXTEP.
Изначально мы не планировали выкладывать код в общий доступ, ибо писалось всё в общем и целом «для себя» и «от и до» не тестировалось, но дух open source всё-таки взял своё — и исходники были выложены на GoogleCode.

Сборка и установка:



Расширение поддерживает версии PHP 4 и 5.

Требования:

— пакеты для разработки PHP4/PHP5 (php4-dev, php5-dev)
— gcc
— subversion

Забираем исходники:

svn checkout http://baxtep.googlecode.com/svn/trunk/ baxtep


Собираем:

cd baxtep
phpize
./configure
make


После сборки вытаскиваем baxtep.so из директории ./modules/ и кладём в extension_dir, и в php.ini добавляем примерно такие строки:

;;;;;;;;;;
; BAXTEP ;
;;;;;;;;;;
; Load extension
extension=baxtep.so

; Absolute path to logfile. File must exist and have write access for php
baxtep.logfile = "/tmp/baxtep_messages"


Лог-файл нужно создавать самому. Кроме того, php-скрипты должны иметь достаточно прав для записи в этот файл:

touch /tmp/baxtep_messages
chmod 777 /tmp/baxtep_messages


Всё, рестартуем Апач, пишем тестовый скрипт и смотрим лог. Там будет нечто навроде этого:

2009-03-13 07:59:05 BAXTEP: system CMDLINE: `pwd` FILE: /var/www/html/test.php on line 5 URI: /test.php

Формат:

ГГГГ-ММ-ДД ЧЧ:ММ:СС BAXTEP: функция CMDLINE: команда FILE: полный путь к файлу на ФС on line N URI: собственно REQUEST_URI

UPD: l0rda собрал пакеты для CentOS 5 (i386 и x86_64), скачать можно тут: rpm.l0rda.biz/CentOS/5/RPMS/i386, ключ: rpm.l0rda.biz/L0RDA-KEY
Tags:
Hubs:
Total votes 112: ↑107 and ↓5 +102
Views 3.9K
Comments Comments 141