请勿截屏传播

Bash Shellshock CVE-2014-6271

1、解题

该poc.cgi把CGI环境变量全部打印出来了,所有可以利用这个CGI脚本执行可执行代码来读取环境的内容,这里可以看

text
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:156.0) Gecko/20100101 Firefox/156.0

这是正常浏览器的 User-Agent,没有任何攻击性,但是改成

text
User-Agent:() { :; }; echo; echo; /bin/ls / 2>/dev/null

就可以看见有哪些文件了

这里说明是可以正确执行代码的,于是我们可以

text
User-Agent:() { :; }; echo; echo; /usr/bin/find / -name '*flag*' 2>/dev/null

这样就可以获得我们想要的东西了。 这个代码可以执行的原因是该脚本可能是用 Bash 写的,或者脚本内部调用了 Bash,Bash 在启动时就会读取这些环境变量。当 Bash 启动并扫描环境变量时,它会看到这个值以 () { 开头,于是把它当作函数定义来解析。但 Bash 的解析器没有在 } 处停止,而是继续执行了后面的代码。

2、安全加固

🩹 第一步:立即止血(优先做)

1. 禁用或限制 CGI 执行

这是最直接的阻断方式。Shellshock 通过 CGI 触发,如果靶机业务不依赖 CGI,直接关掉:

text
#检查 Apache 配置中哪些地方开启了 ExecCGI
grep -r "ExecCGI" /etc/apache2/ /usr/local/apache2/conf/ 2>/dev/null

找到后,在 httpd.conf 或对应配置文件中,将 Options 行里的 ExecCGI 移除,或改为 Options -ExecCGI。如果整个 /cgi-bin/ 目录都不需要,直接注释掉 ScriptAlias 指令。

2. 删除不必要的 CGI 脚本

靶机里可能预置了 printenv、test-cgi 等测试脚本,它们本身就是为了验证漏洞而存在的,必须删掉

bash
rm -f /usr/local/apache2/cgi-bin/printenv
rm -f /usr/local/apache2/cgi-bin/test-cgi
rm -f /usr/local/apache2/cgi-bin/poc.cgi  # 你之前的漏洞验证脚本

3. 用 WAF 规则临时拦截

如果比赛环境提供 WAF 或可以部署规则,添加针对 Shellshock 的检测规则。攻击特征很明显:请求头中出现 () { :; }; 或 () { 开头的异常函数定义。很多 WAF 内置了 Shellshock 规则,启用即可。

🔧 第二步:根本修复(止血后尽快做)

1. 升级 Bash

这是彻底解决漏洞的唯一方式

bash
# Debian/Ubuntu
apt-get update && apt-get install --only-upgrade bash
# CentOS/RHEL
yum update bash
# 验证版本
bash --version

升级后,你之前能成功执行的 payload(() { :; }; ...)会被 Bash 忽略掉后面的命令。

2. 如果无法升级,改用非 Bash 作为默认 shell

临时方案,将 /bin/sh 的指向从 bash 改为 dash(Debian/Ubuntu 上),因为 dash 不受 Shellshock 影响

bash
dpkg-reconfigure dash  # 选择 "No" 不将 /bin/sh 指向 dash 以外的 shell
# 或者手动
ln -sf /bin/dash /bin/sh
Discuz ML CVE-2019-13956
骑士 CMS V5.0.1

评论区

评论加载中...