溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

發(fā)布時(shí)間:2021-11-12 10:37:06 來源:億速云 閱讀:753 作者:小新 欄目:網(wǎng)絡(luò)安全

小編給大家分享一下如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

使用python實(shí)現(xiàn)SMTP 25未授權(quán)訪問批量掃描

測(cè)試某系統(tǒng)過程中發(fā)現(xiàn)很多服務(wù)器都開了25和110端口,但是不確定是不是真的郵件服務(wù)端口,所以打算嘗試復(fù)現(xiàn)下漏洞。

SMTP匿名郵件

SMTP(Simple Mail Transfer Protocol),簡單郵件傳輸協(xié)議是一種可靠且有效的電子郵件傳輸協(xié)議。

但是在設(shè)計(jì)之初,他并沒有添加身份驗(yàn)證的機(jī)制,導(dǎo)致任意用戶可以連接到SMTP服務(wù)器進(jìn)行郵件發(fā)送的操作。當(dāng)然經(jīng)過這么多年,已經(jīng)有了SMTP-AUTH擴(kuò)展來保證其安全性。

由于其巨大的基數(shù),導(dǎo)致大量因?yàn)樵O(shè)置導(dǎo)致未開啟驗(yàn)證或者舊版不支持SMTP-AUTH的STMP仍在現(xiàn)網(wǎng)環(huán)境運(yùn)行,導(dǎo)致大量的垃圾/詐騙郵件依然在網(wǎng)上傳播,于是有了這篇文章來記錄下學(xué)習(xí)的過程。

漏洞準(zhǔn)備

為了保證環(huán)境真實(shí)可控,還是自己搭一個(gè)吧。

系統(tǒng)環(huán)境選擇了kali 2020.1,畢竟省事,還能點(diǎn)到專欄名字,血賺。

現(xiàn)在最簡單安裝這些服務(wù)環(huán)境的方法就是docker了。

sudo systemctl daemon-reload
sudo systemctl restart docker.service   //重啟docker服務(wù),不然可能會(huì)Cannot connect to the Docker 錯(cuò)誤
sudo docker search smtp //搜索smtp服務(wù)的鏡像

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

選一個(gè)STARS最多的就好了。

sudo docker pull namshi/smtp

這個(gè)時(shí)候如果你條件有限用的是公司小水管,就可能會(huì)發(fā)現(xiàn)下載很慢很慢,這時(shí)候要切一下國內(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

下載就起飛了

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

然后開啟docker:

sudo docker run --restart=always -d -e "RELAY_NETWORKS=:0.0.0.0/0" --name smtp -p 25:25 namshi/smtp

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

嘗試使用telnet或者nc連接一下(系統(tǒng)里有哪個(gè)就用哪個(gè),都行)

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

可以看到返回了220,說明了連接成功

輸入HELP可以看到支持的指令

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

使用EHLO或者HELO對(duì)服務(wù)器打個(gè)招呼~

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

可以看到服務(wù)器返回了250。

繼續(xù)編寫 MAIL FROM:< XX@XX.Xx > 這是指定發(fā)件人:

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

然后編寫RCPT TO:< 118xxxxx@qq.com > 這是指定收件人:

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

然后輸入DATA開始編寫內(nèi)容,并且以單獨(dú)的一行中只有一個(gè)"."來標(biāo)識(shí)郵件內(nèi)容結(jié)束:

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

可以看到最后依然是250 OK,id后面是郵件的隊(duì)列,說明添加郵件成功。

可以用QUIT來退出連接了。(小寫也可以呦)

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

這樣就是一個(gè)完整的連接流程了。

總結(jié)一下:

  1. 使用telnet或者nc連接smtp服務(wù)的25端口,連接成功返回220

  2. 使用EHLO xxxx 或者 HELO xxxx ,連接成功返回250

  3. 使用MAIL FROM:< xx@xx > 指定發(fā)件人,設(shè)置成功返回250

  4. 使用RCPT TO:< XX@XX > 指定收件人,設(shè)置成功返回250

  5. 使用DATA寫入郵件內(nèi)容,以單行的“.”結(jié)束,編寫成功返回250,并且返回隊(duì)列id

  6. 使用QUIT退出連接

網(wǎng)絡(luò)實(shí)戰(zhàn)

為了獲取存在問題的環(huán)境,在FOFA中搜索

"SMTP" && port="25" && country="CN"

可以獲取到國內(nèi)的開啟默認(rèn)端口的主機(jī)IP地址,選國內(nèi)是為了連接速度快。

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

##開始利用嘗試使用telnet連接

telnet 1xxxxxx7 25

可以連接成功

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

嘗試使用EHLO命令,看看會(huì)不會(huì)返回支持的擴(kuò)展:

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

然后,繼續(xù)MAIL FROM和RCPT TO,

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

會(huì)發(fā)現(xiàn)需要認(rèn)證。哦吼吼,繼續(xù)看看別的。

看到一個(gè)沒有AUTH擴(kuò)展的,嘗試連接一下:

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

一套操作下來,穩(wěn)健:

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

批量檢測(cè)

可能批量掃描掃描出的25端口很多,一個(gè)一個(gè)測(cè)過去很麻煩,需要一個(gè)方法進(jìn)行批量掃描。

這里需要解決兩個(gè)問題,

  1. 確定NMAP沒有誤報(bào),掃描出的25端口的確是smtp服務(wù)

  2. 嘗試獲取smtp服務(wù)能否匿名發(fā)送郵件,判斷的依據(jù)就是不會(huì)返回553代碼

如果用python調(diào)用telnet,雖然subprocess可以直接調(diào)用telnet,但是執(zhí)行時(shí)不能正確返回telnet命令的結(jié)果(處理起來太麻煩了)。所以只能用python telnetlib的庫來實(shí)現(xiàn)(直接調(diào)用shell里的命令有時(shí)候真的弱爆了)

導(dǎo)入的格式目前是 xx.xx.xx.xx:xx 但是目前只寫了針對(duì)25默認(rèn)端口

import telnetlib
import time


class TelnetClient():
    def __init__(self,):
        self.tn = telnetlib.Telnet()

    # 此函數(shù)實(shí)現(xiàn)telnet連接對(duì)應(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)入的需要是一個(gè)格式為 ip:port 的文件,因?yàn)閼?,所以只寫?5端口,機(jī)智如你,肯定可以隨便改好的。

題外話

檢測(cè)smtp其實(shí)nmap有對(duì)應(yīng)的腳本,只是沒有看到匿名模式的,所以才自己嘗試寫了一下,其他的可以參考這些:

如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題

以上是“如何解決使用python批量掃描SMTP 25未授權(quán)訪問問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI