Guest gnoo Posted April 13, 2018 at 12:07 PM Share Posted April 13, 2018 at 12:07 PM 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. Link to comment Share on other sites More sharing options...
Do Zero Ao Um - Instructors ncaio Posted April 13, 2018 at 01:51 PM Do Zero Ao Um - Instructors Share Posted April 13, 2018 at 01:51 PM 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 - gsmtpRCPT 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 - gsmtpRCPT 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 More sharing options...
Guest gnoo Posted April 13, 2018 at 10:18 PM Share Posted April 13, 2018 at 10:18 PM @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" . 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 More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.