Ir para conteúdo
gnoo

Enumeração de usuários SMTP

Posts Recomendados

Saudações,

tenho uma duvida que é a seguinte, se o SMTP é um serviço de email qual é a razão pela qual é possível fazer enumeração de usuários de um sistema através dele.

Cumprimentos, 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

_\,,/

Editado por ncaio
Melhorias
  • Agradecer 2

Compartilhar este post


Link para o post
Compartilhar em outros 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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×