Submission
Atualizado
Atualizado
Could you help us out?
Web Exploitation
Autor do writeup: @jackskelt
Você pode acessar os arquivos do desafio no nosso repositório https://github.com/HawkSecUnifei/Writeups
O desafio consiste em uma vulnerabilidade de wildcard injection no comando chmod
. Acessando a página inicial, vemos que temos um campo para fazer upload.
A flag está localizada dentro do diretório /var/www/html/uploads
, podendo ser acessada usando /uploads/flag.txt
na URL, porém nenhum usuário tem permissão de ler o arquivo.
Analisando o código fornecido, temos a lógica por trás do upload.
Vemos que somente arquivos que terminam com .txt
podem ser enviados.
Após o arquivo ser salvo, vemos que ele roda o comando chmod 000 *
dentro do diretório de uploads.
Percebemos que temos um wildcard no comando que é rodado. O *
é interpretado pelo shell como uma "expressão regular" que corresponde nomes de arquivos com um ou mais caracteres. Se tivessemos a organização de arquivos abaixo e utilizasse o comando acima, ele poderia ser traduzido em chmod 000 flag.txt arquivo1.txt arquivo2.txt
O comando chmod
tem algumas flags interessantes que podemos utilizar nesse caso. Uma delas é o --reference
, onde é utilizado as permissões/modo de um arquivo como referencia para outros ao invés das permissões/modo explícitos.
Como o wildcard *
não garante que o nome do arquivo que ele está passando é para ser interpretado como um arquivo, podemos usar isso para criar um arquivo em que o nome será interpretado como uma flag do comando, porém temos que ter algumas restrições em mente:
O arquivo para upload deve terminar com .txt
, então não podemos enviar um arquivo --reference=.
, para ele usar como referência as permissões do diretório atual.
O diretório raiz do comando é o uploads
e o único arquivo presente é flag.txt
o qual as permissões estão zeradas.
Não é possível utilizar /
no nome de arquivos em sistemas UNIX, logo não podemos voltar de diretório com ../
.
Então o que podemos fazer é usar o --reference
para um arquivo que vai ser adicionado posteriormente, já que o arquivo é adicionado com as permissões de leitura e escrida. Então criamos e enviamos um arquivo --reference=dummy.txt
, ele vai ser interpretado pelo comando como flag, porém um erro irá ocorrer pois não existe nenhum arquivo dummy.txt
. Após isso, enviamos o arquivo dummy.txt
, que começa com as permissões de forma padrão. O comando após o envio poderia ser traduzido em chmod 000 flag.txt --reference=dummy.txt dummy.txt
, com ele tentando mudar a permissão dos arquivos 000
(que não existe), flag.txt
e dummy.txt
para a permissão do arquivo dummy.txt
.
Após isso, podemos acessar /uploads/flag.txt
e obter a flag.