Jump to content

Enumeração de usuários SMTP


Guest gnoo

Recommended Posts

  • Do Zero Ao Um - Instructors

Hallo. O protocolo SMTP tem comandos. E é utilizando comandos SMTP que você descobre isso. Quando você vai enviar um e-mail, você inicia este procedimento com o seu STMP server com um helo, por exemplo.

Vamos utilizar aqui um SMTP server do google, por exemplo. Utilizando o comando telnet <ipdoservidorsmtp> <porta>

telnet 74.125.24.26 25

Trying 74.125.24.26...
Connected to 74.125.24.26.
Escape character is '^]'.
220 mx.google.com ESMTP f31-v6si5644201plb.212 - gsmtp
helo mentebinaria.com
250 mx.google.com at your service

MAIL FROM: <gnoo@dominio.com>
250 2.1.0 OK f31-v6si5644201plb.212 - gsmtp
RCPT TO: <maria@gmail.com>
550-5.1.1 The email account that you tried to reach does not exist. Please try
550-5.1.1 double-checking the recipient's email address for typos or
550-5.1.1 unnecessary spaces. Learn more at
550 5.1.1 https://support.google.com/mail/?p=NoSuchUser f31-v6si5644201plb.212 - gsmtp
RCPT TO: <joaocarlos@gmail.com>                                           
250 2.1.5 OK f31-v6si5644201plb.212 - gsmtp

Normalmente, se utiliza o comando RCPT (recipiente) para verificar se a conta existe. Possibilitando enumeração. Veja que maria@gmail.com não existe e joaocarlos@gmail.com, sim.

Essa é a razão. Você pode listar os usuários do domínio dessa forma. Alguns sistemas utilizam contas "locais" como base de usuários de e-mail e etc. Isso não significa que no servidor SMTP exista um usuário de sistema chamado joaocarlos, mas pode ser que sim. Por isso se testa enumeração utilizando uma base comum de usuários de sistema, like: www-data, root, postmaster e etc. 

Eu tenho uma ferramenta que faz uma leve auditoria em servidores SMTP de forma simplificada. Se for do seu interessee, https://github.com/ncaio/mxmap

_\,,/

Link to comment
Share on other sites

@ncaio Obrigado por responder,

a tua abordagem ajudou-me a ver as coisas numa respectiva diferente, a minha duvida surgiu devido ao facto de estar a testar usuários do sistema num servidor de e-mail, eu não estava a conseguir relacionar as duas coisas ( servidor de email e usuários do sistema ).

Até à data eu estava a usar apenas o VRFY para fazer essa verificação,  ainda não tinha percebido essa iniciação de conversa com o servidor com o HELO, e isso torna as coisa um pouco mais interessantes.

Achei a tua ferramenta interessante vou usar assim que tiver oportunidade.

Eu tinha feito um pequeno script para fazer a enumeração com VRFY em Python mas tenho que aprofundar mais sobre o assunto para tentar outras abordagens, deixo o código pode ser que tenhas alguma ideia para dar...

O código que segue é apenas um esboço que fiz para perceber como funciona, não é nada que se possa chamar "ferramenta" xD.

from socket import *
import time 

host = input("SMTP VRFY...Inserir host : ")
porto = 25

file = open("smtp.txt", "r")
leitura = file.readlines()

user_match = [] 

def conexao(porto, host):
    global sock
    print("A estabelecer conexão com {} : {}".format(host, porto))
    sock = socket(AF_INET, SOCK_STREAM)
    sock.connect_ex((host, porto))
    banner = sock.recv(1024)
    print(banner.decode())

def VRFY(leitura, sock):
    
    print("A consultar wordlist para USER {} tentativas...".format(len(leitura)))
    for nome in leitura:
        sock.send("vrfy {} \r\n".format(nome).encode())
        print("A testar para {}".format(nome))
        dados = sock.recv(1024)
        time.sleep(3)
        if b"252" in dados:
            user_match.append(nome)
            print("[+] Encontrou {}".format(nome))
        elif b"550" in dados:
            print("[-] 550 username não existe... ")
        elif b"503" in dados:
            print("[!] Servidor pede autenticação...")
        elif b"500" in dados:
            print("[!] O comando VRFY não é suportado...")
        else:
            pass
    sock.close()
    print("RESULTADO---> usuários encontrados:")
    for user in user_match:
        print("{}".format(user))
    

def main():
    conexao(porto, host)
    VRFY(leitura, sock)

if __name__ == '__main__':
    main()

Já tenho ali o livro redes de computadores do Andrew Tanenbaun, que fala do SMTP, vou estudar mais sobre o assunto. 

Obrigado.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...