实战|安卓上基于透明代理对特定APP抓包技巧

VSole2023-02-23 14:10:50

前言

本文结合多篇已有文章,基于iptables + redsocks2 + Charles,最终实现对安卓上特定APP进行抓包,且APP无感知

即APP不能通过检查系统代理或者VPN来判断是不是有抓包行为

步骤

首先先保存开机后的iptables,如果已经修改过,请重启手机


iptables-save > /data/local/tmp/iptables.rules

要恢复iptables为之前的规则,则使用如下命令,或者重启手机


iptables-restore /data/local/tmp/iptables.rules

使用如下命令,作用是:将uid10428所请求的在0-65535端口上的tcp流量,转发到127.0.0.1:16666,但是排除了来自127.0.0.1的请求

参考:iptables 在 Android 抓包中的妙用

iptables -t nat -A OUTPUT -p tcp ! -d 127.0.0.1 -m owner --uid-owner 10428 --dport 0:65535 -j DNAT --to-destination 127.0.0.1:16666

要实现抓包,其中127.0.0.1:16666是一个透明代理的地址

然而根据已有文章可知,如果直接设置为Charles的透明代理地址,对于https将会出现invalid first line in request错误,只有http的请求数据会被正常解析

参考:利用 Redsocks 解决透明代理的远程抓包问题

根据文章可知,借助redsocks进行转发即可

我这里使用的是redsocks2,编译参考:静态交叉编译 Android 的 redsocks2

这里直接使用编译好的即可,也可以考虑自己编译下,下载后解压压缩包

  • https://fh0.github.io/assets/android-redsocks2.tgz

创建配置文件,名为redsocks.conf,内容如下:


base {    log_debug = off;    log_info = on;    log = stderr;    daemon = off;    redirector = iptables;}
redsocks {    bind = "127.0.0.1:16666";    relay = "192.168.1.14:8889";    type = socks5;    autoproxy = 0;    timeout = 13;}

其中bind就是透明代理地址,relay就是Charles的代理地址,更多详细用法请查阅redsocks2的readme

注意配置文件的每一对{}后面都应该有一个空行,否则会提示unclosed section


现在把redsocks.confredsocks2_arm64推送到/data/local/tmp

然后在root用户下运行redsocks2_arm64即可


adb push redsocks2_arm64 /data/local/tmp/redsocksadb shell chmod +x /data/local/tmp/redsocksadb shellsucd /data/local/tmp./redsocks

现在不出意外的话,Charles应该就能看到uid10428所对应APP的全部tcp数据包了(除去来自127.0.0.1的请求)

如果是只想对特定端口抓包,那么应该使用-m multiport --dports 80,443这样来限定一个或者多个端口


iptables -t nat -A OUTPUT -p tcp ! -d 127.0.0.1 -m owner --uid-owner 10428 -m multiport --dports 80,443 -j DNAT --to-destination 127.0.0.1:16666

总结

  1. 使用iptables将来自特定uid的全部tcp流量转到指定的透明代理上
iptables -t nat -A OUTPUT -p tcp ! -d 127.0.0.1 -m owner --uid-owner 10428 --dport 0:65535 -j DNAT --to-destination 127.0.0.1:16666

  2. 使用redsocks将流量转发到正向代理,如Charles的socks5代理

redsocks2_arm64下载地址如下

https://fh0.github.io/assets/android-redsocks2.tgz

redsocks.conf内容如下

base {    log_debug = off;    log_info = on;    log = stderr;    daemon = off;    redirector = iptables;}
redsocks {    bind = "127.0.0.1:16666";    relay = "192.168.1.14:8889";    type = socks5;    autoproxy = 0;    timeout = 13;}

其他补充:

  • 安装Charles证书到系统分区,Charles才能解密https

如果你发现了文章中的错误,请指出

效果

iptables透明代理
本作品采用《CC 协议》,转载必须注明作者和本文链接
使用如下命令,作用是:将uid为10428所请求的在0-65535端口上的tcp流量,转发到127.0.0.1:16666,但是排除了来自127.0.0.1的请求参考:iptables 在 Android 抓包中的妙用iptables -t nat -A OUTPUT -p tcp !-d 127.0.0.1 -m owner --uid-owner 10428 --dport 0:65535 -j DNAT --to-destination 127.0.0.1:16666. redsocks { bind = "127.0.0.1:16666"; relay = "192.168.1.14:8889"; type = socks5; autoproxy = 0; timeout = 13;}
虚拟机和Gateway都运行在虚拟机中,虚拟机器将默认网关设置为GateWay。最终目标是,将HostOnly的所有网络流量,都通过代理的形式,发送到远程服务器。透明代理配置主要有两种配置方法,分别是通过wireguard配置和x2ray。
一旦发现服务器证书为非指定证书即停止通信,最终导致即使将抓包工具的证书安装到系统信任凭据中也无法生效。fridafrida是一款轻量级的hook框架,专业点的说法就是动态插桩工具,可以插入一些代码到原生App的内存空间去动态地监视和修改其行为。该框架从Java层Hook到Native层Hook无所不能,但是持久化还是要依靠Xposed框架,另外由于其过于火爆,一些厂商也研究了反调试的方法。ObjectionObjection是基于frida的集成工具,其主要功能支持Android和iOS两大移动平台。
iptable使用详解
2022-12-09 09:10:52
而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。这五个位置被称为五个钩子函数,也叫五个规则链。这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。为了让这些功能交替工作,制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。
NAT穿透是如何工作的
2022-08-11 06:32:23
整个过程对双方透明。本文接下来都将关注在 UDP 上。对收发包的 socket 有直接控制权。例如,从经验上来说,无法基于某个现有的网络库实现 NAT 穿透,因为我们 必须在使用的“主要”协议之外,发送和接收额外的数据包。某些协议将 NAT 穿透与其他部分紧密集成。
随后Gartner于2019年提出安全访问服务边缘,将零信任网络访问 作为核心组件之一,进一步的让所有企业相信并拥抱零信任。基于路由模式的方案通常采用开源的TUN或TAP驱动,整体实现难度较低。Packet Filter方案实现难度相对路由模式要更高些,这也可能是初创公司没有广泛使用此方案的原因。
美国联邦调查局(FBI)、美国国家安全局(NSA)、美国网络司令部和国际合作伙伴发布了联合网络安全咨询,警告俄罗斯国家支持的网络行为者使用受损的Ubiquiti EdgeRouter进行恶意网络操作。
iptables常用命令总结
2023-04-18 10:08:25
iptables -A INPUT -p tcp --dport 22 -j ACCEPT:允许通过 SSH 连接进入系统,前提是 SSH 服务已经开启并监听在 22 端口上。iptables -D INPUT 2:删除 INPUT 链中的第二条规则。iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j REJECT:限制 HTTP 流量,最多允许 10 个并发连接,超过限制则拒绝连接。确保自己已经备份了原始的 iptables 配置,以防止在操作过程中出现意外情况,导致系统无法访问网络。避免在 iptables 中使用 ACCEPT 命令,因为 ACCEPT 会接受所有的数据包,包括恶意数据包,容易被攻击者利用。
你加密的压缩包比你想象中的还不安全! 哪怕对于信息安全人员来说,很多时候给压缩包加上一个密码就以为的是万事大吉了。但事实是,很多情况下,你的加密压缩包,远远没有你想象的安全。
​iptables由上而下,由Tables,Chains,Rules组成
VSole
网络安全专家