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 集中并且不会被转义。 例如:

$ 数控 127.0.0.1 25

HELO教授.falken
邮件来自:<;睡眠 66;>
RCPT 至:
数据
.
放弃

在此会话之后,OpenSMTPD 在传送到 mbox 时将通过 shell 启动命令

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

同时,由于地址的本地部分不能超过 64 个字符以及特殊字符“$”和“|”,因此攻击的可能性受到限制。 转义时被替换为“:”。 为了绕过这个限制,我们利用这样的事实,即通过输入流运行 /usr/libexec/mail.local 后传输信件正文,即通过操纵地址,您只能启动sh命令解释器并将信件正文用作一组指令。 由于服务 SMTP 标头指示在信件的开头,因此建议在循环中使用 read 命令来跳过它们。 一个有效的漏洞利用看起来像这样:

$ 数控 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;>
RCPT 至:[电子邮件保护]>
数据
#0
#1
...
#d
对于 WOPR 中的 i; 做
echo -n "($i) " && id || 休息
完成 > /root/x."`id -u`.""$$"
.
放弃

来源: opennet.ru

添加评论