Исследование периметра партнёрки по установке Adware (КЕЙС)
Сегодня мы с вами поковыряем сервер, который распространяет нежелательное ПО и является причиной спама. Веб-мастера сразу поймут фразу «даунлод трафик» — это когда вместо ссылки на файл вам предлагается скачать исполнимый (.exe) файл, после запуска которого вы получаете дополнительно полтора десятка ярлыков и прочий трудно вычищаемый мусор. Даже при попытке скачать такой файл, вас заставляют согласиться на Push подписки (спам), и попутно рекламируют казино и прочие иксбэты.
При всей мерзости подобных «партнёрских программ», чтобы не выходить за рамки закона, мы ограничимся сбором информации и исследованием периметра. Тем не менее, на мой взгляд, получился довольно интересный кейс.
Самое интересное — это раскрытие реального IP адреса за, казалось бы, абсолютно непробиваемой защитой CloudFlare. Когда я пытался определить реальный IP адрес, было ощущение, что админ прочитал все статьи про раскрытие IP за CloudFlare и сделал всё как надо. Действительно — с помощью популярных инструментов это сделать не удалось.
Как всё началось
Началось всё с этого комментария:
Я вначале подумал, что это целевая атака — троян, который бы украл пароли и прочее с моего компьютера. Я уже начал освежать в голове Ассемблер и обратный инжиниринг, но VirusTotal показал, что это банальное Adware (рекламное, нежелательное ПО):
Сайт с вредоносным файлом
Сайт произвёл двоякое впечатление — с одной стороны, сразу же нашлась XSS уязвимость, то есть как будто бы всё сделано второпях и на коленке (https://failsame.ru/report/?url=failsame.ru%2Ffile%2F275e62%22%3E%3Cscript%3Ealert(%27We%20got%20XSS%27)%3C/script%3E):
Но, с другой стороны, для скачивания файла задействовалось ещё два домена и показывалась характерная реклама — то есть не совсем творчество ШКОЛОЛО.
Изменяя значения параметров можно получить разные типы файлов (например, установочный файл для мобильного телефона):
curl 'https://failsame.ru/?action=link_open' -d 'fid=47779&type=1' curl 'https://failsame.ru/?action=link_open' -d 'fid=47779&type=2' curl 'https://failsame.ru/?action=link_open' -d 'fid=47779&type=3'
Ошибок, типичных для SQL инъекции, не показывалось:
curl 'https://failsame.ru/?action=link_open' -d 'fid=47779"&type=3' curl 'https://failsame.ru/?action=link_open' -d "fid=47779'&type=3"
Если в качестве значения type указать что-то иное, кроме 1, 2 или 3, то сервер ничего не отвечал на такой запрос.
Смотрите также «Как анализировать POST запросы в веб-браузере».
Анализ исходного кода позволил найти ещё одну форму ввода: https://failsame.ru/abuse/?url=failsame.ru%2Ffile%2F275e62, а также несколько JavaScript скриптов.
Смотрите также «Обход запрета показа исходного HTML кода, обход социальных блокировщиков и других мер противодействия сбору информации о сайте».
Поиск скрытых файлов
Одновременно с изучением сайта, запустил lulzbuster для поиска интересных файлов и папок на сайте:
lulzbuster -s https://failsame.ru/ -w /usr/share/lulzbuster/lists/big.txt
Смотрите также инструкцию «lulzbuster – инструмент для быстрого поиска скрытых файлов и папок на сайтах».
Среди результатов оказались весьма интересные:
[*] 403 | 294B | 294B | 1.000149s | https://failsame.ru/cgi-bin/ [*] 200 | 691B | 691B | 0.997966s | https://failsame.ru/cgi-bin/awstats.pl [*] 403 | 294B | 294B | 0.771629s | https://failsame.ru/php-bin/ [*] 200 | 10K | 10736B | 1.474265s | https://failsame.ru/phpmyadmin/ [*] 200 | 302B | 302B | 0.085564s | https://failsame.ru/robots.txt [*] 301 | 315B | 315B | 0.996312s | https://failsame.ru/roundcube [*] 200 | 7B | 7B | 3.013992s | https://failsame.ru/test.php [*] 401 | 458B | 458B | 0.853156s | https://failsame.ru/webstat/
К примеру, на сайте обнаружен phpmyadmin:
Поскольку пароль и даже имя пользователя я не знаю, то получил ошибки:
#1045 - Access denied for user 'root'@'172.17.0.1' (using password: YES) mysqli_real_connect(): (HY000/1045): Access denied for user 'root'@'172.17.0.1' (using password: YES)
Я не зря сделал попытку входа — я получил IP адрес 172.17.0.1, правда, в настоящий момент от него нет никакого толку: это локальный IP. Причём довольно характерный для Docker. То есть даже если я найду настоящий IP адрес сервера, весьма вероятно, что служба MySQL прослушивает только локальный (или loopback) интерфейс и недоступна из Глобальной сети.
Кстати, перейдём к определению настоящего IP сайта.
Поиск прямого IP сайта за CloudFlare
Я воспользовался всем арсеналом, описанным в статьях:
- Как узнать, сайт за CloudFlare или нет
- Обход файерволов веб приложений Cloudflare, Incapsula, SUCURI
- Как узнать настоящий IP сайта в Cloudflare
Но ни Bypass firewalls by abusing DNS history:
bypass-firewall-dns-history -d failsame.ru
Ни даже CloudFail — результатов не дали:
sudo cloudfail -t failsame.ru
Modus operandi: находим всю сетку однотипных сайтов
Вспоминаем про modus operandi — люди обычно действуют однотипно. Поэтому берём фразу с сайта, помещаем её в двойные кавычки и ищем в Гугл (там орфографическая ошибка, но нужно оставить как есть):
"Если у вас возникла ошибка при скачивание файла, пожалуйста сделайте скриншот и загрузите его сюда»
Сразу находим всю сетку сайтов:
Кстати, смотрите также:
Доменов там очень много, я выборочно попробовал некоторые из них, но ни один не «раскололся» и не раскрыл настоящий IP адрес сервера.
Находим главный сайт
Я заглянул в файл https://failsame.ru/robots.txt (он нашёлся с помощью lulzbuster, но мог бы найтись и с помощью Nikto, либо вообще без сторонних программ — это типичный файл для каждого сайта).
И увидел там:
User-agent: * Disallow: /?page=login Disallow: /?page=registration Disallow: /search/ Disallow: /cart/ Disallow: */?s= Disallow: *sort= Disallow: *view= Disallow: *utm= Allow: /?page=login Allow: /?page=registration Crawl-Delay: 5 Sitemap: https://file-mix.com/sitemap.xml Host: https://file-mix.com
Напомню, это файл домена failsame.ru, а в файле robots.txt упоминается домен file-mix.com. Оказалось, что это и есть главный сайт. И наконец всё стало на свои места:
- это файлообменник, который вместо исходного файла выдаёт .exe файл
- там можно зарегистрироваться в качестве распространителя файлов и пытаться на этом что-то заработать, размещая спам. Либо пытаться заработать на рефералах, рассказывая истории, «как я вчера вывел 4000»
Анализ этого файла тоже не дал результатов и я решил пойти на трюк с почтой — суть в том, что сервер присылает нам письмо, например, для подтверждения email адреса, а мы смотрим IP адрес отправившего сервера. Письмо для подтверждения не высылается, но письмо для восстановления пароля пришло.
Использование email для раскрытия IP адреса за CloudFlare
Вы можете прочитать статью «Анализ email» чтобы понять, что именно можно узнать по присланному электронному письму.
Я воспользовался помощью онлайн сервиса «Извлечение всей информации из e-mail письма» и получил следующее:
Email прошёл через почтовые узлы: file-mix.com ([2a01:4f8:172:1441::2]) -> mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) -> mx.google.com -> Delivered-To: proghoster@gmail.com Email содержит: MIME-parts in this message: 1 text/html [] (2.4 kB)
В качестве источника указан домен file-mix.com, а в качестве его IP указан IPv6 адрес 2a01:4f8:172:1441::2.
У сайта нет IP адреса, а есть только IPv6?
Если ещё не видели, то смотрите статьи:
- Введение в IPv6 адреса: как пользоваться и как исследовать сеть (часть 1)
- Введение в IPv6 адреса: как пользоваться и как исследовать сеть (часть 2)
Делаю проверку, работает ли целевой сайт на IPv6 2a01:4f8:172:1441::2
curl [2a01:4f8:172:1441::2] -H 'Host: file-mix.com'
Я получил ошибку:
curl: (7) Couldn't connect to server
поскольку у моего текущего Интернет-провайдера отсутствует поддержка IPv6.
Я нашёл сервер с IPv6 и всё-таки проверил. К сожалению, вместо заглавной страницы целевого сайта я увидел исходный код дефолтной страницы веб-сервера Apache HTTP на Debian.
То есть сайт имеет какой-то другой IP или IPv6 адрес.
Не забываем проверить и HTTPS протокол:
curl [2a01:4f8:172:1441::2]:443 -H 'Host: file-mix.com'
Там также «Apache2 Debian Default Page: It works».
Пробуем просканировать открытые порты программой Nmap:
sudo nmap -6 2a01:4f8:172:1441::2
Получил:
setup_target: failed to determine route to 2a01:4f8:172:1441::2 WARNING: No targets were specified, so 0 hosts scanned.
А, чёрт, у меня же нет IPv6!!!
Я воспользовался онлайн сервисом «Сканирование открытых портов IPv6 адреса»: https://suip.biz/ru/?act=nmap-ipv6
Результат:
PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 25/tcp open smtp 53/tcp open domain 80/tcp open http 443/tcp open https 465/tcp open smtps 587/tcp open submission 53/udp open domain 123/udp open ntp
Результат дал повод для некоторого оптимизма.
DNS запросы к серверу на IPv6
Когда сайт прячется за CloudFlare, то он использует сервера имён CloudFlare, которые не показывают реальные IP сайта и не разрешают ANY в DNS запросах. К примеру:
dig file-mix.com ANY
вернёт:
file-mix.com. 3788 IN HINFO "RFC8482" ""
Попытка узнать IP адрес почтового субдомена mail.*:
dig mail.file-mix.com
Также не вернёт ничего полезного:
file-mix.com. 1799 IN SOA lynn.ns.cloudflare.com. dns.cloudflare.com. 2032284449 10000 2400 604800 3600
Смотрим MX записи:
dig file-mix.com MX
Результат:
file-mix.com. 299 IN MX 10 emx.mail.ru.
Смотрим TXT записи:
dig file-mix.com TXT
Результат:
file-mix.com. 299 IN TXT "ca3-8a88c11989fb426eaa9c8d677381d258" file-mix.com. 299 IN TXT "v=spf1 redirect=_spf.mail.ru"
Запись SOA:
dig file-mix.com SOA
также не дала ничего полезного:
file-mix.com. 3599 IN SOA lynn.ns.cloudflare.com. dns.cloudflare.com. 2032284449 10000 2400 604800 3600
Мы лишний раз убедились, что CloudFlare прячет настоящие DNS записи. Но мы знаем IPv6 адрес сервера, который имеет какое-то отношение целевому сайту. И на этом сервере запущен DNS сервер. Сделаем запрос к этому DNS по интересующему нас сайту:
dig +nocomments file-mix.com @2a01:4f8:172:1441::2 ANY
И бинго, DNS сервер сдал всех:
; <<>> DiG 9.16.1 <<>> +nocomments file-mix.com @2a01:4f8:172:1441::2 ANY ;; global options: +cmd ;file-mix.com. IN ANY file-mix.com. 3600 IN A 138.201.59.125 file-mix.com. 3600 IN SOA file-mix.com. root.example.com. 2019120315 3600 3600 604800 86400 file-mix.com. 3600 IN NS ns2.example.com. file-mix.com. 3600 IN NS ns1.example.com. file-mix.com. 3600 IN TXT "v=spf1 ip4:138.201.73.238 a mx ~all" file-mix.com. 3600 IN MX 10 mail.file-mix.com. file-mix.com. 3600 IN MX 20 mail.file-mix.com. mail.file-mix.com. 3600 IN A 138.201.73.238 ;; Query time: 39 msec ;; SERVER: 2a01:4f8:172:1441::2#53(2a01:4f8:172:1441::2) ;; WHEN: Tue Apr 14 09:06:58 MSK 2020 ;; MSG SIZE rcvd: 243
Мы получаем сразу 2 IP адреса:
- 138.201.59.125 (сам сайт)
- 138.201.73.238 (почтовый сервер)
Эти строки говорят о том, что настройка не завершена:
- root.example.com
- ns2.example.com
- ns1.example.com
Не забудем домен, с которого всё началось failsame.ru:
dig +nocomments failsame.ru @2a01:4f8:172:1441::2 ANY
Ничего не нашлось.
Также проверим почтовый домен:
dig +nocomments mail.file-mix.com @2a01:4f8:172:1441::2 ANY
Подтверждаем, что найден настоящий IP сайта
Делаем проверку:
curl 138.201.59.125 -H 'Host: file-mix.com'
В ответе видим исходный код file-mix.com.
Веб сервер на 138.201.73.238 показывает какой-то тестовый сайт, попробуем вызвать ошибку:
curl 138.201.73.238:443
Получаем:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>400 Bad Request</title> </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> Reason: You're speaking plain HTTP to an SSL-enabled server port.<br /> Instead use the HTTPS scheme to access this URL, please.<br /> </p> <hr> <address>Apache/2.4.25 (Debian) Server at fail-space.ru Port 443</address> </body></html>
В ошибке упоминается домен fail-space.ru, то есть на этом веб-сервере обслуживается данный сайт.
Ищем соседей IPv6 адреса
При аренде VPS сервера обычно IPv6 выдаются последовательно, поэтому есть смысл попробовать просканировать небольшую подсеть:
sudo nmap -6 2a01:4f8:172:1441::/112
Для чего нужно раскрытие реального IP сайта
CloudFlare — это прослойка между сайтом и пользователем, которая ещё выполняет функции файлового файервола и фильтр ботов. Через CloudFlare можно получить доступ только к веб-серверу и невозможно узнать, какие ещё службы запущены на целевом сервере. Теперь, когда мы знаем настоящие IP адреса, мы можем выполнить полноценное сканирование служб:
sudo nmap -p- 138.201.59.125
Дало следующие результаты:
Host is up (0.66s latency). Not shown: 65522 closed ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 25/tcp open smtp 53/tcp open domain 80/tcp open http 110/tcp open pop3 143/tcp open imap 443/tcp open https 465/tcp open smtps 587/tcp open submission 993/tcp open imaps 995/tcp open pop3s 1500/tcp open vlsi-lm
Сканирование второго IP адреса:
sudo nmap -p- 138.201.73.238
Дало следующие:
Host is up (0.35s latency). Not shown: 65523 closed ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 25/tcp open smtp 53/tcp open domain 80/tcp open http 110/tcp open pop3 143/tcp open imap 443/tcp open https 465/tcp open smtps 587/tcp open submission 993/tcp open imaps 995/tcp open pop3s
Итак, в дополнении к phpMyAdmin и roundcube, ссылки на которые мы нашли ранее, в нашем распоряжении для брут-форса и эксплуатации службы:
- FTP
- SSH
- SMTP(S)
- POP3(S)
- IMAP(S)
Ну и вход в панельку на 1500 порту (isp manager): http://138.201.59.125:1500 (кстати, https://file-mix.com:1500 не работает!).
В общем, развлечений на целый вечер!
Анализ трофеев
Как я сказал, мы ограничимся анализом периметра, но это не означает, что у нас нет трофеев! Трофеи есть!
Инструмент lulzbuster дал нам интересную ссылку https://failsame.ru/cgi-bin/awstats.pl, которая выдаёт ошибку 403:
Forbidden You don't have permission to access /cgi-bin/ on this server.
При анализе домена file-mix.com:
lulzbuster -s https://file-mix.com/ -w /usr/share/lulzbuster/lists/big.txt
найдена похожая ссылка https://file-mix.com/cgi-bin/awstats.pl, а там:
А там статистика с доступом без пароля. Анализ поисковых запросов даёт нам ссылки на сброс пароля (я не знаю как объяснить этот факт, но реально многие люди в поиск Google и Яндекс вбивают URL сайта и переходят по предлагаемой ссылке):
Анализ рефереров позволяет оценить способы «раскрутки» (это сайты для накрутки социальных сигналов и выполнения копеечных заданий вроде «введи такую-то строку в поиске, открой такой-то сайт из выдачи»):
- http://socfactor.ru
- http://go.seosprint.net/surf
- https://zismo.biz/go/go.php
- http://freetraf.ru/go.php
Также трафик из tgraph.io (Телеграмм), где доверчивым школьникам рассказывают, как «я вчера вывел 4000» и «заработок в Интернете ничего не умея»:
Там же ссылки с «хакерских» форумов из «даркнета», где школоло показывает друг другу «хитрые схемы заработка».
В общем спам, треш, ещё раз спам, «бесплатной слитое видео за 3000 со схемой заработка», вновь спам и полный треш, идиотские Телеграмм каналы с копипастой из Интернета и рекламой херни, СКАМы, спам, спам. То есть, эталонный пример неэффективного расходования времени и лучших лет жизни.
А с другой стороны: пользователи, которые скачали файл и тратят время на очистку компьютера от рекламных программ и плагинов, администраторы и модераторы, которые чистят сайты и форумы от спама.
И в центре всего этого «замечательный» рассмотренный сайт, который рекламирует казино, букмекеров, другие очень сомнительные вещи, навязывает Push подписки, мотивирует на распространение файлов, защищённых авторскими правами, и опасных файлов.
Связанные статьи:
- Обход файерволов веб приложений Cloudflare, Incapsula, SUCURI (76.9%)
- Утилиты для сбора информации и исследования сети в Windows и Linux (55.9%)
- Поиск человека по IP (кейс) (54%)
- OSINT инструмент для визуализации отношений между доменами, IP и email адресами (54%)
- Как узнать, сайт за CloudFlare или нет (53.3%)
- Как сканировать беспроводные сети обычным Wi-Fi приёмником (RANDOM - 50.2%)