Помощь Поиск и выявление "стучалок": Или о том как дудки вам дудки

Тема в разделе "Битрикс", создана пользователем mrLom, 6 ноя 2016.

Модераторы: mrLom, puagardian
  1. mrLom

    mrLom ♒︎

    Moderator
    Регистр.:
    24 дек 2014
    Сообщения:
    842
    Симпатии:
    1.509
    Итак, тема давно назревала, в итоге я решил таки вынести ее в отдельную ветвь.
    Правила простые: поменьше флуда, старайтесь писать по теме, что бы не мусорить в теме, просто лишний раз читайте внимательно где находятся подобные стучалки и не ленитесь пользоваться поиском по скриптам. Ищущий найдет.

    Студия Сотбит с решениями sotbit.missshop и sotbit.mistershop:
    sotbit.missshop/lang/ru/include.php
    PHP:
    $MESS['YANDEX']  = '<!-- Yandex.Metrika counter -->
    <script type="text/javascript">
    (function (d, w, c) {
        (w[c] = w[c] || []).push(function() {
            try {
                w.yaCounter22491013 = new Ya.Metrika({id:22491013,
                        webvisor:true,
                        clickmap:true,
                        trackLinks:true,
                        accurateTrackBounce:true});
            } catch(e) { }
        });
     
        var n = d.getElementsByTagName("script")[0],
            s = d.createElement("script"),
            f = function () { n.parentNode.insertBefore(s, n); };
        s.type = "text/javascript";
        s.async = true;
        s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js";

        if (w.opera == "[object Opera]") {
            d.addEventListener("DOMContentLoaded", f, false);
        } else { f(); }
    })(document, window, "yandex_metrika_callbacks");
    </script>
    <noscript><div><img src="//mc.yandex.ru/watch/22491013" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
    <!-- /Yandex.Metrika counter -->
    '
    ;
    $MESS['GOOGLE']  = "
    <script type='text/javascript'>
      var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-45850056-1']);
      _gaq.push(['_trackPageview']);

      (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
      })();
    </script>
    "
    ;
    Решение: вычистить содержимое в кавычках, либо сразу же заменить реквизиты счетчиков на свои.

    Студия Аспро, замечено во всех решениях по аналогии:
    Все непотребства находятся в /bitrix/modules/ а далее в соответствии с решением aspro.(mshop, kshop, ishop, tires, optimus и т.д., во всех решениях студии)
    Учтите, путь тоже может меняться, поэтому пользоваться поиском никто не отменял!
    В старых версиях:
    /aspro.mshop/include.php
    В новых версиях:
    /aspro.mshop/classes/general/CMShop.php
    вытаскиваю отдельные части кода:
    PHP:
                    $socket fsockopen('bi.aspro.ru'80$errno$errstr10);
      
    $data json_encode(
      array(
      
    "client" => "aspro",
      
    "install_date" => date("Y-m-d H:i:s"),
      
    "solution_code" => self::moduleID,
      
    "ip" => $serverIP,
      
    "http_host" => $_SERVER["HTTP_HOST"],
      
    "bitrix_version" => SM_VERSION,
      
    "bitrix_edition" => $APPLICATION->ConvertCharset($editionSITE_CHARSET"utf-8"),
      
    "bitrix_key_hash" => md5(CUpdateClient::GetLicenseKey()),
      
    "site_name" => $APPLICATION->ConvertCharset(COption::GetOptionString("main""site_name"), SITE_CHARSET"utf-8"),
      
    "site_url" => $APPLICATION->ConvertCharset(COption::GetOptionString("main""server_name"), SITE_CHARSET"utf-8"),
      
    "email_default" => $APPLICATION->ConvertCharset(COption::GetOptionString("main""email_from"), SITE_CHARSET"utf-8"),
      
    "action" => $action,
      )
      );
      
    fwrite($socket"POST /rest/bitrix/installs HTTP/1.1\r\n");
      
    fwrite($socket"Host: bi.aspro.ru\r\n");
      
    fwrite($socket"Content-type: application/x-www-form-urlencoded\r\n");
      
    fwrite($socket"Content-length:".strlen($data)."\r\n");
      
    fwrite($socket"Accept:*/*\r\n");
      
    fwrite($socket"User-agent:Bitrix Installer\r\n");
      
    fwrite($socket"Connection:Close\r\n");
      
    fwrite($socket"\r\n");
      
    fwrite($socket"$data\r\n");
      
    fwrite($socket"\r\n");
      
    $answer '';
      while(!
    feof($socket)){
      
    $answer.= fgets($socket4096);
      }
      
    fclose($socket);

    /aspro.mshop/admin/mc.php
    Фрагмент кода открывает фрейм сайта студии, а это вам знаете ли рефка:
    PHP:
      <iframe src="https://aspro.ru/mc/?<?=$m?>"></iframe>
    Благовидно, но сдаст вашу копию с потрохами.

    Решение: Полностью удалить представленные части кода — формирование статистики в сокет и фрейм.
    Либо заменить bi.aspro.ru на localhost — тем самым отправим статистику в никуда.
     
    Последнее редактирование: 16 ноя 2016
    navistarsys, SaKura, zzz101 и 10 другим нравится это.
  2. mrLom

    mrLom ♒︎

    Moderator
    Регистр.:
    24 дек 2014
    Сообщения:
    842
    Симпатии:
    1.509
    Думаю достаточно фрейм
    PHP:
     <iframe src="https://aspro.ru/mc/?<?=$m?>"></iframe>
     
  3. zzz101

    zzz101 Постоялец

    Регистр.:
    19 дек 2013
    Сообщения:
    65
    Симпатии:
    5
    Хорошо. А подскажите, пожалуйста, если хостинг чистить, то в каком месте?
     
  4. mrLom

    mrLom ♒︎

    Moderator
    Регистр.:
    24 дек 2014
    Сообщения:
    842
    Симпатии:
    1.509
    Мне не ясен ваш вопрос. Что значит хостинг чистить? Куда уж ясно написано, искать все встречающиеся aspro.ru заменять без условий на имя вашего домена. Все сокет соединения можно завернуть на locahost. В нашем случае bi.aspro.ru создает сокет. Остальные — http, https на ваш домен. В противном случае посетитель будет пытаться открыть какой-либо ресурс у себя локально. Не каждый антивирусник вынесет такую наглость.

    Если у вас свой сервер — виртуальный или физический, не важно, и вы имеете к нему полный root — можно смело добавить в хосты bi.aspro.ru с адресом 127.0.0.1

    UPD. Парни, давайте не будем превращать тему в длинный тред.
    Предлагаю оставить тут лайфхаки, миминизирующие возможные последствия того, что ваш домен окажется в статистике серверов Битрикса и разработчиков решений, и сами стучалки.
    А то тема быстро превратиться в 100 страничную тему как почистить аспро.
     
    wpt нравится это.
  5. mrLom

    mrLom ♒︎

    Moderator
    Регистр.:
    24 дек 2014
    Сообщения:
    842
    Симпатии:
    1.509
    Все непотребства находятся в /bitrix/modules/ а далее в соответствии с решением aspro.(mshop, kshop, ishop, tires, optimus и т.д., во всех решениях студии)
    В старых версиях:
    /aspro.mshop/include.php
    В новых версиях:
    /aspro.mshop/classes/general/CMShop.php
    Учтите, путь тоже может меняться, поэтому пользоваться поиском никто не отменял!

    У Ромзы не замечал, но это тоже не факт.

    Исправил в шапке. Ветку чищу!
     
    Последнее редактирование: 16 ноя 2016
    b7music нравится это.
  6. mrLom

    mrLom ♒︎

    Moderator
    Регистр.:
    24 дек 2014
    Сообщения:
    842
    Симпатии:
    1.509
    К слову, в самом начале я даже не заметил — у Сотбит оказывается еще пара пасхалочек припасены в рукаве:
    Думаю, это не единственное решение, а так или иначе в подобном сборе статистики принимают участие все их решения.
    Возьмем для разбора дельту: sns.tools1c.3.6.22.delta.upd
    BITRIX44 2285|/sns.tools1c/updater3.6.22.php|c6d7e14b

    Коментарий:
    В момент установки решения распаковывается управляющий скрипт updater3.6.22.php, а там есть фрагмент кода:
    PHP:
    require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_client_partner.php");
    $arInfoSotbit = array();
    $arInfoSotbit['key'] = md5("BITRIX".CUpdateClientPartner::GetLicenseKey()."LICENCE");
    //получим почту
    $email_admin COption::GetOptionString('main','email_from') ;
    function 
    izvlech_pochtovii_adresa($stroka) {
      
    preg_match_all("/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i"$stroka$resultati);
      return 
    $resultati[0];
    }
    $arr_email_admin izvlech_pochtovii_adresa($email_admin);
    $arInfoSotbit['email'] = implode(", "$arr_email_admin);
    //модуль
    $arInfoSotbit['module'] = 'sns.tools1c';
    $postdata http_build_query($arInfoSotbit);
    //сделаем запрос
    $Response QueryGetData(
      
    'www.sotbit.ru',
      
    80
      
    '/bitrix/admin/sotbit_client_modules_request.php?'
      
    $postdata
      
    $error_number 0
      
    $error_text ''
      
    'GET' 
    );

    // 
    // Sample database update 
    // 
     
     
    if($updater->CanUpdateDatabase())
    {
      if(
    $updater->TableExists("b_iblock_element_property"))
      {
      if(!
    $DB->IndexExists("b_iblock_element_property", array("VALUE_NUM""IBLOCK_PROPERTY_ID")))
      {
      
    $updater->Query(array(
      
    "MySQL" => "CREATE INDEX ix_iblock_element_prop_num ON b_iblock_element_property(VALUE_NUM, IBLOCK_PROPERTY_ID)",
      
    "MSSQL" => "CREATE INDEX IX_B_IBLOCK_ELEMENT_PROPERTY_4 ON B_IBLOCK_ELEMENT_PROPERTY(VALUE_NUM, IBLOCK_PROPERTY_ID)",
      
    "Oracle" => "CREATE INDEX IX_IBLOCK_ELEMENT_PROP_NUM ON B_IBLOCK_ELEMENT_PROPERTY(VALUE_NUM, IBLOCK_PROPERTY_ID)",
      ));
      }
      }
      if(
    $updater->TableExists("b_iblock_property"))
      {
      if(!
    $DB->IndexExists("b_iblock_property", array("UPPER(\"CODE\")")))
      {
      
    $updater->Query(array(
      
    "Oracle" => "CREATE INDEX ix_iblock_property_2 ON B_IBLOCK_PROPERTY(UPPER(CODE))",
      ));
      }
      }
    }

    С его помощью одноразово открывается сокет на сайт sotbit.ru и передает статистику в виде хэша вашей лицензии, массива электронной почты и устанавливаемый модуль.
    После установки решения вы даже не найдете этого кода в решении. Однако, хитро придумано.
    Как видно из кода, апдейтер не только занимается сбором статистики, но и производит полезную работу в виде обновления свойств базы данных, поэтому лишний раз напоминаю о пользе использования дельт.

    Решение:
    т.к. фрагмент кода собирающий статистику работает в качестве сокета, то достаточно будет внести в hosts имя хоста студии как локальный
    Код:
    www.sotbit.ru  127.0.0.1
    — статистика упадет в логи вашего сервера. Не важно, каким будет устанавливаемое решение от данной студии — работает универсально.

    Если же у вас шаред хостинг, то тут увы, вы запалитесь как новогодняя ель. Для подобных случаев есть не самое изящное, но решение: ставить у себя дома на изолированной виртуалке из резервной копии, а далее переносить на хостинг.
     
    latteo, wpt, krausa и 2 другим нравится это.
  7. mrLom

    mrLom ♒︎

    Moderator
    Регистр.:
    24 дек 2014
    Сообщения:
    842
    Симпатии:
    1.509
    Решил тут распнуть дельту sotbit.postcalc.2.5.7.delta.upd, а это кстати просто обновление и назовем его — троянский конь. Единственное полезное действие которого, только замена версии на единицу выше, а все содержимое дельты создано только к сбору статистики, смотрите сами:
    PHP:
    BITRIX47   1468|/sotbit.postcalc/updater2.5.7.php|49693711<?
    require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_client_partner.php");
    $arInfoSotbit = array();
    //модуль
    $arInfoSotbit['module'] = 'sotbit.postcalc';
    //ключ
    $arInfoSotbit['key'] = md5("BITRIX".CUpdateClientPartner::GetLicenseKey()."LICENCE");
    //почта
    $email_admin = COption::GetOptionString('main','email_from') ;
    function izvlech_pochtovii_adresa($stroka) {
      preg_match_all("/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i", $stroka, $resultati);
      return $resultati[0];
    }
    $arr_email_admin = izvlech_pochtovii_adresa($email_admin);
    $arInfoSotbit['email'] = implode(", ", $arr_email_admin);
    //сайт
    if($_SERVER['SERVER_NAME']){
        $arInfoSotbit['host'] = $_SERVER['SERVER_NAME'];
    }
    elseif($_SERVER['HTTP_HOST']){
        $arInfoSotbit['host'] = $_SERVER['HTTP_HOST'];
    }
    //дата продления битрикс
    $arUpdateList = CUpdateClientPartner::GetUpdatesList();
    $arInfoSotbit['bitrix_name'] = $arUpdateList["CLIENT"][0]["@"]["NAME"];
    $arInfoSotbit['bitrix_date_from'] = $arUpdateList["CLIENT"][0]["@"]["DATE_FROM"];
    $arInfoSotbit['bitrix_date_to'] = $arUpdateList["CLIENT"][0]["@"]["DATE_TO"];
    $postdata = http_build_query($arInfoSotbit);
    //сделаем запрос
    $Response = QueryGetData(
        'www.sotbit.ru',
        80,
        '/bitrix/admin/sotbit_client_modules_request.php?',
        $postdata,
        $error_number = 0,
        $error_text = '',
        'GET'
    );
    ?>48   98|/sotbit.postcalc/install/version.php|51f49783<?
    $arModuleVersion = array(
            "VERSION" => "2.5.7",
            "VERSION_DATE" => "2016-10-19 12:37:01"
    );
    ?>RTIBE
    К слову, парни помимо сбора хешей лицензий с почтой, просто тупо добавили дату продления Битрикс bitrix_name, bitrix_date_from, bitrix_date_to
    Начнет у вас подходить к окончанию лицензирование Битрикс, если конечно же имеется таковая — полетят письма счастья, посыпяться звонки, что пора бы это дело продлить! В общем, сбор персональных данных в действии.
    Так что призываю к аккуратности использования их решений.

    UPD: А хотите поправить свои данные прямо у них в базе?
    У себя в админке в командной строке PHP выполняете код:
    PHP:
    require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/update_client_partner.php");
    $arInfoSotbit = array();
    //модуль
    $arInfoSotbit['module'] = 'sotbit.postcalc';
    //ключ
    $arInfoSotbit['key'] = md5("BITRIX".CUpdateClientPartner::GetLicenseKey()."LICENCE");
    //почта
    $email_admin COption::GetOptionString('main','email_from') ;
    function 
    izvlech_pochtovii_adresa($stroka) {
      
    preg_match_all("/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i"$stroka$resultati);
      return 
    $resultati[0];
    }
    $arr_email_admin izvlech_pochtovii_adresa($email_admin);
    $arInfoSotbit['email'] = implode(", "$arr_email_admin);
    //сайт
    if($_SERVER['SERVER_NAME']){
        
    $arInfoSotbit['host'] = $_SERVER['SERVER_NAME'];
    }
    elseif(
    $_SERVER['HTTP_HOST']){
        
    $arInfoSotbit['host'] = $_SERVER['HTTP_HOST'];
    }
    //дата продления битрикс
    $arUpdateList CUpdateClientPartner::GetUpdatesList();
    $arInfoSotbit['bitrix_name'] = $arUpdateList["CLIENT"][0]["@"]["NAME"];
    $arInfoSotbit['bitrix_date_from'] = $arUpdateList["CLIENT"][0]["@"]["DATE_FROM"];
    $arInfoSotbit['bitrix_date_to'] = $arUpdateList["CLIENT"][0]["@"]["DATE_TO"];
    $postdata http_build_query($arInfoSotbit);
    echo 
    $postdata;
    Получаете приблизительно вот такую строку вида с вашим хешем лицензии:
    Код:
    module=sotbit.postcalc&key=48341fc3dfe546679ed9856a28fba1c8&email=support%40sotbit.ru&host=sotbit.ru&bitrix_name=пишете_какую-нибудь_гадость&bitrix_date_from=01.01.2001&bitrix_date_to=01.01.2030
    При желании заменяете адреса почты, сайта, фамилию имя.
    А для большей зависти, указываете какую-нибудь дату действия лицензии повыше.

    А дальше, к началу полученной строке добавляем это:
    Код:
    www.sotbit.ru/bitrix/admin/sotbit_client_modules_request.php?
    Думается мне, можно устроить офигенный спам-флешмоб!

    Хэшей лицензий можно даже насобирать в интернете при помощи дополнительного модуля в FF — Life HTTP headers
    Получив хидеры — к примеру вот хидер Эльдорадо: X-Powered-CMS: Bitrix Site Manager (bd2bc670613cc293d44a342b1defd81a) ← а это их хэш лицензии

    А дальше сказать Сотбиту, что на сайтах крупных игроков, таких как Эльдорадо, Хофф, госдума и т.д. искать Перейти по ссылке — стоят их решения, желательно которые подороже — shs.parser sotbit.mistershop sotbit.missshop

    Давайте же удивим парней!
    Ну и пример — ставим в Эльдорадо Мистер Шоп, а лицензию закончим завтра
    Код:
    www.sotbit.ru/bitrix/admin/sotbit_client_modules_request.php?module=sotbit.mistershop&key=bd2bc670613cc293d44a342b1defd81a&email=support%40eldorado.ru&host=www.eldorado.ru&bitrix_name=Сергей Рыжиков&bitrix_date_from=19.11.2010&bitrix_date_to=19.11.2016
    
     
    Последнее редактирование: 18 ноя 2016
    SaKura, Proxyr, HAT и 5 другим нравится это.
  8. wpt

    wpt

    Регистр.:
    11 фев 2013
    Сообщения:
    577
    Симпатии:
    84
    На 7-м вэб окружении добавление доменов разработчика в файл hosts не дает эффекта. Если пинговать - пингуется локалхост, но из админки сайта (в частности панель управления решения) открывается. Что делаю не так?
     
  9. mrLom

    mrLom ♒︎

    Moderator
    Регистр.:
    24 дек 2014
    Сообщения:
    842
    Симпатии:
    1.509
    Есть два вида стучалок. Первый вид открывается в качестве сокета при помощи скриптов, второй вид, это открытие сайтов разработчиков во фреймах. В первом случае запрос проходит при помощи DNS запроса вашего сервера, во втором — при помощи вашего компьютера.

    Решается почти точно так же — добавлением в ваш локальный hosts всех перечисленных блокируемых ресурсов, но в этом случае вы больше не сможете попасть на сайт к разработчикам. Разве что только через ТОР сети.
     
  10. prefer

    prefer

    Регистр.:
    12 май 2016
    Сообщения:
    239
    Симпатии:
    34
    Сможет если временно включит в браузере прокси - в таком случае разрешением имен занимается сервер прокси.
     
  11. wpt

    wpt

    Регистр.:
    11 фев 2013
    Сообщения:
    577
    Симпатии:
    84
    Немножко резюмирую свой вопрос - если во фрейме сайт открывается - причины всего две? (1 - внесение адреса в hosts и 2 - правильность вносимого адреса)
    В centos 6.7 отрабатывала блокировка, в centos 7 нет. Не могу понять куда смотреть