commit 25352479a1338158b018489c3d673f4f6656c2a9 Author: meewan Date: Wed Dec 9 22:43:51 2020 +0100 first commit diff --git a/check_clear_smtp.py b/check_clear_smtp.py new file mode 100644 index 0000000..3929ccc --- /dev/null +++ b/check_clear_smtp.py @@ -0,0 +1,120 @@ +#!/usr/bin/python3 +from string import ascii_lowercase +from random import choices +from argparse import ArgumentParser +from smtplib import ( + SMTP, + SMTPSenderRefused, + SMTPRecipientsRefused, +) + + +def check_clear(domain, port, orgin_domain, from_addr, to_addr, log_level): + with SMTP(host=domain, port=port, local_hostname=orgin_domain) as smtp: + smtp.set_debuglevel(log_level) + try: + smtp.sendmail( + from_addr=from_addr, + to_addrs=[to_addr], + msg="test_cleartextmail" + ) + except SMTPSenderRefused as error: + code = error.smtp_code + error = error.smtp_error.decode() + if code == 530 and "STARTTLS" in error: + return False + else: + raise + except SMTPRecipientsRefused: + pass + return True + + +def color(string, color_name): + color_code = "" + if color_name == "green": + color_code = "\033[92m" + elif color_name == "red": + color_code = "\033[91m" + elif color_name == "orange": + color_code = "\033[93m" + end_color = "\033[1m" + return f"{color_code}{string}{end_color}" + + +def main(): + parser = ArgumentParser( + description=( + "Script to check wether or not the target mail server accepts " + "cleartext connections and email from other smtp relay" + ) + ) + parser.add_argument( + 'domain', + type=str, + help="domain to check" + ) + + parser.add_argument( + '-p', + '--port', + type=int, + default=25, + help="port for STARTTLS (usually 25)", + ) + parser.add_argument( + '-f', + '--from_addr', + type=str, + default="foo@example.com", + help="address to use to check the server (default foo@example.com)" + ) + parser.add_argument( + '-t', + '--to_addr', + type=str, + default="", + help="address of the recipient (default [random]@[domain])" + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + help="Activate verbose mode an display all smtp trafic" + ) + + args = parser.parse_args() + origin_domain = args.from_addr.split("@")[-1] + rand_char = ''.join(choices(ascii_lowercase, k=64)) + to_addr = args.to_addr if args.to_addr else f"{rand_char}@{args.domain}" + + print( + "Testing if the server support clear text email delivery:", + end=' ' + ) + + try: + result = check_clear( + domain=args.domain, + port=args.port, + orgin_domain=origin_domain, + from_addr=args.from_addr, + to_addr=to_addr, + log_level=2 if args.verbose else 0 + ) + except Exception as exception: + print(color("Unknown", "orange")) + print( + "got unknown exception run the command again with -v for more " + "details" + ) + print(exception) + else: + if result: + print(color("True", "green")) + else: + print(color("False", "red")) + + +if __name__ == "__main__": + main()