Вот мы и подошли к самому интересному кейсу использования ansible для пентеста - создание уязвимых стендов, которые можно поднимать просто описав настройки в конфигах. Попробуем разобраться действительно ли это настолько просто и что можно сделать через ansible.
Постановка задачи и описание стенда
Определимся с системами, которые будут использоваться для создания стенда. В этой статье было принято решение описать настройку уязвимого стенда для проведения Relay атак. Поэтому будем исходить их того, что мы будем использовать:
kali linux или Windows 10 в качестве машины атакующего;
машина жертвы будет Windows Server 2019.
Relay атаки сами по себе имеют такую особенность, что при проведении подобных действий нужно чтобы в сети было 3 участника, редко 2:
система, где располагается уязвимый способ аутентификации;
пользователь, который может аутентифицироваться легитимно в уязвимой системе;
атакующий.
Иногда последние 2 могут находиться на одной машине в сети. Мы будем исходить из того, что воспроизведение эксперимента данной статьи будет происходить локально и поэтому нам потребуется:
8 Гб оперативной памяти;
40-50 ГБ на жестком диске (берем с запасом, это Windows).
Итого - 2 виртуальные машины минимум, теперь определимся с видом Relay. Для теста конфигураций черех ansible попробуем реализовать наиболее простой вариант, а потом можно будет распространить опыт на более сложные конфигурации, приступим.
ansible
Из прошлых статей мы уже знаем, что работа с операционной системой Windows осуществляется через powershell скрипты, а не через python. Это нам автоматически дает возможность нативно управлять системой. Единственной задачей для решения по-прежнему остается настройка работы WinRM, а остальное это просто конфигурация системы с использованием Powershell.
Проект ansible будем создавать теми же шагами, как и прошлых статьях. Для начала - создание файла inventory:
[win]
192.168.56.6
[win:vars]
ansible_user=administrator
ansible_password=Qwerty!@#
ansible_connection=winrm
ansible_winrm_server_cert_validation=ignore
Тестируем соединение с системой:
ansible -i hosts all -m win_ping
Настроить Windows Ad сервисы.
Настроить пользователя для Relay атаки.
Для выполнения первой задачи создадим отдельную роль ad. Для работы с функционалом операционной системы будем использовать модуль - win_feature. Нам потребуется установить необходимый набор инструментов и проставить необходимые параметры для настройки нового дерева Windows Active Directory. Файл main.yaml:
---
- name: Test
hosts: all
gather_facts: false
tasks:
- name: set dc name
ansible.windows.win_hostname:
name: DC1
register: res
tags: set_name
- name: Reboot
ansible.windows.win_reboot:
when: res.reboot_required
tags: set_name
- name: Install windows features - AD Domain Services
win_feature:
name: AD-Domain-Services
state: present
include_management_tools: yes
register: features
tags: install_feature_ad
- name: Creating lab.local domain...
win_domain:
dns_domain_name: lab.local
safe_mode_password: "{{domain_password}}"
register: domain_output
tags: set_domain
- name: Reboot
ansible.windows.win_reboot:
when: domain_output.reboot_required
tags: set_domain
На самом деле можно разнести этот файл на handles, roles, но намеренно этого не делаем, чтобы можно было понять какие операции нужно выполнить, чтобы получить рабочий домен на сервере.
Запускаем настройку и ждем когда операционная ситема станет доступна. В итоге должна получиться система Windows Server, в которой установлены все необходимые компоненты для настройки AD.
Для теста можно просто создать одного пользователя, который будет добавлен в локальные администраторы. Для простоты это будет сам Administrator.
Теперь можно приступить к конфигурации уязвимости. Всем известно, что нельзя использовать старые версии протоколов и лучше и проще всего проводить Relay на SMB протокол. Попробуем его сконфигурировать.
Для настройки будем использовать вот такой скрипт:
$task = '/c powershell New-PSDrive -Name "Public" -PSProvider "FileSystem" -Root "\\share\Private"'
$repeat = (New-TimeSpan -Minutes 5)
$taskName = "ntlm_bot"
$user = "lab.local\Administrator"
$password = "Qwerty123"
$action = New-ScheduledTaskAction -Execute "cmd.exe" -Argument "$task"
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval $repeat
$settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -RunOnlyIfNetworkAvailable -DontStopOnIdleEnd
$taskExists = Get-ScheduledTask | Where-Object {$_.TaskName -like $taskName }
if($taskExists) {
Unregister-ScheduledTask -TaskName $taskName -Confirm:$false
}
Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger -User $user -Password $password -Settings $settings
Скрипт проставит все данные необходимые для того чтобы пользователь автоматически заходил на ресурсы сервера. Это делается для того чтобы не нужно было дополнительно самим заходить куда-то. Попробуем протестировать насколько верно работает атака. Для этого запустим команду поиска шар на kali Linux через crackmapexec:
Инструмент соберет все данные для дальнейшей relay атаки и составит список машин.
Попробуем провести атаку, запускаем ntlmrelayx
из impacket
и ждем когда бот начнет открывать доступ к хранилищу. В итоге должен получиться вот такой лог:
Таким простым проектом для ansible можно разворачивать тестовые стенды и тренироваться использовать инструменты для сбора данных и проведения пентеста. Это будет очень экономить время, не требуя самостоятельного введения данных и контроля выполнения задач. При появлении ошибок с помощью тегов можно продолжить установку далее с любой таски. На развертывание и выполнение всех команд для этой статьи потребовалось всего лишь 12 минут.
Автоматизация процесса обнаружения хостов, запуска различных сканеров - постоянная рутинная задача.Приглашаю всех на бесплатный урок, где попробуем автоматизировать эти процессы через ansible.
Yusmit
Два вопроса - где и как вводить скрипт?
Почему бы не воспользоваться встроенными модулями и не устроить башсибл?