Дисклеймер
Никого ни к чему не призываю. Все совпадения с реальностью вымышлены. Данные собраны с целью исследования на тестовых площадках. Материал предоставлен только для ознакомления.
Лаборатория для исследований
1. VPS c ubuntu server на борту и статическим IP
2. Домен для удобства
3. DNSChief
4. Grafana + promtail + Loki (чтоб мы могли работать с нашими данными в GUI через браузер)
5. Docker-compose
Что будем делать
Перехватывать доменные адреса, на которые переходит жертва и вертеть эти данные как нам захочется.
Для этого мы:
- Поднимем на своей VPS стек технологий от Grafana и будем превращать текстовые логи в измеримые данные.
- Поднимем DNSChief как демона для перманентной работы.
- Подружим логи DNSChies с Grafana c помощью Loki и Promtail.
- Попробуем поработать с собранными данными.
Кстати, в этой статье мы будем только смотреть на адреса. На самом же деле DNSChief может намного больше, но это уже для хулиганов =)
Какую задачу решаем
1. У нас есть некоторое количество подконтрольных сетевых устройств.Не спрашивайте меня пж как их намайнить (routersploit)
2. Мы видим все сайты, где бывают наши жертвы.
3. У каждой жертвы своя подсеть, в ней несколько устройств, по несколько пользователей за каждым роутером. Все что-то делают в сети. Из-за этого наш DNSChief генерит записи по 10 000 строк в сутки.
Наша задача среди всех этих данных найти главное.
Поехали!
Поднимаем демона DNSChief
Чтоб не париться с запуском программы через консоль сделаем так, чтобы DNSchief запускался сам после включения VPS еще до стадии запуска сеанса пользователя.
Возьмем скрипт с github и создадим для него unit-файл в системе:
В файле пишем:
<path_to_dnschief> - путь куда вы положили DNSChief
<path_to_logs> - куда будем складывать собранные логи. Можно указать тот же путь для удобства.
<exsternal_IP> - ip адрес вашей VPS
--nameservers 1.1.1.1,1.0.0.1 - это мы делаем так, чтоб наш DNSChief занимался своим делом поверх https.
Выходим, сохраняем (для этого нужны права суперпользовтеля).
Чтоб изменения вступили в силу:
Если все ок, то вывод должен быть примерно такой:
Обратите внимание на uptime: демон работает как швейцарские часы)
Поднимаем Grafana и ее составные компоненты
Следующее описание предполагает что у вас уже поднят VPS с припаркованным доменом.
Promtail
Задача этой программы "тейлить" логи. То есть, взять из одного места, преобразовать и передать в другое.
Создаем папку и назовем ее monitoring_stack - тут будут лежать конфиги для Grafana.
Внутри создаем папку promtail - тут будет лежать конфиг службы, которая превратит логи DNSchief в съедобные для графаны данные. И создаем в ней файл конфига:
В файл пишем:
Loki
Задача этой программы - выводить полученные данные в Grafana (фронтовая часть стека) и давать возможность с ними работать.
Для него отдельного конфига не надо, он поднимется и заработает сам, когда мы закончим с конфигом Docker
Поднимаем стек в Docker-compose
Если у вас еще нет docker-compose, то самое время его установить -
Возвращаемся в папку monitoring_stack и создаем там docker-compose.yaml:
В файл пишем:
Самое сложное позади. Теперь находясь в папке monitoring_stack пишем команду
Такая команда будет выводить все логи запуска в консоль. В случае успеха можно закрыть консоль, либо использовать в команде ключ "-d" - это освободит консоль.
Нужно будет немного подождать, пока стек соберется и запустится. Могут быть ошибки - читайте их и исправляйте, спрашивайте в комментах, если интересно.
Для проверки состояния компонентов используйте команду
Если все ок, то вывод будем примерно такой:
За исключением prometheus - его мы юзали в другой статье.
GUI
Заходим в графану. По представленному конфигу она расположена по адресу https://<domain.com>/graf
Нам осталось подружить все три компонента, для этого логинимся (admin/admin по-умолчанию, но потребуется изменить) -> preferences -> data sources -> add data source.
Настройка будет выглядеть так:
Нужно просто вбить name, url и нажать Save & Test.
Если все получится корректно, то вы увидите об этом сообщение.
Смотрим что получилось
Идем в раздел explore (значок компаса слева), вверху выбираем Loki, открываем Log Browser:
Если все прошло успешно, то должна появиться джоба под названием dnschief. Выбираем ее и нажимаем show logs, предварительно выбрав вверху нужный нам временной диапазон:
Как видно на скрине, по каждой записи параметры remote_ip и url выведены в отдельные labels. Это позволяет фильтроваться по ним, выводить различные статистики прямо из визора логов, либо строить графики на основе этих данных.
В принципе как вы будете агрегировать эти данные - зависит только от вашей фантазии. Приведу пару примеров.
Первый запрос покажет нам самых активных жертв по временной шкале:
Выбираем кого-нибудь одного, создаем под него дашборд, создаем график и настраиваем его вот так:
Visualisation - Bar guague
В поле log Browser пишем:
<ip> - адрес интересующей вас жертвы, по которой уже есть данные.
Результат:
Попробуйте хотя бы на своей машине. Вам будет откровение о том куда только не ходят ваши устройства)
Никого ни к чему не призываю. Все совпадения с реальностью вымышлены. Данные собраны с целью исследования на тестовых площадках. Материал предоставлен только для ознакомления.
Лаборатория для исследований
1. VPS c ubuntu server на борту и статическим IP
2. Домен для удобства
3. DNSChief
4. Grafana + promtail + Loki (чтоб мы могли работать с нашими данными в GUI через браузер)
5. Docker-compose
Кто и когда наиболее активен за последние 12 часов:
ТОП по посещениям за последнюю неделю по конкретной жертве:
Частота посещений по ключевым словам:
ТОП по посещениям за последнюю неделю по конкретной жертве:
Частота посещений по ключевым словам:
Что будем делать
Перехватывать доменные адреса, на которые переходит жертва и вертеть эти данные как нам захочется.
Для этого мы:
- Поднимем на своей VPS стек технологий от Grafana и будем превращать текстовые логи в измеримые данные.
- Поднимем DNSChief как демона для перманентной работы.
- Подружим логи DNSChies с Grafana c помощью Loki и Promtail.
- Попробуем поработать с собранными данными.
Кстати, в этой статье мы будем только смотреть на адреса. На самом же деле DNSChief может намного больше, но это уже для хулиганов =)
Какую задачу решаем
1. У нас есть некоторое количество подконтрольных сетевых устройств.
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
Если все ок, то вывод должен быть примерно такой:
Обратите внимание на 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> - адрес жертвы, а в конце строки доменное имя сайта.
Так как формат записи всегда одинаковый, то мы спокойно можем разобрать его с помощью регулярки:
Это мы и указываем в конфиге.
Когда 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
следующий <path_to_log> - точно такой же путь
<domain.com> - домен, припаркованный к VPS
Самое сложное позади. Теперь находясь в папке monitoring_stack пишем команду
docker-compose up --build
Такая команда будет выводить все логи запуска в консоль. В случае успеха можно закрыть консоль, либо использовать в команде ключ "-d" - это освободит консоль.
Нужно будет немного подождать, пока стек соберется и запустится. Могут быть ошибки - читайте их и исправляйте, спрашивайте в комментах, если интересно.
Для проверки состояния компонентов используйте команду
docker-compose ps
(находясь в папке monitoring_stack)Если все ок, то вывод будем примерно такой:
За исключением prometheus - его мы юзали в другой статье.
GUI
Заходим в графану. По представленному конфигу она расположена по адресу https://<domain.com>/graf
Нам осталось подружить все три компонента, для этого логинимся (admin/admin по-умолчанию, но потребуется изменить) -> preferences -> data sources -> add data source.
Настройка будет выглядеть так:
Нужно просто вбить name, url и нажать Save & Test.
Если все получится корректно, то вы увидите об этом сообщение.
Смотрим что получилось
Идем в раздел explore (значок компаса слева), вверху выбираем Loki, открываем Log Browser:
Если все прошло успешно, то должна появиться джоба под названием dnschief. Выбираем ее и нажимаем show logs, предварительно выбрав вверху нужный нам временной диапазон:
Как видно на скрине, по каждой записи параметры remote_ip и url выведены в отдельные labels. Это позволяет фильтроваться по ним, выводить различные статистики прямо из визора логов, либо строить графики на основе этих данных.
В принципе как вы будете агрегировать эти данные - зависит только от вашей фантазии. Приведу пару примеров.
Первый запрос покажет нам самых активных жертв по временной шкале:
Код:
sum(count_over_time({job="dnschef"}[5m])) by (remote_ip)
Выбираем кого-нибудь одного, создаем под него дашборд, создаем график и настраиваем его вот так:
Visualisation - Bar guague
В поле log Browser пишем:
Код:
sum by (url)
(count_over_time
({job="dnschef", remote_ip="<ip>"}[5m]))
<ip> - адрес интересующей вас жертвы, по которой уже есть данные.
Результат:
Попробуйте хотя бы на своей машине. Вам будет откровение о том куда только не ходят ваши устройства)
Последнее редактирование модератором: