前言
本文结合多篇已有文章,基于iptables + redsocks2 + Charles
,最终实现对安卓上特定APP进行抓包,且APP无感知
即APP不能通过检查系统代理或者VPN来判断是不是有抓包行为
前置知识
安卓上怎么看APP的uid?
先打开你的APP,然后ps -ef
命令找到有你的应用包名那一行,第一列就是uid
通常你看到的是u0_a428
这样的,那么后面的命令,uid相关的可以写成u0_a428
,也可以写成10428
步骤
首先先保存开机后的iptables,如果已经修改过,请重启手机
iptables-save > /data/local/tmp/iptables.rules
要恢复iptables为之前的规则,则使用如下命令,或者重启手机
iptables-restore /data/local/tmp/iptables.rules
使用如下命令,作用是:将uid
为10428
所请求的在0-65535
端口上的tcp
流量,转发到127.0.0.1:16666
,但是排除了来自127.0.0.1
的请求
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
进行转发即可
我这里使用的是redsocks2,编译参考:静态交叉编译 Android 的 redsocks2
这里直接使用编译好的即可,也可以考虑自己编译下,下载后解压压缩包
创建配置文件,名为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.conf
和redsocks2_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应该就能看到uid
为10428
所对应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
总结
- 使用
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
- 使用
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 在 Android 抓包中的妙用
- 利用 Redsocks 解决透明代理的远程抓包问题
- 静态交叉编译 Android 的 redsocks2
- redsocks2
- 默认配置文件报错
- redsocks搭配iptables实现真全局代理
广告:星球&加群交流
已有 7 条评论
师傅好,请教一下,redsocks报错
socks5_is_known_auth_method: Socks5 server reported unexpected auth methods reply version...,并且经过charles的数据包无法解密,请问您有遇到这种情况吗?
@nnkk 你可能操作有问题。如果你抓到了数据,不能解密,你可能是没有安装证书。
@sfx 感谢师傅,我又重试了一下,确实是我的操作问题
脸哥,假如uid是root,也能抓吗
@sw 可以的,你把--uid-owner指定为root即可,但是要注意iptables要避免redsocks的造成回环之类的,不过我个人也不会这个操作,根据参考文章直接避免127的流量就好了。
这里使用 iptables-restore 与 iptables-save 恢复,可以替换为 -A 添加规则 -D 删除规则,举个例子,添加规则 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,删除规则 iptables -t nat -D 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
@つなやう 感谢你的建议,iptables-restore确实不是很好使。不过大部分小白执行命令也不知道有些选项该怎么设置,个人推荐设置的有问题的时候,直接重启手机(