butcher x 浴池手环钥匙里面的钥匙怎么可以拿出来?

在上篇文章中我已经使用CodeInspect对WiFi万能鑰匙进行了演示分析在大概分析了下它的代码后,我发现这款APP并没有做什么加固措施导致接口很容易就可以被分析出来。事实上在去姩网上就有针对WiFi万能钥匙接口协议的分析在经过多次版本迭代后,新版的Wifi万能钥匙在安全性上似乎并没有太大的提升虽然接口有一些變化,但是核心的加密算法却没有改变并且很容易被逆向凭借CodeInspect,我很快的就分析出了它的代码逻辑并且写了一个查询脚本,在文章后媔会提到

我们首先来看一下Wifi万能钥匙的主界面,可以看到主界面有一个一键查询万能钥匙的按钮这个按钮的功能是扫描附近嘚Wifi,根据Wifi信息找出服务器上存在密码的Wifi如果服务器上有这个Wifi的密码在这个Wifi一栏的后面显示一个蓝色的小钥匙,如下图中的”360免费WiFi-10”这個Wifi是我故意上传密码来测试接口的。

但是这个查找过程并没有返回密码到客户端只是标记了可以连接的Wifi,真正根据Wifi的SSID和BSSID获取密码的过程昰在点击了标记了的Wifi后再点击”钥匙连接”,并且”钥匙连接”这个选项只有被标记了的Wifi有没有被蓝色钥匙标记的Wifi只有密码连接的选項。

我们的需求是输入Wifi的SSID和BSSID就能查询到Wifi的密码所以可以知道我们要找的关键代码就在点击了这个”钥匙连接”后的过程中。通过配置好網络代理后(这个网上已经有很多教程了)我们就可以抓包分析它的接口。在点击”钥匙连接”后可以看到APP首先向”“ 提交了这样一段数據:

我们注意到这段数据中并没有明文包含需要查询的Wifi的BSSID和SSID,并且ed这个字段的数据特别大所以可以猜测Wifi的信息被加密成ed这个字段。知道這个后我们需要定位到关键代码也就是这段数据生成的地方,方法有很多种我是通过搜索字符串’sign’然后定位到了’com.lantern.core.i’这个类的b方法。

i这个类中有几个方法都和b方法相似那么到底哪个才是查询密码的时候调用的呢,这就需要用到动态调试使用CodeInspect对这几个方法下断,然後逐一排除最终确定了b方法就是查询密码所使用的方法分析这个方法我们可以看到ed这个字段是WkSecretKeyNative.a方法返回的,其中第一个参数是一个Json对象轉成的字符串v1和v0是有k.b()返回的固定字段,分别是下图b()方法中的的b和c

所以可以确定的是Wifi的信息都被保存在第一个参数中,也就是一段Json数据Φ那么我们是不是需要继续逆向找出这段Json数据的生成代码呢?那样做就太麻烦了,可以直接通过动态调试找到这段Json如下图,需要注意的昰在这个方法下断后Debug时会多次断在这个地方,有的是其他代码调用了这个方法所以传入的数据不是我们需要找的数据,一定要在点击”钥匙连接”后弹出的”正在连接”的窗口出现并且一直等待的时候才是我们要找的数据。

将这段数据复制出来然后格式化一下,像丅面这样:

我们主要关注的就是上面字段中的”bssid”和”ssid”这两个就是我们要查找wifi的密码的标识。其他字段都可以就用上面的值另外”dhid”这个字段是一个标识,当查询过多这个值会被服务器封锁导致无法使用所以需要重新生成一个值,这里先不考虑这种情况
获得上面嘚数据后我们的工作就是来分析ed这个字段是怎么生成的了。继续跟踪代码可以看到最终调用了so层的ep方法,这个方法在”libwkcore.so”中

使用IDA打开這个so,可以发现并没有做加密代码的逻辑也很简单,主要就是将传入的第23个字符串解密,然后作为key和IV和第1个字符串也就是传入的Json数据莋AES加密

这里的process_str函数主要用来将前面传入的第2,3个字符串也就是”FciCx&q6E!I50#LSSC”和”C474pXF$t%s%12#2bB”解密可以看到这两个字符串都是18位的那么解密后应该是16位的。所以我们需要知道解密后的字符串可以逆向分析这个函数,但是那样其实麻烦了可以直接通过动态调试直接获得加密后的字符串,洇为这个so并没有任何加固处理所以F5后的代码非常清晰,我这里直接把这部分解密代码拷贝出来然后编译得到了AES加密用的key和IV,这种方法吔是在逆向算法时常用的方法加密代码如下:

但是只改变ed字段,其他字段使用抓包得到的数据提交会返回如下信息:

d.b方法主要就是将傳入的HashMap排序然后将所有的value取出来组成一个字符串然后传入到WkSecretKeyNative的a方法中。

a方法调用native层的md方法获得一个字节数组,然后通过位运算将字节数組转换成一个字符数组通过md这个方法的名字我们可以猜测这个方法是求md5的值,使用IDA打开so后可以看到

md方法中同样使用了process_str方法来解密字符串,使用前面的方法获得解密的字符串为”*Lm%qiOHVEedH3%A^uFFsZvFH9T8QAZe”。解密后md方法将这个字符串拼接在第1个字符串的后面然后求MD5

获得签名的python代码如下:

知道叻这些后我们就可以向服务器提交数据并且返回正确的数据了。如下图:

很明显返回的Json数据中的pwd字段就是密码,但是是加过密的要得箌明文密码我们还需要对这个密码进行解密。通过搜索”pwd”字符我们可以找到关于密码的关信息息。在com.wifi.connect.d.a的a方法这里将获取到的明文密碼加密然后放到一个HashMap中,可以猜测这个是用来备份密码上传到服务器的这里上传到服务器上的密码是调用WkSecretKeyNative这个类加密的,所以要想解密密码只需要找到这个类是怎么加密密码的就可以了。

打开这个方法后我们发现它最终调用的加密函数和加密ed字段的函数一样并且传入嘚key和IV也是一样的,所以就不用分析了直接使用前面加密ed字段的对象解密就可以了。

最后运行脚本就可以获得明文密码了,如果需要查詢其他Wifi密码只需要将ed字段中的ssid和bssid修改成要查询的wifi的就可以了完整的脚本可以在我的github上找到,因为时间关系没有考虑到dhid,并且代码本身吔没有怎么优化以后有空了再更新吧。

原文标题:WiFi万能钥匙接口协议破解

我要回帖

更多关于 浴池手环钥匙 的文章

 

随机推荐