Привет! Меня зовут Миша, я основатель https://defbox.io - платформы на которой можно попробовать написать детект под разные атаки и соревноваться кто лучше это делает :)

На примере SSH-bruteforce стенда я расскажу, как можно своими руками сделать лабу для тренировки написания детектов:

  1. Как поднять платформу для сбора и анализа логов.

  2. Как поднять и подготовить заведомо уязвимый сервер.

  3. Как провести SSH-Bruteforce.

  4. Что искать в платформе из п.1 и как написать правило в эластике.

Зачем это нужно? Чтобы потренировать свои скиллы аналитика логов, попробовать построить домашний SIEM или чтобы просто разобраться с чем это там работают ваши коллеги.

Мы хотим собирать логи и находить в них нехорошие события. Перед тем, как создавать эти события, нужно подготовиться к сбору логов. Для этого мы поднимем популярный ELK стек (строго говоря мы поднимем EK стек, логстеш мы подымать не будем).

ELK стенд и уязвимый сервер можно поднять по разному:

  1. на разных виртуальных машинах в облаке.

  2. на разных виртуальных машинах используя личный компьютер.

  3. Поднять ELK на своем компьютере, а в облаке поднять виртуальную машину с уязвимым стендом.

Мы будем использовать третий вариант, хоть это и может показаться спорным из-за необходимости выставлять эластик в интернет.

Поднять его можно вот так:

  1. Клонируем репозиторий с готовыми docker compose файлами: git clone https://github.com/deviantony/docker-elk.git

  2. Переходим в этот репозиторий cd docker-elk/

  3. Делаем магию чтобы мы могли писать правила корелляции: echo "xpack.encryptedSavedObjects.encryptionKey: $(openssl rand -hex 32)" >> kibana/config/kibana.yml (Эта команда генерирует и создает случайный ключ, который кибана будет использовать для шифрования)

  4. И запускаем 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  

Которые:

  1. Настроят ssh на доступ с паролем.

  2. Создадут пользователя keeton с паролем Qm8Aokcvl9NHzO1XJRs1KYhTktq0SmZf

Теперь нужно подключить наш стенд к системе сбора логов.

Для этого мы установим auditbeat на наш сервер:

  1. Установим 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
  2. Настроим auditbeat так, чтобы он отправлял информацию в наш ELK - для этого нужно отредактировать файл /etc/auditbeat/auditbeat.yml и в секцию output.elasticsearch ввести адрес, юзернейм и пароль нашего эластика (дефолтные юзернейм и пароль это elastic:elastic)

  3. Перезапустим auditbeat чтобы применить изменения

    $ auditbeat setup --index-management
    $ service auditbeat start
    

Теперь мы должны увидеть в нашей кибане такую картину:

  1. 1 хост во вкладке Security->Explore->Hosts

На вкладке Security->Explore->Hosts должен быть 1 хост
  1. Список всех ивентов во вкладке Discover (но для этого нужно будет добавить Data view)

Ивенты можно посмотреть на вкладке Discover

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

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

  1. Установим гидру - apt-get update; apt-get install -y hydra-gtk

  2. Скачаем список часто используемых паролей curl https://raw.githubusercontent.com/danielmiessler/SecLists/master/Passwords/Leaked-Databases/rockyou-10.txt > passwords.txt

  3. Добавим наш пароль в конец этого списка, чтобы брутфорс закончился удачно echo "Qm8Aokcvl9NHzO1XJRs1KYhTkTq0SmZf" >> passwords.txt

  4. Запустим брутфорс hydra -l keeton -P passwords.txt "{{ nameSSH }}" ssh -t 4

Минут через пять брутфорс будет закончен успешно. Воображаемый хакер сможет зайти на сервер, а мы сможем проверить, есть ли у нас необходимая информация в ELK чтобы не повторить такого в будущем.

Сделаем фильтр event.category: authentication , чтобы посмотреть на все события аутентификации:

Подозрительные события

Видим 300 неуспешных попыток аутентификации - похоже на брутфорс!

Попробуем написать правило (у эластика есть 700 с лишним созданных правил, в том числе и на брутфорс SSH, но у меня не получилось сделать так чтобы оно заработало)

Попробуем такую же query, какой мы воспользовались ранее:
event.category : "authentication" and event.outcome : "failure"

Пример страницы с правилом

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

Все это можно сделать в секции действий которые нужно выполнить если правило сработало:

Страница с действиями на правило


И все - на самом простом уровне мы готовы к отражению SSH Bruteforce атаки.

В этой статье я постарался показать как можно подготовить себе стенд для обучения работе в BlueTeam:

  1. Поднять ELK для сбора и анализа логов.

  2. Поднять-удалить-заново поднять заведомо уязвимый сервер.

  3. Найти что-то подозрительное в логах.

  4. Написать правило чтобы в следующий раз получить уведомление об этом.

Чем можно заняться дальше?

  1. Настроить Logstash для того чтобы эффективно обрабатывать логи (без него будет тяжело обрабатывать продакшен окружения).

  2. Попытаться воспользоваться стандартной библиотекой детектирующих правил от Elastic.

  3. Причесать ELK стенд, скрыв его за TLS, создав эффективный кластер.

  4. Попытаться повторить все то же самое на стендах https://github.com/ermetic-research/cnappgoat , https://github.com/DataDog/stratus-red-team

  5. Попробовать сдетектировать атаки на нашей платформе - https://defbox.io/invite/7539a046-5bc5-479a-94cf-b9c54934498c ( чат проекта https://t.me/+UBFBxHyMi9RmOWQy )