fail2ban远程代码执行漏洞深度解析

本文详细分析了fail2ban软件中存在的CVE-2021-32749漏洞,该漏洞源于mailutils包的邮件命令处理机制,攻击者可通过特制WHOIS响应实现远程代码执行,文章探讨了攻击场景和防护建议。

Remote code execution by fail2ban

Jakub Żoczek | 2022年4月4日 | 教育研究

本文将讨论近期在流行软件fail2ban(CVE-2021-32749)中披露的漏洞。在特定条件下,此漏洞可被利用以实现root权限的代码执行。幸运的是,普通攻击者难以利用此漏洞。该漏洞根源于mailutils包中mail命令的工作方式。此外,我必须承认,我是完全偶然发现这一点的!

fail2ban通过分析日志(或其他数据源)来检测暴力破解攻击,并在检测到攻击时封锁源IP地址。它包含针对特定服务(SSH、SMTP、HTTP等)的多种规则。此外,当检测到攻击时,会执行特定操作——其中之一是向管理员发送电子邮件,通知特定IP地址已被封锁。如果我们在互联网上搜索从命令行发送电子邮件的方法,经常会找到这样的解决方案:

1
$ echo "test e-mail" | mail -s "subject" user@example.org

这正是fail2ban发送邮件操作的定义方式——以下是文件./config/action.d/mail-whois.conf的片段:

1
2
3
4
5
6
7
actionban = printf %%b "Hi,\n
            The IP <ip> has just been banned by Fail2Ban after
            <failures> attempts against <name>.\n\n
            Here is more information about <ip> :\n
            `%(_whois_command)s`\n
            Regards,\n
            Fail2Ban"|mail -s "[Fail2Ban] <name>: banned <ip> from <fq-hostname>" <dest>

上面的代码片段看起来并无异常。然而,如果我们查看mailutils的文档,可以发现关于所谓的波浪转义序列(tilde escape sequences)的信息: “!”转义执行指定命令并返回到邮件撰写模式而不更改消息。无参数使用时,它会启动你的登录shell。“|”转义将当前撰写的消息通过给定的shell命令管道传输,并用命令产生的输出替换消息。如果命令没有产生输出,mail会假定出现问题并保留消息的旧内容。

实际操作如下:

1
2
3
4
5
6
7
8
9
jz@fail2ban:~$ cat -n pwn.txt
 	1  Next line will execute command :)
 	2  ~! uname -a
 	3
 	4  Best,
 	5  JZ
jz@fail2ban:~$ cat pwn.txt | mail -s "whatever" whatever@whatever.com
Linux fail2ban 4.19.0-16-cloud-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64 GNU/Linux
jz@fail2ban:~$

如果我们再次查看fail2ban的操作定义,可以看到whois命令的结果被附加到电子邮件中。如果攻击者能够在其选择的IP地址的whois响应中添加波浪转义序列——在向管理员发送电子邮件后,最终会执行代码——很可能以管理员(root)权限执行。

从攻击者的角度来看,有哪些选择? 首先想到的是尝试联系我的ISP,请求他们联系RIPE并为我的IP地址添加特定条目。不幸的是,这种方式行不通。RIPE/ARIN/APNIC等机构修改的是整个IP地址段的条目。此外,不太可能有人会同意在不询问任何问题的情况下向WHOIS响应添加任何可疑字符串。

那么,运行自己的WHOIS服务器是否可行?令人惊讶的是,这是可能的,并且你可以遇到几个“私有”WHOIS服务器。这要归功于RFC中详细描述的机制:即,如果在WHOIS响应中找到ReferralServer属性,客户端将尝试连接到设置为该属性值的服务器。可以通过验证IP地址157.5.7.5的WHOIS响应来查看示例操作:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
$ whois 157.5.7.5

#
# ARIN WHOIS data and services are subject to the Terms of Use
# available at: https://www.arin.net/resources/registry/whois/tou/
#
# If you see inaccuracies in the results, please report at
# https://www.arin.net/resources/registry/whois/inaccuracy_reporting/
#
# Copyright 1997-2021, American Registry for Internet Numbers, Ltd.
#


NetRange:       157.1.0.0 - 157.14.255.255
CIDR:           157.4.0.0/14, 157.14.0.0/16, 157.1.0.0/16, 157.12.0.0/15, 157.2.0.0/15, 157.8.0.0/14
NetName:        APNIC-ERX-157-1-0-0
NetHandle:      NET-157-1-0-0-1
Parent:         NET157 (NET-157-0-0-0-0)
NetType:        Early Registrations, Transferred to APNIC
OriginAS:
Organization:   Asia Pacific Network Information Centre (APNIC)

[… cut …]

ReferralServer:  whois://whois.apnic.net
ResourceLink:  http://wq.apnic.net/whois-search/static/search.html

OrgTechHandle: AWC12-ARIN
OrgTechName:   APNIC Whois Contact
OrgTechPhone:  +61 7 3858 3188
OrgTechEmail:  search-apnic-not-arin@apnic.net

[… cut …]

Found a referral to whois.apnic.net.

% [whois.apnic.net]
% Whois data copyright terms    http://www.apnic.net/db/dbcopyright.html

% Information related to '157.0.0.0 - 157.255.255.255'

% Abuse contact for '157.0.0.0 - 157.255.255.255' is 'helpdesk@apnic.net'

inetnum:        157.0.0.0 - 157.255.255.255
netname:        ERX-NETBLOCK
descr:          Early registration addresses

[… cut …]

理论上,如果我们是一个足够大的网络的所有者,我们可以尝试请求我们的区域互联网注册管理机构添加适当的条目。然后,从我们自己的RWhois服务器级别,我们将能够自由控制发送的响应。

尽管如此,很容易想象一个场景,攻击者/黑帽——简单地入侵运行RWHOIS服务的网络或服务器,然后从该网络发起攻击。这似乎比成为一个足够大的公司来合法运行自己的有效whois服务器更容易且成本更低。

当然,你可以是一个大国的政府,并简单地控制该国的网络流量。如果我们仔细观察WHOIS协议,可以注意到几点:

  • 这是一个非常古老的协议(起源可追溯到1977年)
  • 非常容易实现(问答式)
  • 完全不加密

鉴于上述情况,通过对这个未加密协议进行MITM攻击——攻击者(在这种情况下是政府)可以简单地在响应中插入适当的恶意字符串。

值得注意的是,问题不在于fail2ban本身,而在于mailutils——其中提到的功能不是一个错误,而是一个计划中的结果。因此,值得关注使用mail命令的自有专有脚本,以及其他可能也易受攻击的软件。

历史一再表明,安全是困难且复杂的。有时一个看似无害的无辜功能可能最终成为一个相当大的威胁。

作者:Jakub Żoczek

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计