• Nome:Ricardo L0gan
  • Especialidade:Network Security and Security Researcher Enthusiast
  • E-mail:ricardologanbrøgmail·com·br
  • Contato:About-me | Github: Loganbr | Twitter:l0ganbr | Localização:::1
Desofuscando um webshell em PHP

Ao ajudar um amigo em uma perícia sobre crimes virtuais em um servidor Web comprometido, nos deparamos com um código que nos deixou intrigados. O código estava ofuscado, então resolvemos desofuscar e ver do que se tratava. Foi então que chegamos a conclusão que era um webshell (backdoor) feito em PHP, escondido dentro do código de uma página de erro 404 (Not Found). O objetivo desse artigo é demonstrar como foi feita a desofuscação do webshell.
Um trecho do código encontrado na página de erro 404 pode ser visto no Código 1.




preg_replace é uma função que realiza busca e substituição utilizando expressão regular. Ressalta-se o uso da flag “e”, que ocasionará a execução de código presente na string. A string que potencialmente possui código malicioso está presente no segundo parâmetro da chamada da função preg_replace (Código 1). Nota-se que ela está ofuscada. Para fins didáticos, a string ofuscada foi dividida em 3 partes: a ideia é separar a utilização de representação hexadecimal (Partes 1 e 3) dos demais caracteres (Parte 3).







Olhando rapidamente para as Partes 1 e 3, aparentemente, nota-se a utilização de caracteres ASCII representados em hexadecimal. A fim de se obter os caracteres ASCII dessas duas partes, foi desenvolvido o programa analise.c, que pode ser observado no Código 2. A Listagem 1 ilustra a execução de tal programa.





Bingo! Observando os resultados obtidos na Listagem 1, podemos perceber que realmente as partes 1 e 3 tratam-se de caracteres ASCII representados em hexadecimal.
A primeira parte da string nada mais é do que uma chamada para as funções eval, gzinflate e base64_decode. Essas funções serão interpretadas em tempo de execução por causa do modificador “e”, que pode ser observado na chamada da função preg_replace no Código 1. Adicionalmente, ressalta-se que a segunda parte da string será submetida diretamente à função base64_decode, logo percebe-se que ela se trata de dados codificados com Base64. A terceira parte da string ofuscada simplesmente fecha os parêntesis abertos pela primeira e encerra o comando PHP com um “;”. Até agora foi descoberto que a chamada a preg_replace, observada no Código 1., ocasionará a interpretação do código presente na Listagem 2.,



Observando a Listagem 2, nota-se claramente que a segunda parte da string é um parâmetro passado para a função base64_decode. Logo, essa parte é uma string com dados codificados em Base64. Desta forma, tem-se que o primeiro e último caracteres da Parte 2 são, simplesmente, indicadores para que o PHP interprete o resto dos dados dessa parte como string. A fim de desobfuscar a segunda parte da string, foi desenvolvido o programa analise2.php (Código 3), cujo objetivo é desfazer as ações realizadas pelas funções presentes na Listagem 2.



A execução do programa analise2.php pode ser observada na Listagem 4



Pronto! Agora basta abrir o arquivo webshellfinal.php para ver a string que estava ofuscada (Listagem 5):



Pronto! Analizando a Listagem 2, percebe-se que o código presente na Listagem 5 é o que, de fato, será interpretado pelo PHP. Agora, fica a cargo do leitor estudar o funcionamento do webshell.

NOTA DO EDITOR (Revisão H2HC) Link 4:
Durante o processo de revisão deste artigo, notou-se que alguns antivírus consideraram o documento .docx enviado pelo autor como infectado. Após alguns testes, ficou claro que o motivo de tal comportamento foi a presença das strings relativas aos códigos e listagens aqui presentes. Após alguns outros testes, obteve-se um resultado curioso:

1. O código presente em [1]foi submetido ao virustotal.com. Resultado: de 55 antivírus utilizados, 28 detectaram o arquivo como sendo malicioso.
2. Do código presente em [1], apenas uma modificação foi realizada: na linha do preg_replace(), a primeira representação hexadecimal (“\x65”) foi substituída pelo respectivo caractere (“e”). Utilizando o virustotal.com, somente 6 dos 55 antivírus detectaram o arquivo como sendo malicioso.

Fica uma sugestão de exercício aos leitores: utilizar o código presente em [1] e o site virustotal.com para estudar o comportamento dos antivírus.

Referências:
[1] Código completo Acessado em: 07/09/2014.
[2] Parte 2 ofuscada Acessado em: 07/09/2014.
[3] Parte 2 desofuscada Acessado em: 07/09/2014.
[4] H2HC Magazine Ed.9 Artigo - Pagina 21