Android抓包攻防技术 - Dubh3

admin 2021年12月31日14:47:39评论98 views字数 3032阅读10分6秒阅读模式

一.检测代理

1. 原理

APP在发起网络请求前会检测系统是否设置了代理,如果发现有代理,就不发起请求。以下是一段APP检测系统是否有代理的实例代码:

public static boolean isWifiProxy(Context context) {
    final boolean IS_ICS_OR_LATER = Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
    String proxyAddress;
    int proxyPort;
    if (IS_ICS_OR_LATER) {
        proxyAddress = System.getProperty("http.proxyHost");    //获取代理主机
        String portStr = System.getProperty("http.proxyPort");  //获取代理端口
        proxyPort = Integer.parseInt((portStr != null ? portStr : "-1"));
    } else {
        proxyAddress = android.net.Proxy.getHost(context);
        proxyPort = android.net.Proxy.getPort(context);
    }
   Log.i("代理信息","proxyAddress :"+proxyAddress + "prot : " proxyPort")
   return (!TextUtils.isEmpty(proxyAddress)) && (proxyPort != -1);
}

2.特征

设置手机代理后,APP无法获取网络数据。

3.绕过方法

  • 直接在系统底层使用iptables强制转发流量(ProxyDroid:全局模式)

  • 反编译APP,在smali代码中修改检测代理的代码逻辑

4.参考文章

二、No Proxy

1.原理

APP 用了No Proxy参数发起网络请求,即使系统设置了代理,也会被直接绕过。

以下是一段使用No Proxy参数发起网络请求的代码:

public void run() {
        Looper.prepare();
        OkHttpClient okHttpClient = new OkHttpClient.Builder().
                proxy(Proxy.NO_PROXY).      //使用此参数,可绕过系统代理直接发包
                build();
        Request request = new Request.Builder()
                .url("http://www.baidu.com")
                .build();
        Response response = null;
        try {
            response = okHttpClient.newCall(request).execute();
            Toast.makeText(this, Objects.requireNonNull(response.body()).string(), Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Looper.loop();
    }

2.特征

设置代理后,APP依然能正常获取网络数据,但抓包工具无法抓到该APP的数据包。

3.绕过方法

  • 直接在系统底层使用iptables强制转发流量(ProxyDroid:全局模式)

  • 以VPN形式设置代理(Drony,启动后手机状态栏上会显示VPN图标)

4.参考文章

三、SSL Pinning证书锁定

1.原理(多种实现方式,以下为 “证书特征码比对方式”)

开发者将SSL证书的某些字节码硬编码在APP中。当应用程序与服务器通信时,它将检查证书中是否存在相同的字节码。如果存在,则应用程序将请求发送到服务器。如果字节码不匹配,它将抛出SSL证书错误。此技术可防止攻击者使用自己的自签名证书。

实现方法当然不止这一种,例如以下是一段通过预埋证书来进行 SSL Pinning 的代码:

2.特征

挂代理后无法抓包,且APP无法获取网络数据。

3.绕过方法

  • 逆向 APP 取出证书,导入到抓包程序中:证书通常在 /assets 里,jadx 反编译后搜索 .p12 .pem .cer ssl 等关键词

  • JustTruetMe:手机上部署xposed框架,然后安装此模块,对目标APP生效即可

  • Frida:自己对APP逆向分析后,手动使用 Frida 去 hook 证书校验的代码

  • 局限性

    虽然说我们可以使用通用的 HOOK 方式去修改证书校验的结果,但是开发人员也可以使用代码混淆的办法来对抗hook。开发人员只需要将证书校验的那部分代码混淆,就能够防止通用的SSL unpinning方法。这时候我们就只能反编译代码,自己去寻找代码中进行证书校验的位置,然后自己编写hook代码去进行SSL pinning的绕过。

4.参考文章

四、双向认证

1.原理

相比 SSL Pinning,双向认证是服务器也对客户端一个提取预埋的证书进行了SSL Pinning。

2.特征

绕过 SSL Pinning 后仍然无法抓包,且 APP 无法获取网络数据。

3.绕过方法

  • 逆向 APP 提取出客户端证书,并将证书挂载到抓包代理软件上

4.参考文章

BY:先知论坛

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月31日14:47:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Android抓包攻防技术 - Dubh3http://cn-sec.com/archives/709659.html

发表评论

匿名网友 填写信息