【问题标题】:Avoid man in the middle (proxy) Android避免中间人(代理)Android
【发布时间】:2013-10-08 18:11:31
【问题描述】:

我的工作任务是对应用程序进行逆向工程。

我已经多次将Charles Proxy 与其他应用程序一起使用,没有任何问题,并且还尝试过Fiddler。我一直能够监控提出的请求/响应。

但是我现在正在尝试的应用程序现在确实在CharlesFiddler 中显示任何活动。首先,我认为他们检查了证书并终止了连接,但应用程序正常运行,没有任何问题。

应用程序有什么方法可以避免代理设置或我错过了什么?

我一直在使用 apktooldex2jar 并发现这种代码和平。可能不是 100% 正确,但它可以为您提供一些关于正在发生的事情的线索。

public final void a(int paramInt1, int paramInt2)
  {
    this.b = paramInt2;
    InetSocketAddress localInetSocketAddress = new InetSocketAddress(InetAddress.getByName(this.a), this.b);
    while (true)
    {
      try
      {
        SSLContext localSSLContext = SSLContext.getInstance("TLS");
        X509TrustManager[] arrayOfX509TrustManager = new X509TrustManager[1];
        arrayOfX509TrustManager[0] = new c(this);
        localSSLContext.init(null, arrayOfX509TrustManager, new SecureRandom());
        this.e = ((SSLSocket)localSSLContext.getSocketFactory().createSocket());
        this.e.connect(localInetSocketAddress, paramInt1);
        this.d.clear();
        if (Arrays.asList(this.e.getSupportedProtocols()).contains("TLSv1.2"))
        {
          this.d.add("TLSv1.2");
          String[] arrayOfString1 = (String[])this.d.toArray(new String[this.d.size()]);
          SSLSocket localSSLSocket1 = this.e;
          if (arrayOfString1.length > 0)
            localSSLSocket1.setEnabledProtocols(arrayOfString1);
          this.c.clear();
          if (!Arrays.asList(this.e.getSupportedCipherSuites()).contains("TLS_RSA_WITH_AES_256_CBC_SHA"))
            break label374;
          this.c.add("TLS_RSA_WITH_AES_256_CBC_SHA");
          String[] arrayOfString2 = (String[])this.c.toArray(new String[this.c.size()]);
          SSLSocket localSSLSocket2 = this.e;
          if (arrayOfString2.length > 0)
            localSSLSocket2.setEnabledCipherSuites(arrayOfString2);
          e.a().a(this.e.getLocalAddress().getAddress());
          e.a().a(this.e.getLocalPort());
          a(5000);
          this.e.startHandshake();
          a(0);
          return;
        }
      }
      catch (Exception localException)
      {
        throw new IOException(localException.toString());
      }
      if (Arrays.asList(this.e.getSupportedProtocols()).contains("TLSv1.1"))
      {
        this.d.add("TLSv1.1");
      }
      else if (Arrays.asList(this.e.getSupportedProtocols()).contains("TLSv1"))
      {
        this.d.add("TLSv1");
        continue;
        label374: if (Arrays.asList(this.e.getSupportedCipherSuites()).contains("TLS_RSA_WITH_AES_128_CBC_SHA"))
          this.c.add("TLS_RSA_WITH_AES_128_CBC_SHA");
        else if (Arrays.asList(this.e.getSupportedCipherSuites()).contains("SSL_RSA_WITH_3DES_EDE_CBC_SHA"))
          this.c.add("SSL_RSA_WITH_3DES_EDE_CBC_SHA");
        else if (Arrays.asList(this.e.getSupportedCipherSuites()).contains("DES-CBC3-SHA"))
          this.c.add("DES-CBC3-SHA");
      }
    }
  }

对 TLS 1.2 了解不多,但我知道它应该更健壮?但它可以避免代理吗?

我还使用Wireshark 转储了流量,该方法有效,但信息已加密,正如预期的那样,因此它没有多大用处。

任何帮助将不胜感激。

【问题讨论】:

  • 您是否尝试过嗅探来自您设备的所有流量?话虽这么说,如果您真的想拦截来自 Android 应用程序的流量,那么您最好构建自己的 Android 发行版,其中包含用于捕获所需内容的钩子,并在该自定义构建下运行应用程序(无论是在真实设备,或者更容易在模拟器中)。
  • hm...是的,我想我可以自定义构建,一个比我希望的更复杂的解决方案,但如果没有其他工作...但仍然知道为什么我看不到流量在 Charles Proxy 还是 Fiddler?

标签: android ssl proxy reverse-engineering man-in-the-middle


【解决方案1】:

此代码可能会避免代理,因为正在制作直接套接字。如果您使用一些更高级别的 api,例如 HttpURLConnection,它尊重代理设置。 http://developer.android.com/reference/java/net/HttpURLConnection.html

您可以尝试使用 SandroProxy 找出在哪个端口进行通信。

http://code.google.com/p/sandrop/issues/detail?id=76

  1. 转到 HTTP 选项卡并按下操作栏上的播放按钮 SandroProxy 将监听两个新端口 8020 -> web , 8021 -> websockets for chrome devtools
  2. 使用 url http your_device_ip:8020 从 PC 启动 chrome
  3. 检查连接选项卡,最后两列是进程uid和名称(可以多个)

要捕获数据,您还可以使用 SandroProxy 并强制 iptable 重定向。您将需要有根电话。

顺便说一句:由 Sandroproxy 支持发送 :)

【讨论】:

  • 嗨,谢谢,你的权利,它是一个直接代理,所以这就是为什么我无法监控流量,我已经让它与其他一些工具一起工作,但我只能监控加密流量,有什么办法可以为中间人配置 Sandroproxy 吗?
  • 是的。在设置中启用捕获数据、透明代理。还要在 App 选项卡中激活 iptable 规则。要拦截 ssl,您还应该使用 Menu->Export CA 将 SandroProxy ca 证书导入到 android os cert store。然后您可以在 Http 选项卡或网络面板中的 chrome 中监控流量
  • 抱歉延迟响应,在此之前已优先处理其他任务。无论如何。您对我应该如何设置 iptables 有任何提示吗?该应用程序使用传出端口 4710 和传入(随机端口)到一个地址,比如说 111.111.111.111。如何设置 iptables 以便它通过 SandroProxy 连接? APPS tap似乎不起作用,猜猜是因为连接使用端口4710?如果这行得通,我会给你一些捐赠的啤酒:)
  • iptables -t nat -I OUTPUT -m 所有者! --uid-owner 10062 -p tcp --dport 4710 -j DNAT --to 127.0.0.1:8010 ->其中 uid-owner(10062) 是 Sandroproxy 的进程 uid。它必须被排除,以便它可以连接到真正的 4710。如果服务器有一些不受信任的 ca,你可能还需要设置-CA 证书->[信任所有 SSL 证书]。可能一些新版本的 Sandroproxy 也会有自定义端口重定向,而不仅仅是 443 和 80。我们在谈论什么样的啤酒? :)
【解决方案2】:

您可以尝试对设备或模拟器使用adb forward 80 3456 之类的东西,将所有端口 80 流量重定向到工作站上的 3456。然后让您的代理在该端口上侦听。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2011-04-25
    • 2022-01-25
    • 2016-11-11
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多