Сканим с ansible

3bd3f920cc870f36c74733e5a1c8e5a5.png

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

Ansible

Один из популярных инструментов для автоматизации развертывания систем. Реализация на языке программирования Python. Предоставляет DevOPS инженерам возможность работать с инфраструктурой через написание сценариев. В общем это называется IaC (Infrastructure as Code). Сценарии для инструмента пишутся с использованием языка yaml. Чтобы наиболее полно можно было познакомиться с инструментом, в сети есть большое количества мануалов, но как всегда, лучше начать знакомство с документации.

На момент написания статьи использовалась бесплатная версия Community Edition, она позволяет запускать ansible из консоли и производить отладку уже работающего сценария. В платных версиях есть свой веб-интерфейс, который позволяет ускорять разработку новых сценариев развертывания, но для задач этой статьи он избыточен.

Установим ansible на систему. Для этого нам потребуется использовать Linux дистрибутив или WSL подсистема для Windows. Самая главная зависимость, которая должна быть установлена в системе — python pip модуль и сам python. Из коробки ansible поддерживает установку для всех версий, но лучше использовать последние стабильные. Открываем терминал и вводим команду:

python3 -m pip install --user ansible

Специальных привелегий для этого предоставлять не нужно, все разложится автоматически по нужным директориям. Единственное, что придется подправить это путь в переменной PATH, но об этом pip напишет сразу в окне установки. Если всё было завершено успешно, то при наборе следующей команды:

ansible --version

Результат работы команды:

53c6ee6e3f9e7bedbacd4b315d45554a.png

Для масштабирования ресурсов можно использовать виртуальные машины. Это удобно делать через Vagrant, но базовые образа придется качать отдельно или собирать самостоятельно. На момент написания статьи продукт заблокировал доступ из РФ.

Теперь попробуем поуправлять хотя бы одной машиной, которая предварительно развернута в виртуализированной среде. В общем можно управлять и системами, которые находятся на отдельных машинах. Самое главное — предоставить ansible доступ к вашему private key.

Ansible для работы с машинами Linux использует ssh, а для Windows — WinRM. Мы будем автоматизировать взаимодействие с Linux. Подготовим ключ для доступа в систему:

ssh-keygen -t rsa -f id_rsa -C kali

Пользователь kali выбран не случайно, будем автоматизировать именно Kali Linux.

Настроим доступ по ключу в систему:

  1. Открыть на kali файл /etc/ssh/sshd_config

  2. Раскоментировать строки:

  3. cat id_rsa.pub >> ~/.ssh/authorized_keys

Тестируем:

ssh -i ids_rsa kali@ka.li.ip.addr

Ansible проект

Ansible работает с системами за счет использования специального файла — inventory. Его можно создавать в формате ini файла или в формате yaml. Будем использовать ini формат. Тестовый файл назовём hosts содержимое будет выглядеть вот так:

kali ansible_host=kali.ip.ad.dr ansible_port=22 ansible_user=kali ansible_ssh_private_key_file="id_rsa"

По файлу:

  • kali — метка наименования машины;

  • ansible_host — адрес машины для управления;

  • ansible_port — порт ssh на машине, которой будет осуществляться управление;

  • ansible_user — имя пользователя для передачи машине;

  • ansible_ssh_private_key_file — путь к private_key.

Протестировать соединение с машиной можно командой:

ansible -i hosts all -m ping

Успешный результат работы команды:

75dd1ba7aad518b93e547e1d365fb27a.png

Следующий этап — определиться что можно сделать с помощью ansible из коробки?

Последовательность команд в файле yaml, который описывает последовательность действий в Ansible называется playbook. Обычно этот файл называют main.yaml или site.yaml.

Все конструкции можно изучить в официальной документации. Мы будем ипользовать community inventory и

Создадим файл site.yml:

---
  - name: "Automate some actions"
    hosts: kali
    roles:
    - nmap

Правилом хорошего проекта можно назвать структурированность тех задач, которые в нём описаны. Чтобы часами потом не разбираться что происходит, будем использовать структуру ролей. Для этого отдельно описываем для каждого инструмента все действия. Чтобы ansible их мог подхватить нужно создать директории и файлы: roles→nmap→tasks→main.yaml

В такой структуре будет проще вносить новые команды и отключать те, которые не нужны.

Содержимое файла main.yaml:

- name: Print test
  ansible.builtin.debug:
    msg: "Hello!"

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

ansible-playbook -i hosts site.yaml --syntax-check

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

ansible-playbook -i hosts site.yaml -D

Примерный вывод рабочего проекта:

81c34add315d26e061052b71e0dc2940.png

Теперь добавим задачу для сканирования. Для этого нужно в файл main.yaml добавить такие строки:

---
  - name: Print test
    ansible.builtin.debug:
      msg: "Hello!"

  - name: Run simple scan
    ansible.builtin.shell: nmap -n {{ip_addresses}} -oA scan
    tags: syn

  - name: Run full scan
    ansible.builtin.shell: nmap -n {{ip_addresses}} -oA scan
    tags: full

В этот раз добавлены куски кода, который работает с шаблонизатором jinja2. Переменные можно пережавать в командной строке для playbook или можно прописать в файле по директориям:

group_vars/all.yaml:

ip_addresses: "192.168.0.0/24"

Так же стоит обратить внимание на дополнительный параметр tags — он используется для того чтобы можно было запускать отдельные таски из списка. Например простой скан можно запустить вот так:

ansible-playbook -i hosts site.yaml --tags syn -D

Результат работы команды можно найти в рабочей директории пользователя kali. Ниже приведен листинг директории и файлы, которые были созданы в результате работы сканера. При желании можно прописать команды с помощью которых полученные отчеты будут выкладываться в централизованное хранилище.

486dd4d0ee4f97e99a9a86dbceb24caf.png

Таким образом можно говорить об автоматизации разнородного софта при использовании 2–3 и более машин для задач сканирования и сбора данных о системах. В следующей статье попробуем автоматизировать операционную систему Windows для сбора данных в окружении Windows AD. Проект, который был использован для этой статьи можно найти тут.

Вместо заключения хочу пригласить всех желающих на бесплатный вебинар по теме: «Атаки Relay, инструменты и особенности использования». Поговорим о том, как работают атаки на механизмы аутентификации в Windows Active Directory.

© Habrahabr.ru