您好,登錄后才能下訂單哦!
小編給大家分享一下如何解決使用python批量掃描SMTP 25未授權訪問問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
測試某系統過程中發現很多服務器都開了25和110端口,但是不確定是不是真的郵件服務端口,所以打算嘗試復現下漏洞。
SMTP(Simple Mail Transfer Protocol),簡單郵件傳輸協議是一種可靠且有效的電子郵件傳輸協議。
但是在設計之初,他并沒有添加身份驗證的機制,導致任意用戶可以連接到SMTP服務器進行郵件發送的操作。當然經過這么多年,已經有了SMTP-AUTH擴展來保證其安全性。
由于其巨大的基數,導致大量因為設置導致未開啟驗證或者舊版不支持SMTP-AUTH的STMP仍在現網環境運行,導致大量的垃圾/詐騙郵件依然在網上傳播,于是有了這篇文章來記錄下學習的過程。
為了保證環境真實可控,還是自己搭一個吧。
系統環境選擇了kali 2020.1,畢竟省事,還能點到專欄名字,血賺。
現在最簡單安裝這些服務環境的方法就是docker了。
sudo systemctl daemon-reload sudo systemctl restart docker.service //重啟docker服務,不然可能會Cannot connect to the Docker 錯誤 sudo docker search smtp //搜索smtp服務的鏡像
選一個STARS最多的就好了。
sudo docker pull namshi/smtp
這個時候如果你條件有限用的是公司小水管,就可能會發現下載很慢很慢,這時候要切一下國內源:
sudo vi /etc/docker/daemon.json //沒有內容就創建一下,不用慌
然后添加如下內容:
{ "registry-mirrors": ["http://hub-mirror.c.163.com"] }
添加后重啟docker:
sudo systemctl restart docker.service
下載就起飛了
然后開啟docker:
sudo docker run --restart=always -d -e "RELAY_NETWORKS=:0.0.0.0/0" --name smtp -p 25:25 namshi/smtp
嘗試使用telnet或者nc連接一下(系統里有哪個就用哪個,都行)
可以看到返回了220,說明了連接成功
輸入HELP可以看到支持的指令
使用EHLO或者HELO對服務器打個招呼~
可以看到服務器返回了250。
繼續編寫 MAIL FROM:< XX@XX.Xx > 這是指定發件人:
然后編寫RCPT TO:< 118xxxxx@qq.com > 這是指定收件人:
然后輸入DATA開始編寫內容,并且以單獨的一行中只有一個"."來標識郵件內容結束:
可以看到最后依然是250 OK,id后面是郵件的隊列,說明添加郵件成功。
可以用QUIT來退出連接了。(小寫也可以呦)
這樣就是一個完整的連接流程了。
總結一下:
使用telnet或者nc連接smtp服務的25端口,連接成功返回220
使用EHLO xxxx 或者 HELO xxxx ,連接成功返回250
使用MAIL FROM:< xx@xx > 指定發件人,設置成功返回250
使用RCPT TO:< XX@XX > 指定收件人,設置成功返回250
使用DATA寫入郵件內容,以單行的“.”結束,編寫成功返回250,并且返回隊列id
使用QUIT退出連接
為了獲取存在問題的環境,在FOFA中搜索
"SMTP" && port="25" && country="CN"
可以獲取到國內的開啟默認端口的主機IP地址,選國內是為了連接速度快。
##開始利用嘗試使用telnet連接
telnet 1xxxxxx7 25
可以連接成功
嘗試使用EHLO命令,看看會不會返回支持的擴展:
然后,繼續MAIL FROM和RCPT TO,
會發現需要認證。哦吼吼,繼續看看別的。
看到一個沒有AUTH擴展的,嘗試連接一下:
一套操作下來,穩健:
可能批量掃描掃描出的25端口很多,一個一個測過去很麻煩,需要一個方法進行批量掃描。
這里需要解決兩個問題,
確定NMAP沒有誤報,掃描出的25端口的確是smtp服務
嘗試獲取smtp服務能否匿名發送郵件,判斷的依據就是不會返回553代碼
如果用python調用telnet,雖然subprocess可以直接調用telnet,但是執行時不能正確返回telnet命令的結果(處理起來太麻煩了)。所以只能用python telnetlib的庫來實現(直接調用shell里的命令有時候真的弱爆了)
導入的格式目前是 xx.xx.xx.xx:xx 但是目前只寫了針對25默認端口
import telnetlib import time class TelnetClient(): def __init__(self,): self.tn = telnetlib.Telnet() # 此函數實現telnet連接對應服務器25端口 def login_host(self,host_ip): try: # self.tn = telnetlib.Telnet(host_ip,port=23) self.tn.open(host_ip,port=25) except: print('%s網絡連接失敗'%host_ip) return False else: time.sleep(5) # read_very_eager()獲取到的是的是上次獲取之后本次獲取之前的所有輸出 try: command_result = self.tn.read_very_eager().decode('ascii') except: print('%s smtp端口連接失敗' % host_ip) return False else: # 等待返回Mail Server ESMTP ready,返回該信息說明登陸成功 if '220'in command_result: print('%s smtp登錄成功'%host_ip) self.tn.write("EHLO localhost\n") command_result = self.tn.read_very_eager().decode('ascii') if "553" not in command_result and "connection closed" not in command_result: self.tn.write("MAIL TO:<123@QQ.COM>\n") print("輸入MAIL TO內容") command_result = self.tn.read_very_eager().decode('ascii') if "553" not in command_result and "connection closed" not in command_result: self.tn.write("RCPT TO:<456@QQ.COM>\n") print("輸入MAIL TO內容") command_result = self.tn.read_very_eager().decode('ascii') if "553" not in command_result: print("可能存在未授權問題") return True else: print('%s smtp登錄失敗'%host_ip) return False # 退出telnet def logout_host(self): self.tn.write(b"quit\n") if __name__ == '__main__': ip_list = open("iplist1.txt", 'r') for line in ip_list.readlines(): target=line.split(":",1) if ":25" in line: print("-----------------------------") print(target[0]) telnet_client = TelnetClient() # 如果登錄結果返加True,則執行命令,然后退出 if telnet_client.login_host(target[0]): telnet_client.logout_host() print("-----------------------------")
導入的需要是一個格式為 ip:port 的文件,因為懶,所以只寫了25端口,機智如你,肯定可以隨便改好的。
檢測smtp其實nmap有對應的腳本,只是沒有看到匿名模式的,所以才自己嘗試寫了一下,其他的可以參考這些:
以上是“如何解決使用python批量掃描SMTP 25未授權訪問問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。