前言

个人常用的一些抓包方案如下:

  1. 安卓端抓包软件(VPN模式)
  2. 系统代理/转发软件(VPN模式) + PC端抓包软件
  3. 本机iptables透明代理 + clash转发 + PC端抓包软件

以上方案往往还需要:root环境加持 + Magisk + 移动证书

还有一种是路由器上做转发,不过这经常受到以下几方面的挑战:

  1. 没有路由器设备/难以申请网络接入
  2. 网络稳定性,即信号不稳,干扰严重
  3. 防火墙设置,即需要调整出入站规则等等

所以还是感觉安卓上抓包不方便,希望在受限的情况下也能实现较为方便的抓包

众所周知,路由器不常有有但手机多得是,所以可以用一个手机充当路由器的功能

[Clash版]安卓上基于透明代理抓包中,已经可以做到对设备热点下的流量一并抓包处理转发,然而设备本身还有其他软件也会产生流量,这总归是让人难以接受的

于是核心目的就是实现:仅对设备热点的流量进行转发抓包

最终整个处理过程如下:

  1. 设备A开启WIFI热点,设备A必须有root
  2. 设备B接入设备A的WIFI热点
  3. 设备A上使用iptables规则将WIFI热点的所有流量交由clash处理
  4. 设备A上使用clash将流量转发到目标节点
  5. PC设备开启抓包软件,开启socks/http监听
  6. 设备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禁用了,其中78931053都是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:

2023-12-05T09:46:13.png

现在通过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

那么搞这么复杂有哪些好处呢?

  1. 不需要路由器,网络稳定性有保障;以及不需要专门申请网络接入
  2. 设备B能连接WIFI就能随时抓包,接入热点即抓包,它可以是手机,也可以是其他依赖WIFI联网的设备
  3. 设备B如果是一个手机,没root你可以抓一些简单的数据包;有root那你配好系统证书,可以抓更多的数据包;关键重点是不存在vpn检查的困扰
  4. 抓包环节改成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部分很简陋,感觉不是很好,希望有人能再多多完善下

2023-12-05T09:43:44.png

抓包软件效果截图,略