遠程登錄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號又微信號)右上方掃一掃可加博主微信
所寫所說,是心之所感,思之所悟,行之所得;文當無敷衍,落筆求簡潔。 以所舍,求所獲;有所依,方所成!
拿走了 感謝