Привет! Меня зовут Миша, я основатель https://defbox.io - платформы на которой можно попробовать написать детект под разные атаки и соревноваться кто лучше это делает :)
На примере SSH-bruteforce стенда я расскажу, как можно своими руками сделать лабу для тренировки написания детектов:
Как поднять платформу для сбора и анализа логов.
Как поднять и подготовить заведомо уязвимый сервер.
Как провести SSH-Bruteforce.
Что искать в платформе из п.1 и как написать правило в эластике.
Зачем это нужно? Чтобы потренировать свои скиллы аналитика логов, попробовать построить домашний SIEM или чтобы просто разобраться с чем это там работают ваши коллеги.
Мы хотим собирать логи и находить в них нехорошие события. Перед тем, как создавать эти события, нужно подготовиться к сбору логов. Для этого мы поднимем популярный ELK стек (строго говоря мы поднимем EK стек, логстеш мы подымать не будем).
ELK стенд и уязвимый сервер можно поднять по разному:
на разных виртуальных машинах в облаке.
на разных виртуальных машинах используя личный компьютер.
Поднять ELK на своем компьютере, а в облаке поднять виртуальную машину с уязвимым стендом.
Мы будем использовать третий вариант, хоть это и может показаться спорным из-за необходимости выставлять эластик в интернет.
Поднять его можно вот так:
Клонируем репозиторий с готовыми docker compose файлами:
git clone https://github.com/deviantony/docker-elk.git
Переходим в этот репозиторий
cd docker-elk/
Делаем магию чтобы мы могли писать правила корелляции:
echo "xpack.encryptedSavedObjects.encryptionKey: $(openssl rand -hex 32)" >> kibana/config/kibana.yml
(Эта команда генерирует и создает случайный ключ, который кибана будет использовать для шифрования)И запускаем ELK -
docker compose --profile=setup up
После выполнения этих действий по адресу http://localhost:5601
вас будет ждать кибана в которой можно смотреть логи. Мы чуть позже посмотрим на нее.
Еще у нас должен быть доступен эластик - http://localhost:9200
Для того, чтобы на этот эластик можно было отправлять логи, нужно сделать так, чтобы эластик был доступен из интернета - для этого лучше всего воспользоваться ngrok'ом.
Теперь, когда у нас доступен эластик, мы можем развернуть виртуальную машину с SSH, специально сконфигурировать ее плохо, и даже взломать.
Эта статья больше обзорная, поэтому мы возьмем один из самых простых сценариев - брутфорс SSH.
Вообще, виртуальную машину развернуть можно где угодно, лично я обычно разворачиваю их в Digital Ocean. Это можно либо руками из интерфейса сделать, либо воспользоваться терраформом. Для того, чтобы наш стенд легко было переподнимать, имеет смысл написать терраформ файл, мы представим что он у нас уже написан, и виртуальная машина с линуксом есть.
На этой виртуальной машине нужно выполнить следующие команды
sed -i -e 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
sudo /etc/init.d/ssh force-reload
sudo /etc/init.d/ssh restart
useradd -ou 0 -g 0 -m keeton
echo \"keeton:Qm8Aokcvl9NHzO1XJRs1KYhTktq0SmZf\" | chpasswd
Которые:
Настроят ssh на доступ с паролем.
Создадут пользователя
keeton
с паролемQm8Aokcvl9NHzO1XJRs1KYhTktq0SmZf
Теперь нужно подключить наш стенд к системе сбора логов.
Для этого мы установим auditbeat на наш сервер:
Установим auditbeat
curl -L -O https://artifacts.elastic.co/downloads/beats/auditbeat/auditbeat-8.4.3-amd64.deb sudo dpkg -i auditbeat-8.4.3-amd64.deb
Настроим auditbeat так, чтобы он отправлял информацию в наш ELK - для этого нужно отредактировать файл /etc/auditbeat/auditbeat.yml и в секцию output.elasticsearch ввести адрес, юзернейм и пароль нашего эластика (дефолтные юзернейм и пароль это elastic:elastic)
Перезапустим auditbeat чтобы применить изменения
$ auditbeat setup --index-management $ service auditbeat start
Теперь мы должны увидеть в нашей кибане такую картину:
1 хост во вкладке Security->Explore->Hosts
![На вкладке Security->Explore->Hosts должен быть 1 хост Pasted image 20230521114802.png](https://habrastorage.org/getpro/habr/upload_files/470/6e2/bbd/4706e2bbda3b1cb0635c9ec564837d5f.png)
Список всех ивентов во вкладке Discover (но для этого нужно будет добавить Data view)
![Ивенты можно посмотреть на вкладке Discover Ивенты можно посмотреть на вкладке Discover](https://habrastorage.org/getpro/habr/upload_files/c88/d39/976/c88d39976f8dfaeb58818d36a99bfabe.png)
Теперь мы полностью готовы к тому, чтобы забрутфорсить и задетектить :)
Для брутфорса мы будем использовать гидру (команды нужно выполнять не на уязвимом сервере):
Установим гидру -
apt-get update; apt-get install -y hydra-gtk
Скачаем список часто используемых паролей
curl https://raw.githubusercontent.com/danielmiessler/SecLists/master/Passwords/Leaked-Databases/rockyou-10.txt > passwords.txt
Добавим наш пароль в конец этого списка, чтобы брутфорс закончился удачно
echo "Qm8Aokcvl9NHzO1XJRs1KYhTkTq0SmZf" >> passwords.txt
Запустим брутфорс
hydra -l keeton -P passwords.txt "{{ nameSSH }}" ssh -t 4
Минут через пять брутфорс будет закончен успешно. Воображаемый хакер сможет зайти на сервер, а мы сможем проверить, есть ли у нас необходимая информация в ELK чтобы не повторить такого в будущем.
Сделаем фильтр event.category: authentication
, чтобы посмотреть на все события аутентификации:
![Подозрительные события Подозрительные события](https://habrastorage.org/getpro/habr/upload_files/ca0/d44/bd1/ca0d44bd1e78038eae19129943e6782b.png)
Видим 300 неуспешных попыток аутентификации - похоже на брутфорс!
Попробуем написать правило (у эластика есть 700 с лишним созданных правил, в том числе и на брутфорс SSH, но у меня не получилось сделать так чтобы оно заработало)
Попробуем такую же query, какой мы воспользовались ранее:
event.category : "authentication" and event.outcome : "failure"
![Пример страницы с правилом Пример страницы с правилом](https://habrastorage.org/getpro/habr/upload_files/d82/383/4a8/d823834a8eee2b20581bba0121cee9d4.png)
И вот мы написали правило, которое теперь будет следить за тем, пытаются ли наши сервера забрутфорсить. На это правило мы можем навесить интеграций (чтобы обои отваливались) чтобы, например, получать нотификации в телеграм, или сразу уведомлять товарища майора :)
Все это можно сделать в секции действий которые нужно выполнить если правило сработало:
![Страница с действиями на правило Страница с действиями на правило](https://habrastorage.org/getpro/habr/upload_files/90e/0c4/ccf/90e0c4ccff4a6395fbda56c451126502.png)
И все - на самом простом уровне мы готовы к отражению SSH Bruteforce атаки.
В этой статье я постарался показать как можно подготовить себе стенд для обучения работе в BlueTeam:
Поднять ELK для сбора и анализа логов.
Поднять-удалить-заново поднять заведомо уязвимый сервер.
Найти что-то подозрительное в логах.
Написать правило чтобы в следующий раз получить уведомление об этом.
Чем можно заняться дальше?
Настроить Logstash для того чтобы эффективно обрабатывать логи (без него будет тяжело обрабатывать продакшен окружения).
Попытаться воспользоваться стандартной библиотекой детектирующих правил от Elastic.
Причесать ELK стенд, скрыв его за TLS, создав эффективный кластер.
Попытаться повторить все то же самое на стендах https://github.com/ermetic-research/cnappgoat , https://github.com/DataDog/stratus-red-team
Попробовать сдетектировать атаки на нашей платформе - https://defbox.io/invite/7539a046-5bc5-479a-94cf-b9c54934498c ( чат проекта https://t.me/+UBFBxHyMi9RmOWQy )