• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

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

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Статья Работаем с данными посещений устройств. DNSchief + Grafana

Дисклеймер

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

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

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


Попробуйте хотя бы на своей машине. Вам будет откровение о том куда только не ходят ваши устройства)
 
Последнее редактирование модератором:
  • Нравится
Реакции: Сергей Такой
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!