Обход каптчи на сайте Киевстара

Discussion in 'Уязвимости' started by n3m0, 1 Oct 2008.

  1. n3m0

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

    Joined:
    11 May 2007
    Messages:
    133
    Likes Received:
    92
    Reputations:
    11
    Добрый вечер уважаемые!
    Наша команда обнаружила на сайте украинского оператора мобильной связи "Киевстар" уязвимость в отправке коротких текстовых сообщений*
    (http://kyivstar.net/_sms/)


    Она заключается в распознавании капчти. Это грозит тем, что злоумышленник может автоматически отправлять сообщения через этот сервис не выбирая картинки "живой" природы. Т.е осуществить спам-рассылку.

    Для распознавания изображений нашей командой был придуман метод "Квадрата".

    Суть метода:

    Под квадратом имеется ввиду изображение которое нужно определить, является оно или "живой" или "не живой" природой.
    Мы проанализировали все картинки, которые предоставляются для выбора
    "живой" и "не живой" природы. Потом нужно взять восемь эталонных точек, которые расположены на бёдрах
    квадрата. Сравнение первой точки должно происходить по такому равенству:

    |R-Re| <= COEF_R && |G-Ge| <= COEF_G && |B-Be| <= COEF_B
    где R,G,B - это цветовая схема пикселя тестового изображения,
    Re,Ge,Be - это цветовая схема пикселя эталонного изображения
    COEF_(R,G,B) - это коэффициенты потери , которые возникают в следствие
    подачи изображения разного качества

    В итоге, если все восемь точек соответствуют равенству - мы
    рассматриваем эталонное изображение.

    Мы написали класс, для работы с изображениями
    Ссылка:
    http://c.glaive.org.ua/ksocr.html
    Или код:
    Code:
    #         ___ _      _         
    #        / __| |__ _(_)_ _____ 
    #       | (_ | / _` | \ V / -_)
    #        \___|_\__,_|_|\_/\___|
    #                       
    #  Security Group (c) Rubalko Dmitriy , 2008
    
    package KSOCR;
    use strict;
    use GD::Image;
    use Carp;
    use constant {
                    # К-во эталонов живой природы
                    IMAGE_AMOUNT => 15,
                    
                    # Погрешности в следсвии подачи изображения разного качества                 
                    COEF_R       => 45,
                    COEF_G       => 40,
                    COEF_B       => 65,
                    
                    # Координаты точек для эталонного сравнения
                    POSITIONS    => [ '0:0'  , '69:0',
                                      '0:69' , '69:69',
                                      '35:0' , '69:35',
                                      '35:69', '0:35'],                
    };
    
    # хеш '%c'  содержит RGB  эталонных изображений  
    # Эталонные точки  0:0/35:0      69:0/69:35      0:69/35:69     69:69/0:35
    my %c = ( 1 => [ '196:86:60'  , '143:147:108' , '112:92:51'   , '114:75:35'   ,
                     '56:42:8'    , '89:60:20'    , '47:67:32'    , '41:53:16'   ],          
              2 => [ '118:120:78' , '117:107:53'  , '112:90:49'   , '112:90:49'   ,
                     '201:215:190', '115:100:49'  , '168:182:140' , '184:166:110'],          
              3 => [ '251:248:232', '236:230:215' , '132:150:25'  , '119:126:43'  ,
                     '252:252:249', '252:242:250' , '180:190:52'  , '166:153:97' ],         
              4 => [ '252:253:249', '252:253:249' , '92:114:72'   , '252:253:249' ,
                     '252:253:249', '210:220:195' , '102:114:65'  , '234:244:217'],         
              5 => [ '74:100:47'  , '30:46:17'    , '106:148:65'  , '149:188:75'  ,
                     '74:109:34'  , '119:164:56'  , '209:239:90'  , '117:156:49' ],
              6 => [ '44:53:13'   , '60:99:11'    , '155:201:47'  , '147:164:128' ,
                     '183:190:153', '55:76:17'    , '164:201:58'  , '34:52:7'    ],
              7 => [ '234:215:178', '234:215:178' , '220:215:172' , '234:215:178' ,
                     '107:104:63' , '99:96:42'    , '92:89:55'    , '244:206:111'],          
              8 => [ '117:124:84' , '117:124:84'  , '52:30:4'     , '117:124:84'  ,
                     '91:99:65'   , '91:99:65'    , '184:204:216' , '102:108:78' ],
              9 => [ '252:253:250', '252:253:250' , '244:250:232' , '252:246:245' ,
                     '252:253:250', '252:253:250', '188:182:100' , '92:97:47'    ],
             10 => [ '113:85:70'  , '168:148:112' , '236:227:218' , '165:132:91'  ,
                     '169:147:97' , '124:85:53'   , '214:195:168' , '78:52:32'   ],
             11 => [ '196:179:196', '7:12:10'     , '48:61:88'    , '12:19:16'    ,
                     '44:40:40'   , '116:99:121'  , '49:41:62'    , '152:94:129' ],
             12 => [ '81:72:47'   , '104:117:76'  , '78:61:44'    , '57:73:77'    ,
                     '135:75:5'   , '44:40:9'     , '43:69:77'    , '60:70:51'   ],
             13 => [ '116:98:92'  , '33:37:43'    , '66:68:71'    , '91:91:97'    ,
                     '21:20:20'   , '68:69:84'    , '252:253:251' , '166:154:112'],
             14 => [ '48:81:34'   , '86:60:34'    , '166:168:134' , '129:151:112' ,
                     '66:67:33'   , '113:116:77'  , '180:193:160' , '100:92:52'  ],         
             15 => [ '148:117:100', '218:208:168' , '181:168:113' , '200:192:143' ,
                     '216:208:152', '193:199:129' , '198:178:127' , '170:160:81' ],
    );
    
    sub new {
        
        my $class = shift;
        my $self  = {   DEBUG      => 0,
                        FILE_DATA  => undef,
                        FILE_NAME  => undef,
                        @_,
        };
        return bless $self, $class;
    }
    
    sub put_file{
        
        my $self = shift;
        $self->{ FILE_NAME } = shift;
        return $self->{ FILE_NAME };   
    }
    
    sub put_data{
        
        my $self = shift;
        $self->{ FILE_DATA } = shift;
        return $self->{ FILE_DATA };
    }
    
    sub recognition {
        
        my $self = shift;
        my ( $image,$result ) = ( undef,0 );
        
        if ( defined $self->{ FILE_NAME } ){
            
            croak "Файл с именем : $self->{ FILE_NAME } не существует\n" unless -e $self->{ FILE_NAME } ;
            $image = GD::Image->newFromJpeg( $self->{ FILE_NAME } );
        }elsif ( defined $self->{ FILE_DATA } ){
            $image = GD::Image->newFromJpegData( $self->{ FILE_DATA } );
        }else{
            croak 'Не задан файл , или его DATA' ;      
        }
        for ( 1..IMAGE_AMOUNT ){
            
            print "\nПроверка с эталоном # $_\n",'-'x23,"\n\n" if $self->{ DEBUG };         
            for ( my $point = 0 ;$point <= 7; $point++ ){
                               
                my ( $x,$y ) = split ':',POSITIONS->[$point];
                # RGB образца 
                my ( $r,$g,$b ) = $image->rgb( $image->getPixel( $x,$y ) );
                # RGB эталонов живой природы 
                my ( $re,$ge,$be ) = split ':',$c{$_}->[$point];
                   
                if ( $self->{ DEBUG } ) {
                    
                    printf "( %2d:%2d )       R   G   B\n",$x,$y;
                    printf "Образец     : %3d %3d %3d\n",$r,$g,$b; 
                    printf "Эталон      : %3d %3d %3d\n",$re,$ge,$be;
                    printf "Погрешность : %3d %3d %3d\n",abs($r-$re),abs($g-$ge),abs($b-$be);
                 }
                if ( abs($r-$re) <= COEF_R && abs($g-$ge) <= COEF_G &&
                     abs($b-$be) <= COEF_B){ 
                     $result++;
                     printf "Совпадений  : %d/8 \n\n",$result if $self->{ DEBUG };
                     return 1 if $result == 8 ;
                }else{
                    $result = 0;
                    printf "Совпадений  : %d/8 \n\n",$result if $self->{ DEBUG };
                    last;
                }
            }
        }
        return 0;   
    }
    
    1;
    
    
    * Администрация сайта была оповещена по электронной почте о найденной уязвимости. Но в течении двух недель мы не дождались ответа и уязвимость до сих пор остаётся рабочей.

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

    С уважением,
    Glaive Security Group
     
    #1 n3m0, 1 Oct 2008
    Last edited: 1 Oct 2008
    8 people like this.
  2. iddqd

    iddqd Banned

    Joined:
    19 Dec 2007
    Messages:
    637
    Likes Received:
    519
    Reputations:
    19
    красавцы)
     
  3. n3m0

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

    Joined:
    11 May 2007
    Messages:
    133
    Likes Received:
    92
    Reputations:
    11
    Ну а вот пример, как этот класс использовать:
    Code:
    #!/usr/bin/perl -w
    
    use strict;
    use KSOCR;
    
    my $ocr = new KSOCR( DEBUG     => 1,
                         FILE_NAME => 'image' );
    if ( $ocr->recognition ){
        print "Живая природа";
    }else{
        print "Неживая природа"
    }
    
    Пример отладки:
    Code:
    Проверка с эталоном # 1
    -----------------------
    
    (  0: 0 )       R   G   B
    Образец     : 252 253 249
    Эталон      : 196  86  60
    Погрешность :  56 167 189
    Совпадений  : 0/8 
    
    
    Проверка с эталоном # 2
    -----------------------
    
    (  0: 0 )       R   G   B
    Образец     : 252 253 249
    Эталон      : 118 120  78
    Погрешность : 134 133 171
    Совпадений  : 0/8 
    
    
    Проверка с эталоном # 3
    -----------------------
    
    (  0: 0 )       R   G   B
    Образец     : 252 253 249
    Эталон      : 251 248 232
    Погрешность :   1   5  17
    Совпадений  : 1/8 
    
    ( 69: 0 )       R   G   B
    Образец     : 252 253 249
    Эталон      : 236 230 215
    Погрешность :  16  23  34
    Совпадений  : 2/8 
    
    (  0:69 )       R   G   B
    Образец     :  92 114  72
    Эталон      : 132 150  25
    Погрешность :  40  36  47
    Совпадений  : 3/8 
    
    ( 69:69 )       R   G   B
    Образец     : 252 253 249
    Эталон      : 119 126  43
    Погрешность : 133 127 206
    Совпадений  : 0/8 
    
    
    Проверка с эталоном # 4
    -----------------------
    
    (  0: 0 )       R   G   B
    Образец     : 252 253 249
    Эталон      : 252 253 249
    Погрешность :   0   0   0
    Совпадений  : 1/8 
    
    ( 69: 0 )       R   G   B
    Образец     : 252 253 249
    Эталон      : 252 253 249
    Погрешность :   0   0   0
    Совпадений  : 2/8 
    
    (  0:69 )       R   G   B
    Образец     :  92 114  72
    Эталон      :  92 114  72
    Погрешность :   0   0   0
    Совпадений  : 3/8 
    
    ( 69:69 )       R   G   B
    Образец     : 252 253 249
    Эталон      : 252 253 249
    Погрешность :   0   0   0
    Совпадений  : 4/8 
    
    ( 35: 0 )       R   G   B
    Образец     : 252 253 249
    Эталон      : 252 253 249
    Погрешность :   0   0   0
    Совпадений  : 5/8 
    
    ( 69:35 )       R   G   B
    Образец     : 203 220 185
    Эталон      : 210 220 195
    Погрешность :   7   0  10
    Совпадений  : 6/8 
    
    ( 35:69 )       R   G   B
    Образец     : 102 114  65
    Эталон      : 102 114  65
    Погрешность :   0   0   0
    Совпадений  : 7/8 
    
    (  0:35 )       R   G   B
    Образец     : 234 244 217
    Эталон      : 234 244 217
    Погрешность :   0   0   0
    Совпадений  : 8/8 
    
    Живая природа
    
    Дерзайте ;)
     
    #3 n3m0, 1 Oct 2008
    Last edited: 1 Oct 2008
    1 person likes this.
  4. LEE_ROY

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

    Joined:
    9 Nov 2006
    Messages:
    450
    Likes Received:
    188
    Reputations:
    26
    зачет :)
     
    #4 LEE_ROY, 1 Oct 2008
    Last edited: 1 Oct 2008
  5. *eXe*

    *eXe* Banned

    Joined:
    20 May 2008
    Messages:
    0
    Likes Received:
    184
    Reputations:
    0
    зачёт!!!

    оффтоп/ при пополнении оператора КС ваучеров, номиналом в 300 грн, даётся бонус 10 грн. Я часто пополняю. Собралось более 200 грн. Некоторое время не юзал симкарту, а когда обнаружил. то оказалось, что бонус анулился. С чем это связано???
     
  6. sabe

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

    Joined:
    16 Mar 2007
    Messages:
    313
    Likes Received:
    178
    Reputations:
    14
    молодец дим!

    *eXe*
    наверника с тем что Некоторое время не юзал симкарту )
     
  7. n3m0

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

    Joined:
    11 May 2007
    Messages:
    133
    Likes Received:
    92
    Reputations:
    11
    Нет, это не Я. НО этот человек в нашей команде. И он забанен на этом форуме :(
     
  8. оlbaneс

    оlbaneс Moderator

    Joined:
    5 Nov 2007
    Messages:
    1,379
    Likes Received:
    1,095
    Reputations:
    356
    молодцы
     
    _________________________
  9. sabe

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

    Joined:
    16 Mar 2007
    Messages:
    313
    Likes Received:
    178
    Reputations:
    14
    n3m0
    забанили наверника за чтото хорошое.. )
     
  10. Rebit

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

    Joined:
    7 Aug 2007
    Messages:
    85
    Likes Received:
    214
    Reputations:
    2
    Маладци ! Ставлю +
     
  11. De-visible

    De-visible [NDC] Network develope c0ders

    Joined:
    6 Jan 2008
    Messages:
    916
    Likes Received:
    550
    Reputations:
    66
    убил....
     
    1 person likes this.
  12. DDoSька

    DDoSька Elder - Старейшина

    Joined:
    5 May 2008
    Messages:
    317
    Likes Received:
    352
    Reputations:
    18
    Походу стрелял очередью - убило именя
     
    1 person likes this.
  13. Дюша

    Дюша Banned

    Joined:
    9 Dec 2007
    Messages:
    160
    Likes Received:
    77
    Reputations:
    -13
    =\ на украинку шлюзы без капчи есть lol
     
  14. drive_pan

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

    Joined:
    18 Oct 2007
    Messages:
    178
    Likes Received:
    78
    Reputations:
    5
    делись...
     
  15. n3m0

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

    Joined:
    11 May 2007
    Messages:
    133
    Likes Received:
    92
    Reputations:
    11
    Чувак, как раз это не мейл-шлюз. Это официальный шлюз. СМС приходят с номера 777.
    Так что не умничай сильно, lol ;)