"/>
声明 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。 某银行请求加密算法破解 我们拿一个银行的APP进行举例: 开局就有ROOT检测,不让在模拟器里测。因此得先过掉ROOT检测。 <string name="msg_rootError">You cannot use this App because your device is jailbroken/rooted.</string> msg_rootError 以l.smali为例 so,以SplashActivity为例,可以看到是根据com.*********.Manager.dl类来决定是否设置LoginActivity的成员变量d的值。 最终发现dl 类即root检测类 patch如下回编,即可bypass root检测。 设置好bp代理,重新安装后,在注册、登录的界面,点一下会提示。 txt_connection_error,目测是证书检测导致。 分析APP可知其通过Retrofit 来发送请求。因此注释掉类okhttp3.CertificatePinner中check方法、patch类okhttp3.internal.tls.OkHostnameVerifier中verify方法返回值。在java层hook类HttpsURLConnection中setDefaultHostnameVerifier、setSSLSocketFactory、setHostnameVerifier等方法、com.android.org.conscrypt.TrustManagerImpl实现类checkServerTrusted、checkClientTrusted等方法,就可以无视SSL Pinning了。 最终bypass证书检测,bp可顺利抓包,我们看到一些请求和响应被加密,保存在encData。 com/***********/Manager/dm.java 发现api 地址 startsWith("https://********_api/"); k 方法通过rx发送请求。 f 类中(com.****.Manager.f)存在大量请求实现。 aq类a 「static HashMap<String,RequestBody> a(HashMap<String,String> hashMap) 」方法定义 n类的h方法「startic RequestBody h(String str) 」定义 根据代码逻辑,选中的a方法处理b这个hashmap后,将会得到加密后的信息。提取aq类以及相关类,并修复代码,可以构造出请求加密部分逻辑。 类aq简单修复后如下图 类n简单修复后如上图 dm类中可找到g、h的初始化 GetSessionKeyResponse 类中保存了加密相关的关键变量。 这些值从encData解密后取出。n类d方法用来解密。 pm clear后,抓包可以看到如下图所示。先是一个GET请求获取公钥。接着便是一个发往 /session/key 的post请求, 据参数名及个数,可找到在f类中的j方法「static retrofit2.b<ResponseBody> j (Context context,String str) 」触发。且str已被加密。 aq类中调用了j方法「static retrofit2.b<ResponseBody> j (Context context,String str) 」 此处b(String str)方法在当前类的a方法「void a(String str) 」里调用。 aq.a() 「 static String a() 」定义 aq.b() 「 static String b() 」定义 而a方法「static String a(String str) 」方法在该类a方法「 void a() 」方法中调用。 类n中c方法「 static String c(byte[] bAttr) 」完成了base64编码。 aq.a 「 static byte[] a(String) 」 用来生成加密字符串。 类n中x方法「 static byte[] (String str) 」完成了base64解码。n.x(a)中的a即公钥。具体的实现都在n类中。 因此第二个请求,请求体中的encData完整的加密流程分析完毕。 app获取到响应后,解密并提取sKey、iv、SESSIONID。同时生成aq.i的值。 继续分析可知,后续解密响应中的encData需要用到aq.i 和 aq.g。 加密依然通过aq.a来完成。因此整个请求加解密分析完毕,最终可以构造出encData的加解密算法。 请求加解密程序效果实现如下: 构造请求:(加密encData) 解密响应: 上图为模拟了用户注册时,输入手机号后接受接收短信的请求。构造了加密请求,服务端识别并给出响应,以及解密了响应数据。 相关代码实现: 对此app而言,在测试过程中,只需在获取publicKey、cKey、cIv、sKey、iv、SESSIONID等处直接插桩获取并替换即可。 防护方案 1.加壳 2.java层逻辑抽到native层去 3.native层混淆 招聘启事 安全招聘 设计师 ———————— 【职位描述】 简历投递至 strategy@dbappsecurity.com.cn 安恒雷神众测SRC运营(实习生) 简历投递至 strategy@dbappsecurity.com.cn 安全服务工程师/渗透测试工程师 ———————— 地点:新疆 【岗位要求】 2、熟悉风险评估、安全评估; 3、熟练掌握各类渗透工具,如Sqlmap、Burpsuite、AWVS、Appscan、Nmap、Metasploit、Kali等; 4、熟练掌握Web渗透手法,如SQL注入、XSS、文件上传等攻击技术; 5、至少熟悉一种编程语言(php/java/python),能够独立编写poc者优先; 6、具有良好的沟通能力和文档编写能力,动手能力强; 7、对工作有热情,耐心、责任心强,具备沟通能力和良好的团队意识; 8、加分项:有安全开发经验/可进行代码审计工作; 9、加分项:有安全和网络相关证书,如CISSP、CISA、CISP 、CCNP、CCIE等认证者; 【岗位职责】 1、参与安全服务项目实施,其中包括渗透测试与安全评估,代码审计,安全培训,应急响应; 2、独立完成安全服务项目报告编写,输出安全服务实施报告; 简历投递至 strategy@dbappsecurity.com.cn 专注渗透测试技术 全球最新网络攻击技术 上一篇:【漏洞复现】Gogs任意用户登录漏洞分析复现 下一篇:10年了!微信这个功能瞬间刷屏,冲上热搜第一! |