zoukankan      html  css  js  c++  java
  • APP Https双向认证抓包_android

     01 声明

        由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。

        雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

     

    02 正文

        在一次测试中偶然遇到一个https双向认证的手机app(fiddler抓包提示需要提供客户端证书),平时一梭子能搞定地抓包姿势没有效果了,本着所有客户端发出的数据都是操控的想法,决定搞一搞,无非是采用什么方式的问题。双向认证只要拿到客户端加密的私钥证书就行了。

    很不巧,手机app被加壳了,基本上告别动态调试的方式。 

     

    在assets目录下发现了用于双向认证的证书库文件,如下:

    要使用证书库,我们还需要找到证书库的密码, 脱壳获取部分源代码,通过关键字定位到了如下代码:

    关键代码在函数m8196a中,具体代码如下:(因为没有写过相关双向认证和keystore的相关代码,只能通过java api 文档查查函数说明,补充了注释)

       String str = "X509";
           String str2 = "BKS";
           Application b = MyApplication.m5574b();
           SSLSocketFactory sSLSocketFactory = null;
           try {
               KeyStore instance = KeyStore.getInstance(str2);
               KeyStore instance2 = KeyStore.getInstance(str2);
               InputStream open = b.getAssets().open(f7624a); // 取了客户端证书的keystore
               InputStream open2 = b.getAssets().open(f7625b); // 取了服务端相关证书的keystore文件
               instance.load(open, f7626c.toCharArray()); // 通过密钥库密码打开客户端 keystore
               instance2.load(open2, f7627d.toCharArray());// 通过密钥库密码打开服务端keystore
               open.close();
               open2.close();
               SSLContext instance3 = SSLContext.getInstance("TLS");
               TrustManagerFactory instance4 = TrustManagerFactory.getInstance(str);
               KeyManagerFactory instance5 = KeyManagerFactory.getInstance(str);
               instance4.init(instance2);
               instance5.init(instance, f7626c.toCharArray());// 再次输入了密钥库的密码
               instance3.init(instance5.getKeyManagers(), C2639d.m8197a(instance4.getTrustManagers()), null);
               sSLSocketFactory = instance3.getSocketFactory();// 完成了sslsocketfactory
               return sSLSocketFactory;
           } catch (KeyStoreException e) {
                 ………….省略

    对于keystore认识的缺乏的我开始了绕圈之路。误以为已经搞定了双向认证,打开了burpsuite导入证书:

    Pkcs12格式,暴露了我对证书相关格式的盲区,google告诉我用keytool可以进行证书格式的转换,如下:

    Emmmm?还需要密钥口令,本着试试相同密码的尝试(代码访问了同一个密码两次)(毕竟代码里没有看到其他密码)——绕圈的开始 复制,粘贴——go

    Emm 手动输入试试

    Emmmm,what?

    代码里没有看到相关密码,决定搜搜相关的调用,上级调用在函数m5660a 

    没有任何关于密钥的代码。感觉事情并不寻常,可能掉到了什么诡异的坑里。

    1. 代码不完整,可能密钥没脱出来
    2. 证书库可能有什么问题

    网上找了httpsURLConnection类的双向https的实现demo——几乎完全一致。那一定是证书库有什么玄学的问题,找到了关于证书文件格式的介绍(https://blog.csdn.net/zzhongcy/article/details/22755317)

    几个相关的文件格式如下:

    Emmmmm,开始了兜兜转转之旅,之后再次查看了代码中涉及的函数说明

    第一次调用load使用的密码是keystore的解锁密码

    第二次调用init使用的密码Keystore中的恢复密码——推测就是私钥证书的密码。福尔摩斯:“当你排除了所有的不可能,无论剩下的是什么,即使再不可能也一定是真相。”密码肯定没有问题,一定是keytool有点问题,网上找了款证书管理的工具portecle,两次输入相同密码,成功打开获取私钥证书:

    生成了p12格式的客户端证书,心里真是的万马奔腾。

    还是失败,推测可能是证书信任或者服务端证书缺少的问题 ,将另一个bks库中的ca证书和server证书导出,导入到windows证书库中,成功抓包:

  • 相关阅读:
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 实现业务
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 开发流程
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 报表系统集成说明
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 处理报表
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 数据访问
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 分布式应用
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 实现插件
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 对象设计器使用帮助
    基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET平台开发指南 数据层开发
    Jquery 中的CheckBox、 RadioButton、 DropDownList、CheckBoxList、RadioButtonList的取值赋值
  • 原文地址:https://www.cnblogs.com/pt007/p/11883924.html
Copyright © 2011-2022 走看看