Фильтрация локальных групп в BloodHound
В статье мы определили, что есть проходимые и непроходимые связи. Ребра локальных групп LocalToComputer и MemberOfLocalGroup являются непроходимыми. Исключая их мы можем потерять интересные маршруты. Исправим эту ситуацию.
Добавим к нашему запросу, состоящему из проходимых ребер, эти два ребра:
MATCH p=AllShortestPaths((m:Group {name:"DOMAIN USERS@DOMAIN.LOCAL"})-[r: AddMember|AddSelf|AdminTo|…|WriteSPN|LocalToComputer|MemberOfLocalGroup*1..]->(n:Group {name:"DOMAIN ADMINS@DOMAIN.LOCAL"}))
RETURN pРезультат будет таким, как показано на рисунке в заголовке. Чаще всего будет встречаться локальная группа USERS на разных компьютерах. Эта группа позволяет локально подключаться к компьютеру, удаленное подключение невозможно, поэтому нужно исключить ее из нашего запроса.
MATCH (c)-[r:MemberOfLocalGroup]->(b) WHERE b.objectid =~ '(?i).*(-568|-545)' WITH collect (b) AS excludeGroup
MATCH p=AllShortestPaths((m:Group {name:"DOMAIN USERS@DOMAIN.LOCAL"})-[r: AddMember|AddSelf|AdminTo|…|WriteSPN|LocalToComputer|MemberOfLocalGroup*1..]->(n:Group {name:"DOMAIN ADMINS@DOMAIN.LOCAL"}))
WHERE NONE(x in nodes(p) WHERE x IN excludeGroup)
RETURN pПервым запросом мы выбирает все локальные группы из базы, которые соответствуют нашему критерию (users, iis_iusrs) и собираем их в коллекцию excludeGroup. В самом поиске всех коротких путей мы добавляем условие, что в графе не должно встречаться ни одного узла из коллекции excludeGroup.
В результате мы получим более эксплуатируемых граф.
Дополнительно мы исключили из запроса группу IIS_IUSRS, этот список можно расширять, добавляя RID в запрос.
Если вы используете свойство is_traversable, то нам нужно добавить условие, что в запросе могут быть ребра LocalToComputer и MemberOfLocalGroup. И мы все также исключаем узлы с локальными группами из запроса.
MATCH (c)-[r:MemberOfLocalGroup]->(b) WHERE b.objectid =~ '(?i).*(-568|-545)' WITH collect (b) AS excludeGroup
MATCH p=AllShortestPaths((m:Group {name:"DOMAIN USERS@DOMAIN.LOCAL"})-[*]->(n:Group {name:"DOMAIN ADMINS@DOMAIN.LOCAL"}))
WHERE ANY(x IN relationships(p) WHERE x.is_traversable = TRUE OR type(x) = "LocalToComputer" OR type(x) = "MemberOfLocalGroup")
AND NONE(x in nodes(p) WHERE x IN excludeGroup)
RETURN pТаким образом добавление непроходимых ребер для локальных групп и фильтрация по этим группам могут предоставить интересные маршруты для проведения работ.