ПОИСК РУТКИТА НА LINUX СЕРВЕРЕ
Иногда случаются крайне неприятные ситуации, когда сервер заражен вредоносным ПО (трояны, руткиты и т.д.)
И возникает вопрос как это исправить. Лучше всего помогает ручное сканирование системы на подозрительные процессы и источники их появления, хотя и автоматическими системами скнирования не стоит пренебрегать.
Попробуем найти на зараженном сервере вредоносное ПО.
Сначала изолируем сервер от внешнего мира, оставив только SSH подключение. В данном случае это было требование датацентра, на которой он размещен т.к. данный сервер генерировал огромное количество трафика. Поэтому было принято решение заблокировать все подключения, кроме относительно безопасных и необходимых, чтобы разблокировали доступ к нему (крайне неудобно искать вредоносное ПО через KVM).
Для блокировки используем iptables и создадим в нем набор правил, которые запрещают все лишнее.
1
2
3
4
5
6
7
8
9
10
|
iptables —F
iptables —t nat —F
iptables —X
iptables —P FORWARD DROP
iptables —P INPUT DROP
iptables —P OUTPUT DROP
iptables —A INPUT —p tcp —dport 22 —j ACCEPT
iptables —A OUTPUT —p tcp —sport 22 —j ACCEPT
iptables —A INPUT —j DROP
iptables —A OUTPUT —j DROP
|
посмотрим список подозрительных процессов (для удобного просмотра больших списков лучше еще использовать обработчик less, чтобы можно было листать список):
1
|
ps —aux
|
Список процессов
Мы видим несколько подозрительных процессов:
/usr/bin/.sshd — путь запуск стандартный, на какое-то подозрительное имя.
/tmp/Sav — подозрительное имя и подозрительное расположение для исполняемого файла
/boot/.IptabLex — подозрительное имя и подозрительное расположение для исполняемого файла
теперь посмотрим что эти процессы делают:
1
|
netstat —avnp
|
Список сетевых соединений
Netstat выдает подозрительную активность.
.IptabLex — пытается создать соединение с сервером 222.186.21.48 по порту 7000
Sav — пытается создать соединение с сервером 222.186.34.177 по порту 25000
Интересующие нас процессы имеют PID: 12419, 12445, 12515, 21795 (бывший 19710. Оказывается процесс .IptabLex периодически перезапускется).
Посмотрим какие файлы в системе они открывают и используют:
1
2
3
4
|
lsof —p 12419
lsof —p 12445
lsof —p 12515
lsof —p 21795
|
Список открытых файлов
Сверхинтересного ничего не найдено, вредоносное ПО в данных файлах хранит собственные PID, но в файле /.mylisthbx.pid был найден еще один PID (3257), который я пропустил, это окзался еще один вредоносный процесс /boot/.IptabLex. В нем тоже не было ничего интересного.
Далее сравним найденные файлы (по размеру и контрольной сумме каждого) и сохраним размеры и контрольные суммы (они в дальнейшем пригодятся).
Контрольные суммы:
1
2
3
|
md5sum /usr/bin/.sshd
md5sum /tmp/Sav
md5sum /boot/.IptabLex
|
Размер:
1
2
3
|
ls —lia /usr/bin/.sshd
ls —lia /tmp/Sav
ls —lia /boot/.IptabLex
|
Контрольные суммы
и увидим, что два файла идентичны, а третий отличается.
Собственно основные запущенные файлы выявлены.
Теперь посмотрим что у них внутри. Для этого воспользуемся утилитой strings, используемую для поиска печатаемых строк в бинарных файлах
1
|
strings /boot/.IptabLex
|
Интересные строки 1
Тут мы видим странные строки с публичными сайтами (декомпиляция в дальнейшем показала, что по ним определяется доступность выхода в интернет), а так же некоторый набор путей.
1
|
strings /tmp/Sav
|
Интересные строки 2
На этом скриншоте записи, которые нам говорят о некоторых параметрах (или переменных), которые имеют вполне красноречивые названия
Интересные строки 3
Далее мы видем список каких-то IP. Скорее всего это сервера управления ботнетом.
Интересные строки 4
И подозрительные локальные пути. Дальнейший поиск по файловой системе показал, что это пути куда дополнительно копируется вирус.
В принципе вирус найден. Осталось его удалить.
Первый будем искать по имени:
1
|
find / —type f —name возможные_имена_вируса
|
пример:
1
|
find / —type f —name .IptabLex
|
В данном случае ищем все файлы с именем .IptabLex
Далее пройдемся поиском по размеру файла со сравнением контрольной суммы, для исключения ложных срабатываний.
Посмотрим размер файла вируса:
1
|
ls —lia /boot/.IptabLex
|
запустим поиск по размеру:
1
|
find / —size размер_файлаc —type f —exec md5sum {} \; | grep ^контрольная_сумма | awk ‘{print $2}’
|
пример:
1
|
find / —size 12800c —type f —exec md5sum {} \; | grep ^6b1af22a53c8f23f9cf8635f1658094f | awk ‘{print $2}’
|
будет произведен поиск всех файлов с размером 121800 байт и сравнение с контрольной суммой найденного образца вируса, а параметр c указывает, что ищем файл с нужным количеством байт.
И последний поиск сделаем по контрольной сумме (он самый долгий и шанс коллизии слишком низкий, поэтому для параноиков):
1
|
find / —type f —exec md5sum {} \; | grep ^контрольная_сумма_файла | awk ‘{print $2}’
|
пример:
1
|
find / —type f —exec md5sum {} \; | grep ^6b1af22a53c8f23f9cf8635f1658094f | awk ‘{print $2}’
|
Объясню некоторые параметры поиска:
-type f — указывает что искать нужно файлы
-exec md5sum {} \; — выполнить команду (exec) вычисления контрольной суммы md5sum над найденным файлом {} и закрывем команду exec символами \;
grep ^ — фильтруем строки, ^ означает, что строка с этого должна начинаться.
awk ‘{print $2}’ — выводим второе значение (путь и имя файла)
После нахождения всех файлов, убиваем процессы командой:
1
|
kill —9 PID1 PID2 PID3
|
пример:
1
|
kill —9 12419 12445 12515 21795
|
Проверяем все ли процессы завершены и удаляем все найденные файлы командой rm.
Остается проверить все места, из которых возможен автозапуск (cron, init.d и т.д.).
После окончания проверки — перезапускаем систему и смотрим на наличие вредоносных процессов. Если все чисто — то очистка закончена.
Если процессы остались, то значит вычистили вредоносный код не целиком или его части находятся гораздо глубже, например в initramfs или в виде модуля ядра и требует более глубокого исследования системы.