POST

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 流量题最稳的工作流。

记住三件事就够了:加过滤、写文件、拉回本地看。

👁 - 次浏览

留言

← 返回首页