РАЗБОР SOC Статья

Раскройте Секреты DNS-Трафика: Глубокий Анализ с DNSchief и Grafana

woolf1514
woolf1514 Newbie · 176 сообщений
Подписаться
5,2 тыс.
[ обложка статьи ]
Режим чтения
Дисклеймер

Никого ни к чему не призываю. Все совпадения с реальностью вымышлены. Данные собраны с целью исследования на тестовых площадках. Материал предоставлен только для ознакомления.

Лаборатория для исследований

1. VPS c ubuntu server на борту и статическим IP

2. Домен для удобства

3. DNSChief

4. Grafana + promtail + Loki (чтоб мы могли работать с нашими данными в GUI через браузер)

5. Docker-compose
Кто и когда наиболее активен за последние 12 часов:
1643123534352.png


ТОП по посещениям за последнюю неделю по конкретной жертве:
1643123921449.png


Частота посещений по ключевым словам:
1643125171491.png
Что будем делать

Перехватывать доменные адреса, на которые переходит жертва и вертеть эти данные как нам захочется.

Для этого мы:

  • Поднимем на своей VPS стек технологий от Grafana и будем превращать текстовые логи в измеримые данные.
  • Поднимем DNSChief как демона для перманентной работы.
  • Подружим логи DNSChies с Grafana c помощью Loki и Promtail.
  • Попробуем поработать с собранными данными.
Кстати, в этой статье мы будем только смотреть на адреса. На самом же деле DNSChief может намного больше, но это уже для хулиганов =)

Какую задачу решаем

1. У нас есть некоторое количество подконтрольных сетевых устройств. Не спрашивайте меня пж как их намайнить (routersploit)

2. Мы видим все сайты, где бывают наши жертвы.

3. У каждой жертвы своя подсеть, в ней несколько устройств, по несколько пользователей за каждым роутером. Все что-то делают в сети. Из-за этого наш DNSChief генерит записи по 10 000 строк в сутки.

Наша задача среди всех этих данных найти главное.

Поехали!

Поднимаем демона DNSChief

Чтоб не париться с запуском программы через консоль сделаем так, чтобы DNSchief запускался сам после включения VPS еще до стадии запуска сеанса пользователя.

Возьмем скрипт с github и создадим для него unit-файл в системе:
Bash:
git clone https://github.com/iphelix/dnschef
cd /etc/systemd/system
nano dnschef.service
В файле пишем:
Bash:
[Unit]
Description=DNSchef
After=network.target

[Service]
ExecStart=/usr/bin/python3 <path_to_dnschief>/dnschef.py -i <exsternal_IP> --logfile=<path_to_logs>/logfile.txt --nameservers 1.1.1.1,1.0.0.1 -q
RestartSec=15
StartLimitInterval = 60
StartLimitBurst = 10

[Install]
WantedBy=multi-user.target
<path_to_dnschief> - путь куда вы положили DNSChief

<path_to_logs> - куда будем складывать собранные логи. Можно указать тот же путь для удобства.

<exsternal_IP> - ip адрес вашей VPS

--nameservers 1.1.1.1,1.0.0.1 - это мы делаем так, чтоб наш DNSChief занимался своим делом поверх https.

Выходим, сохраняем (для этого нужны права суперпользовтеля).

Чтоб изменения вступили в силу:
Bash:
systemctl daemon-reload
service dnschief start
service dnschief status
Если все ок, то вывод должен быть примерно такой:
1643127648823.png


Обратите внимание на uptime: демон работает как швейцарские часы)

Поднимаем Grafana и ее составные компоненты

Следующее описание предполагает что у вас уже поднят VPS с припаркованным доменом.

Promtail

Задача этой программы "тейлить" логи. То есть, взять из одного места, преобразовать и передать в другое.

Создаем папку и назовем ее monitoring_stack - тут будут лежать конфиги для Grafana.

Внутри создаем папку promtail - тут будет лежать конфиг службы, которая превратит логи DNSchief в съедобные для графаны данные. И создаем в ней файл конфига:
Bash:
mkdir monitoring_stack
cd monitoring_stack
mkdir promtail
cd promtail
nano config.yaml
В файл пишем:
YAML:
server:
  http_listen_address: 0.0.0.0
  http_listen_port: 9080

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://loki:3100/loki/api/v1/push

scrape_configs:

- job_name: dnschef
  static_configs:
  - targets:
      - localhost
    labels:
      job: dnschef
      host: localhost
      __path__: <path_to_log>/log.txt

  pipeline_stages:
  - match:
      selector: '{job="dnschef"}'
      stages:
      - regex:
          expression: '^^\((?P<time>\d{2}\/\w{3}\/\d{4}:\d{2}:\d{2}:\d{2} \+\d{4})\) \[\*\] (?P<remote_ip>\d*.\d*.\d*.\d*): proxying the response of type \DA\D for (?P<url>.*)$$'
      - labels:
          remote_ip:
          url:
      - timestamp:
          source: time
          format: '2/Jan/2006:15:04:05 -0700'
