声明

出品|先知社区(ID:dummersoul)

以下内容,来自先知社区的dumm-ersoul作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。

前言

本文将从网络通信原理浅析在android中出现的一些代理转发检测,这些功能会使我们测试app时出现抓不到包或者应用闪退等情况,针对这种场景,我搭建了测试环境,并对其场景展开分析与实施应对方案。

OSI 7层网络模型

网络通信嘛,首先得知道什么是OSI 7层模型。下面是百度的解释:

为了使不同计算机厂家生产的计算机能够相互通信,以便在更大的范围内建立计算机网络,国际标准化组织(ISO)在1978年提出了“开放系统互联参考模型”,即著名的OSI/RM模型。

它将计算机网络体系结构的通信协议划分为七层,自下而上依次为:

物理层(Physics Layer)、数据链路层(Data Link Layer)、网络层(Network Layer)、传输层(Transport Layer)、会话层(Session Layer)、表示层

(Presentation Layer)、应用层(Application Layer)。

使用网络数据的传输离不开网络协议七层模型,通过理解每一层协议的分工,也就能对网络故障逐一排查,这样的思维逻辑在安卓应用中也同样适用。

OSI 7层模型各层功能及对应的协议、设备如下表所示:

知识点:HTTPS协议是HTTP+SSL

根据上表可知,SSL做数据加密是在表示层,也就是说,HTTPS实际上是建立在SSL之上的HTTP协议,而普通的HTTP协议是建立在TCP协议之上的。

所以,当HTTPS访问URL时,由于URL在网络传送过程中最后是处于HTTP协议数据报头中,而HTTP协议位于SSL的上层,所以凡是HTTP协议所负责传输的数据就全部被加密了;但是IP地址并没加密,因为处理IP地址的协议(网络层)位于处理SSL协议(表示层)的下方。

额,说了这么多,就是要告诉你一个重要的关键点:数据的封装是自下而上的 !在网络数据处理方面,如果是上层做了检测处理,则需要在同层或下层进行逻辑绕过,这就是攻与防的关键了,偷家(底层)才是硬道理。

接下来,我们再理解一下代理与VPN。

代理与VPN 3.1、代理

代理(proxy)也称网络代理,是一种特殊的网络服务,允许一个终端(一般为客户端)通过这个服务与另外一个终端(一般为服务器)进行非直接的连接。

一个完整的代理请求过程为:客户端首先根据代理服务器所使用的代理协议,与代理服务器创建连接,接着按照协议请求对目标服务器创建连接、或者获得目标服务器的指定资源。

3.2、VPN

VPN(virtual private network)(虚拟专用网络 )是常用于连接中、大型企业或团体间私人网络的通讯方法。它利用隧道协议(Tunneling Protocol)来达到发送端认证、消息保密与准确性等功能。

3.3、代理和VPN的区别

从各自的定义,我们就能看出VPN的特点是采取隧道协议进行数据传输和保护;而代理使用的则是对应的代理协议。

下面是VPN和代理的常用协议:

VPN 协议大多是作用在 OSI 的第二层和第三层之间,所以使用 VPN 时,几乎能转发所有的流量。而代理协议多作用在应用层,最高层。

安卓代理检测

知道了代理与VPN的作用后,在APP中,如果开发人员在代码中添加了一些网络层的检测机制,而这些机制恰恰又是针对工作层协议进行的检测,那么只要分析出工作在IOS的哪一层,抢先一步在下层做出应对,那APP在上层无论怎么检测,都没有用。

下面将对测试场景进行详细分析。

抓包的步骤:

1.在客户端(手机)中设置代理服务器的地址

2.开启代理服务器(burp)的代理功能

如果在客户端对代理服务进行过滤,禁止客户端通过代理服务器进行访问Internet,添加如下代码:

connection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);

官方对于Proxy.NO_PROXY的描述如下:

/** * A proxy setting that represents a {@code DIRECT} connection, * basically telling the protocol handler not to use any proxying. * Used, for instance, to create sockets bypassing any other global * proxy settings (like SOCKS): * <P> * {@code Socket s = new Socket(Proxy.NO_PROXY);} * */public final static Proxy NO_PROXY = new Proxy();// Creates the proxy that represents a {@code DIRECT} connection.private Proxy() {type = Type.DIRECT;sa = null;}

NO_PROXY实际上就是type属性为DIRECT的一个Proxy对象,这个type有三种:

  • DIRECT

  • HTTP

  • SOCKS

所以,Proxy.NO_PROXY的意思是connection的请求是直连。

此时若通过系统进行代理,app对外请求会失效,也就是视觉上看到的卡死状态,就是不让走系统代理。

安卓手机上设置系统代理即是在【设置】-【WLAN】-【修改网络】手动设置代理。

针对不走系统代理的情况有如下两种应对:

1、使用基于VPN模式的Postern

2、使用基于iptables的ProxyDroid

对此,我做出了如下一些测试:

4.1、使用系统代理

APP关键代码如下:

private void sendRequestWithHttpURLConnection(){new Thread(new Runnable() {@Overridepublic void run() {HttpURLConnection connection = null;BufferedReader reader = null;try{URL url = new URL("http://www.baidu.com");connection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);connection.setRequestMethod("GET");InputStream in = connection.getInputStream();reader = new BufferedReader(new InputStreamReader(in));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null){response.append(line);}showResponse(response.toString());} catch (Exception e){e.printStackTrace();} finally {if (reader != null) {try {reader.close();} catch (IOException e){e.printStackTrace();}}if (connection != null){connection.disconnect();}}}}).start();}

针对Proxy.NO_PROXY,先测试一下,系统代理是否真的不能抓包。

如下图先设置系统代理,burp监听8888,此时打开APP,点击发送请求无任何反应,burp中也抓不到包,说明系统代理被禁了。

4.2、使用Postern代理

用过这款软件的都知道,当开启代理服务后状态栏会有个钥匙的标志,这可能也是基于VPN模式工作的特征。

同样的APP,点击请求,此时成功绕过了Proxy.NO_PROXY检测!也说明了VPN协议在HTTP协议的下层。

安卓VPN检测

VPN也是代理的一种,但是由于通讯协议的差异,所以检测代码也不一样。

当客户端运行VPN虚拟隧道协议时,会在当前节点创建基于eth之上的tun0接口或ppp0接口,所以一旦出现带有明显特征的网络接口名称,就可以认定是使用了VPN协议进行通信。

下面这段代码的检测方式:出现特征tun0或者ppp0则退出应用,也就是我们看到的闪退效果。

private void isDeviceInVPN() {try {Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();while (networkInterfaces.hasMoreElements()) {String name = networkInterfaces.nextElement().getName();if (name.equals("tun0") || name.equals("ppp0")) {stop();}}} catch (SocketException e) {e.printStackTrace();}}

在点击监听中放置isDeviceInVPN()功能,点击即触发,如果检测到了使用了VPN则直接退出。

@Overridepublic void onClick(View view){if (view.getId() == R.id.send_request){isDeviceInVPN();sendRequestWithHttpURLConnection();}}

5.1、使用ProxyDroid代理

当前场景:APP同时开启了代理检测以及VPN检测

这时使用iptables进行数据转发的软件 ProxyDroid 进行测试,开启之后,系统状态栏不会出现钥匙的形状,这时再次进行抓包测试。

burp成功获取到了请求,至此代理与VPN的应对方法均已实现。所以,iptables 竟然能从OSI的 2、3层下面走吗,下面我们继续分析。

6.iptables原理

我们都知道安卓使用的是linux内核,而linux内核提供的防火墙工具是Netfilter/Iptables。

Netfilter是由linux内核集成的IP数据包过滤系统,其工作在内核内部,而Iptables则是让用户定义规则集的表结构。

也就是,iptables是一个命令行工具,位于用户空间,它真正操作的框架实现在内核当中。

Netfilter是一个数据包处理模块,它具有网络地址转换、数据包内容修改、数据包过滤等功能。要使netfilter能够工作,就需要将所有的规则读入内存中。

