小編給大家分享一下如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
目前創(chuàng)新互聯(lián)已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計、敖漢網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
測試某系統(tǒng)過程中發(fā)現(xiàn)很多服務(wù)器都開了25和110端口,但是不確定是不是真的郵件服務(wù)端口,所以打算嘗試復(fù)現(xiàn)下漏洞。
SMTP(Simple Mail Transfer Protocol),簡單郵件傳輸協(xié)議是一種可靠且有效的電子郵件傳輸協(xié)議。
但是在設(shè)計之初,他并沒有添加身份驗證的機制,導(dǎo)致任意用戶可以連接到SMTP服務(wù)器進行郵件發(fā)送的操作。當(dāng)然經(jīng)過這么多年,已經(jīng)有了SMTP-AUTH擴展來保證其安全性。
由于其巨大的基數(shù),導(dǎo)致大量因為設(shè)置導(dǎo)致未開啟驗證或者舊版不支持SMTP-AUTH的STMP仍在現(xiàn)網(wǎng)環(huán)境運行,導(dǎo)致大量的垃圾/詐騙郵件依然在網(wǎng)上傳播,于是有了這篇文章來記錄下學(xué)習(xí)的過程。
為了保證環(huán)境真實可控,還是自己搭一個吧。
系統(tǒng)環(huán)境選擇了kali 2020.1,畢竟省事,還能點到專欄名字,血賺。
現(xiàn)在最簡單安裝這些服務(wù)環(huán)境的方法就是docker了。
sudo systemctl daemon-reload sudo systemctl restart docker.service //重啟docker服務(wù),不然可能會Cannot connect to the Docker 錯誤 sudo docker search smtp //搜索smtp服務(wù)的鏡像
選一個STARS最多的就好了。
sudo docker pull namshi/smtp
這個時候如果你條件有限用的是公司小水管,就可能會發(fā)現(xiàn)下載很慢很慢,這時候要切一下國內(nèi)源:
sudo vi /etc/docker/daemon.json //沒有內(nèi)容就創(chuàng)建一下,不用慌
然后添加如下內(nèi)容:
{ "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連接一下(系統(tǒng)里有哪個就用哪個,都行)
可以看到返回了220,說明了連接成功
輸入HELP可以看到支持的指令
使用EHLO或者HELO對服務(wù)器打個招呼~
可以看到服務(wù)器返回了250。
繼續(xù)編寫 MAIL FROM:< XX@XX.Xx > 這是指定發(fā)件人:
然后編寫RCPT TO:< 118xxxxx@qq.com > 這是指定收件人:
然后輸入DATA開始編寫內(nèi)容,并且以單獨的一行中只有一個"."來標(biāo)識郵件內(nèi)容結(jié)束:
可以看到最后依然是250 OK,id后面是郵件的隊列,說明添加郵件成功。
可以用QUIT來退出連接了。(小寫也可以呦)
這樣就是一個完整的連接流程了。
總結(jié)一下:
使用telnet或者nc連接smtp服務(wù)的25端口,連接成功返回220
使用EHLO xxxx 或者 HELO xxxx ,連接成功返回250
使用MAIL FROM:< xx@xx > 指定發(fā)件人,設(shè)置成功返回250
使用RCPT TO:< XX@XX > 指定收件人,設(shè)置成功返回250
使用DATA寫入郵件內(nèi)容,以單行的“.”結(jié)束,編寫成功返回250,并且返回隊列id
使用QUIT退出連接
為了獲取存在問題的環(huán)境,在FOFA中搜索
"SMTP" && port="25" && country="CN"
可以獲取到國內(nèi)的開啟默認(rèn)端口的主機IP地址,選國內(nèi)是為了連接速度快。
##開始利用嘗試使用telnet連接
telnet 1xxxxxx7 25
可以連接成功
嘗試使用EHLO命令,看看會不會返回支持的擴展:
然后,繼續(xù)MAIL FROM和RCPT TO,
會發(fā)現(xiàn)需要認(rèn)證。哦吼吼,繼續(xù)看看別的。
看到一個沒有AUTH擴展的,嘗試連接一下:
一套操作下來,穩(wěn)?。?/p>
可能批量掃描掃描出的25端口很多,一個一個測過去很麻煩,需要一個方法進行批量掃描。
這里需要解決兩個問題,
確定NMAP沒有誤報,掃描出的25端口的確是smtp服務(wù)
嘗試獲取smtp服務(wù)能否匿名發(fā)送郵件,判斷的依據(jù)就是不會返回553代碼
如果用python調(diào)用telnet,雖然subprocess可以直接調(diào)用telnet,但是執(zhí)行時不能正確返回telnet命令的結(jié)果(處理起來太麻煩了)。所以只能用python telnetlib的庫來實現(xiàn)(直接調(diào)用shell里的命令有時候真的弱爆了)
導(dǎo)入的格式目前是 xx.xx.xx.xx:xx 但是目前只寫了針對25默認(rèn)端口
import telnetlib import time class TelnetClient(): def __init__(self,): self.tn = telnetlib.Telnet() # 此函數(shù)實現(xiàn)telnet連接對應(yīng)服務(wù)器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網(wǎng)絡(luò)連接失敗'%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內(nèi)容") 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內(nèi)容") command_result = self.tn.read_very_eager().decode('ascii') if "553" not in command_result: print("可能存在未授權(quán)問題") 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() # 如果登錄結(jié)果返加True,則執(zhí)行命令,然后退出 if telnet_client.login_host(target[0]): telnet_client.logout_host() print("-----------------------------")
導(dǎo)入的需要是一個格式為 ip:port 的文件,因為懶,所以只寫了25端口,機智如你,肯定可以隨便改好的。
檢測smtp其實nmap有對應(yīng)的腳本,只是沒有看到匿名模式的,所以才自己嘗試寫了一下,其他的可以參考這些:
以上是“如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!