Android上基于透明代理对特定APP抓包技巧

描述

前言

本文结合多篇已有文章,基于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/redsocks
adb shell chmod +x /data/local/tmp/redsocks
adb shell
su
cd /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

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

效果

Android

Android

审核编辑 :李倩

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分