netfilter自己维护一个内存块,在此内存块中有4个表:filter表、NAT表、mangle表和raw表。在每个表中有相应的链,链中存放的是一条条的规则,规则就是过滤防火的语句或者其他功能的语句。也就是说表是链的容器,链是规则的容器。实际上,每个链都只是一个hook函数(钩子函数)而已。

Iptables主要工作在OSI七层的2.3.4层,好像也没比VPN的工作协议低,反而还有高的,但是测试结果证明,是我想错了,iptables不是由于协议低,而是没有出现tun0或者ppp0这两个关键的网卡特征,所以成功绕过了VPN的检测。

基于iptables这个流量转发,我还发现了一个新的名词,叫做“透明代理”,iptables的转发模式就是这种。

由此,延伸了一个新的代理模式,通过burp进行“透明代理”,网上的教程错综复杂,亲测使用过程如下。

透明代理

原理:透明代理技术可以让客户端感觉不到代理的存在,用户不需要在浏览器中设置任何代理,只需设置缺省网关即可。在访问外部网络时,客户端的数据包被发送到缺省网关,通过缺省网关的路由,最终到达代理服务器,最后代理服务器运行代理进程,数据实际被重定向到代理服务器的代理端口,即由本地代理服务器向外请求所需数据然后拷贝给客户端。接下来我将尝试:结合安卓端的透明代理技术与burp存在的invisible模式

7.1、使用Burp透明代理 (1)安卓端设置

首先在设备上手动进行设置:将所有请求80、443端口的tcp流量进行nat转发到192.168.50.177(burp的监听地址)的对应端口上

adb shell
su
iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to  192.168.50.177:80
iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to  192.168.50.177:443

查看当前规则是否成功添加

iptables -t nat -L

(2)代理服务器端设置

添加80和443的端口监听

在【Binding】中设置端口,选中 【All interfaces】并对【Request handing】做出如下设置

Redirect to port - 如果配置了这个选项,Burp会在每次请求转发到指定的端口,而不必受限于浏览器所请求的目标。

Force use of SSL - 如果配置了这个选项,Burp会使用HTTPS在所有向外的连接,即使传入的请求中使用普通的HTTP。您可以使用此选项,在与SSL相关的响应修改选项结合,开展sslstrip般的攻击使用Burp,其中,强制执行HTTPS的应用程序可以降级为普通的HTTP的受害用户的流量在不知不觉中通过BurpProxy代理。

设置之后,此时burp就可对转发到这里的80和443端口的流量进行透明代理。

注意:如果出现443端口被占用,查找进程kill掉即可。经过测试,burp成功抓取到了请求包。

这里不禁思考,如果是基于iptables进行的数据转发,那么刚才的ProxyDroid是否也内置了一些路由规则呢?查看一下开启ProxyDroid时iptables当下的规则

血泪避坑:网上出现了很多教程,最关键的iptables规则写法不一,导致多次测试结果并不成功,如果将安卓终端的80和443端口同时转发到burp上监听的唯一一个端口则会出现连接错误。根据burp官方文档说明为每个端口号设置监听器会更加稳定,也就是要设置两个代理监听。

8.总结

根据不同的代码检测,也会有不同的应对方法,所以,遇到APP出现抓包闪退等问题,先逆向,查看源码,在通信处仔细进行分析,再针对检测代码进行绕过,才是正解。本文提到的并不是固定的处理方法,如果文章有叙述不当,尽请矫正。

9.参考链接

  1. https://portswigger.net/burp/documentation/desktop/tools/proxy/options/invisible

  2. https://mp.weixin.qq.com/s/u4WwEGFADvRIYFudrMDsRQ

  3. https://cloud.tencent.com/developer/article/1619659

