Продолжаем серию постов, связанных с расширением возможностей 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 и заново скомпилировать программу.  На этом все, до новых встреч! Автор: Дмитрий Неверов, руководитель группы анализа защищенности внутренней инфраструктуры, "Ростелеком-Солар"