远程登录RDP(3389)和Radmin端口(访问)邮件通知(提醒)小工具
[重要通告]如您遇疑难杂症,本站支持知识付费业务,扫右边二维码加博主微信,可节省您宝贵时间哦!
今天还写了有网友中了勒索病毒,其实就是RDP不够严谨造成的,虽然安全性软件也很多,但难免依然还会中;
用frps做内网穿透服务器的多注意-小心中招勒索病毒lockbit2.0
现在有这么一个软件,就是登录远程服务器的时候就会自动邮件提醒,包括自己登录;演示效果如下:
远程登录服务器3389邮件通知小工具介绍:
主要实现的功能是获取指定端口连接的远程 IP 地址,并将其发送给指定的邮箱,可用于一些远程工具的登录通知,或者其他你需要检测的程序。
远程登录服务器3389邮件通知小工具特点:
1. 可在配置文件内自定义需要检测的端口;支持多端口检测
2. 白名单功能,可设置多个IP排除;
3. 使用zmail模块发送邮件更高效方便,不需要手动添加服务器地址、端口以及适合的协议,zmail会帮你完成;
远程登录服务器3389邮件通知小工具原理:
1.读取配置文件 'Mail.ini' 中的配置信息,包括白名单和检测端口
2.根据读取的端口信息,调用 get_remote_ips 函数获取指定端口的远程IP地址列表,并将其存储在 remote_ips_dict 字典中
3.根据 remote_ips_dict 字典中的数据生成邮件正文
4.使用 zmail 库发送邮件给指定的收件人地址,邮件包括检测时间、主机名、用户名、检测到的连接端口以及该端口连接的远程IP地址列表,同时提供查询IP归属地的链接。
远程登录服务器3389邮件通知小工具更新:
2023/3/1
添加了两条错误日志输出
2023/2/23
使用python3.10编译,优化了一下代码,
执行过程:
1.使用 ConfigParser() 函数创建一个 config 实例,并使用 read() 方法读取名为 Mail.ini 的配置文件。然后获取 WL 段中的 add 选项的值并按逗号分隔成列表,将其保存到 wl_list 变量中。接着遍历 port 段中的所有选项,如果选项的名称以 net_port 开头且选项的值是数字,则将其转换为整数并调用 get_remote_ips() 函数获取当前连接到该端口的所有远程IP地址,将其保存到 remote_ips_dict 字典中。
2.定义函数 get_remote_ips(),它接收两个参数 port 和 wl_list,并使用 net_connections() 函数获取当前系统上所有建立连接的信息。然后使用生成器表达式筛选出所有远程IP地址,使得地址不是空值、状态为 ESTABLISHED、不是本地回环地址、不包含冒号,且本地地址的端口号等于 port 参数。然后使用列表推导式去重并过滤掉在 wl_list 中出现的地址,最终返回远程IP地址列表。
3.定义函数 send_mail(),它接收两个参数 remote_ips_dict 和 config。函数首先获取当前计算机的主机名、用户名和当前时间,并将其插入到邮件正文中。然后遍历 remote_ips_dict 字典中的所有端口及其对应的远程IP地址,如果有远程IP地址则将其插入到邮件正文中,最终将邮件正文和邮件标题通过 zmail 模块发送到指定的收件人。
4.如果 remote_ips_dict 字典中至少有一个非空列表,则调用 send_mail() 函数将所有远程IP地址发送到指定的收件人。
远程登录服务器3389邮件通知小工具演示:
远程登录服务器3389邮件通知小工具软件下载地址:
远程登录服务器3389邮件通知小工具代码如下:
from configparser import ConfigParser from time import strftime, localtime from psutil import net_connections from os import environ import zmail # 获取远程IP地址 def get_remote_ips(port, wl_list): # 使用psutil库中的net_connections函数获取所有网络连接信息 # 筛选出对应端口、处于已建立状态、远程地址不是回环地址和IPv6地址的网络连接 remote_ips = (conn.raddr[0] for conn in net_connections() if conn.raddr and conn.status == 'ESTABLISHED' and not conn.raddr[0].startswith('127.') and ':' not in conn.raddr[0] and conn.laddr[1] == port) # 返回远程IP地址列表中不在白名单中的地址 return [ip for ip in set(remote_ips) if not any(ip.startswith(wl) for wl in wl_list if wl.strip())] or [] # 发送邮件 def send_mail(remote_ips_dict, config): # 获取计算机名称、用户名和当前时间 try: hostname, username = environ["COMPUTERNAME"], environ["USERNAME"] time = strftime("%Y-%m-%d %H:%M:%S", localtime()) # 构造邮件正文 content = [f'<font size="4">检测时间: {time}<br>主机名: {hostname}<br>用户名: {username}<br></font><br>'] for port, remote_ips in remote_ips_dict.items(): if remote_ips: content.append( f'连接端口<font color="#0000ff"><b>"{port}"</b></font>的IP地址:<br>' f'<b><font color="#ff0000" size="5">{"<br>".join(remote_ips)}</font></b><br>' f'<a <br>".join(remote_ips)}' f'">查询IP归属地</a><br>====================<br><br>') content = "".join(content) # 从配置文件中读取发件人地址、密码和邮件标题 from_addr, pwd, title = ( config.get('Mail', key) for key in ('from_addr', 'pwd', 'title') ) # 从配置文件中读取收件人地址列表 to_addr = config.get('to_addr', 'add').split(',') # 使用zmail库发送邮件 zmail.server(from_addr, pwd).send_mail(to_addr, {'subject': title, 'content_html': content}) except Exception as e: with open("Mail.log", "a", encoding="utf-8") as f: f.write(f"[{strftime('%Y-%m-%d %H:%M:%S', localtime())}] [ERROR] 邮件发送失败: {str(e)}\n") # 从配置文件中读取白名单和需要检测的端口 config = ConfigParser() config.read('Mail.ini', encoding='utf-8') wl_list = config.get('WL', 'add').split(',') remote_ips_dict = {} for port_key, port in config.items('port'): if port_key.startswith('net_port') and (port := port.strip()).isdigit(): remote_ips = get_remote_ips(int(port), wl_list) if remote_ips: remote_ips_dict[int(port)] = remote_ips else: with open('Mail.log', 'w', encoding="utf-8") as f: f.write(f"[{strftime('%Y-%m-%d %H:%M:%S', localtime())}] " f"[INFO] 端口{port}外部IP不存在或与白名单匹配,程序退出。\n") # 如果有需要发送的远程IP地址,则发送邮件 if remote_ips_dict.values(): send_mail(remote_ips_dict, config)
666
问题未解决?付费解决问题加Q或微信 2589053300 (即Q号又微信号)右上方扫一扫可加博主微信
所写所说,是心之所感,思之所悟,行之所得;文当无敷衍,落笔求简洁。 以所舍,求所获;有所依,方所成!
拿走了 感谢