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

тема

Один бьёт троих.

bezmyatezhnost · · 2 ответов · 267 просмотров

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

​
Всех приветствую, название как обычно с подвыподвертом, но если чучуть подумать, смысл на поверхности. Один чекер, три сервиса, ну, как три туза из одной колоды. Сегодня разберём ситуацию, которая, если честно, меня самого удивила. Три разных сайта, три разных продукта, а юзербаза одна. Зарегался на malcare.com, логинишься на blogvault.net и wpremote.com, без подтверждений, без привязок, просто email:pass и добро пожаловать. Ну красавцы, чё. У них внизу сайта даже скромненько написано "Also from us" со ссылками друг на друга, но кто ж туда смотрит. А продукты-то разные. MalCare - секьюрити, сканер малвари, WAF, защита от брутфорса, мониторинг активности. BlogVault - бэкапы, миграция сайтов, стейджинг, рилтайм бэкапы для WooCommerce, 400 тысяч сайтов. WPRemote - менеджмент для агентств, управление кучей сайтов из одного дашборда, обновления в один клик, клиентские отчеты, аптайм-мониторинг. Три продукта, три ценника, три лендинга, а контора одна и база одна. И вот представьте: человек зарегался на MalCare, привязал свои десять магазинов, а его креды внезапно работают и на двух других платформах, про которые он может даже не слышал. А чекеру вообще без разницы куда стучаться, результат один и тот же. Как всё это завернуть в один инструмент - разберём по шагам. Погнали.

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

​
А теперь давайте на секунду задумаемся, что это вообще значит на практике. Когда человек скупает строки, что он обычно ищет? wp-login, wp-admin, cpanel, и всё, дальше голова не думает. Все привыкли получать вордпрессы одними и теми же способами - брут wp-login, эксплойты на дырявые плагины, cpanel-креды из стиллер-логов. Всё это, конечно, рабочие методы, никто не спорит. Но вот про такие сервисы как MalCare, BlogVault, WPRemote - все забывают. А там, на минуточку, к одному аккаунту может быть привязано 10, 20, 50 боевых сайтов. Причем не просто привязано, а с полным доступом, бэкапы, файлменеджер, обновления, у MalCare вообще чистка малвари в один клик, то есть если они могут малварь удалить, значит у них есть доступ на запись в файловую систему сайта. Один валидный акк на таком сервисе может стоить дороже, чем сотня голых wp-admin строк, потому что это не один сайт, а целый пучок, уже залинкованных, уже с бэкапами, уже с доступом ко всему. И самое смешное, что в логах этих сервисов никто и не подумает искать компрометацию, потому что для сайта это легитимный запрос от легитимного плагина. Тихо, чисто, красиво.

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

​
Ладно, хватит философствовать, давайте к технике. Первое что нужно сделать, это понять как вообще устроен логин. Заходим на app.blogvault.net/users/signin, открываем F12, вкладка Network, и пробуем залогиниться. И вот тут сразу первый сюрприз - Cloudflare Turnstile. Да, капча. Но не гугловская, а клаудфлейровская, и это, скажем так, меньшее зло. На странице логина сидит блок cf-turnstile с data-sitekey, при сабмите формы вместе с email и паролем улетает поле cf-turnstile-response. Помимо этого, форма шлёт authenticity_token, классический Rails-овский CSRF-токен, который лежит в скрытом инпуте. То есть, чтоб залогиниться программно, нам нужно: сначала сделать GET на страницу логина, распарсить из HTML authenticity_token и sitekey от Turnstile, решить капчу, и только потом слать POST с полным набором полей. Ниже скрин запроса из DevTools, чтоб было понятно что куда летит.

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

​
С капчей всё решается просто, Capsolver, AntiTurnstileTaskProxyLess, закидываем websiteURL и websiteKey, получаем токен. По цене копейки, Turnstile один из самых дешевых типов, не гугловская рекапча v3 где можно разориться на объемах. Получили токен, собираем POST-запрос: authenticity_token из формы, cf-turnstile-response от солвера, email и пароль. Шлём на /users/signin. Если креды валидные, нас редиректит на дашборд, статус 200, а в теле страницы появляется слово "dashboard". Если нет, кидает обратно на логин. Элементарная проверка, никаких заморочек. Но самое вкусное начинается дальше. После логина мы сидим в авторизованной сессии, и теперь можем дёргать внутреннее API. Делаем GET на /api/v5/account, получаем JSON с данными аккаунта, а оттуда достаём account_gid, это идентификатор аккаунта. Дальше с этим gid стучимся на /api/v5/sites, и нам прилетает полный список привязанных сайтов: URL, тайтл, статус подключения, всё как на ладони. Вот пример ответа от API.

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

​
А теперь та самая часть, ради которой вы вообще сюда пришли. Помните, я говорил что база одна? Вот доказательство. Берём валидный акк с blogvault.net, и пробуем те же самые email:pass засунуть в app.malcare.com/users/signin. Тот же authenticity_token, тот же Turnstile, тот же формат POST-запроса, один в один. И оно залетает. Заходим в дашборд, и тут уже становится совсем смешно. Это не просто "одна база", это вообще один и тот же сайт, буквально. Тот же фронтенд, тот же интерфейс, те же кнопки, те же фильтры, те же Quick Suggestions, Hacked, Disconnected, Down, Vulnerable, один в один пиксель в пиксель. Разница ровно в двух местах: название вкладки в браузере и домен в адресной строке. Всё. Даже не пытались что-то перерисовать или хотя бы цвета поменять. Вот вам скрин, слева MalCare, справа BlogVault, найдите отличия (спойлер - их нет, кроме URL):

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

