Исследование периметра партнёрки по установке 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

Я воспользовался всем арсеналом, описанным в статьях:

Но ни 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 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 подписки, мотивирует на распространение файлов, защищённых авторскими правами, и опасных файлов.

Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован.