
Автоматизированный скрипт реагирования на инциденты для Linux с живым триажем, сбором памяти (LiME), созданием образов дисков, сканированием YARA и генерацией HTML-отчётов.
Реагирование на инциденты в Linux

TuxResponse — это скрипт реагирования на инциденты для систем Linux, написанный на bash. Он может автоматизировать действия по реагированию на инциденты в Linux и позволяет быстро проводить триаж систем, не жертвуя результатами. Обычно корпоративные системы имеют некоторый мониторинг и контроль, но бывают исключения из-за теневого ИТ и нестандартных образов, развернутых в компаниях. То, что требует ввода 10 команд с пробным тестированием, можно сделать нажатием одной кнопки.
Протестировано на:
Основная цель:
Внешние инструменты в пакете:
INSTALL LiME
function init_lime(){
if [ -f /usr/bin/yum ]; then
yum -y install make kernel-headers kernel-devel gcc
elif [ -f /usr/bin/apt-get ]; then
apt-add-repository universe
apt-get -y install make linux-headers-$(uname -r) gcc
fi
rm -f /tmp/v1.8.1.zip
wget -P/tmp https://github.com/504ensicsLabs/LiME/archive/v1.8.1.zip
unzip /tmp/v1.8.1.zip
rm -f /tmp/v1.8.1.zip
pushd LiME-1.8.1/src
make
mv lime-*.ko /tmp/lime.ko
popd
rm -rf LiME-1.8.1
}
При реагировании на инциденты, если вам придется устанавливать LiME вручную, набирая все команды, это значительно замедлит работу.
1) Информация о системе, IP, дата, время, локальный часовой пояс, последняя загрузка - 'hostnamectl; who -b; uname -a; uptime; ifconfig; date; last reboot'
1) Проверка смонтированных файловых систем - 'df -h'
2) Хеширование исполняемых файлов (MD5) - 'find /usr/bin -type f -exec file "{}" \; | grep -i "elf" | cut -f1 -d: | xargs -I "{}" -n 1 md5sum {}'
3) Измененные файлы - 'modified_files_period_select' (вызов функции в tuxresponse.sh)
4) Список всех скрытых каталогов - 'find / -type d -name "\.*"'
5) Файлы/каталоги без имени пользователя или группы - 'find / \( -nouser -o -nogroup \) -exec ls -l {} \; 2>/dev/null'
6) Измененные файлы из пакетов - 'packaged_files_changed' (вызов функции в tuxresponse.sh)
1) Проверка на руткиты - запуск 'chkrootkit'
2) Сканирование Yara - вызов функции tuxresponse.sh 'yara_select' (сканирование системы со всеми правилами YARA Linux из главного репозитория)
3) EXIFTool - вызов функции tuxresponse.sh 'exiftool_select' (установка EXIFTool)
1) Список запущенных процессов - 'ps -axu'
2) Удаленные бинарники, всё ещё запущенные - 'ls -alR /proc/*/exe 2> /dev/null | grep deleted'
3) Активные сетевые соединения (TCP, UDP) - 'ss -tunap | sed "s/[ \t]\+/|/g"'
4) Дамп процесса по PID - 'dump_process_select' (вызов функции в tuxresponse.sh)
1) Введите PID для дампа: **(выполняемая команда: gcore -a -o "${DUMP_FILE}" ${DUMP_PID} )**
5) Процессы, запущенные из /tmp, /dev - 'ls -alR /proc/*/cwd 2> /dev/null | grep -E "tmp|dev"'
1) Список всех активных сетевых соединений/сырых сокетов - 'netstat -nalp; netstat -plant'
1) Список всех пользователей, подключенных к системе - 'w'
2) Получить пользователей с паролями - 'getent passwd'
1) Проверка файла истории bash - 'cat ~/.bash_history | nl'
1) Список всех задач Cron - 'list_all_crontab' (вызов функции в tuxresponse.sh)
2) Список всех программ, запускаемых при старте/загрузке - 'list_all_onstartup' (вызов функции в tuxresponse.sh)
1) Дамп .bash_history пользователей - 'cat_all_bash_history' (вызов функции в tuxresponse.sh)
2) Поиск логов с бинарным содержимым - 'grep [[:cntrl:]] /var/log/*.log'
Эта опция позволяет подключиться к удаленной системе, скопировать все скрипты и инструменты и проанализировать систему.
Эта опция позволяет скомпилировать LiME из исходников и снять дамп оперативной памяти системы. Это самый простой способ, так как альтернатива — компилировать из исходников для всех основных версий ядра и вставлять LKM.
That option enables you to do a full disk image of the target system using well-known tool - dd. The function is taking source and destination as parameters and inserts them in the following command 'dd if=${IMAGE_IN} | pv | dd of='${IMAGE_OUT}' bs=4K conv=noerror,sync'. If you're investigating remote system, the script is going to copy itself there. Then if the parameter ${TARGET_HOST} is set, then the script is going to download the image to analyst system using this command >> "ssh -p${TARGET_PORT} ${TARGET_USER}@${TARGET_HOST} 'dd if=${IMAGE_IN} bs=4K conv=noerror,sync' | pv | dd of='${IMAGE_OUT}'" (im heavily using pv to make sure progress is tracked)
Все ваши действия записываются в текстовые файлы, поэтому легко вернуться и просмотреть вывод. Прелесть в том, что вы можете загрузить их в свои любимые инструменты анализа логов и разобраться на более позднем этапе. Кроме того, вы можете использовать эту функцию для создания HTML-отчета и просмотра вывода команд в более удобном для человека виде.
Установка бинарников, необходимых для корректной работы скрипта.
1) Зависимости
2) Yara и правила
3) ExifTool
4) Проверка инициализации
5) chckrootkit
6) LiME
Проход по усилению и криминалистической надежности в tuxresponse.sh:
YYYYMMDDTHHMMSSZ) вместо местного времени для защищаемой временной метки.evidence/manifest.txt; образы дисков получают сопутствующий файл .sha256.modified_files_period_select больше не создает touch файл временной метки на целевой файловой системе (который загрязнял atime/mtime в /tmp до обхода find). Теперь используется find / -xdev -newermt "1 $opt ago".eval ${DD_CMD} в _create_disk_image; конвейер dd/ssh выполняется напрямую, и исходное устройство проверяется на соответствие перед использованием.Примечание: режим с меню по-прежнему зависит от
.cmds.sh,.menu_en.shиforensics.sh, которые отсутствуют в этом репозитории. Перестройка каталога команд/меню отслеживается как отдельная задача.
^/dev/[a-zA-Z0-9]+$dump_process_select проверяет, что PID является числовым и что /proc/<pid> существует перед вызовом gcore.exec_CMD больше не использует eval; команды shell-конвейера из внутреннего каталога выполняются через bash -c.set -euo pipefail, глобальные переменные инициализируются заранее.DISTO → DISTRO в ветке обнаружения Arch Linux (ранее тихо неправильно назывался дистрибутив).apt-get install netstat → net-tools.evidence/*.txt через glob (больше не парсит ls) и пропускает манифест; выходные переменные в кавычках.VERSION='1.1'; баннер печатает версию.shellcheck -S error чист.