LDAP-зап­росы лежат в осно­ве раз­ведки Active Directory: от Kerberoasting в Impacket до сбо­ра гра­фа в BloodHound. Филь­тры, атри­буты и база поис­ка ста­новят­ся удоб­ными сиг­натура­ми для детек­та подоз­ритель­ной активнос­ти. В этой статье раз­берем, как устро­ены такие зап­росы, где имен­но их мож­но монито­рить и какие при­емы обфуска­ции помога­ют менять фор­му зап­роса, сох­раняя тот же резуль­тат.

Внут­ри боль­шинс­тва скрип­тов раз­ведки работа­ет LDAP. Нап­ример, ког­да ты запус­каешь скрипт GetUserSPNs.py из Impacket, он отправ­ляет LDAP-зап­рос в служ­бу катало­гов со сле­дующим филь­тром:

(&(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(servicePrincipalName=*))

Этот филь­тр зап­рашива­ет все вклю­чен­ные учет­ные записи поль­зовате­лей с непус­тым SPN — то есть учет­ные записи, для которых мож­но зап­росить билет TGS.

Сбор­щики BloodHound получа­ют спи­сок всех объ­ектов в Directory Service с помощью раз­ных зап­росов. Нап­ример, RustHound ис­поль­зует зап­рос такого вида:

(objectClass=*)

Ана­логич­но зап­рашива­ется информа­ция по LDAP при раз­ведке сер­висов AD CS, SCCM и дру­гих.

Од­нако у команд защиты пос­тепен­но появ­ляет­ся все боль­ше спо­собов отлавли­вать раз­ведку инфраструк­туры через LDAP. В сегод­няшней статье раз­берем эти методы, а так­же пос­мотрим, какие есть воз­можнос­ти для обфуска­ции зап­росов от средств защиты.

warning

Статья име­ет озна­коми­тель­ный харак­тер и пред­назна­чена для спе­циалис­тов по безопас­ности, про­водя­щих тес­тирова­ние в рам­ках кон­трак­та. Автор и редак­ция не несут ответс­твен­ности за любой вред, при­чинен­ный с при­мене­нием изло­жен­ной информа­ции. Рас­простра­нение вре­донос­ных прог­рамм, наруше­ние работы сис­тем и наруше­ние тай­ны перепис­ки прес­леду­ются по закону.

 

Краткая теория LDAP и служб каталогов

Пе­ред тем как перей­ти к обна­руже­нию атак и спо­собам защиты, давай сна­чала раз­берем­ся, что такое LDAP и как он работа­ет. Если по‑прос­тому, LDAP — это база дан­ных AD. Дан­ные хра­нят­ся в служ­бе катало­гов (Directory Service) в виде дре­вовид­ной струк­туры. Объ­ект домена — корень, от которо­го отхо­дят вет­ви с катего­риями дан­ных.

Структура LDAP
Струк­тура LDAP

Клас­сичес­кий LDAP-зап­рос Search сос­тоит из сле­дующих полей:

  • BaseObject (StartingNode) — точ­ка, отку­да нач­нется поиск. Нап­ример, это может быть весь домен или отдель­ная вет­ка с поль­зовате­лями, если тебе инте­рес­ны толь­ко объ­екты поль­зовате­лей;
  • Scope — параметр LDAP-зап­роса Search, который опре­деля­ет глу­бину поис­ка. Зна­чение subtree подой­дет, если нужен поиск во вло­жен­ных вет­ках, onelevel — если нужен поиск на одном уров­не, без углубле­ния в вет­ки. Еще есть base — поиск толь­ко по одно­му объ­екту, базе;
  • филь­тр зап­роса — усло­вие, которо­му дол­жны соот­ветс­тво­вать иско­мые объ­екты;
  • зап­рашива­емые атри­буты — атри­буты, которые будут зап­рошены у най­ден­ных объ­ектов.

Сам филь­тр зап­роса сос­тоит из сле­дующих час­тей:

  • ис­комый атри­бут;
  • зна­чение;
  • опе­ратор срав­нения;
  • от­рицание — если нуж­но исклю­чить опре­делен­ные объ­екты.

При­мер филь­тра зап­роса:

(name=Bob)

В резуль­тате при­мене­ния филь­тра сер­вер вер­нет нам все объ­екты, у которых в атри­буте name есть зна­чение Bob.

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

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

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

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

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

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

    Подписаться

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