• XSS.stack #1 – первый литературный журнал от юзеров форума

Вопрос | поиск imap url по email

AmperVolt

Древний
Пользователь
Регистрация
06.08.2020
Сообщения
300
Реакции
110
Гарант сделки
3
Пытаюсь реализовать поиск корректных imap url по адресу мыла. Может кто сталкивался? Просьба подсказать. Желательно чтобы это возможно было делать в командной строке либо скриптом.
 
Решение
Python:
def is_listening(ip, port):
    try:
        port = int(port)
        socket_type = socket.AF_INET6 if ':' in ip else socket.AF_INET
        s = socket.socket(socket_type, socket.SOCK_STREAM)
        s.settimeout(3)
        s = ssl.wrap_socket(s, server_hostname=ip, do_handshake_on_connect=False) if port == 465 else s
        s.connect((ip, port))
        s.close()
        return True
    except:
        return False

def guess_smtp_server(domain):
    global default_login_template, resolver_obj, domain_configs_cache, dangerous_domains
    domains_arr = [domain, 'smtp-qa.'+domain, 'smtp.'+domain, 'mail.'+domain, 'webmail.'+domain, 'mx.'+domain]
    try:
        mx_domain = str(resolver_obj.resolve(domain, 'mx')[0].exchange)[0:-1]...
Пожалуйста, обратите внимание, что пользователь заблокирован
Python:
def is_listening(ip, port):
    try:
        port = int(port)
        socket_type = socket.AF_INET6 if ':' in ip else socket.AF_INET
        s = socket.socket(socket_type, socket.SOCK_STREAM)
        s.settimeout(3)
        s = ssl.wrap_socket(s, server_hostname=ip, do_handshake_on_connect=False) if port == 465 else s
        s.connect((ip, port))
        s.close()
        return True
    except:
        return False

def guess_smtp_server(domain):
    global default_login_template, resolver_obj, domain_configs_cache, dangerous_domains
    domains_arr = [domain, 'smtp-qa.'+domain, 'smtp.'+domain, 'mail.'+domain, 'webmail.'+domain, 'mx.'+domain]
    try:
        mx_domain = str(resolver_obj.resolve(domain, 'mx')[0].exchange)[0:-1]
        domains_arr += [mx_domain]
    except:
        raise Exception('no MX records found for: '+domain)
    if is_ignored_host(mx_domain) or re.search(dangerous_domains, mx_domain) and not re.search(r'\.outlook\.com$', mx_domain):
        raise Exception(white('skipping domain: '+mx_domain+' (for '+domain+')',2))
    if re.search(r'protection\.outlook\.com$', mx_domain):
        return domain_configs_cache['outlook.com']
    for host in domains_arr:
        try:
            ip = get_rand_ip_of_host(host)
        except:
            continue
        for port in [2525, 587, 465, 25]:
            debug(f'trying {host}, {ip}:{port}')
            if is_listening(ip, port):
                    return ([host+':'+str(port)], default_login_template)
    raise Exception('no connection details found for '+domain)
Без проблем переделаешь для IMAP (домены и порт). И вот в атаче стаааарые (нужно перечекать) конфиги для доменов из какого-то говночекера.
 

Вложения

  • imapdatabase.txt
    2.5 МБ · Просмотры: 18
Решение
Python:
def is_listening(ip, port):
    try:
        port = int(port)
        socket_type = socket.AF_INET6 if ':' in ip else socket.AF_INET
        s = socket.socket(socket_type, socket.SOCK_STREAM)
        s.settimeout(3)
        s = ssl.wrap_socket(s, server_hostname=ip, do_handshake_on_connect=False) if port == 465 else s
        s.connect((ip, port))
        s.close()
        return True
    except:
        return False

