RiccardoCataldi/access-point
GitHub: RiccardoCataldi/access-point
该工具利用 hostapd 和 dnsmasq 在 Linux 上快速创建虚假开放 Wi-Fi 接入点,用于受控环境中的流量捕获与客户端行为分析。
Stars: 6 | Forks: 1
# 虚假 Access Point
用于在受控环境中捕获流量的恶意开放 Wi-Fi AP。使用 `hostapd`(原生 nl80211 AP 模式)+ `dnsmasq`(DHCP/DNS)+ `iptables` NAT 转发至上行链路接口。

## 要求
- Linux,root 权限。
- 支持 AP 模式的无线网卡(`iw phy` → `Supported interface modes: ... AP`)。
- 软件包:`hostapd`、`dnsmasq`、`iw`、`iptables`、`rfkill`、`wireshark`。
## 配置
编辑 `fake_ap.sh` 顶部的变量。
### `INTERNET_IFACE` — 带有互联网的上行链路
这是已经具有默认路由的接口(以太网、USB 适配器、Wi‑Fi 客户端等)。名称因机器而异(`eth0`、`enp3s0`、`wlp3s0`,……)。
```
ip route | grep default
# default via 192.168.1.1 dev enp3s0 ...
# ^^^^^^
# 使用此名称
```
将 `INTERNET_IFACE` 设置为 `dev` 之后的接口名称。
### `AP_IFACE` — 用于虚假 AP 的无线网卡
使用 `iw dev` 输出的物理 Wi‑Fi 接口。通常是 `wlan0`,但也可能是 `wlp2s0` 或类似名称。
```
iw dev
# phy#0
# Interface wlan0
# ^^^^^
# 使用此名称
```
选择支持 AP 模式的物理接口(`iw phy` → `Supported interface modes: ... AP`)。不要使用 Docker 桥接(`docker0`、`br-*`)或虚拟接口(`veth*`)。
### 示例
```
FAKE_SSID="Free_Public_WiFi"
CHANNEL="6"
INTERNET_IFACE="enp3s0"
AP_IFACE="wlan0"
GATEWAY_IP="10.0.0.1"
```
## 运行
```
sudo ./fake_ap.sh
```
该脚本将执行以下操作:
1. 在无线 phy 上以 managed 模式创建 AP 接口(例如 `wlan0`)。
2. 启动 `hostapd`,在选定信道上广播开放 SSID。
3. 启动 `dnsmasq`(DHCP + DNS 转发器,指向 1.1.1.1 / 8.8.8.8)。
4. 启用 IP 转发,并设置指向上行链路的 MASQUERADE。
5. 实时打印已连接的客户端(从租约中提取的 MAC + IP + 主机名)。
6. Ctrl+C 执行全面清理(iptables 规则、接口、NM、ip_forward)。
## 实时监控
```
sudo journalctl -t dnsmasq -f # DHCP leases + every client DNS query
sudo wireshark -i wlan0 # capture client L3 traffic (use your AP_IFACE)
sudo iw dev wlan0 station dump # client L2 state (RSSI, rate, traffic)
cat /var/lib/misc/dnsmasq.leases # active leases
```
## Wireshark — 枚举过滤器
在您的 AP 接口(例如 `wlan0`)上打开 Wireshark,并应用您需要的显示过滤器。
### 识别设备
| 获取的信息 | 过滤器 |
| --- | --- |
| 主机名和供应商(DHCP 选项 12/55/60) | `dhcp` |
| 设备名称 + 服务(Bonjour/AirPlay/Chromecast) | `mdns` |
| Windows 主机名 / SMB | `nbns` |
| 设备型号(UPnP) | `ssdp` |
| 根据 MAC 获取的供应商 | `eth.addr == aa:bb:cc:dd:ee:ff` |
| 来自单个客户端的所有流量 | `ip.addr == 10.0.0.X` |
### 正在浏览的内容(包括 HTTPS)
| 获取的信息 | 过滤器 |
| --- | --- |
| 通过 DNS 解析的域名 | `dns.qry.name` |
| HTTPS 域名(ClientHello 中的 SNI) | `tls.handshake.type == 1` |
| 包含解析 IP 的 DNS 响应 | `dns.flags.response == 1` |
| QUIC 连接(Google、YouTube、Meta) | `quic` |
| 明文 HTTP(完整 URL) | `http.request` |
| 应用/浏览器 User-Agent | `http.user_agent` |
### 会话与新连接
| 获取的信息 | 过滤器 |
| --- | --- |
| 仅 SYN(新 TCP 连接) | `tcp.flags.syn == 1 && tcp.flags.ack == 0` |
| 正在进行的 TLS 握手 | `tls.handshake` |
| 大容量传输(基于 TLS 的 HTTP/2) | `tcp.len > 1000` |
| ICMP(客户端诊断 Ping) | `icmp` |
### 凭证 / 表单(在 HTTPS 环境下较少见,但仍值得检查)
| 获取的信息 | 过滤器 |
| --- | --- |
| HTTP POST(http:// 站点上的登录) | `http.request.method == "POST"` |
| FTP 凭证 | `ftp.request.command in {"USER","PASS"}` |
| Telnet | `telnet` |
| 明文 SMTP/IMAP/POP3 | `smtp || imap || pop` |
| payload 中的可疑字符串 | `frame contains "password"` |
### 实用组合
```
# 一个客户端的加密流量 + 联系的域名
ip.src == 10.0.0.42 && (dns || tls.handshake.type == 1)
# 被动发现手机型号
ip.src == 10.0.0.42 && (dhcp || mdns || ssdp || nbns)
# 发往特定域名(例如社交网站)的流量
tls.handshake.extensions_server_name contains "instagram"
# 排除 broadcast/multicast 噪声
not (eth.dst == ff:ff:ff:ff:ff:ff) && not (ip.dst >= 224.0.0.0 && ip.dst <= 239.255.255.255)
```
### 提示
- 快速提取客户端访问的 **SNI**:
sudo tshark -i wlan0 -Y 'tls.handshake.type==1 && ip.src==10.0.0.42' \
-T fields -e tls.handshake.extensions_server_name
- 持续导出 pcap 数据包以供离线分析:
sudo tcpdump -i wlan0 -w /tmp/capture.pcap
- 无需 Wireshark,DNS 查询也可通过 `journalctl -t dnsmasq -f` 查看。
## 许可证
MIT — 详见 [LICENSE](LICENSE)。
## 法律声明
仅在您拥有或获得书面授权进行测试的网络和设备上使用。截获他人流量是违法行为。
标签:Cutter, Linux网络, Shell脚本, 流量劫持, 网络安全, 钓鱼WiFi, 防御绕过, 隐私保护