这篇文章上次修改于 372 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
前言
个人常用的一些抓包方案如下:
- 安卓端抓包软件(VPN模式)
- 系统代理/转发软件(VPN模式) + PC端抓包软件
- 本机iptables透明代理 + clash转发 + PC端抓包软件
以上方案往往还需要:root环境加持 + Magisk + 移动证书
还有一种是路由器上做转发,不过这经常受到以下几方面的挑战:
没有路由器设备/难以申请网络接入- 网络稳定性,即信号不稳,干扰严重
- 防火墙设置,即需要调整出入站规则等等
所以还是感觉安卓上抓包不方便,希望在受限的情况下也能实现较为方便的抓包
众所周知,路由器不常有有但手机多得是,所以可以用一个手机充当路由器的功能
在[Clash版]安卓上基于透明代理抓包中,已经可以做到对设备热点下的流量一并抓包处理转发,然而设备本身还有其他软件也会产生流量,这总归是让人难以接受的
于是核心目的就是实现:仅对设备热点的流量进行转发抓包
最终整个处理过程如下:
- 设备A开启WIFI热点,设备A必须有root
- 设备B接入设备A的WIFI热点
- 设备A上使用iptables规则将WIFI热点的所有流量交由clash处理
- 设备A上使用clash将流量转发到目标节点
- PC设备开启抓包软件,开启socks/http监听
- 设备A通过USB连接PC,使用adb reverse将设备A的clash与PC打通
步骤5和6也可以省略,将步骤4变更为直接转发到设备A上的抓包软件,目前安卓似乎只有ProxyPin支持处理转发过来的流量
不过由于ProxyPin目前要强制开启VPN,我写的iptables规则会先经过VPN,无法实现这个效果,后面可能会支持不开启VPN的情况下接受转发来的流量抓包
步骤
首先确保设备A先开启WIFI热点,设备B可以先不用接入
然后通过ifconfig
命令查看网卡信息,wlan0
通常是WLAN功能的网卡,另外一个wlan
开头的是WIFI热点的网卡,我测试机上名为wlan2
也可以通过开关WIFI热点来判断WIFI热点是哪个网卡
准备如下的iptables.sh
,放入/data/local/tmp
下执行,注意脚本中将ipv6禁用了,其中7893
和1053
都是clash的配置
#!/system/bin/sh
set -ex
# ENABLE ipv4 forward
sysctl -w net.ipv4.ip_forward=1
# DISABLE ipv6
sysctl -w net.ipv6.conf.all.disable_ipv6=1
sysctl -w net.ipv6.conf.default.disable_ipv6=1
# ROUTE RULES
ip rule add fwmark 666 table 777
ip route add local 0.0.0.0/0 dev lo table 777
# DNS端口的请求后面交给clash 1053端口处理,不能走透明代理
iptables -t mangle -A PREROUTING -i wlan2 -p udp --dport 53 -j RETURN
# 这个端口是请求DHCP服务的,不能走透明代理
iptables -t mangle -A PREROUTING -i wlan2 -p udp --sport 68 -j RETURN
# 将所有的tcp流量都转到clash的透明代理端口
iptables -t mangle -A PREROUTING -i wlan2 -p tcp -j TPROXY --on-port 7893 --on-ip 127.0.0.1 --tproxy-mark 666
# 将所有的udp流量都转到clash的透明代理端口
iptables -t mangle -A PREROUTING -i wlan2 -p udp -j TPROXY --on-port 7893 --on-ip 127.0.0.1 --tproxy-mark 666
# 将53端口的请求,即DNS请求都转到clash处理
iptables -t nat -I PREROUTING -i wlan2 -p udp --dport 53 -j DNAT --to-destination 127.0.0.1:1053
准备下面的clash配置config.yaml
,注意dns一定要开起来,和clash一并放入/data/local/tmp
,执行下面的命令
/data/local/tmp/clash-linux-arm64 -d /data/local/tmp
# TProxy 的透明代理端口
tproxy-port: 7893
# mixed-port 端口将同时支持 SOCKS5/HTTP
mixed-port: 7890
# RESTful API for clash
external-controller: 127.0.0.1:9090
allow-lan: true
mode: global
log-level: debug
bind-address: 0.0.0.0
dns:
enable: true
listen: 0.0.0.0:1053
ipv6: false
enhanced-mode: fake-ip
nameserver:
- 114.114.114.114
proxies:
- name: "proxy_socks5"
type: socks5
server: 127.0.0.1
port: 12345
udp: true
- name: "proxy_http"
type: http
server: 127.0.0.1
port: 12346
udp: true
- name: "proxypin_socks5"
type: socks5
server: 127.0.0.1
port: 9099
udp: true
- name: "proxypin_http"
type: http
server: 127.0.0.1
port: 9099
udp: true
proxy-groups:
rules:
现在通过web控制台设置代理节点,此处我选择proxy_socks5
(此动作只需要做一次),用在线的或者自己搭建一个:
注意使用http链接,https链接chrome会提示安全问题,因为external-controller
是本地ip
由于配置中external-controller
并没有直接暴露出来,所以还需要adb forward tcp:9090 tcp:9090
关于proxy_socks5
节点,我Charles的socks5端口就是12345
,请根据自己的情况修改
这里节点是127.0.0.1,设备A是通过USB连接的PC,所以通过adb reverse tcp:12345 tcp:12345
确保clash能将流量转发到PC的抓包软件
现在万事俱备了,将设备B接入设备A的热点即可实现对设备B的抓包,设备A本身软件的请求不会被转发给抓包软件
iptables规则暴力重置脚本,clean.sh
#!/system/bin/sh
set -ex
ip rule del fwmark 666 table 777 || true
ip route del local 0.0.0.0/0 dev lo table 777 || true
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
那么搞这么复杂有哪些好处呢?
- 不需要路由器,网络稳定性有保障;以及不需要专门申请网络接入
- 设备B能连接WIFI就能随时抓包,接入热点即抓包,它可以是手机,也可以是其他依赖WIFI联网的设备
- 设备B如果是一个手机,没root你可以抓一些简单的数据包;有root那你配好系统证书,可以抓更多的数据包;关键重点是不存在vpn检查的困扰
- 抓包环节改成ProxyPin等支持仅开启端口监听即可抓包的软件,可实现完全脱离PC抓包
试想下这些场景:
场景一: 你是一个有两个以上手机的高中生,玩机党,酷安爱好者...有个软件的vpn检查过不掉还想抓包
场景二: 你是一个苦逼逆向工程师,正在甲方驻场,甲方爸爸拿来一个没有root,不能安装软件,甚至没有锁屏密码的手机,问你能不能抓包!
场景三: 你是一个移动仔,此时几十个设备都在用公司的WIFI热点,因为网络不稳定,抓包不是失败就是超时,申请新路由器网络接入还有层层审批...
总结
将上述操作涉及的命令汇总如下,注意相关配置部分请根据自己的情况进行调整:
准备工作:
adb forward tcp:9090 tcp:9090
adb reverse tcp:12345 tcp:12345
adb push iptables.sh /data/local/tmp/iptables.sh
adb shell chmod +x /data/local/tmp/iptables.sh
adb push clean.sh /data/local/tmp/clean.sh
adb shell chmod +x /data/local/tmp/clean.sh
adb push config.yaml /data/local/tmp/config.yaml
iptables处理,需要root
/data/local/tmp/iptables.sh
clash服务,切换节点请通过web控制台进行,需要root
/data/local/tmp/clash-linux-arm64 -d /data/local/tmp
想恢复设备A的原始环境的时候执行,需要root,或者直接重启手机
/data/local/tmp/clean.sh
手机WIFI感叹号请修改captive_portal链接,因为这有可能影响到一些软件的网络请求:
adb shell settings put global captive_portal_http_url http://connect.rom.miui.com/generate_204
adb shell settings put global captive_portal_https_url https://connect.rom.miui.com/generate_204
iptables部分很简陋,感觉不是很好,希望有人能再多多完善下
抓包软件效果截图,略
已有 2 条评论
师傅方便留个联系方式吗 有个关于路由器流量转发的问题 想问一下师傅
写的正好