2011-06-14 7 views
1

내 웹 사이트는 매우 성공적으로 스크립트 키디에 의해 공격당했습니다. 자동으로 내 서버에서 숨겨진 스크립트에 액세스하여 모든 index.php 파일을 수정하고 그 위에 iframe을 추가합니다 (base 64로 인코딩 됨).어떤 스크립트가 fopen을 사용하고 있는지 어떻게 알 수 있습니까?

내 호스팅 제공 업체에 도움을 요청하는 데 어려움을 겪고 있습니다.이 문제에 대해서는 다소 도움이되지 않습니다.

나는 php의 fopen 기능을 사용하고있는 스크립트를 결정할 수 있다면 master tamper 스크립트의 위치를 ​​발견하고 제거 할 수있을 것이라고 생각합니다.

어떤 조언이 필요합니까?

+1

최근 소식 백업? –

+3

백도어의 내용이 아마도 "인코딩 됨"이므로 eval()을 사용하여 스크립트를 찾고 싶을 것입니다. –

+0

서버에서 자동으로 숨겨진 스크립트인지 어떻게 알 수 있습니까? – horatio

답변

2

사용 find는 PHP 스크립트를 모두 찾은 다음 fopen을 위해 grep을합니다. 셸 액세스 권한이없는 경우 스크립트로 전체 디렉토리를 다운로드하고 컴퓨터에서 수행하십시오.

find /base/dir/with/your/scripts -name '*.php' | xargs grep 'fopen' 
+0

이것도 모든 하위 디렉토리에 적용됩니까? –

+0

@Hudson 예, 그렇습니다. –

+0

이 방법으로 성공을 거두고 있지만, 어떻게 퍼티 피드백을 매길 수 있습니까? 발견 된 코드의 예와 함께 많은 반환 된 결과를 보여주고 있지만 결과 로그의 시작 부분으로 탐색하여 파일을 빗질 할 수는 없습니다. 퍼지를 페이지 매기기로 가져 오는 방법에 대한 조언이 있으십니까? –

1

Grep이 (가)이 친구에게 아마 친구 일 것입니다. 추측에 그렙을 시작하여 평범하지 않은 것이 나타나는지 확인하십시오.

공격이 어디에서 왔는지 확인할 수 있는지 확인할 수있는 모든 로그를 조사합니다. 적어도 가까운 시일 내에 공격을 차단할 수 있습니다. 파일의 날짜를 보면 마지막으로 액세스 한 위치를 찾을 수 있습니다.

또한 자바 스크립트 삽입을 배제하지 마십시오. 그들은 그것과 함께 꽤 의미있는 일을 할 수 있으며, 페이지 하단에 무작위로 딱딱 거리는 것처럼 보입니다.

분명히 DB를 포함하도록 암호를 변경하십시오. 모든 사람들이 어떻게 들어오는 지 알기 때문에 모든 오픈 소스 소프트웨어를 업데이트하십시오. 코드 소유권을 다른 사용자에게 변경해보십시오. 다음에 악의적 인 코드를 추적하려고 할 때 팝업에 오류가 발생하는 것. 나는 새로운 호스트를 찾는 것에 대해 생각할 것

그리고 ...

3

다음 단계를

  1. 종료 모든 것을 내려
  2. 다시 설치 서버가 갓
  3. 구멍을 찾기 위해 코드, 조금씩, 분석합니다.

해킹 된 서버를 계속 실행하는 것은 무책임한 행동입니다. index.php 파일을 변경하는 것 외에도 실제로 악의적 인 도구가 설치되었을 수 있습니다. 서버가 그 동안 범죄자를위한 공개 프록시 일 수 있습니다.

fopen을

는 fopen을 따로 PHP 내에서 파일을 변경의 12 가지 방법이 있습니다. 그것이 정말 fopen의인지

proc_open 예

  • file_put_contents를
  • 인 move_uploaded_file 시스템, 경유, shell_exec와
  • exec('echo foo > /path/to/bar')
  • 같은, 당신은 매우 운이 좋다.

+0

서버에 영구적 인 공격을 가하고 싶다면이 기술을 사용하면됩니다. –

+0

정확히! 첫째로 상황을 포함하고, 더 나쁘게하는 것을 허용하지 말라. 서버에 물리적으로 액세스 할 수있는 경우 컴퓨터에서 네트워크 케이블을 분리하십시오. 하드 드라이브를 분리하십시오. 새 하드 드라이브를 설치하고 백업에서 복원하십시오. 다른 컴퓨터로 손상된 드라이브를 분석하십시오. –

2