浅析APP代理检测对抗相关推荐

  1. 使用BurpSuite进行APP抓包如何绕过代理检测

    文章目录 使用BurpSuite进行APP抓包如何绕过代理检测 场景描述 如果绕过呢? 总结与思考 使用BurpSuite进行APP抓包如何绕过代理检测 场景描述 最近接手到一个项目,对某客户的ios ...

  2. 检测对抗样本_对抗T恤以逃避ML人检测器

    检测对抗样本 Neural Networks are exceptionally good at recognizing objects shown in an image and in many c ...

  3. Android开发中虚拟位置定位、应用双开、IP代理检测

    Android开发中虚拟位置定位.应用双开.IP代理检测 1.虚拟位置定位.应用双开原理 目前市面上的多开App的原理类似,都是以新进程运行被多开的App,并hook各类系统函数,使被多开的App认为 ...

  4. [免费专栏] Android安全之绕过直连、HOST校验、系统证书校验、代理检测、双向认证抓HTTPS数据

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  5. 无感知抓包的几种实现方式,除了ssl pinning,app无法检测

    无感知抓包有什么用? 要分析app的流量需要需要进行抓包,常用的抓包方式就是给手机设置一个代理将流量导到抓包软件.这里给手机设置代理,不管是使用wifi代理还是VPN代理都可以被检测到. 有没有不会被 ...

  6. 检测对抗样本_避免使用对抗性T恤进行检测

    检测对抗样本 How can just wearing a specific type of t-shirt make you invisible to the person detection an ...

  7. 信度和效度经典例子_浅析经典目标检测评价指标--mmAP(一)

    大家好,我是旷视科技南京研究院研究员赵博睿,主要研究领域为目标检测.今天和大家聊聊mmAP的那些事- 目标检测是计算机视觉领域的一项基础问题,在许多智能场景的落地应用中目标检测通常都是视觉感知的第一步 ...

  8. 安卓实现APP自动检测软件版本并提示更新

    安卓实现APP自动检测软件版本并提示更新 前言 当我们在做安卓项目的时候,客户的需求往往难免会发生变动.但是我们的产品已经上线了,却又需要修改的话我们该怎么办呢?也许很多应用商店已经集成了这个功能,只 ...

  9. 移动 app安全评估检测技术分析

    由于现今的网络技术日益发达,安卓 APP 的安全也有很多隐患,这些都需要我们不断地去注意,从而提高其安全性.人们基于系统程序.系统数据.基础业务的安全性以及应用程序出现的漏洞这几个方面,来不断地完善并 ...

最新文章

  1. Linux下Nagios的安装与配置
  2. 2440按键中断编程
  3. Linux下进程隐藏的常见手法及侦测手段
  4. python direct_Python-RabbitMQ-direct(广播模式)
  5. 【渝粤教育】国家开放大学2018年春季 8668-22T汽车涂装技术(A) 参考试题
  6. B站视频下载(含bv快速变回av)
  7. 照片一寸改成二寸,并压缩体积KB的工具
  8. IT人员应该掌握的30种技能
  9. 逐浪海棠居刻本字-第一款基于unicode13标准构建的中文字库全面发布
  10. div设置半透明效果
  11. 开发版速达扩展功能-提供便捷的界面布局功能
  12. pdf怎么压缩文件到最小?pdf文件怎么变小内存?
  13. 今日头条推荐算法原理解析
  14. .NET Core、Xamarin、.NET Standard和.NET Framework四者之间的区别
  15. 北京:外地社保卡可以在北京19家医院实现住院费用即时结算!
  16. 少数派实测报告:AI巨无霸模型GPT-3 | 附送API 调用方法「AI核心算法」
  17. matlab解方程、方程组
  18. 大盘下跌时,如何做空股市,继续赚钱?
  19. 《锦绣中华》中老年公益文旅游-走进佛山敬老院
  20. 算法大师孙膑--田忌赛马(转自labuladong)

热门文章

  1. thinkphp Invalid numeric literal报错
  2. C语言里try的用法
  3. 阿里云ACP考试地点及考试时间安排
  4. 云计算入门与常见概念介绍
  5. 机器视觉(1)——概述
  6. CSS知识点汇总(六)--垂直居中动画实现方式
  7. python操作redis数据库
  8. EXCEPTIONS——异常处理总结
  9. 矩阵图的四个算法 - DFS、BFS、Dijkstra、Topological Sort
  10. 基伍手机-专注第三世界做手机的中国厂商