0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一种在Andorid中实现单应用、全局、优雅的抓包方法

哆啦安全 来源:哆啦安全 2023-02-07 10:50 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文介绍一种在 Andorid 中实现单应用、全局、优雅的抓包方法。

本文于去年端午节编写,由于种种原因,当时藏拙并未发布。现删除一些敏感信息后分享出来,希望对各位有所帮助。

背景

昨天在测试一个 Android APK 的时候发现使用 WiFi 的 HTTP 代理无法抓到包,在代理的日志中没有发现任何 SSL Alert,因此可以判断不是证书问题;另外 APP 本身仍可以正常收发数据,这说明代理设置被应用绕过了。

根据我们前一篇文章(终端应用安全之网络流量分析)中所介绍的,遇到这种情况时就可以使用路由抓包方法,确保接管所有流量。但是因为端午放假被封印在家,且用于抓包的树莓派放在了公司,因此只有另谋他路。

本来接着考虑装个 DroidProxy 去试一下,但突然间灵光一闪,为什么不直接用 iptables 去修改流量呢?于是,就有了这篇小记。

iptables 101

iptables应该大家都不会陌生,说起来这也是我入门 “黑客” 时就接触的命令,因为我的网络安全入门第一战就是使用aircrack去破解邻居的 WiFi 密码。多年以前还写过一篇Linux内核转发技术,介绍 iptables 的常用操作,但当时年幼无知,很多概念自己并没有完全理解。其实介绍 iptables 最好的资料就是官方的man-pages,因此这里也就不做一个无情的翻译机器人了,只简单介绍一些关键的概念。

basic

首先是我们作为系统管理员最为关心的命令行参数,在坊间流传的各类防火墙、WiFi 热点、流控 shell 脚本中,充斥着各种混乱而难以理解的 iptables 命令,但实际上其命令行参数非常优雅,可以概况为以下表述:

iptables[-ttable]{-A|-C|-D}chainrule-specification

rule-specification=[matches...][target]
match=-mmatchname[per-match-options]
target=-jtargetname[per-target-options]

一个 table 中有多个 chain,除了内置的 chain,用户也可以自己新建(比如 DOCKER 链)。常用的 table 及其包含的 chain 有以下这些:

  • •filter

    • •INPUT

    • •FORWARD

    • •OUTPUT

  • •nat

    • •PREROUTING

    • •INPUT

    • •OUTPUT

    • •POSTROUTING

  • •mangle

    • •PREROUTING

    • •OUTPUT

    • •INPUT

    • •FORWARD

    • •POSTROUTING

  • •raw

    • •PREROUTING

    • •OUTPUT

其中有的表比其他表包含更多的 chain,这是其定位决定的。正如其名字而言,filter主要用于流量过滤,nat表主要用于网络地址转换,mangle表用于数据包修改,而raw表则用于网络包更早期的配置。除此之外还有security表用于权限控制,不过用得不多。

虽然看起来各个表各司其职,但实际中也没有强制的差异。比如 mangle 表虽然用来修改流量,但也可以用来做网络地址转换,filter 表也是同理。在日常中设置 iptables 规则的时候主要考虑的是数据包的时序,而这和 chain 的关系更大一些。

上面提到的这些常见 chain,不管在哪个表中,其含义都是类似的:

  • • INPUT: 表示数据包从远端发送到本地;

  • • OUTPUT: 表示数据包在本地生成,并准备发送到远端;

  • • PREROUTING: 接收到数据包的第一时间,在内核进行路由之前;

  • • POSTROUTNG: 表示数据包准备离开的前一刻;

  • • FOWARD: 本机作为路由时正要准备转发的时刻;

table 结合对应的 chain,网络数据包在 iptables 中的移动路径如下图所示:

ff55b776-a605-11ed-bfe3-dac502259ad0.pngflow

extensions

对于iptables而言重点无疑是其中的规则定义,上文提到的参数无非就是将自定义的规则加入到对应 CHAIN 之中,比如-A是将规则插入到链的末尾(append),-I是插入到链的头部(insert),-D是删除对应规则(delete),等等。

而规则又分为两个部分,即数据包匹配以及匹配之后的操作,分别通过-m-j来指定。这其中就引入了成百的命令行参数,以至于社区还就此产生了不少段子:

Overheard:“Inanyteamyouneedatank,ahealer,adamagedealer,someonewithcrowdcontrolabilitiesandanotheronewhoknowsiptables”

—JéromePetazzoni(@jpetazzo)June27,2015

不过实际上社区对 iptables 的抱怨更多是在多用户系统中规则配置冲突以及由此引发的艰难调试之旅,在没有冲突的情况下,配置规则也是比较简单的。定义 iptables 规则的参考主要是iptables-extensions(8),其中定义了一系列匹配拓展(MATCH EXTENSIONS)以及 **目标拓展(TARGET EXTENSIONS)**。

match

先看匹配拓展,一般我们使用 iptables 都是根据 ip 或者端口进行匹配,比如-m tcp --dport 22。但其中也有一些比较有趣的匹配规则,比如上一篇文章中介绍过的 Android 单应用抓包方法:

$iptables-AOUTPUT-mowner--uid-owner1000-jCONNMARK--set-mark1
$iptables-AINPUT-mconnmark--mark1-jNFLOG--nflog-group30
$iptables-AOUTPUT-mconnmark--mark1-jNFLOG--nflog-group30
$dumpcap-inflog:30-wuid-1000.pcap

用到了两个匹配拓展,一个是owner拓展,使用--uid-owner参数表示创建当前数据包的应用 UID。但是这样只能抓到外发的包,而服务器返回的包由于并不是本地进程创建的,因此没有对应的 UID 信息,因此 owner 拓展只能应用于OUTPUT或者POSTROUTING链上。为了解决这个问题,上面使用了另一个拓展connmark,用来匹配 tcp 连接的标志,这个标志是在第一条命令中的外发数据中进行设置的。

还有个值得一提的匹配拓展是bpf,支持两个参数,可以使用--object-pinned直接加载编译后的 eBPF 代码,也可以通过--bytecode直接指定字节码。直接指定的字节码格式类似于tcpdump -ddd的输出结果,第一条是总指令数目。

例如以下 bpf 指令 (ip proto 6):

4#numberofinstructions
48009#loadbyteip->proto
21016#jumpequalIPPROTO_TCP
6001#returnpass(non-zero)
6000#returnfail(zero)

实际调用时候需用用逗号分隔每条指令,且不支持注释等其他符号:

iptables-AOUTPUT-mbpf--bytecode'4,48009,21016,6001,6000'-jACCEPT

对于其他遇到的匹配拓展,可以在官方文档中查看其详细用法。

target

target 表示数据包匹配之后要执行的操作,一般使用大写表示。标准操作有 ACCEPT/DROP/RETURN 这三个,其他都定义在 target extensions 即目标拓展中。

比如我们前面提到的CONNMARK就是其中一个拓展,其作用是对当前链接进行打标,这样 TCP 请求的返回数据也会带上我们的标记。类似的还有MARK拓展,表示对当前数据包设置标志,主要用于后续 table/chain 的识别。

前面用到的另一个拓展是NFLOG,表示 netfilter logging,规则匹配后内核会将其使用对应的日志后端进行保存,通常与nfnetlink_log一起使用,通过多播的方式将获取到的数据包发送到netlink套接字中,从而可以让用户态的抓包程序获取并进行进一步分析。

其他常用的拓展还有SNAT/DNAT用于修改数据包的源地址和目的地址,LOG可以使内核 dmesg 打印匹配的数据包信息,TRACE可以使内核打印规则信息用于调试分析等。

Android Proxy

复习完 iptables 的基础后,我们继续回到文章开头的问题,有什么办法可以在不设置代理的基础上代理所有流量呢?

这个问题可以从两方面去考虑,即:

  1. 1. 如何匹配目标数据包;

  2. 2. 匹配之后如何转发到代理地址;

第一个问题比较简单,我们需要匹配从本地发出的,目的端口是 80/443 的 tcp 流量,因此匹配规则可以写为:

-ptcp-mtcp--dport443

在不确定目标 web 服务器端口的情况下,可以将 dport 指定为0:65535,对所有端口都进行劫持转发;当然也可以直接不写 match,默认就是匹配所有 tcp 包。不过可以稍微过滤一下目的地址,比如! -d 127.0.0.1,以免本地的 RPC 请求也被误拦截。

或者,更优雅的方案是使用multiport来一次性指定多个端口:

-mmultiport--dports80,443

第二个问题,既然我们需要将流量转发到代理工具,那么可以选择透明代理模式,上篇文章也有提到过。因此一个最简单的方法是使用 DNAT 修改目的地址。查阅文档可知,DNAT 只能用在nat表中的PREROUTINGOUTPUT链。再根据上文中的流程图,如果代理地址在本地,那只能使用 OUTPUT、如果是远程地址,那么两个链任选一个即可。

综上所述,假设 HTTP 透明代理监听在127.0.0.1:8080,那么可以直接用以下方法设置代理并进行抓包:

iptables-tnat-AOUTPUT-ptcp!-d127.0.0.1-mmultiport--dports80,443-jDNAT--to-destination127.0.0.1:8080

更进一步

通过这么一条 iptables 命令,配合上透明代理就可以实现全局的 HTTPS 抓包了。所以就这样了吗?回忆一下之前我们其实是可以通过ownertarget 去进行 UID 匹配的,只不过之前是使用 NFLOG 配合 tcpdump 进行抓包。因此我们其实也可以通过类似的方式实现基于 UID 的透明代理。

转发规则并没有太大变化,只需要在匹配规则上新增一个约束。

iptables-tnat-AOUTPUT-ptcp!-d127.0.0.1-mowner--uid-owner2000-mmultiport--dports80,443-jDNAT--to-destination127.0.0.1:8080

这样,不需要额外的路由抓包设备,甚至不需要引入 VPN Service 等其他应用,只需要一行命令即可实现针对单个 Android 应用的全局 HTTP/HTTPS 抓包。

elegant

总结

本文主要介绍了 iptables 规则的配置方法,并且实现了一种在 Android 中全局 HTTP(S) 抓包的方案,同时借助owner拓展实现应用维度的进一步过滤,从而避免手机中其他应用的干扰。

相比于传统的 HTTP 代理抓包方案,该方法的优势是可以实现全局抓包,应用无法通过禁用代理等方法绕过;而相比于 Wireshark 等抓包方案,该方法基于透明代理,因此可以使用 BurpSuite、MITMProxy 等成熟的 HTTP/HTTPS 网络分析工具来对流量进行快速的可视化、拦截/重放,以及脚本分析等操作,这些优势是传统抓包方案所无法比拟的。

iptables-tnat-AOUTPUT-ptcp!-d127.0.0.1-mowner--uid-owner2000-mmultiport--dports80,443-jDNAT--to-destination<burp ip:port>


(1).-t nat -A OUTPUT 使用nat表,在OUTPUT链追加规则
(2).-p tcp 指定只过滤tcp协议
(3).!d 127.0.0.1 不误伤回环包,很严谨!
(4).-mowner--uid-owner2000 通过uid指定只看单个应用的数据包
(5).-mmultiport--dports80,443 优雅的一次性指定多个目标端口,owsap wstg上分2条命令不够优雅!
(6).-jDNAT--to-destination<burp ip:port> 使用DNAT 即修改目标地址到您的透明代理地址上,记得勾选 invisible proxy哦!
(7).iptables-tnat-F 搞事结束,清场恢复!
(8).验证查看转发效果,可使用提供的debugAOSP rom,开启adb root(高权限启动tcpdump),结合新版wireshark有线接口选择捕获android wlan0接口的数据包,完美验证!
(9).https如果有证书pin的 还是要hook搞定下,否则信任链不通数据包
审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    13

    文章

    10094

    浏览量

    90880
  • 数据包
    +关注

    关注

    0

    文章

    269

    浏览量

    25425

原文标题:参考链接

文章出处:【微信号:哆啦安全,微信公众号:哆啦安全】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    一种基于IP的单向文件广播传输方法

    【作者】:朱佩江;尹亚光;丁森华;【来源】:《广播电视信息》2010年03期【摘要】:本文针对单向广播信道设计定义了一种基于IP的单向文件传输协议用于支持各种文档、图像、音视频片段、应用软件、服务
    发表于 04-23 11:38

    一种优雅的方式去实现个Verilog版的状态机

    描述:基于此,我们便可以方便快捷的去描述状态机,以一种优雅的方式去实现状态机描述,而对于他人阅读来讲也是相当OK的。等等,还有更好玩儿的。SpinalHDL里,定义了四
    发表于 07-13 14:56

    利用golang优雅实现实例分享

    1、利用golang优雅实现实例平时编写代码过程,经常会遇到对于全局角度只需运行次的代码
    发表于 10-17 16:46

    一种环境下的线性差错控制编码方法

    网络传输的数据存在着丢失现象,需要一种高效的差错控制方法。本文针对分组低密度纠删码编码复杂度较高的缺陷,提出了一种利用卷积结构
    发表于 01-09 11:32 7次下载

    一种特殊阵列实现DOA估计的方法

    一种特殊阵列实现DOA估计的方法:提出了一种基于特殊阵列形式实现doa估计的方法
    发表于 03-18 16:18 19次下载

    一种基于的逻辑内置自测试电路设计方法

    一种基于的逻辑内置自测试电路设计方法
    发表于 02-07 16:14 13次下载

    一种新的基于全局特征的极光图像分类方法

    提出了一种新的基于全局特征的极光图像分类方法方法,极光图像通过Radon变换投影到Rad
    发表于 11-30 14:13 1次下载
    <b class='flag-5'>一种</b>新的基于<b class='flag-5'>全局</b>特征的极光图像分类<b class='flag-5'>方法</b>

    全局变量和全局函数的三基本方法

    在教授学生使用V isuaIC++60的MFC基本应用时,由于MFC制作的工程由很多文件构成,它不能象般C+程序那样随意在类外定义全局变量,那样有时会在运行程序时出现问题。软件开
    发表于 04-03 10:30 3次下载

    一种分析绕组电气参数对不同种类变形的全局灵敏度方法

    目前已有利用变压器绕组电气参数检测绕组变形的方法,但对电气参数变化与绕组变形之间的联系的研究还不够深入。为此,提出一种分析绕组电气参数对不同种类变形的全局灵敏度方法。该
    发表于 04-10 14:49 1次下载

    一种基于排序学习的软件众任务推荐方法

    为了更有效地实现软件众任务推荐,提升软件开发质量,为工人推荐合适的任务,降低工人利益受损风险,以达到工人和众平台双赢的效果,设计了一种基于排序学习的软件众
    发表于 04-23 11:13 4次下载
    <b class='flag-5'>一种</b>基于排序学习的软件众<b class='flag-5'>包</b>任务推荐<b class='flag-5'>方法</b>

    一种AUTOSAR软件架构RTE的实现方法

    介绍了一种AUTOSAR软件架构RTE的实现方法
    发表于 07-13 16:02 7次下载

    渗透测试过程中所使用的方法

    本篇只是简单分享平常笔者渗透测试过程中所使用的方法,后面会继续更新其他以及安卓端的方法
    的头像 发表于 02-01 15:41 2531次阅读

    如何抓取app数据 网络原理及实现

    实现对App的网络数据,需要监控App与服务器交互之间的网络节点,监控其中任意个网络节点(网卡),获取所有经过网卡的数据,对这些数
    发表于 08-11 09:30 4979次阅读
    如何抓取app数据<b class='flag-5'>包</b> 网络<b class='flag-5'>抓</b><b class='flag-5'>包</b>原理及<b class='flag-5'>实现</b>

    一种利用wireshark对远程服务器/路由器网络方法

    一种利用wireshark对远程服务器/路由器网络方法
    的头像 发表于 09-21 08:03 7122次阅读
    <b class='flag-5'>一种</b>利用wireshark对远程服务器/路由器网络<b class='flag-5'>抓</b><b class='flag-5'>包</b><b class='flag-5'>方法</b>

    CentOS中使用tcpdump

    CentOS中使用tcpdump
    的头像 发表于 10-28 14:48 1082次阅读