学习 / 技术分享

逆向分析某学校App

越权(0x3E5) · 5月11日 · 2020年 · · · · ·

疫情期间,学校每天都要填*疫情信息,每天填写不及时都要被催,于是便萌生了一个想法(身为CS的学生竟如果能写一个脚本每天帮我填写那就再好不过啦~)。

0x01 逆向工程中用到的工具

0x02 逆向思路

  1. 抓取服务器接口
  2. 分析反编译App源码
  3. 模拟APP登录
  4. 模拟填报疫情信息并提交

0x03 App的登录逻辑

  1. 从服务器获取公钥(PublicKey)

  2. 生成一段随机的Base64代码(RandomBase64),然后用公钥加密

  3. 将加密生成的代码放到请求中,继续请求获取公钥的链接,获取一个加密的Unique-Code代码,并将此代码用一开始生成的RandomBase64解密,拿到解密后的Unique-Code

  4. 将用户的登录信息用开始生成的RandomBase64进行加密

  5. 将Unique-Code放入请求头,将加密后的用户信息作为参数,带参访问服务器的登录接口。登录成功后服务器会返回用户的所有信息,当然是经过加密的,解密后即可获得用户的所有信息

  6. 登陆成功后根据服务器返回的信息本文来自:1024s.cn填充Access-Token并进行加密,然后将其放入请求头。在以后访问接口时请求头需带Unique-Code和Access-Token

0x04 具体的流程和步骤

  1. 先用FD抓到了第一个接口,如图所示。
Powered by 0x3E5

可以看到在app启动时请求了两次服务器,并且拿到了一串代码,这就是加密的公钥

  1. 使用Jadx工具对App进行反编译,对反编译的代码进行分析

发现这个随机生成的Base64代码是通过asBaseSecretUtil中的某方法生成的,然后我们将反编译代码中整个a1024s.cnsBaseSecretUtil类提取出来,用Java模拟生成了RandomBase64Key

  1. 继续分析FD抓到的数据包,发现客户端二次请求服务器并且携带了一些加密数据

  1. 根据抓到的数据包,可以看到请求时携带了Unique-Code和Access-Token1024s.cn和加密后的RandomBase64Key,然后把Unique-Code放到请求头,然后将RandomBase64Key作为参数,使用Postman模拟请求服务器,可以拿到一串加密后的数据,然后结合逆向代码,并且尝试用RandomBase64解密返回的数据,成功拿到了Unique-Code,然后放到请求头中。并且在逆向代码中可以可以找到登录时代码,可以发现上传时将一个用户Bean进行加密,然后带上加密的数据请求服务器。我们尝试用RandomBase64加密此数据,并本文来自:1024s.cn且访问服务器本文来自:1024s.cn,这时候服务器返回了一段加密数据,和登陆成功的字样,代表模拟登陆成功了。



  1. 然后我们尝本文来自:1024s.cn试用RandomBase64进行解密,发现返回了用户的大量信息,这些信息很多都是不需要的,十分不安全。如下图

  1. 登陆成功后根据拿到的数据封装加密后的Access-Token,以后进行其他操作的时候带上此Token和Unique-Code就可以了

0x05附上小伙伴写的java代码

小伙伴是个Java大佬 大家可以戳这个链接 神秘的小伙伴 访问他的博客。

至此我们已经用Java模拟登录成功了APP,然后就可以用Python或者其他语言来编写自动化填写*情信息的代码了,然后可以把程序挂到服务器上写一个定时任务,这样每天就不用担心班长和导员会来催填了!

0x06利用接口实现自动化操作

最后附上自己用Node.js写的批量自动化填写疫情报告Powered by 0x3E5的演示效果图。