CTF 里的 tcpdump:没有图形界面时怎么抓包
服务器、容器、远程靶机上不方便开 Wireshark,tcpdump 就是最顺手的抓包工具。
CTF 里经常遇到这种情况:目标是一台远程服务器,没有图形界面,但你需要看它收发的流量。这时 tcpdump 就是标准答案——它几乎预装在所有 Linux 上,抓完把 pcap 拉回本地再用 Wireshark 分析。
仅限 CTF 靶场和授权环境使用。
基本用法
# 抓所有网卡的包,写到文件
tcpdump -i any -w capture.pcap
# 只抓某个端口
tcpdump -i any port 8080 -w capture.pcap
# 只抓某个主机
tcpdump -i any host 192.168.1.10 -w capture.pcap
# 抓完按 Ctrl+C 停止,然后用 Wireshark 打开 capture.pcap
几个常用参数:
-i any:监听所有网卡,不确定走哪张卡时最省事;-w file.pcap:写入文件,这是推荐做法,别在终端里刷屏;-n:不做 DNS 解析,速度快;-s 0:抓完整包(老版本默认只抓前 96 字节);-A/-X:直接以 ASCII / 十六进制显示内容,适合快速看明文。
过滤表达式
tcpdump 的过滤语法是 BPF,抓包时就把无关流量过滤掉,能显著减小文件体积:
tcpdump -i any 'tcp port 80 or tcp port 443'
tcpdump -i any 'host 10.0.0.5 and not port 22'
tcpdump -i any 'udp port 53'
注意过滤表达式一般要用引号包起来,避免被 shell 拆开。
CTF 里的典型场景
抓 HTTP 请求。 如果目标服务是明文 HTTP,直接 tcpdump -i any -A port 80 就能看到请求和响应,很多时候不用回本地分析。
抓 DNS 隧道。 有些题把数据藏在 DNS 查询里,tcpdump -i any port 53 抓下来,再用 Wireshark 或脚本提取。
在容器里抓包。 容器默认只有自己的网络命名空间,-i any 一般只看到容器内的流量。需要抓宿主机或别的容器,得用 nsenter 进网络命名空间,或者直接在宿主机上抓。
权限问题。 普通用户需要 sudo,或者给 tcpdump 加 CAP_NET_RAW。CTF 环境里通常直接 root。
抓完怎么分析
把 pcap 下载回本地:
scp user@target:/tmp/capture.pcap .
然后用 Wireshark 打开。也可以在服务器上用 tshark 直接过滤:
tshark -r capture.pcap -Y "http.request" -T fields -e http.host -e http.request.uri
几个容易踩的坑
抓太多把磁盘写满。 长时间抓包一定要加过滤条件,或者用 -C 限制文件大小、-G 按时间切分。
缓冲区导致丢包。 高流量场景下可以加 -B 调大缓冲区,或者增大 -s。
-i any 的链路层类型。 在某些环境下 -i any 抓出来的包链路层是 Linux cooked,Wireshark 能识别,但个别工具可能不兼容。必要时指定具体网卡。
别在别人的网络上乱抓。 这个不用多说。
小结
tcpdump 的价值在于「哪里都能跑」:服务器、容器、树莓派,甚至一个精简的 Docker 镜像里。它负责抓,Wireshark 负责分析,两者配合就是 CTF 流量题最稳的工作流。
记住三件事就够了:加过滤、写文件、拉回本地看。
留言