遠(yuǎn)程登錄RDP(3389)和Radmin端口(訪問)郵件通知(提醒)小工具
[重要通告]如您遇疑難雜癥,本站支持知識付費(fèi)業(yè)務(wù),掃右邊二維碼加博主微信,可節(jié)省您寶貴時間哦!
今天還寫了有網(wǎng)友中了勒索病毒,其實(shí)就是RDP不夠嚴(yán)謹(jǐn)造成的,雖然安全性軟件也很多,但難免依然還會中;
用frps做內(nèi)網(wǎng)穿透服務(wù)器的多注意-小心中招勒索病毒lockbit2.0
現(xiàn)在有這么一個軟件,就是登錄遠(yuǎn)程服務(wù)器的時候就會自動郵件提醒,包括自己登錄;演示效果如下:
遠(yuǎn)程登錄服務(wù)器3389郵件通知小工具介紹:
主要實(shí)現(xiàn)的功能是獲取指定端口連接的遠(yuǎn)程 IP 地址,并將其發(fā)送給指定的郵箱,可用于一些遠(yuǎn)程工具的登錄通知,或者其他你需要檢測的程序。
遠(yuǎn)程登錄服務(wù)器3389郵件通知小工具特點(diǎn):
1. 可在配置文件內(nèi)自定義需要檢測的端口;支持多端口檢測
2. 白名單功能,可設(shè)置多個IP排除;
3. 使用zmail模塊發(fā)送郵件更高效方便,不需要手動添加服務(wù)器地址、端口以及適合的協(xié)議,zmail會幫你完成;
遠(yuǎn)程登錄服務(wù)器3389郵件通知小工具原理:
1.讀取配置文件 'Mail.ini' 中的配置信息,包括白名單和檢測端口
2.根據(jù)讀取的端口信息,調(diào)用 get_remote_ips 函數(shù)獲取指定端口的遠(yuǎn)程IP地址列表,并將其存儲在 remote_ips_dict 字典中
3.根據(jù) remote_ips_dict 字典中的數(shù)據(jù)生成郵件正文
4.使用 zmail 庫發(fā)送郵件給指定的收件人地址,郵件包括檢測時間、主機(jī)名、用戶名、檢測到的連接端口以及該端口連接的遠(yuǎn)程IP地址列表,同時提供查詢IP歸屬地的鏈接。
遠(yuǎn)程登錄服務(wù)器3389郵件通知小工具更新:
2023/3/1
添加了兩條錯誤日志輸出
2023/2/23
使用python3.10編譯,優(yōu)化了一下代碼,
執(zhí)行過程:
1.使用 ConfigParser() 函數(shù)創(chuàng)建一個 config 實(shí)例,并使用 read() 方法讀取名為 Mail.ini 的配置文件。然后獲取 WL 段中的 add 選項(xiàng)的值并按逗號分隔成列表,將其保存到 wl_list 變量中。接著遍歷 port 段中的所有選項(xiàng),如果選項(xiàng)的名稱以 net_port 開頭且選項(xiàng)的值是數(shù)字,則將其轉(zhuǎn)換為整數(shù)并調(diào)用 get_remote_ips() 函數(shù)獲取當(dāng)前連接到該端口的所有遠(yuǎn)程IP地址,將其保存到 remote_ips_dict 字典中。
2.定義函數(shù) get_remote_ips(),它接收兩個參數(shù) port 和 wl_list,并使用 net_connections() 函數(shù)獲取當(dāng)前系統(tǒng)上所有建立連接的信息。然后使用生成器表達(dá)式篩選出所有遠(yuǎn)程IP地址,使得地址不是空值、狀態(tài)為 ESTABLISHED、不是本地回環(huán)地址、不包含冒號,且本地地址的端口號等于 port 參數(shù)。然后使用列表推導(dǎo)式去重并過濾掉在 wl_list 中出現(xiàn)的地址,最終返回遠(yuǎn)程IP地址列表。
3.定義函數(shù) send_mail(),它接收兩個參數(shù) remote_ips_dict 和 config。函數(shù)首先獲取當(dāng)前計(jì)算機(jī)的主機(jī)名、用戶名和當(dāng)前時間,并將其插入到郵件正文中。然后遍歷 remote_ips_dict 字典中的所有端口及其對應(yīng)的遠(yuǎn)程IP地址,如果有遠(yuǎn)程IP地址則將其插入到郵件正文中,最終將郵件正文和郵件標(biāo)題通過 zmail 模塊發(fā)送到指定的收件人。
4.如果 remote_ips_dict 字典中至少有一個非空列表,則調(diào)用 send_mail() 函數(shù)將所有遠(yuǎn)程IP地址發(fā)送到指定的收件人。
遠(yuǎn)程登錄服務(wù)器3389郵件通知小工具演示:
遠(yuǎn)程登錄服務(wù)器3389郵件通知小工具軟件下載地址:
(溫馨提示:發(fā)表評論請勾選 在此瀏覽器中保存我的顯示名稱、郵箱地址和網(wǎng)站地址,以便下次評論時使用。)
遠(yuǎn)程登錄服務(wù)器3389郵件通知小工具代碼如下:
from configparser import ConfigParser from time import strftime, localtime from psutil import net_connections from os import environ import zmail # 獲取遠(yuǎn)程IP地址 def get_remote_ips(port, wl_list): # 使用psutil庫中的net_connections函數(shù)獲取所有網(wǎng)絡(luò)連接信息 # 篩選出對應(yīng)端口、處于已建立狀態(tài)、遠(yuǎn)程地址不是回環(huán)地址和IPv6地址的網(wǎng)絡(luò)連接 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) # 返回遠(yuǎn)程IP地址列表中不在白名單中的地址 return [ip for ip in set(remote_ips) if not any(ip.startswith(wl) for wl in wl_list if wl.strip())] or [] # 發(fā)送郵件 def send_mail(remote_ips_dict, config): # 獲取計(jì)算機(jī)名稱、用戶名和當(dāng)前時間 try: hostname, username = environ["COMPUTERNAME"], environ["USERNAME"] time = strftime("%Y-%m-%d %H:%M:%S", localtime()) # 構(gòu)造郵件正文 content = [f'<font size="4">檢測時間: {time}<br>主機(jī)名: {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) # 從配置文件中讀取發(fā)件人地址、密碼和郵件標(biāo)題 from_addr, pwd, title = ( config.get('Mail', key) for key in ('from_addr', 'pwd', 'title') ) # 從配置文件中讀取收件人地址列表 to_addr = config.get('to_addr', 'add').split(',') # 使用zmail庫發(fā)送郵件 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] 郵件發(fā)送失?。?{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") # 如果有需要發(fā)送的遠(yuǎn)程IP地址,則發(fā)送郵件 if remote_ips_dict.values(): send_mail(remote_ips_dict, config)
666
問題未解決?付費(fèi)解決問題加Q或微信 2589053300 (即Q號又微信號)右上方掃一掃可加博主微信
所寫所說,是心之所感,思之所悟,行之所得;文當(dāng)無敷衍,落筆求簡潔。 以所舍,求所獲;有所依,方所成!
拿走了 感謝