Всем привет! В данной статье я расскажу вам про одну уязвимость в хомячке,и стоит ли ждать листинга? Что такое Hamster Kombat? Вообще,все мы знаем что такое Hamster Kombat)) Ну,кто не знает,расскажу вкратце: Hamster Kombat -- популярная игра-кликер, суть этой игры кликать на хомяка,и выполнять различные задания. Почему же он так популярен? Миллионы пользователей увидели потенциал в этой игре,и пытаются повторить успех Notcoin,что бы разбогатеть. Большинство экспертов считали Notcoin скамом, но позже он был запущен на площадке Binance,хотя и стоил он на старте всего $0,012,а потом и вообще ушел в падение. Что насчет защиты ? В данном кликере есть базовая защита,но не более. Разработчик даже не обфусцировал код,что делает поиск уязвимостей легче. Ладно,перейдем к главному! Сама уязвимостьДля начала,нам нужно скачать ViolentMonkey ViolentMonkey Chrome Firefox Edge Скрипт // ==UserScript== // @name Hamster Kombat Web // @namespace http://tampermonkey.net/ // @version 1.4 // @description Запуск Hamster Kombat в браузере // @author mudachyo // @match *://*.hamsterkombat.io/* // @match *://*.hamsterkombatgame.io/* // @grant none // @icon [IMG][IMG] https://hamsterkombatgame.io/images/icons/hamster-coin.png[/IMG][/IMG] // @downloadURL https://github.com/mudachyo/Hamster-Kombat/raw/main/hamster-kombat.user.js // @updateURL https://github.com/mudachyo/Hamster-Kombat/raw/main/hamster-kombat.user.js // @homepage https://github.com/mudachyo/Hamster-Kombat // ==/UserScript== (function() { 'use strict'; function getRandomiOSUserAgent() { const iOSVersions = ['14_0', '14_1', '14_2', '14_3', '14_4', '14_5', '14_6', '14_7', '14_8', '15_0', '15_1', '15_2', '15_3', '15_4', '15_5', '15_6', '15_7', '16_0', '16_1', '16_2', '16_3', '16_4', '16_5', '16_6', '16_7', '17_0', '17_1', '17_2', '17_3', '17_4', '17_5']; const iPhoneModels = ['iPhone11,2', 'iPhone11,4', 'iPhone11,6', 'iPhone11,8', 'iPhone12,1', 'iPhone12,3', 'iPhone12,5', 'iPhone13,1', 'iPhone13,2', 'iPhone13,3', 'iPhone13,4', 'iPhone14,2', 'iPhone14,3', 'iPhone14,4', 'iPhone14,5']; const randomVersion = iOSVersions[Math.floor(Math.random() * iOSVersions.length)]; const randomModel = iPhoneModels[Math.floor(Math.random() * iPhoneModels.length)]; return `Mozilla/5.0 (${randomModel}; CPU iPhone OS ${randomVersion} like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1`; } const newUserAgent = getRandomiOSUserAgent(); // Функция для замены URL скрипта function replaceScriptUrl() { // Список URL-адресов для замены const urlsToReplace = [ 'https://hamsterkombat.io/js/telegram-web-app.js', 'https://app.hamsterkombat.io/js/telegram-web-app.js', 'https://hamsterkombat.io/js/telegram-web-app.js?v=7.6', 'https://hamsterkombatgame.io/js/telegram-web-app.js?v=7.6' ]; const newUrl = 'https://mudachyo.codes/hamsterkombat/telegram-web-app.js'; // Получаем все теги <script> на странице const scripts = document.getElementsByTagName('script'); for (let script of scripts) { // Проверяем, содержит ли src один из URL-адресов для замены if (urlsToReplace.includes(script.src)) { // Создаем новый тег <script> с новым URL const newScript = document.createElement('script'); newScript.src = newUrl; newScript.type = 'text/javascript'; // Заменяем старый тег на новый script.parentNode.replaceChild(newScript, script); console.log('Script URL replaced:', newScript.src); } } } Object.defineProperty(navigator, 'userAgent', { get: function() { return newUserAgent; } }); Object.defineProperty(navigator, 'platform', { get: function() { return 'iPhone'; } }); Object.defineProperty(navigator, 'vendor', { get: function() { return 'Apple Computer, Inc.'; } }); Object.defineProperty(navigator, 'deviceMemory', { get: function() { return undefined; } }); Object.defineProperty(navigator, 'maxTouchPoints', { get: function() { return 5; } }); // Наблюдатель за изменениями в DOM const observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.addedNodes.length) { replaceScriptUrl(); } }); }); // Настройки наблюдателя const config = { childList: true, subtree: true }; // Начинаем наблюдение за изменениями в DOM observer.observe(document.body, config); // Первоначальный запуск замены URL replaceScriptUrl(); })(); JS // ==UserScript== // @name Hamster Kombat Web // @namespace http://tampermonkey.net/ // @version 1.4 // @description Запуск Hamster Kombat в браузере // @author mudachyo // @match *://*.hamsterkombat.io/* // @match *://*.hamsterkombatgame.io/* // @grant none // @icon [IMG][IMG] https://hamsterkombatgame.io/images/icons/hamster-coin.png[/IMG][/IMG] // @downloadURL https://github.com/mudachyo/Hamster-Kombat/raw/main/hamster-kombat.user.js // @updateURL https://github.com/mudachyo/Hamster-Kombat/raw/main/hamster-kombat.user.js // @homepage https://github.com/mudachyo/Hamster-Kombat // ==/UserScript== (function() { 'use strict'; function getRandomiOSUserAgent() { const iOSVersions = ['14_0', '14_1', '14_2', '14_3', '14_4', '14_5', '14_6', '14_7', '14_8', '15_0', '15_1', '15_2', '15_3', '15_4', '15_5', '15_6', '15_7', '16_0', '16_1', '16_2', '16_3', '16_4', '16_5', '16_6', '16_7', '17_0', '17_1', '17_2', '17_3', '17_4', '17_5']; const iPhoneModels = ['iPhone11,2', 'iPhone11,4', 'iPhone11,6', 'iPhone11,8', 'iPhone12,1', 'iPhone12,3', 'iPhone12,5', 'iPhone13,1', 'iPhone13,2', 'iPhone13,3', 'iPhone13,4', 'iPhone14,2', 'iPhone14,3', 'iPhone14,4', 'iPhone14,5']; const randomVersion = iOSVersions[Math.floor(Math.random() * iOSVersions.length)]; const randomModel = iPhoneModels[Math.floor(Math.random() * iPhoneModels.length)]; return `Mozilla/5.0 (${randomModel}; CPU iPhone OS ${randomVersion} like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Mobile/15E148 Safari/604.1`; } const newUserAgent = getRandomiOSUserAgent(); // Функция для замены URL скрипта function replaceScriptUrl() { // Список URL-адресов для замены const urlsToReplace = [ 'https://hamsterkombat.io/js/telegram-web-app.js', 'https://app.hamsterkombat.io/js/telegram-web-app.js', 'https://hamsterkombat.io/js/telegram-web-app.js?v=7.6', 'https://hamsterkombatgame.io/js/telegram-web-app.js?v=7.6' ]; const newUrl = 'https://mudachyo.codes/hamsterkombat/telegram-web-app.js'; // Получаем все теги <script> на странице const scripts = document.getElementsByTagName('script'); for (let script of scripts) { // Проверяем, содержит ли src один из URL-адресов для замены if (urlsToReplace.includes(script.src)) { // Создаем новый тег <script> с новым URL const newScript = document.createElement('script'); newScript.src = newUrl; newScript.type = 'text/javascript'; // Заменяем старый тег на новый script.parentNode.replaceChild(newScript, script); console.log('Script URL replaced:', newScript.src); } } } Object.defineProperty(navigator, 'userAgent', { get: function() { return newUserAgent; } }); Object.defineProperty(navigator, 'platform', { get: function() { return 'iPhone'; } }); Object.defineProperty(navigator, 'vendor', { get: function() { return 'Apple Computer, Inc.'; } }); Object.defineProperty(navigator, 'deviceMemory', { get: function() { return undefined; } }); Object.defineProperty(navigator, 'maxTouchPoints', { get: function() { return 5; } }); // Наблюдатель за изменениями в DOM const observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if (mutation.addedNodes.length) { replaceScriptUrl(); } }); }); // Настройки наблюдателя const config = { childList: true, subtree: true }; // Начинаем наблюдение за изменениями в DOM observer.observe(document.body, config); // Первоначальный запуск замены URL replaceScriptUrl(); })(); Следующее что нам надо сделать,это скачать программу POSTMAN. После скачки логинимся,и ставим настройки как у меня: В поле ввода пишем данную ссылку: https://api.hamsterkombatgame.io/clicker/tap и ставим POST запрос. Далее,мы заходим в веб версию тг,заходим в хомячка и тапаем пару раз на хомяка,открываем dev tools (CTRL+SHIFT+C) и переходим во вкладку Network. Далее ищем "tap" (можно вписать в фильтр), пролистываем чуть ниже,и видим строку Authorization,содержимое (начинается с Bearer) копируем. Переключаемся опять в POSTMAN,заходим во вкладку Headers, и добавляем заголовок Authorization,в него мы вставляем токен авторизации,который мы скопировали. Должно получиться так: Далее,переходим во вкладку Body,ставим raw В него мы вставляем следующее { "count": 1161, "availableTaps": 1161, "timestamp": 1161 } Code { "count": 1161, "availableTaps": 1161, "timestamp": 1161 } Давайте разберем что это значит? сount- Сколько мы хотим про-кликать availableTaps- Количество энергии которое у нас есть,ее надо выставлять,смотря сколько мы хотим про-кликать. Например если у нас есть 1000 энергии,и мы хотим их про-кликать,пишем в count 1000,а в availableTaps 0. timestamp- Это временная метка,сколько прошло времени с 1 января 1970 года. timestamp можно получить в консоли браузера,или на этом сайте. Вариант как получить в консоли браузера -- Date.now() JS Date.now() Данный скрипт нужно вставить в консоли браузера,что бы получить timestamp Вернемся в POSTMAN,у нас должно получится что то вроде { "count": 1500, "availableTaps": 0, "timestamp": 1722622032230 } JS { "count": 1500, "availableTaps": 0, "timestamp": 1722622032230 } Теперь,отправляем запрос на сервер И видим что вся энергия про-кликалась! Всем спасибо за то что прочитали мою статью (она первая) Сорян если что-то лишнее,или есть вода. Если есть вопросы,задавайте!
Просто клики завязаны на запросах, ты отправляешь этот запрос и он обрабатывается сервером. В чём уязвимость?
Сомневаюсь, что кто-то абузить активно так, мб на нулячих акках, куда проще уже ферму целую завести, раз её проапаьь примерно до 2-ух лямов и забирать каждые 3 часа и выкидывать в прокачку