Цель пен­тесте­ра — оце­нить, нас­коль­ко защище­на внут­ренняя сеть кли­ента. Чаще все­го это озна­чает работу в сре­де Active Directory. Что­бы най­ти скры­тые и неожи­дан­ные свя­зи, исполь­зуют BloodHound — он стро­ит граф свя­зей и показы­вает потен­циаль­ные пути к при­виле­гиям. Но что, если у нас не AD, а FreeIPA?

В рам­ках импорто­заме­щения заказ­чики пос­тепен­но отка­зыва­ются от Active Directory и перехо­дят на FreeIPA. Эта сис­тема похожа по воз­можнос­тям, но работа­ет на Linux. Для пен­тесте­ра это зна­чит, что при­выч­ный инс­тру­мен­тарий нуж­но адап­тировать. Поэто­му, не най­дя ничего похоже­го в откры­том дос­тупе, мы решили соз­дать собс­твен­ный ана­лог BloodHound для FreeIPA.

Глав­ный воп­рос при раз­работ­ке такого инс­тру­мен­та: делать всё с нуля или дорабо­тать BloodHound? В ито­ге решили пой­ти по вто­рому пути. При­чина оче­вид­на — во мно­гих ком­пани­ях вмес­те работа­ют домены FreeIPA и Active Directory. Гораз­до удоб­нее ана­лизи­ровать их в одном общем интерфей­се, а не перек­лючать­ся меж­ду раз­ными инс­тру­мен­тами.

Разработчики BloodHoundIPA

 

Архитектура

Кон­цепту­аль­но BloodHoundIPA, как и любой дру­гой BloodHound, сос­тоит из кол­лекто­ра, который вытас­кива­ет информа­цию из домена, и GUI — для отри­сов­ки всех вза­имос­вязей и гра­фовой базы дан­ных Neo4j:

  • кол­лектор BloodyIPA под­держи­вает сбор информа­ции через HTTP API и по LDAP. Реали­зова­на под­дер­жка Kerberos и ано­ним­ного сбо­ра информа­ции из LDAP;
  • BloodHoundIPA — GUI с под­дер­жкой объ­ектов FreeIPA.

Neo4j при этом нуж­но уста­новить самос­тоятель­но с офи­циаль­ного сай­та.

И как бонус для тес­тирова­ния инс­тру­мен­та — скрипт BadIPA для напол­нения тес­тового домена объ­екта­ми и вза­имос­вязями.

 

Разработка BloodyIPA

Итак, для сбо­ра дан­ных с кон­трол­лера домена FreeIPA мы раз­работа­ли инс­тру­мент BloodyIPA. Он написан на Python 3 и тре­бует биб­лиотек python-freeipa и ldap3. Они нуж­ны для сбо­ра дан­ных по про­токо­лам HTTP и LDAP соот­ветс­твен­но.

В резуль­тате работы инс­тру­мен­та для каж­дого типа объ­ектов будут соз­даны фай­лы JSON со сле­дующей струк­турой:

{
"data": [
{
"Properties": {
"name": "admin",
"highvalue": true,
...
},
"Edges": [
{
"source": {
"type": "freeipa_*",
"uid": "admin"
},
"target": {
"type": "IPAUserGroup",
"uid": "admins"
},
"edge": {
"type": "IPAMemberOf",
"properties": {
"isacl": false
}
}
},
...
] ,
}
],
"meta": {
"methods": 0,
"type": "freeipa",
"count": 2,
"version": 6
}
}

По­ле data содер­жит в себе перечис­ление всех объ­ектов это­го типа. У каж­дого объ­екта есть поля Properties и Edges. В Properties ука­заны свой­ства объ­екта в фор­мате ключ‑зна­чение, а в поле Edges содер­жатся реб­ра, свя­зыва­ющие этот объ­ект с дру­гими.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии