Продолжаем серию постов, связанных с расширением возможностей BloodHound. Сегодня рассмотрим способ добавления результатов атаки распыления пароля в базу BloodHound. Тема не является новой, другие варианты можно почитать здесь и здесь.
BloodHound – это популярный инструмент, который используется для сбора и анализа данных во время проведения пентеста внутренней инфраструктуры на базе Active Directory. Этот инструмент позволяет визуализировать некорректные настройки объектов Active Directory и строить цепочки атак. Основная его особенность — использование теории графов при анализе данных.
Предыдущие наши посты по теме расширения возможностей BloodHound здесь и здесь.
В атаке распыления пароля один пароль подставляется ко всем учетным записям. Это снижает риск блокировки учетки, но все же не стоит злоупотреблять это техникой. Добавление результатов такой атаки в базу BloodHound, возможно, покажет новые пути компрометации домена.
Допустим, мы обнаружили пароль пользователя в атрибуте Description или в результате атаки Kerberoasting. Чтобы отразить это в BloodHound, можно выполнить следующий запрос Cypher:
MATCH (u:User {name:”USER@WINDOMAIN.LOCAL”}) SET u.ClearTextPassword = “Qwerty123” SET u.owned = True
После выполнения этого запроса в свойствах объекта добавится новое поле свойств ClearTextPassword с указанным паролем. В BloodHound оно будет отображаться в разделе EXTRA PROPERTIES:
Для атак распыления подходят шаблонизированные пароли. В качестве инструмента можно использовать DomainPasswordSpray. Синтаксис запуска будет следующим:
Invoke-DomainPasswordSpray -Password Qwerty123
В результате будут получены учетные записи, имеющие такой же пароль:
Если записей будет немного, их можно добавить вручную с помощью запроса Cypher, используемого выше. Но если запросов будет много, вводить их вручную неудобно и в данной ситуации можно изменить вывод в самом PowerShell-скрипте, который сразу будет создавать строку запроса Cypher.
Найти строку вывода информации в консоль (строка 550)
Write-Host -ForegroundColor Green "[*] SUCCESS! User:$User Password:$Password"
И изменить ее на следующую:
Write-Host -ForegroundColor Green "MATCH (u :User) WHERE u.name =~ '(?i)$User`@$DomainObject' SET u.ClearTextPassword = '$Password' SET u.owned = True;"
После запуска измененной версии скрипта будет получен следующий результат:
Достаточно скопировать полученные данные и вставить их в строку запросов Neo4j Brower и выполнить. Проверить, что все создалось корректно, можно с помощью запроса:
MATCH (u:User) WHERE u.ClearTextPassword = "Qwerty123" RETURN u.name,u.ClearTextPassword
Теперь можно построить новые пути компрометации. Например, до группы доменных администраторов, запрос Cypher будет выглядеть так:
MATCH p=AllShortestPaths((u:User)-[*1..]->(g: Group {name:"DOMAIN ADMINS@WINDOMAIN.LOCAL"})) WHERE u.owned = True RETURN p
Заключительным шагом станет создание связи SharePasswordWith между всеми объектами, которые имею одинаковый пароль. Запрос Cypher будет таким:
MATCH (n:User) WHERE n.ClearTextPassword = "Qwerty123"
MATCH (m:User) WHERE m.ClearTextPassword = "Qwerty123"
FOREACH (_ IN CASE WHEN n <> m THEN [1] END | MERGE (n)-[r:SharePasswordWith]->(m))
Стоит рассмотреть его более подробно. Первые два запроса создают одинаковые списки пользователей с одинаковым паролем. Третий запрос выполняет всю трудную работу: берет два списка сравнивает их, чтобы не было совпадения узлов, и создает связь SharePasswordWith.
Проверить, что все связи создались корректно, можно, выполнив следующий запрос Cypher:
MATCH p=(u1:User)-[r:SharePasswordWith]-(u2:User) return p
Повторив запрос поиска коротких путей до группы администраторов домена, получим следующую картину:
Необходимо помнить, что интерфейс BloodHound ничего не знает о новых созданных связях. Поэтому можно добавить новые связи в const fullEdgeList (31 строка) в файле AppContainer.jsx и заново скомпилировать программу.
На этом все, до новых встреч!
Автор: Дмитрий Неверов, руководитель группы анализа защищенности внутренней инфраструктуры, "Ростелеком-Солар"