​
С WPRemote та же история, те же креды, тот же дашборд, тот же фронт. Три домена, одна панелька. Для чекера это значит что нам достаточно чекнуть на одном любом из тройки, и мы сразу знаем что акк валиден на всех трёх. В коде я стучусь через blogvault.net, но можете поставить malcare.com или wpremote.com, без разницы, результат будет идентичный. И вот ещё момент, который многие не догоняют: в утечках эти акки могут лежать под разными сервисами. Один и тот же человек мог засветиться в базе как юзер MalCare, в другой утечке как юзер BlogVault, в третьей как WPRemote. Три разных строки, три разных источника, а по факту это один и тот же аккаунт, и пустит по любой из этих пар на все три сервиса. Данные, сайты, доступы - всё будет одинаковое. Так что если гоняете по утечкам, имейте в виду, тут тройной охват из коробки.

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

Окей, теперь к самому чекеру. Код целиком будет в конце статьи, а тут разберём ключевые моменты, чтоб было понятно что происходит и зачем. Написано на питоне, используется tls_client (чтоб не палиться по TLS-фингерпринту как requests), capsolver для решения Turnstile, BeautifulSoup для парсинга HTML. Многопоточность через ThreadPoolExecutor, по дефолту 15 потоков, проксики крутятся по кругу через cycle. Логика простая. Берём строку email:pass из accs.txt, делаем GET на страницу логина, парсим из HTML authenticity_token и data-sitekey от Turnstile:
Code:
response_get = session.get(LOGIN_URL, headers=BROWSER_HEADERS)
soup = BeautifulSoup(response_get.text, 'html.parser')
auth_token = soup.find('input', {'name': 'authenticity_token'})['value']
turnstile_div = soup.find(class_='cf-turnstile')
sitekey = turnstile_div.get('data-sitekey')

Решаем капчу через Capsolver:
Code:
solution = capsolver.solve({
"type": "AntiTurnstileTaskProxyLess",
"websiteURL": TURNSTILE_WEBSITE_URL,
"websiteKey": sitekey,
})
turnstile_token = solution.get("token")

Собираем POST с полным набором полей и шлём:
Code:
payload = {
'authenticity_token': auth_token,
'cf-turnstile-response': turnstile_token,
'user[email]': email,
'user[password]': password
}
response_post = session.post(LOGIN_URL, data=payload, headers=post_headers, allow_redirects=True)

Если залетело - дёргаем API. Сначала /api/v5/account за account_gid, потом /api/v5/sites за списком привязанных сайтов:
Code:
preload_data = session.get(f'{base_domain}/api/v5/account?newui=true').json()
account_gid = preload_data['account']['gid']
search_data = session.get(f'{base_domain}/api/v5/sites', params={'account_id': account_gid}).json()
blogs_data = search_data.get('sites', [])

Результат пишется в valids.txt в формате email:pass | Site: название (url) -> CONNECTED/NOT CONNECTED. Невалид в invalids.txt, ошибки в errors.txt. Всё, никакой магии.

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

​
Пару слов по статусам. Если в выдаче видите CONNECTED - это значит плагин на сайте живой, связь активна, и через дашборд MalCare/BlogVault можно в один клик зайти в wp-admin без логина и пароля от самого вордпресса. Просто жмёте кнопку и вы внутри. Если NOT CONNECTED - значит связь потерялась. Может плагин снесли, может сайт переехал на другой хостинг, может просто домен протух. Но это не значит что аккаунт бесполезный - перепроверяйте креды от малкейра/блогвольта к самому сайту напрямую, порой email:pass от сервиса совпадает с wp-login и залетает абсолютно легко.

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

​
Три сервиса, одна база, один чекер. Регнулся на одном - автоматом есть акк на остальных двух. Люди годами юзают MalCare для защиты или BlogVault для бэкапов и даже не думают что их креды утекли через какой-нибудь комболист. А там за каждым аккаунтом могут висеть живые вордпрессы с полным доступом к админке в один клик. Тема не заезженная, конкуренции ноль, в паблике про это никто не писал (для лисы99! у меня не все юлп мира!! при должном кол-ве монету уж точно вытащите, как минимум прогнав по паблик юлп висят незараженные сайты, под кликфиксы более чем, а месяц назад мне удалось таким образом угнать шопчик на 2к cc/месяц тир1 страны, думайте!)). Код чекера целиком ниже, всё разбито по файлам, ставьте зависимости через pip, закидывайте акки в accs.txt, проксики в proxies.txt и погнали. Всем пока, не болейте!

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

5.1 KB file on MEGA

Не удалось прогрузить медиа
mega.nz
👍15 🔥4 👏4
Ответbezmyatezhnost

в паблике про это никто не писал

 https://wptavern.com/malcare-blogvault-and-wpremote-plugins-patch-vulnerabilities-allowing-site-takeover-through-stolen-api-credentials

https://medium.com/@beyondmachines/exposing-cryptographic-weaknesses-the-case-of-malcare-blogvault-and-wpremote-for-wordpress-d91d66328ca5

Как это никто не писал, вот статьи в которых рассказывается что все 3 плагина имеют общую кодовую базу, про уязвимости и не только.
👍2
Ответcybergangster

https://wptavern.com/malcare-blogvault-and-wpremote-plugins-patch-vulnerabilities-allowing-site-takeover-through-stolen-api-credentials…

это немного не то о чем я писал)
👍3

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