Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Привет! Меня зовут Миша, я основатель https://defbox.io - платформы на которой можно попробовать написать детект под разные атаки и соревноваться кто лучше это делает :)
На примере SSH-bruteforce стенда я расскажу, как можно своими руками сделать лабу для тренировки написания детектов:
1. Как поднять платформу для сбора и анализа логов
2. Как поднять и подготовить заведомо уязвимый сервер
3. Как провести SSH-Bruteforce
4. Что искать в платформе из п.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/r/w1560/getpro/habr/upload_files/470/6e2/bbd/4706e2bbda3b1cb0635c9ec564837d5f.png)
Список всех ивентов во вкладке Discover ( но для этого нужно будет добавить Data view )
![Ивенты можно посмотреть на вкладке Discover Ивенты можно посмотреть на вкладке Discover](https://habrastorage.org/r/w1560/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/r/w1560/getpro/habr/upload_files/ca0/d44/bd1/ca0d44bd1e78038eae19129943e6782b.png)
Видим 300 неуспешных попыток аутентификации - похоже на брутфорс!
Попробуем написать правило ( у эластика есть 700 с лишним созданных правил, в том числе и на брутфорс SSH, но у меня не получилось сделать так чтобы оно заработало )
Попробуем такую же query, какой мы воспользовались ранее:
event.category : "authentication" and event.outcome : "failure"
![Пример страницы с правилом Пример страницы с правилом](https://habrastorage.org/r/w1560/getpro/habr/upload_files/d82/383/4a8/d823834a8eee2b20581bba0121cee9d4.png)
И вот мы написали правило, которое теперь будет следить за тем, пытаются ли наши сервера забрутфорсить. На это правило мы можем навесить интеграций ( чтобы обои отваливались ) чтобы, например, получать нотификации в телеграм, или сразу уведомлять товарища майора :)
Все это можно сделать в секции действий которые нужно выполнить если правило сработало:
![Страница с действиями на правило Страница с действиями на правило](https://habrastorage.org/r/w1560/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 )