<path_to_log> - путь до файла с логами DNSChief

Когда DNSChief начнет свою работу, то он будет генерить записи вида: [*] <ip>: proxying the response of type 'A' for ws12.gti.mcafee.com

Где <ip> - адрес жертвы, а в конце строки доменное имя сайта.

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

^^\((?P<time>\d{2}\/\w{3}\/\d{4}:\d{2}:\d{2}:\d{2} \+\d{4})\) \[\*\] (?P<remote_ip>\d*.\d*.\d*.\d*): proxying the response of type \DA\D for (?P<url>.*)$$

Это мы и указываем в конфиге.
Loki

Задача этой программы - выводить полученные данные в Grafana (фронтовая часть стека) и давать возможность с ними работать.

Для него отдельного конфига не надо, он поднимется и заработает сам, когда мы закончим с конфигом Docker

Поднимаем стек в Docker-compose

Если у вас еще нет docker-compose, то самое время его установить - sudo apt install -y docker docker-compose

Возвращаемся в папку monitoring_stack и создаем там docker-compose.yaml: nano docker-compose.yaml

В файл пишем:

YAML:
version: "3"

networks:
  loki:
    driver: bridge

services:
  loki:
    image: grafana/loki:2.0.0
    restart: always
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    networks:
      - loki

  promtail:
    image: grafana/promtail:2.0.0
    restart: always
    volumes:
# Это конфиг маппинга файлов.
# Прокидываем файлы внутри системы к файлам внутри докера.
      - <path_to_log>/log.txt:<path_to_log>/log.txt
      - ./promtail/config.yaml:/etc/promtail/config.yaml
    command: -config.file=/etc/promtail/config.yaml
    networks:
      - loki

  grafana:
    image: grafana/grafana:latest
    restart: always
    ports:
      - "3000:3000"
    networks:
      - loki
    environment:
      - GF_SERVER_DOMAIN=<domain.com>
      - GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s:%(http_port)s/graf
      - GF_SERVER_SERVE_FROM_SUB_PATH=true
<path_to_log> - путь до файла с логами DNSChief

следующий <path_to_log> - точно такой же путь

<domain.com> - домен, припаркованный к VPS
Самое сложное позади. Теперь находясь в папке monitoring_stack пишем команду docker-compose up --build

Такая команда будет выводить все логи запуска в консоль. В случае успеха можно закрыть консоль, либо использовать в команде ключ "-d" - это освободит консоль.

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

Для проверки состояния компонентов используйте команду docker-compose ps (находясь в папке monitoring_stack)

Если все ок, то вывод будем примерно такой:
1643130385124.png


За исключением prometheus - его мы юзали в другой статье.

GUI

Заходим в графану. По представленному конфигу она расположена по адресу https://<domain.com>/graf

Нам осталось подружить все три компонента, для этого логинимся (admin/admin по-умолчанию, но потребуется изменить) -> preferences -> data sources -> add data source.

Настройка будет выглядеть так:

1643130665107.png

1643130692555.png


Нужно просто вбить name, url и нажать Save & Test.

Если все получится корректно, то вы увидите об этом сообщение.

Смотрим что получилось

Идем в раздел explore (значок компаса слева), вверху выбираем Loki, открываем Log Browser:

1643130937381.png


Если все прошло успешно, то должна появиться джоба под названием dnschief. Выбираем ее и нажимаем show logs, предварительно выбрав вверху нужный нам временной диапазон:
1643208348011.png


Как видно на скрине, по каждой записи параметры remote_ip и url выведены в отдельные labels. Это позволяет фильтроваться по ним, выводить различные статистики прямо из визора логов, либо строить графики на основе этих данных.

В принципе как вы будете агрегировать эти данные - зависит только от вашей фантазии. Приведу пару примеров.

Первый запрос покажет нам самых активных жертв по временной шкале:
Код:
sum(count_over_time({job="dnschef"}[5m])) by (remote_ip)
1643131482443.png


Выбираем кого-нибудь одного, создаем под него дашборд, создаем график и настраиваем его вот так:

Visualisation - Bar guague
1643131644990.png


В поле log Browser пишем:
Код:
sum by (url)
(count_over_time
({job="dnschef", remote_ip="<ip>"}[5m]))
<ip> - адрес интересующей вас жертвы, по которой уже есть данные.

Результат:
1643132154190.png


Попробуйте хотя бы на своей машине. Вам будет откровение о том куда только не ходят ваши устройства)
Полезно · 1

Комментарии

0