OpenSMTPD 中允許使用 root 權限遠端執行程式碼的漏洞

在OpenBSD專案開發的郵件伺服器中 打開SMTPD 已確定 嚴重漏洞 (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)。隨後,當使用指令'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' 呼叫傳遞代理(MDA) 時,將使用mda_expand_token() 中準備的行。 . 如果透過 /bin/sh 將信件放入 mbox,則會啟動“/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}”行,其中值“%” {mbox.from}”包含來自“MAIL FROM”參數的轉義資料。

這個漏洞的本質是 smtp_mailaddr() 存在邏輯錯誤,因此,如果發送空網域到電子郵件,函數會傳回成功的驗證碼,即使位址中「@」之前的部分包含無效字元。此外,在準備字串時,mda_expand_token() 函數不會轉義所有可能的 shell 特殊字符,而只會轉義電子郵件地址中允許的特殊字符。因此,要運行命令,只需在電子郵件的本地部分使用“;”符號即可。和空格,它們不包含在 MAILADDR_ESCAPE 集中並且不會被轉義。例如:

$nc 127.0.0.1 25

HELO教授.falken
mail來自:
RCPT 至:
數據
.
退出

在此會話之後,OpenSMTPD 在傳送到 mbox 時將透過 shell 啟動命令

/usr/libexec/mail.local -f ;睡眠 66;根

同時,由於地址的本地部分不能超過64個字符,並且特殊字符‘$’和‘|’在轉義時被替換為“:”,因此限制了攻擊的可能性。為了繞過這個限制,我們利用這樣的事實,即透過輸入流運行 /usr/libexec/mail.local 後傳輸信件正文,即透過操縱位址,您只能啟動sh命令解釋器並將信件正文用作一組指令。由於服務 SMTP 標頭指示在信件的開頭,因此建議在循環中使用 read 命令來跳過它們。一個有效的漏洞利用看起來像這樣:

$nc 192.168.56.143 25

HELO教授.falken
郵件來自:
RCPT 至:<[電子郵件保護]>
數據
#0
#1
...
#d
對於 W O P R 中的 i;做
echo -n "($i) " && id ||休息
完成 > /root/x."`id -u`.""$$"
.
退出

來源: opennet.ru

添加評論