def guess_smtp_server(domain):
    global default_login_template, resolver_obj, domain_configs_cache, dangerous_domains
    domains_arr = [domain, 'smtp-qa.'+domain, 'smtp.'+domain, 'mail.'+domain, 'webmail.'+domain, 'mx.'+domain]
    try:
        mx_domain = str(resolver_obj.resolve(domain, 'mx')[0].exchange)[0:-1]
        domains_arr += [mx_domain]
    except:
        raise Exception('no MX records found for: '+domain)
    if is_ignored_host(mx_domain) or re.search(dangerous_domains, mx_domain) and not re.search(r'\.outlook\.com$', mx_domain):
        raise Exception(white('skipping domain: '+mx_domain+' (for '+domain+')',2))
    if re.search(r'protection\.outlook\.com$', mx_domain):
        return domain_configs_cache['outlook.com']
    for host in domains_arr:
        try:
            ip = get_rand_ip_of_host(host)
        except:
            continue
        for port in [2525, 587, 465, 25]:
            debug(f'trying {host}, {ip}:{port}')
            if is_listening(ip, port):
                    return ([host+':'+str(port)], default_login_template)
    raise Exception('no connection details found for '+domain)
Без проблем переделаешь для IMAP (домены и порт). И вот в атаче стаааарые (нужно перечекать) конфиги для доменов из какого-то говночекера.
Вот подобный конфиг как раз искал. Спасибо большое. а то я пока только смог вот такое нагородить:
Python:
import os
import re
import json
import requests

def get_email_settings(email):
    url = f'https://emailsettings.firetrust.com/settings?q={email}'
    response = requests.get(url)
    if response.status_code == 200:
        source = response.json()
        data = source
        for i in range(len(data["settings"])):
            if data["settings"][i]["protocol"] == "IMAP":
                imap_server = data["settings"][i]["address"]
                imap_port = data["settings"][i]["port"]
                return imap_server, imap_port
    return 'N/A', 'N/A'

with open('emails2.txt', 'r') as email_file:
    email_addresses = email_file.readlines()

email_addresses = [email.strip() for email in email_addresses]

for email in email_addresses:
    imap_server, imap_port = get_email_settings(email)
    if imap_server != 'N/A':
        print(f'{email}: {imap_server}:{imap_port}')
    else:
        print(f'No IMAP server found for {email}')
Нашёл api, но он сильно ограничен, не всё находит.

Ну и вот так для тех кого api что выше, не нашёл.

Python:
import subprocess
import socket

def get_mx_record(domain):
    cmd = f"dig {domain} MX"
    output = subprocess.run(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    output_str = output.stdout.decode("utf-8").strip()
    lines = output_str.split("\n")
    mx_records = []
    for line in lines:
        if "MX" in line:
            mx_records.append(line.split()[-1][:-1])
    return mx_records

def get_imap_url(email):
    email_parts = email.split("@")
    domain = email_parts[-1]
    imap_hosts = []
    imap_hosts.append(f"imap.{domain}")
    mx_records = get_mx_record(domain)
    for mx_record in mx_records:
        imap_hosts.append(f"imap.{mx_record}")
    ip_hosts = []
    for host in imap_hosts:
        try:
            ip = socket.gethostbyname(host)
            try:
                reverse_host = socket.gethostbyaddr(ip)[0]
                ip_hosts.append(f"imap.{reverse_host}")
            except socket.herror:
                pass
        except socket.gaierror:
            pass
    imap_hosts.extend(ip_hosts)
    for host in imap_hosts:
        for port in (993, 143):
            try:
                s = socket.create_connection((host, port), timeout=3)
                s.close()
                return f"{host}:{port}"
            except socket.error:
                pass
    return None

results = {}
with open("emails.txt", "r") as f:
    for email in f:
        email = email.strip()
        results[email] = get_imap_url(email)

with open("imap_urls.txt", "w") as f:
    for email, imap_url in results.items():
        if imap_url:
            f.write(f"{email}: {imap_url}\n")
        else:
            f.write(f"{email}: Not found\n")
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх