Как работает механизм блокировок со стороны Роскомнадзора
Представляю вашему вниманию увлекательнейшее расследование от пользователя ruskar, опубликовавшего вчера материал в своем ЖЖ.Прошло чуть больше месяца с тех пор, как мы начали заниматься зеркалами блога Навального и борьбой с цензурой. Чего за это время только не было: нас и DDoSили, и писали жалобы на наши интернет-кошельки, и пытались подставить с придуманным компроматом, и пытались выставить вирусмейкерами, и банили зеркала большими пачками, а примерно полмесяца назад ещё и перестали удалять адреса зеркал из реестра, несмотря на то, что мы формально выполняем требования Роскомнадзора — убираем с попавших в реестр зеркал блог Навального. Не всей информацией, которую мы получаем в ходе нашей работы, мы можем сразу поделиться: всегда нужен кропотливый анализ, проверка и подтверждение фактами, сбор дополнительной информации, разведка. Но сегодня кое-что интересное мы вам поведаем.Одной из наших задач было: выявить среди десятков тысяч посетителей зеркал того одного, который зашёл с целью выявить «противоправную информацию» и сообщить об этом в Роскомнадзор / добавить в «запретный реестр». Речь не просто о том, чтобы выявить тех, кто проверяет доступность информации и заблокировать их / показывать им котят. Речь, по сути, о сборе разведывательной информации: каким образом они проверяют сайты — руками или автоматизированным скриптом; «щёлкают» ли они при проверке остальные страницы сайта на всякий случай, анализируя информацию на них; как часто они заходят на проверяемый сайт, в какое время; насколько они специалисты в техническом плане, где их слабые места и т.д. Мы знаем всё о том, как реализуется блокировка сайтов из реестра со стороны провайдеров, знаем сильные и слабые стороны этих механизмов (благодаря чему нами и была продемонстрирована возможность атаки заблокированным ресурсом), но вот механизм работы с реестром со стороны Роскомнадзора для нас был тогда чёрным ящиком. Тогда мы придумали как промаркировать всех пользователей: сделать wildcard-поддомен (т.е. ссылка любой.поддомен.fuckrkn.me приводила на актуальное зеркало).Мы сделали, чтобы при заходе на «большую красную кнопку» пользователю генерировался новый, уникальный поддомен на *.fuckrkn.me, после чего в логах веб-сервера можно было легко найти пользователя по этому уникальному маркеру — поддомену, сгенерированному специально для него.
скрин — прим. редактора
Казалось бы, нам оставалось ждать, когда очередное зеркало попадёт в реестр, а потом смотреть логи. Но оставался один важный вопрос. Это был первый опыт, когда Роскомнадзору в теории нужно было «забанить» не один основной домен, а неограниченное кол-во поддоменов (не трогая при этом основной fuckrkn.me). Мы не знали как поступит РКН, знали только что текущий формат реестра не позволяет вносить в него «маски», можно вносить только конкретные URL-адреса. Но Роскомнадзор всё равно мог что-то придумать и разом «бахнуть» все поддомены, и тогда мы бы потеряли нашу возможность собрать ценную разведывательную информацию.
Чтобы уменьшить такой риск, мы решили «сделать вид», что работает не любой поддомен, а определённый список якобы заранее созданных поддоменов. Нам нужно было создать ощущение у «специалистов» Роскомнадзора, что они зашли на не уникальный поддомен (адрес зеркала блога Навального), а общий для всех адрес. Для этого мы вбросили, вывели в паблик тему с созданием «персональных поддоменов» на зеркалах, а чтобы пользователи их с бОльшим удовольствием пиарили (Роскомнадзор в первую очередь банит именно те зеркала, которые больше всего пиарятся), приписали их известным лицам:
Другие Тему с удовольствием поддержали ТОПы: А следом за ними и пользователи начали «создавать» свои поддомены-зеркала на нашем *.fuckrkn.me и пиарить их. Тем самым мы сильно уменьшили риск, описанный выше. Также у нас существовала проблема, что ТОПы постоянно постили в своих ЖЖ и твиттерах ссылки не на главную страницу с кнопкой зеркала (navalny.us), а на конкретное, уникальное для них зеркало (а-ля blablabla.fuckrkn.me). А благодаря вброшенной теме с «персонализированными зеркалами» (makarenko.fuckrkn.me, pekhtin.fuckrkn.me и т.д.), все посетители зеркала заходили не на одно зеркало, а на множество распиаренных. И тут уже шанс «затеряться в толпе» у «специалистов» Роскомнадзора становился гораздо меньше (что и случилось, например, с адресом зеркала makarenko.fuckrkn.me).
К счастью, ждать результатов пришлось недолго — в реестр начали один за другим попадать адреса зеркал на *.fuckrkn.me. К ещё большему нашему счастью, Роскомнадзор не догадался о wildcard-поддомене и внёс в реестр уникальные адреса зеркал, на которые заходили только они. Тем самым мы получили полную информацию как они заходят на сайты, которые планируют забанить, что на них делают, что смотрят, откуда переходят и т.д. Для большей достоверности, мы подождали относительно долгое время, чтобы как можно больше таких зеркал попало в реестр и мы сравнили логи. Теперь мы можем говорить со 100%-ой уверенностью: по всем тем забаненным зеркалам были абсолютно идентичные заходы с одних и тех же IP, в одном и том же порядке, и т.д. Эти заходы присутствовали в логах всех забаненных зеркал.
Итак, как же был устроен процесс выявления и проверки «плохих» сайтов с обратной стороны, со стороны Роскомнадзора в нашем примере? В логах всех забаненных зеркал содержалась одна и та же последовательность действий. Первое обращения шло на адрес navalny.us с IP-адреса 109.188.125.89 (Yota). По заголовку User-agent было видно, что человек заходит с мобильного браузера Safari, с айфона. Примечание: в логах время стоит «как на сервере». Чтобы получить московское время, просто прибавьте 4 часа к времени, указанному в логе.
109.188.125.89 - - [03/Apr/2014:07:32:10 +0000] 3zcb.fuckrkn.me "GET / HTTP/1.1" 412 223166 "http://navalny.us/" "Mozilla/5.0 (iPhone; CPU iPhone OS 7_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D167 Safari/9537.53" "-" Спустя некоторое количество секунд (обычно порядка 30), на адрес зеркала заходили уже с IP-адреса 194.165.23.2. Этот IP-адрес принадлежит подсети Главного радиочастотного центра — это подведомственное предприятие Роскомнадзора. 194.165.23.2 - - [03/Apr/2014:07:32:26 +0000] 3zcb.fuckrkn.me "GET / HTTP/1.1" 302 356 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" Дальше начинается самое интересное: вал запросов с IP-адреса 77.37.208.110. Самый первый из этих запросов — получение WHOIS-данных адреса зеркала через сервис http://1whois.ru/ (это нужно, чтобы определить на кого зарегистрирован домен, получить контактные e-mail-адреса владельца и отослать ему требование об удалении информации).
77.37.208.110 - - [03/Apr/2014:07:48:42 +0000] 3zcb.fuckrkn.me "GET / HTTP/1.0" 200 110960 "http://1whois.ru/?url=3zcb.fuckrkn.me" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" Следующие запросы с этого же IP-адреса особенно странные:
77.37.208.110 - - [03/Apr/2014:07:48:43 +0000] 3zcb.fuckrkn.me "GET //web.config HTTP/1.0" 404 6673 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:43 +0000] 3zcb.fuckrkn.me "GET //kreotonsystems.php HTTP/1.0" 404 6697 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:44 +0000] 3zcb.fuckrkn.me "GET //wp-login.php HTTP/1.0" 404 6679 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:44 +0000] 3zcb.fuckrkn.me "GET //favicon.ico HTTP/1.0" 200 5663 "http://1whois.ru/?url=3zcb.fuckrkn.me" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:44 +0000] 3zcb.fuckrkn.me "GET //scripts/drupal.sh HTTP/1.0" 404 6700 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:45 +0000] 3zcb.fuckrkn.me "GET // HTTP/1.0" 200 7359 "http://1whois.ru/?url=3zcb.fuckrkn.me" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:45 +0000] 3zcb.fuckrkn.me "GET //joomla.xml HTTP/1.0" 404 6673 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:45 +0000] 3zcb.fuckrkn.me "GET //libraries/joomla/index.html HTTP/1.0" 404 6736 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:46 +0000] 3zcb.fuckrkn.me "GET //i/admin/yandexmoneylogo_small.gif HTTP/1.0" 404 6754 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:46 +0000] 3zcb.fuckrkn.me "GET //textpattern/textpattern.css HTTP/1.0" 404 6730 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:47 +0000] 3zcb.fuckrkn.me "GET //bitrix/js/main/core/css/core_admin.css HTTP/1.0" 404 6787 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:47 +0000] 3zcb.fuckrkn.me "GET //bitrix/themes/.default/compatible.css HTTP/1.0" 404 6772 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:48 +0000] 3zcb.fuckrkn.me "GET //wp-admin/ms-users.php HTTP/1.0" 404 6712 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:48 +0000] 3zcb.fuckrkn.me "GET //config.core.php HTTP/1.0" 404 6688 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:48 +0000] 3zcb.fuckrkn.me "GET //manager/includes/config.inc.php HTTP/1.0" 404 6748 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:49 +0000] 3zcb.fuckrkn.me "GET //e107_admin/index.php HTTP/1.0" 404 6709 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:49 +0000] 3zcb.fuckrkn.me "GET //up/watermark.png HTTP/1.0" 404 6697 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:50 +0000] 3zcb.fuckrkn.me "GET //jscript/sbMenu.js.php HTTP/1.0" 404 6712 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:50 +0000] 3zcb.fuckrkn.me "GET //Admin/adminzone.css HTTP/1.0" 404 6706 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:51 +0000] 3zcb.fuckrkn.me "GET //adm/style/admin.css HTTP/1.0" 404 6712 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:51 +0000] 3zcb.fuckrkn.me "GET //db/mssql-odbc.php HTTP/1.0" 404 6700 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:52 +0000] 3zcb.fuckrkn.me "GET //img/nethouse_icon_bg_hover.png HTTP/1.0" 404 6739 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:52 +0000] 3zcb.fuckrkn.me "GET //engine/lib/external/html5shiv.js HTTP/1.0" 404 6757 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:53 +0000] 3zcb.fuckrkn.me "GET //hostcmsfiles/ajax/JsHttpRequest.js HTTP/1.0" 404 6757 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:53 +0000] 3zcb.fuckrkn.me "GET //admin/456 HTTP/1.0" 404 6676 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:54 +0000] 3zcb.fuckrkn.me "GET //include/inc_act/act_addchat.php HTTP/1.0" 404 6748 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:54 +0000] 3zcb.fuckrkn.me "GET //templates/banned.tpl HTTP/1.0" 404 6709 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:07:48:56 +0000] 3zcb.fuckrkn.me "GET //components/actions/frontend.php HTTP/1.0" 404 6748 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" По запросам понятно, что автоматизированный скрипт пытается определить на каком движке стоит сайт. Зачем это нужно, какой практический смысл несёт определение движка сайта в ситуации с блокировками — непонятно. Ещё через некоторое количество секунд на адрес зеркала заходят уже одновременно с двух IP-адресов: 188.254.8.42 (это провайдер Ростелеком, через который ходит в интернет Радиочастотный центр) и через VPN с IP-адреса 85.114.141.191 (после того, как мы это выявили и забанили их VPN, они начали на этом этапе заходить на адрес зеркала через сервис hidemyass.com). Причём как видно по логам, обращения чередуются друг за другом с этих двух адресов (т.е. человек смотрит, что заблокировано для российских пользователей, а что доступно остальным и сравнивает):
188.254.8.42 - - [03/Apr/2014:07:50:54 +0000] 3zcb.fuckrkn.me "GET / HTTP/1.1" 302 356 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 85.114.141.191 - - [03/Apr/2014:07:51:13 +0000] 3zcb.fuckrkn.me "GET // HTTP/1.1" 200 47178 "http://" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "4.79" 188.254.8.42 - - [03/Apr/2014:07:52:37 +0000] 3zcb.fuckrkn.me "GET / HTTP/1.1" 302 356 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0" "-" 85.114.141.191 - - [03/Apr/2014:07:52:44 +0000] 3zcb.fuckrkn.me "GET //navalny/__rpc_ctxpopup?user=&userid=0&userpic_url=http%3A%2F%2Fl-userpic.livejournal.com%2F44724520%2F10064515&mode=getinfo&_=1396511562609 HTTP/1.1" 200 2755 "http://" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 188.254.8.42 - - [03/Apr/2014:07:53:59 +0000] 3zcb.fuckrkn.me "GET / HTTP/1.1" 302 356 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0" "-" Дальше снова происходит запрос с IP-адреса 77.37.208.110 на получение WHOIS-данных: 77.37.208.110 - - [03/Apr/2014:08:01:26 +0000] 3zcb.fuckrkn.me "GET / HTTP/1.0" 200 110960 "http://1whois.ru/?url=3zcb.fuckrkn.me" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" Потом снова попытка определить движок сайта: 77.37.208.110 - - [03/Apr/2014:08:01:27 +0000] 3zcb.fuckrkn.me "GET //web.config HTTP/1.0" 404 6673 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:27 +0000] 3zcb.fuckrkn.me "GET //kreotonsystems.php HTTP/1.0" 404 6697 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:28 +0000] 3zcb.fuckrkn.me "GET //wp-login.php HTTP/1.0" 404 6679 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:28 +0000] 3zcb.fuckrkn.me "GET //wp-admin/ms-users.php HTTP/1.0" 404 6712 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:28 +0000] 3zcb.fuckrkn.me "GET // HTTP/1.0" 200 7358 "http://1whois.ru/?url=3zcb.fuckrkn.me" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:29 +0000] 3zcb.fuckrkn.me "GET //scripts/drupal.sh HTTP/1.0" 404 6700 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:29 +0000] 3zcb.fuckrkn.me "GET //joomla.xml HTTP/1.0" 404 6673 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:29 +0000] 3zcb.fuckrkn.me "GET //libraries/joomla/index.html HTTP/1.0" 404 6749 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:30 +0000] 3zcb.fuckrkn.me "GET //i/admin/yandexmoneylogo_small.gif HTTP/1.0" 404 6754 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:31 +0000] 3zcb.fuckrkn.me "GET //textpattern/textpattern.css HTTP/1.0" 404 6730 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:31 +0000] 3zcb.fuckrkn.me "GET //favicon.ico HTTP/1.0" 200 5662 "http://1whois.ru/?url=3zcb.fuckrkn.me" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:31 +0000] 3zcb.fuckrkn.me "GET //bitrix/js/main/core/css/core_admin.css HTTP/1.0" 404 6787 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:32 +0000] 3zcb.fuckrkn.me "GET //bitrix/themes/.default/compatible.css HTTP/1.0" 404 6772 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:32 +0000] 3zcb.fuckrkn.me "GET //config.core.php HTTP/1.0" 404 6688 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:33 +0000] 3zcb.fuckrkn.me "GET //manager/includes/config.inc.php HTTP/1.0" 404 6748 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:33 +0000] 3zcb.fuckrkn.me "GET //e107_admin/index.php HTTP/1.0" 404 6709 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:33 +0000] 3zcb.fuckrkn.me "GET //up/watermark.png HTTP/1.0" 404 6697 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:34 +0000] 3zcb.fuckrkn.me "GET //jscript/sbMenu.js.php HTTP/1.0" 404 6712 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:35 +0000] 3zcb.fuckrkn.me "GET //Admin/adminzone.css HTTP/1.0" 404 6706 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:35 +0000] 3zcb.fuckrkn.me "GET //adm/style/admin.css HTTP/1.0" 404 6712 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:36 +0000] 3zcb.fuckrkn.me "GET //db/mssql-odbc.php HTTP/1.0" 404 6700 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:36 +0000] 3zcb.fuckrkn.me "GET //img/nethouse_icon_bg_hover.png HTTP/1.0" 404 6739 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:37 +0000] 3zcb.fuckrkn.me "GET //engine/lib/external/html5shiv.js HTTP/1.0" 404 6770 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:37 +0000] 3zcb.fuckrkn.me "GET //components/actions/frontend.php HTTP/1.0" 404 6748 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:38 +0000] 3zcb.fuckrkn.me "GET //hostcmsfiles/ajax/JsHttpRequest.js HTTP/1.0" 404 6757 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:38 +0000] 3zcb.fuckrkn.me "GET //admin/456 HTTP/1.0" 404 6676 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:39 +0000] 3zcb.fuckrkn.me "GET //include/inc_act/act_addchat.php HTTP/1.0" 404 6748 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" 77.37.208.110 - - [03/Apr/2014:08:01:40 +0000] 3zcb.fuckrkn.me "GET //templates/banned.tpl HTTP/1.0" 404 6709 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" Напоследок снова заходит с рабочего компьютера: 188.254.8.42 - - [03/Apr/2014:08:03:06 +0000] 3zcb.fuckrkn.me "GET / HTTP/1.1" 302 356 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36" "-" Дальше обращения к зеркалу (конкретно по данному адресу, в приведённом примере это 3zcb.fuckrkn.me) прекращаются и через несколько часов или день это зеркало попадает в реестр Роскомнадзора. И так было и есть со всеми забаненными зеркалами. Одна и та же последовательность. Полный access.log по приведённому примеру.Посмотрев информацию по IP-адресу 77.37.208.110, мы выяснили что на нём находится сайт kreoton.com. Ещё более интересная информация нашлась по адресу http://77.37.208.110/admin/ — похоже что по нему находится админка того самого скрипта. Погуглив информацию по «компании» Kreoton, мы выяснили, что это название ассоциировано только с одним человеком: Борисом Поповым.
Кто такой Борис Попов?
Относительно первые упоминания в сети об этом человеке можно найти за 2005-ый год, когда он появился на различных форумах программистов и начал пиарить свою «операционную систему» Miraculix, которую он тогда писал на ассемблере (довольно характерное для начала 2000-ых увлечение, тогда многие писали подобные свои «велосипеды»). И хотя до уровня ReactOS Miraculix не доросла, всё же по уровню это был не какой-нибудь BolgenOS (который, как мы знаем, оказался просто переименованным Линуксом). Уже тогда Борис именовал себя как «Kreoton Development Group», хотя в некоторых старых его интервью он признавал, что никакого «девелопмент групп» там нет, в действительности он занимается проектом в одиночку. Дальше появляется сервис 1whois.ru (в числе прочего, например, умеет сканировать удалённые порты), а недавно — сервис «Ревизор», который включает в себя функционал кейлоггера, удалённого управления компьютером, слежение за компьютером и многое другое.
Тут уместно задастся вопросом: как связан Борис с радиочастотным центром, подведомственным предприятием Роскомнадзора? Ведь каким-то образом он же заходит с IP-адресов, принадлежащих радиочастотному центру. На ум приходит очевидная мысль: он является сотрудником радиочастотного центра. Если мы попробуем поискать среди руководства радиочастотного центра, Минкомсвязи и Роскомнадзора однофамильцев Бориса, то по информации от 2005-2006-ых годов мы увидим Попова Александра Константиновича, на момент 2005-го года являющегося заместителем генерального директора ФГУП «Радиочастотный центр ЦФО». По информации от 2010-го года можно найти Попова Александра Николаевича, который на тот момент является начальником одного из управлений Главного радиочастотного центра. А в годовом отчёте Минкомсвязи за 2010-ый год есть ещё и Попов Александр Борисович — директор департамента проектного управления. Явно кому-то из этих Поповых Александров Борис приходится родственником.
К тому же, если мы сравним мы сайты «Радиочастотного центра ЦФО», старый дизайн сайта kreoton.com, который есть в архиве, сайт miraculix.ru, сайт ревизора, то заметим множество схожих деталей: примерно один «уровень» дизайна, местами одинаковые иконки и даже именование файлов, одинаковый стиль вёрстки сайтов (много табличной вёрстки, устаревших тегов).
Мы считаем, что весь комплекс этих фактов указывает на то, что в данный момент Борис Попов является сотрудником радиочастотного центра, а в своей работе использует свои старые наработки, скрипты, установленные на принадлежащих ему серверах.
Ещё один очень важный момент У нас есть очень-очень отдалённые подозрения, что Борис Попов причастен к DDoS-атакам на наши сервера. Почему у нас такие подозрения возникли? Во-первых, уровень знаний соответствует — человек писал некоторое подобие зародыша операционной системы, сервис, сканирующий порты, программы, удалённо управляющие компьютером, прослушивающие его. При этом до уровня высококлассного специалиста он явно не дорос: в крупных проектах не замечен, в каких-то сложных IT-шных обсуждениях как хороший специалист себя не проявлял. Аналогично и DDoS-атака на наши зеркала была далеко не самого профессионального уровня, это скорее «начальный профессиональный уровень», под который подходит Борис и который мы с лёгкостью отбивали.
Второй момент. Для своей работы по проверке «плохих» сайтов Борис (либо другие сотрудники Радиочастотного центра или Роскомнадзора) пользовался VPN с IP-адреса 85.114.141.191. При этом среди 2 000 атаковавших нас машин две были с IP-адресами из той же подсети (т.е. принадлежали тому же хостингу): 85.114.142.168 и 85.114.142.172. Да, 2 адреса из чуть более чем 2 000 — это несерьёзно, но именно поэтому я в самом начале написал, что у нас очень-очень отдалённые подозрения.
И ещё один важный момент Через какое-то время после начала DDoS-атаки, когда было понятно, что она нас завалить не сможет и мы легко отбиваемся, началась атака на наши зеркала другого типа. Множество ботов (заражённых машин) начали выполнять однотипные запросы к нашим зеркалам, запрашивая адрес вида "/navalny/__rpc_get_thread?journal=naval<wbr />ny&itemid=921169&flat=&skip=&page=2&_=1396546836669" со скоростью 10 запросов в секунду. Цель атаки состояла в том, чтобы сервера наших зеркал отдавали информацию в ответ не из кэша, а каждый раз запрашивали её с серверов livejournal. А с учётом кол-ва таких запросов, наши сервера быстро выходили за ограничения livejournal и уже сам ЖЖ банил нас. В самом начале эта атака удалась, но мы быстро выявили её и пресекли.
Самое интересное здесь то, что среди прочих адресов, эти боты долбились в том числе на попавшие в реестр адреса зеркал. Те самые, где кроме посещений Бориса, больше никого не было (а сами по себе боты эти адреса узнать не могли, потому что они уникальны). Это уже более веское основание для подозрений.
Кое-какие другие результаты нашей деятельности Когда реестр только-только заработал, многие указывали на его несовершенство в той части, что заблокированному ресурсу достаточно сменить IP и всё, он уже вне блокировки. Таким способом пользовались Lurkmore, Википедия и другие. Из-за этого Роскомнадзор вскоре приказал провайдерам при фильтрации резолвить (определять текущий IP) адрес «плохого» сайта, чтобы фильтровать актуальный IP и не дать ресурсу избежать блокировки путём смены IP. Это, в свою очередь, создало возможность атаки заблокированным ресурсом, которую мы продемонстрировали несколько раз, в результате чего Роскомнадзор вынужден был «отступить» и теперь приказал провайдерам при фильтрации больше не резолвить адрес ресурса и блокировать только тот IP, который указан в реестре. В итоге мы заставили РКН вернуть «защищённость» механизма блокировки на прежний уровень, когда заблокированному ресурсу зачастую достаточно сменить IP, чтобы выйти из-под блокировки.
Также можем сказать, что из более чем 2 000 атаковавших нас машин, многие были с российскими IP-адресами. Очевидно, что это заражённые компьютеры пользователей. Для выявления и установления таких пользователей (у нас имеются их IP-адреса) к работе с нами подключился один из интернет-гигантов, пока не на уровне компании, а на уровне отдельных сотрудников. Посмотрим, что из этого выйдет.