나는 grep 및 ssh 액세스를 사용하여 문제를 발견하고 제거합니다. 내 파일을 다시 작성하는 임베디드 스크립트 대신 PHP 코드가 사이트 어딘가에 입력 양식에 의해 실행되고있을 수 있습니다. 나는 아직 확실하지 않다. 그 동안 eval (base64_decode 주입을 내 index.php 파일에 주입하는 스크립트)을 작성했는데 index.php 파일에서 eval (base64_decode ('');를 검사하고 제거하고 내 파일 구조를 5 개의 디렉토리로 검색합니다 내 사이트에 충분 깊은 수준. 나는 그것이 세트 5 분마다 cronjob에 실행해야합니다. 그것은 서버에서 모든 집약적하지 않는 것 같다. 당신은 비슷한 문제가있는 경우

<?php 
$level=5; 
function get_sorted($path) 
{ 
    //$ignore = array('.',"'","error_log"); 
    $dh = @opendir($path); 
    while ($file = @readdir($dh)) 
    { 
     if (!strstr($file,'.')&&!strstr($file,"'")&&!strstr($file,"error_log")&&!strstr($file,"README")&&!strstr($file,"cookietxt")&&$file!='.'&&$file!='..') 
     { 
      $directories[] = $file; 
     } 
     else 
     { 
      if ($file!='.'&&$file!='..') 
      { 
       $files[] = $file; 
      } 
     } 
    } 

    $array = array($directories,$files); 
    return $array; 
} 

function clean_files($files, $path) 
{ 
    //echo 1;exit; 
    if ($files) 
    { 
     foreach($files as $key=>$val) 
     { 
      //echo $val; 
      if ($val == 'index.php') 
      { 
       //echo 1; exit; 
       //fopen .htacess 
       $targetFile = "$path/$val"; 
       echo "Checking: $targetFile <br>"; 

       $handle1 = fopen($targetFile, 'r');  
       $data = @fread($handle1,filesize($targetFile)); 
       fclose($handle1); 



       $string = preg_match('/eval.base64_decode(.*?)\;/', $data, $matches); 
       $string = $matches[0]; 

       if ($string) 
       { 
        echo "MALWARE FOUND IN $targetFile ! ... rewriting!<br>"; 
        $data = str_replace($string,'', $data); 
        $handle1 = fopen($targetFile, 'w'); 
        fwrite($handle1, $data); 
        fclose($handle1); 
        //exit; 
       } 
       unset($string); 
       unset($data); 

      } 
     } 
    } 
    else 
    { 
     echo "<br>No files discovered in $path<br>"; 
    } 
} 

//clean first level 
$array = get_sorted('.'); 
$directories = $array[0]; 
$files = $array[1]; 
clean_files($files,'.'); 

//get second level & clean 
foreach ($directories as $key=>$val) 
{ 
    $p_1 = "./$val"; 
    $a_1 = get_sorted($val); 
    $d_1 = $a_1[0]; 
    $f_1 = $a_1[1]; 

    //echo $val; 
    //print_r($d_1); 
    //echo "<hr>"; 
    clean_files($f_1, "{$p_1}"); 

    //check and clean level 2 
    if ($d_1) 
    { 
     foreach ($d_1 as $k_1=>$v_1) 
     { 
      //echo $v_1;exit; 
      $p_2 = $p_1.'/'.$v_1; 
      $a_2 = get_sorted($p_2); 
      $d_2 = $a_2[0]; 
      $f_2 = $a_2[1]; 

      clean_files($f_2, $p_2); 

      if ($d_2) 
      { 
       //check and clean level 3 
       foreach ($d_2 as $k_2=>$v_2) 
       { 

        $p_3 = $p_2.'/'.$v_2; 
        //echo $p_3; 
        $a_3 = get_sorted($p_3); 
        $d_3 = $a_3[0]; 
        $f_3 = $a_3[1]; 
        //echo"<hr>$v_2"; 
        //print_r($f_3);exit; 
        clean_files($f_3, $p_3); 
        //unset($ 
       } 

       //check and clean level 4 
       if ($d_3) 
       { 
        foreach ($d_3 as $k_3=>$v_3) 
        { 
         $p_4 = $p_3.'/'.$v_3; 
         $a_4 = get_sorted($p_4); 
         $d_4 = $a_4[0]; 
         $f_4 = $a_4[1]; 

         clean_files($f_4, $p_4); 
        } 

        //check and clean level 5 
        if ($d_4&&$level==5) 
        { 
         foreach ($d_4 as $k_4=>$v_4) 
         { 
          $p_5 = $p_4.'/'.$v_4; 
          $a_5 = get_sorted($p_5); 
          $d_5 = $a_5[0]; 
          $f_5 = $a_5[1]; 

          clean_files($f_5, $p_5); 
         } 
        } 
       } 
      } 
     } 
    } 

} 




?> 

은주의하시기 바랍니다 이 스크립트를 실행하려고하면 모든 eval (base64_encode 스크립트가 악성 코드이거나 index.php 파일에없는 스크립트)이 제거됩니다. 또한 preg_match 표현식을 편집하여 다른 자연 주입을 대상으로 할 수도 있습니다.이 코드를 사용하여 index가 아닌 다른 파일을 타겟팅 할 수도 있습니다 .php

관련 문제