linux https拦截与url解析
uprobe 拦截TLS库用eBPF uprobe拦截 TLS 库OpenSSL/GnuTLS/Go TLS在加密前 / 解密后捕获明文 HTTP 请求即可解析出 HTTPS URL无需 CA 证书、无需修改应用。核心原理HTTPS 明文含 URL在 TLS 库内部处理发送应用 →SSL_write明文→ 加密 → 网络接收网络 → 解密 →SSL_read明文→ 应用Uprobe 挂钩SSL_write/SSL_read在函数入口 / 返回时读取明文缓冲区从中提取完整 HTTP 请求含HostPath拼接为 URL。uprobe 直接抓有个问题SSL_write 传入的 len 不一定是真实发送长度返回值才是。方案uprobe 保存 buf 地址uretprobe 取返回值再读明文这是生产环境最稳的 eBPF 方式。属于 eBPF 范畴但比单纯 uprobe 更强。主流 TLS 库关键钩子点1. OpenSSL最常用入口SSL_write(SSL *ssl, const void *buf, int num)入口SSL_read(SSL *ssl, void *buf, int num)需配合uretprobe获取实际读写长度返回值2. GnuTLS入口gnutls_record_send(gnutls_session_t session, const void *data, size_t size)入口gnutls_record_recv(gnutls_session_t session, void *data, size_t size)3. Go crypto/tls入口crypto/tls.(*Conn).Write(b []byte) (n int, err error)入口crypto/tls.(*Conn).Read(b []byte) (n int, err error)BPFtrace 快速示例捕获 SSL_write 明文#!/usr/bin/env bpftrace uprobe:/lib/x86_64-linux-gnu/libssl.so.1.1:SSL_write { $ssl (struct ssl_st *)arg0; $buf arg1; $num arg2; $pid pid; // 读取前 2048 字节明文HTTP 请求 $data buf($buf, 2048); printf(PID %d SSL_write: %s\n, $pid, $data); }运行sudo bpftrace ssl_write.btBCC 完整方案uprobe uretprobe 配合需两步uprobe入口保存SSL*、buf、num到 BPF Mapuretprobe返回时用实际长度读取完整明文解析 URL核心 eBPF 代码片段C// 入口探针保存上下文 SEC(uprobe/SSL_write) int probe_entry_SSL_write(struct pt_regs *ctx) { u64 pid_tgid bpf_get_current_pid_tgid(); void *ssl (void *)PT_REGS_PARM1(ctx); void *buf (void *)PT_REGS_PARM2(ctx); int num (int)PT_REGS_PARM3(ctx); struct ssl_data_t data { .ssl ssl, .buf buf, .num num, }; bpf_map_update_elem(ssl_ctx_map, pid_tgid, data, BPF_ANY); return 0; } // 返回探针读取明文并解析 SEC(uretprobe/SSL_write) int probe_ret_SSL_write(struct pt_regs *ctx) { u64 pid_tgid bpf_get_current_pid_tgid(); struct ssl_data_t *data bpf_map_lookup_elem(ssl_ctx_map, pid_tgid); if (!data) return 0; int ret PT_REGS_RC(ctx); // 实际写入长度 if (ret 0) { bpf_map_delete_elem(ssl_ctx_map, pid_tgid); return 0; } // 读取明文 HTTP 请求 char http_req[2048] {0}; bpf_probe_read_user(http_req, ret 2048 ? ret : 2048,>工具化方案1. eCapture推荐开箱即用eCapture其实内部整合了uprobeuretprobeCO-REOpenSSL 1.0.2/1.1/3.0 结构体自动适配直接从 SSL 结构体取hostname SNI自动拼接 URLhttps://host/path这是目前最成熟、不用自己写代码的方案。支持 OpenSSL/GnuTLS/Go TLS/BoringSSL/NSS无需写代码直接捕获明文并输出 URL命令sudo ecapture tls -p PID -m text输出示例GET /index.html HTTP/1.1 Host: example.com URL: https://example.com/index.html2. BCC sslsniff.py官方示例捕获 SSL 明文sudo python3 /usr/share/bcc/tools/sslsniff.py -p PID从 SSL 结构体中直接提取 SNI超级高级玩法*根本不用解析 HTTP直接从 SSL取出域名。**OpenSSL 结构体里有SSL::session::hostSSL::s3-hostnameSSL::tlsext_hostname直接用 uprobe/uretprobe 读取结构体偏移直接拿到域名。优点不需要解析 HTTP 包不会被分包影响最稳定、最快这是专业 eBPF 监控产品如 Pixie、Calico、Cilium真正使用的方案。核心原理TLS 握手时客户端会发送SNIServer Name Indication域名OpenSSL 会把它存在SSL结构体的固定字段里// OpenSSL 内部结构体 struct ssl_st { // ... const char *tlsext_hostname; // 这里就是 SNI 域名 };我们用uprobe 挂钩SSL_connect直接读取这个指针秒拿到域名比解析 HTTP 稳定 100 倍。SSL_connect 只能拿到 SNI域名握手阶段还没发送 HTTP 请求拿不到 Path完整 URL SSL_connect (SNI) SSL_write (Path)域名来自SSL-tlsext_hostnameSNI路径来自SSL_write明文 HTTP 请求用 eBPF Map 关联同一个 SSL 连接的 域名 路径这是 Cilium / Pixie /eCapture 底层真正商用方案1. SSL_connectTLS握手 → 读取 SSL 结构体 → 获取 SNI 域名 → 存入 eBPF Map[SSL指针: 域名] 2. SSL_write发送HTTP → 读取明文 → 获取 Path → 从 Map 取出对应域名 → 拼接https://域名路径为什么这个方案最强超级稳定不受 TCP 分包影响不受 HTTP 头格式影响不依赖明文数据性能极高只在 TLS 握手时触发一次不挂钩高频的 SSL_write通用性强所有 HTTPS 流量都带 SNI浏览器、APP、curl 全支持直接拿到域名无需拼接 HostPath直接输出https://$sni关键要点✅uprobe 挂钩 SSL_connect✅直接读取 SSL 结构体偏移 0x180/0x190✅拿到 SNI 域名 直接得到 HTTPS 域名✅不解析 HTTP、不分包、最稳定Kernel TLS (KTLS) 劫持如果开启 KTLS加密解密在内核完成可以用sk_buff直接抓明文极稳定但依赖内核开启 KTLS。MITM中间人代理 TLS 证书伪造HTTPS 是 TLS 加密的 HTTP直接抓包只能看到密文。要解析必须做中间人解密流量劫持将目标 HTTPS443流量重定向到代理端口如 8080。TLS 握手欺骗代理收到客户端 ClientHello伪造目标服务器证书用自签 CA 签发。客户端信任代理 CA 后完成 TLS 握手建立客户端 ↔ 代理的加密通道。双向解密转发代理解密客户端请求 → 处理 / 记录 → 再与真实服务器建立 TLS 连接 → 转发请求。服务器响应 → 代理解密 → 处理 → 加密发回客户端。关键前提客户端必须信任代理的根 CA 证书否则会报证书错误。透明代理无需客户端手动设代理1mitmproxy最常用支持 eBPF 本地拦截优势命令行 Web UI、脚本化、支持 HTTP/2、TLS 1.3、eBPF 内核级劫持。透明拦截Linux# 安装 sudo apt install mitmproxy # 启动透明模式8080 代理 sudo mitmproxy --mode transparent --showhost # 配置 iptables 重定向 80/443 到 8080 sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8080 sudo iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-port 8080证书安装浏览器访问mitm.it下载并信任 CA 证书~/.mitmproxy/mitmproxy-ca-cert.pem。脚本示例修改响应# modify.py from mitmproxy import http def response(flow: http.HTTPFlow) - None: if example.com in flow.request.pretty_url: flow.response.text flow.response.text.replace(old, new) # 运行 mitmproxy -s modify.py --mode transparent2bettercap网络层 MITM适合局域网嗅探支持 ARP 欺骗、HTTPS 降级、TLS 拦截。启动 HTTPS 代理sudo bettercap -eval set http.proxy on; set https.proxy on; set https.proxy.sslstrip true; http.proxy.start应用层代理需客户端手动配置CharlesGUI 工具适合调试需手动设代理并安装证书。FiddlerWindows 为主Linux 可通过 Wine 运行。tcpdump Wireshark仅抓密文无法解析除非有服务器私钥仅用于自己的服务。内核级拦截高性能eBPFmitmproxy 新版支持 eBPF 挂钩 socket 创建实现进程级透明拦截比 iptables 更高效。netfilter 模块内核级 TLS 解析如 tls_helper适合网关 / 防火墙场景。iptables 流量劫持本地流量本机应用# 清空规则测试用 sudo iptables -t nat -F # 重定向 80/443 到代理 8080 sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 8080 sudo iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-port 8080 # 查看规则 sudo iptables -t nat -L -n # 清除规则 sudo iptables -t nat -F网关流量转发其他设备# 开启 IP 转发 echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward # 转发 80/443 到代理 sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080 sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080证书管理生成自签 CAmitmproxy 自动生成# 手动生成可选 openssl req -x509 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 365 -nodes客户端信任证书浏览器设置 → 隐私与安全 → 管理证书 → 导入ca.crt。Linux 系统sudo cp ca.crt /usr/local/share/ca-certificates/ sudo update-ca-certificatesAndroid设置 → 安全 → 从 SD 卡安装证书。用 mitmproxy 拦截并解析 HTTPS启动透明代理sudo mitmweb --mode transparent --web-host 0.0.0.0配置 iptables 重定向 443 → 8080。浏览器访问http://localhost:8081打开 Web UI。访问任意 HTTPS 网站即可看到明文请求 / 响应。脚本化编写 Python 脚本过滤、修改、记录流量。风险与限制证书信任未信任 CA 会导致 TLS 握手失败浏览器报 “不安全”。证书锁定Certificate PinningAPP 内置服务器公钥MITM 会被拒绝需脱壳 / Frida 绕过。TLS 1.3 0-RTT早期数据可能无法解密。法律合规未经授权拦截他人流量违法仅用于自己的设备 / 授权测试。性能损耗MITM 会增加延迟高并发场景需优化。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2471725.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!