n-000
15.08.2008, 23:54
Наверное не один из нас сталкивался с траблами когда его веб шелл (залитый неимоверними усилиями) на какой либо ресурс, в данном случае это форум SMF находил и удалял злой дятька АдМиН ?
Размышляя на эту тему хотел бы боделиться некоторыми соображениями, для которых необходимо иметь веб шелл на этом ресурсе ...
Сампле машин форум имеет некоторые фишки, как и большое кол во движков (не только форумы), такие как ретрив пароля ... так вот имея доступ к БД, я как то раз зделал ретрив пасса админу и подсмотрел табличку в базе под названием validation_code, формирование этого кода в смф происходит таким образом :
$password = substr(preg_replace('/\W/', '', md5(rand())), 0, 10);
// Set the password in the database.
db_query("
UPDATE {$db_prefix}members
SET validation_code = '" . md5($password) . "'
WHERE $searchField = '$_POST[user]'
LIMIT 1", __FILE__, __LINE__);
require_once($sourcedir . '/Subs-Post.php');
sendmail($row['emailAddress'], $txt['reminder_subject'],
sprintf($txt['sendtopic_dear'], $row['realName']) . "\n\n" .
"$txt[reminder_mail]:\n\n" .
"$scripturl?action=reminder;sa=setpassword;u=$row[ID_MEMBER];code=$password\n\n" .
"$txt[512]: $user_info[ip]\n\n" .
$txt[35] . ': ' . $row['memberName'] . "\n\n" .
$txt[130]);
Так вот, весь смысл в том, что при ретриве генерица произвольное число, шифруется MD5 и обрезается до 10 символов ...
Хочу заметить , что эта лабуда сначало пишется в базу в столбец validation_code потом ещё раз шифруется и обрезается, только после этого отправляется на почту юзера !
На первый взгляд дело дрянь ! Но когда во время моих глумленей удалили ВСЕ мои шелы (скорее всего сервер просто почистили, переустановили скрипты и бекапом вернули базу) мне так не показалось, имея на руках эти 10 символов, начал усиленно думать ...
Я понял, что шелы не вернуть, а вот validation_code наверняка остался при бекапе и зная 10 символов из целого хэша можно попробывать расшифровать и сменить пасс админу. Параметры для брута были известны, это маленькие латинские и цифры, но 10 символов, как понимаете не одна ноч расшифровки ...
Но как то я случайно вбил все маленкие символы и о чудо -) пасворд про нашол коллизию под эти 10 символов - Благо эта тузла умеет понимать не полные хэши ))
Результат получился не особо впечатляющим (2nq3&l7) всё портил символ &, при переходе по ссылке на ретрив пасса (http://site.ru/forum/index.php?action=reminder;sa=setpassword;u=1;code= 2nq3&l7) этот символ как бы передавал ещё один параметр скрипту ретрива, тоесть всё что до него проходило, а после отсекалось !
Зная validation_code в СМФ можно без труда изменить пасс любому юзеру, чей код известен. И тут я решил - а что если подделать HTTP пакет и через POST запрос передать переменную code вместе с этим мать его & !
Воспользовавшись локальным прокси сервером Odysseus я так и зделал -)
Для не просвящёных одисей - это такая тузла которая при отправке каких либо данных в инет даёт вам возможность отредактировать их перед отправкой.
Ну и конечно я радовался как первокласник новому году, когда мне сказали что пасс админа успешно поменян и предложили зайти на форум -))
Через некоторое время мой хитрозамаскированный шелл снова удалили, скорее всего админ опять зделал бакуп базы и всё переустановил, но ещё при этом апгрейдил форум -) наивно , но он до сих пор не вкурил что дело не в уязвимости скрипта, а бэкдор до сих пор храниться в его базе -)
Вот таким вот образом я обеспечил себе дверь, через которую можно зайти не один раз, даже при полной чистки сервака, был бы бэкап -) ... удачи вам !
Размышляя на эту тему хотел бы боделиться некоторыми соображениями, для которых необходимо иметь веб шелл на этом ресурсе ...
Сампле машин форум имеет некоторые фишки, как и большое кол во движков (не только форумы), такие как ретрив пароля ... так вот имея доступ к БД, я как то раз зделал ретрив пасса админу и подсмотрел табличку в базе под названием validation_code, формирование этого кода в смф происходит таким образом :
$password = substr(preg_replace('/\W/', '', md5(rand())), 0, 10);
// Set the password in the database.
db_query("
UPDATE {$db_prefix}members
SET validation_code = '" . md5($password) . "'
WHERE $searchField = '$_POST[user]'
LIMIT 1", __FILE__, __LINE__);
require_once($sourcedir . '/Subs-Post.php');
sendmail($row['emailAddress'], $txt['reminder_subject'],
sprintf($txt['sendtopic_dear'], $row['realName']) . "\n\n" .
"$txt[reminder_mail]:\n\n" .
"$scripturl?action=reminder;sa=setpassword;u=$row[ID_MEMBER];code=$password\n\n" .
"$txt[512]: $user_info[ip]\n\n" .
$txt[35] . ': ' . $row['memberName'] . "\n\n" .
$txt[130]);
Так вот, весь смысл в том, что при ретриве генерица произвольное число, шифруется MD5 и обрезается до 10 символов ...
Хочу заметить , что эта лабуда сначало пишется в базу в столбец validation_code потом ещё раз шифруется и обрезается, только после этого отправляется на почту юзера !
На первый взгляд дело дрянь ! Но когда во время моих глумленей удалили ВСЕ мои шелы (скорее всего сервер просто почистили, переустановили скрипты и бекапом вернули базу) мне так не показалось, имея на руках эти 10 символов, начал усиленно думать ...
Я понял, что шелы не вернуть, а вот validation_code наверняка остался при бекапе и зная 10 символов из целого хэша можно попробывать расшифровать и сменить пасс админу. Параметры для брута были известны, это маленькие латинские и цифры, но 10 символов, как понимаете не одна ноч расшифровки ...
Но как то я случайно вбил все маленкие символы и о чудо -) пасворд про нашол коллизию под эти 10 символов - Благо эта тузла умеет понимать не полные хэши ))
Результат получился не особо впечатляющим (2nq3&l7) всё портил символ &, при переходе по ссылке на ретрив пасса (http://site.ru/forum/index.php?action=reminder;sa=setpassword;u=1;code= 2nq3&l7) этот символ как бы передавал ещё один параметр скрипту ретрива, тоесть всё что до него проходило, а после отсекалось !
Зная validation_code в СМФ можно без труда изменить пасс любому юзеру, чей код известен. И тут я решил - а что если подделать HTTP пакет и через POST запрос передать переменную code вместе с этим мать его & !
Воспользовавшись локальным прокси сервером Odysseus я так и зделал -)
Для не просвящёных одисей - это такая тузла которая при отправке каких либо данных в инет даёт вам возможность отредактировать их перед отправкой.
Ну и конечно я радовался как первокласник новому году, когда мне сказали что пасс админа успешно поменян и предложили зайти на форум -))
Через некоторое время мой хитрозамаскированный шелл снова удалили, скорее всего админ опять зделал бакуп базы и всё переустановил, но ещё при этом апгрейдил форум -) наивно , но он до сих пор не вкурил что дело не в уязвимости скрипта, а бэкдор до сих пор храниться в его базе -)
Вот таким вот образом я обеспечил себе дверь, через которую можно зайти не один раз, даже при полной чистки сервака, был бы бэкап -) ... удачи вам !