tcpdump抓包与nmap扫描
tcpdump
过滤条件
类型:host、net、port、portange
方向:src、dst
协议:tcp、dup、ip、wlan、arp…
多条件组合:and、or、not…
tcpdump过滤语句介绍
可以给tcpdump传送“过滤表达式”来起到网络包过滤的作用,而且可以支持传入单个或多个过滤表达式。
可以通过命令 man pcap-filter 来参考过滤表达式的帮助文档过滤表达式大体可以分成三种过滤条件,“类型”、“方向”和“协议”,这三种条件的搭配组合就构成了我们的过滤表达式。
关于类型的关键字,主要包括host,net,port, 例如 host 210.45.114.211,指定主机 210.45.114.211,net 210.11.0.0 指明210.11.0.0是一个网络地址,port 21 指明端口号是21。如果没有指定类型,缺省的类型是host.
关于传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,
这些关键字指明了传输的方向。举例说明,src 210.45.114.211 ,指明ip包中源地址是210.45.114.211, dst net 210.11.0.0 指明目的网络地址是210.11.0.0 。如果没有指明方向关键字,则缺省是srcor dst关键字。
关于协议的关键字,主要包括 ether,ip,ip6,arp,rarp,tcp,udp等类型。这几个的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。
除了这三种类型的关键字之外,其他重要的关键字如下:
gateway, broadcast,less,greater,还有三种逻辑运算,取非运算是 ‘not ’ ‘! ‘, 与运算是’and’,’&&’;或运算是’or’ ,’||’;
可以利用这些关键字进行组合,从而组合为比较强大的过滤条件。
下面举例说明
(1)只想查目标机器端口是21或80的网络包,其他端口的我不关注:
-c 只抓取10条
tcpdump -i eth0 -c 10 'dst port 21 or dst port 80'
(2) 想要截获主机172.16.0.11 和主机210.45.123.249或 210.45.123.248的通信,使用命令(注意括号的使用):
tcpdump -i eth0 -c 3 'host 172.16.0.11 and (210.45.123.249 or 210.45.123.248)'
(3)想获取使用ftp端口和ftp数据端口的网络包
tcpdump 'port ftp or ftp-data'
这里 ftp、ftp-data到底对应哪个端口? linux系统下 /etc/services这个文件里面,就存储着所有知名服务和传输层端口的对应关系。如果你直接把/etc/services里的ftp对应的端口值从21改为了3333,那么tcpdump就会去抓端口含有3333的网络包了。
(4) 如果想要获取主机172.16.0.11除了和主机210.45.123.249之外所有主机通信的ip包,使用命令:
tcpdump ip 'host 172.16.0.11 and ! 210.45.123.249'
(5) 抓172.16.0.11的80端口和110和25以外的其他端口的包
tcpdump -i eth0 'host 172.16.0.11 and! port 80 and ! port 25 and ! port 110'
参数详解
(1) tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,基于协议进行过滤,不能对应用层协议过滤,如http https dns等,需要写成 tcpdump port 53
tcpdump tcp port 23 and host 210.27.48.1 #获取主机210.27.48.1接收或发出的telnet包 tcpdump udp port 123 #对本机的udp 123 端口进行监视 123 为ntp的服务端口
(2) -i eth1 : 只抓经过接口eth1的包 ;-i any 监听所有网卡的数据包
tcpdump -i eth0
(3) -t : 不显示时间戳,不常用,因为要看传输花费了多长时间
-ttt 打印每行报文之间间隔时间,以 ms 为单位
-tttt 在每行打印的时间戳之前 加上当前日期 年-月-日
(4) -s 0 : 抓取数据包时默认抓取长度为262144 bytes,超过大小会被截断。加上-s 0 后可以抓到完整的数据包,不同版本的tcpdump 默认数据包长度上限不一样。4.9.3 是262144,可以使用man tcpdump 查看帮助。
(5) -c 100 : 只抓取100个数据包
(6) dst port ! 22 : 不抓取目标端口是22的数据包 dst 1.1.1.1 只抓取发送给1.1.1.1 的数据包,即单向数据包,而非双向通信的数据包,同理 src 1.1.1.1 在目标主机抓取 源地址为1.1.1.1 发给我的报文,而不关心我回复的报文
(7) src net 192.168.1.0/24 : 数据包的源网络地址(抓取网段地址)为192.168.1.0/24
tcpdump -i eth0 src host webserver #截获主机webserver发送的所有数据
tcpdump -i eth0 dst host webserver #监视所有发送到主机webserver的数据包
(8) -w (write) ./target.cap : 保存成cap文件,方便用 wireshark 分析
(9) -nn 第一个n 不将ip地址转换为主机名,第二个n 不将端口转换为服务名,如53 为dns
(10) -src 80 源端口 -dst 80 目的端口
(11) src portrange 8000-8080 ; dst portrange 8000-8080 对端口范围进行抓包
(12) -r (read) 从文件中读取抓包数据 tcpdump -r http.pcap,也可以用 wireshark 打开分析
(13) -v 更加详细的显示 -vv -vvv
(14) -C 与 -w 配合使用 指定文件大小,如果超过了就写入另外一个文件,默认为1MB -W 3 最多三个文件(当数据包超过3个,从第一个文件覆盖重写),没有指定 -W 无限文件
tcpdump -C 1 -W 3 -w test.cap
(15) -Q in|out|inout 选择入方向的数据包还是出方向,或者是入和出都抓取
(16) -q 简洁输出
(17) -A 使用ASCII 格式打印出所有数据包并且读取此文件,方便使用grep 对内容过滤。 -X 同时显示16进制 和ASCII 格式
tcpdump -A -r test.cap
tcpdump -A |grep baidu.com
(18) -e 在输出行打印出数据链路层的头部信息。默认情况下 tcpdump 不会显示数据链路层的信息,-e 可以显示源和目的MAC 地址,以及vlan tag 信息。
tcpdump -e -r test.cap
(19) -F 将过滤规则写入文件中,适用于长期保存维护 ; 在命令行输入过滤规则不生效,只会根据文件规则过滤
tcpdump -F filter_rule -c 10 tcp port 80
(20) -l (不是大写的I) 对标准输出进行缓冲,在需要同时观察打印和需要保存到文件时很有用。
tcpdump -l |tee test.cap
tee: 读取标准输入的数据,并将其保存到文件中
上面命令可以解释为
tcpdump -l > test.cap & tail -f test.cap
(21) 过滤规则逻辑计算
and && 优先级比 or 高
or ||
not !
tcpdump "host 210.27.48.1 and (210.27.48.2 or 210.27.48.3)" #截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,注意 " " tcpdump host 172.18.0.67 and ! 172.18.60.129 # 获取主机172.18.0.67除了和主机172.18.60.129之外所有主机通信的ip包 tcpdump tcp -i eth1 -s 0 -c 100 and tcp dst port ! 22 and src net 192.168.1.0/24 -nn -w ./target.cap #综合
(22) 基于包大小进行过滤
抓取包大小小于32bytes的数据包
tcpdump -i eth0 host 1.1.1.1 dst 80 less 32 -w test.cap
抓取包大小大于100bytes的数据包
tcpdump -i eth0 greater 300 -w test.cap
一些练习题
抓取所有网络接口上的流量,并将结果保存到一个文件中。
tcpdump -i any -C 1 -W 5 -w test.cap
抓取特定主机的流量
只抓取来自或发送到IP地址 192.168.1.100 的流量。
tcpdump host 192.168.1.100
抓取特定端口的流量
只抓取HTTP(端口80)和HTTPS(端口443)流量。
tcpdump 'port 80 or port 443'
抓取流量并且输出时不进行IP地址和端口号的解析。
tcpdump -nn dst port 80
只抓取TCP和UDP流量。
tcpdump 'tcp or udp'
抓取包含特定字符串的流量
抓取包含字符串 "login" 的流量。
tcpdump -A | grep "login"
抓取来自子网 192.168.1.0/24 的所有流量。
tcpdump -i eth0 src net 192.168.1.0/24
抓取流量并将结果保存到文件中,每个文件大小限制为100MB。
tcpdump -i any -C 100 -w test.cap
只抓取ICMP协议的流量。
tcpdump icmp
抓取特定时间段的流量
只抓取每天早上8点到9点的流量。
echo "0 8 * * * /usr/sbin/tcpdump -i eth0 -w /path/to/output/file.cap" | crontab - echo "0 9 * * * pkill tcpdump" | crontab -
只抓取数据包长度大于100字节的流量。
tcpdump -i eth0 greater 100 -w test.cap
抓取来自IP地址 192.168.1.100 并且端口为22的TCP流量。
tcpdump -i eth0 src 192.168.1.100 and tcp dst port 22
抓取所有数据包并显示详细信息。
tcpdump -v
抓取特定主机的入站流量,只抓取目标地址为 192.168.1.100 的流量。
tcpdump dst host 192.168.1.100
只抓取源地址在 10.0.0.0/8 网络范围内的流量。
tcpdump net 10.0.0.0/8
只抓取端口范围在1000到2000之间的流量。
tcpdump portrange 1000-2000
只抓取带有SYN标志的TCP流量。
tcpdump tcp -A |grep -i "SYN"
只抓取并显示DNS查询数据包。
tcpdump -i any port 53
抓取并显示HTTP请求的头部信息
抓取HTTP请求并显示其头部信息
只抓取源MAC地址为 00:11:22:33:44:55 的流量。
tcpdump -e src 00:11:22:33:44:55
过滤并保存特定协议的数据包
过滤UDP协议的数据包并将其保存到文件中。
tcpdump udp -w test.cap
显示数据包的时间戳信息。
tcpdump -tt
实时分析流量并显示数据包的内容。
tcpdump -A -l |tee test.cap
抓取来自子网 192.168.1.0/24,目的端口为80,并且数据包长度大于200字节的流量。
tcpdump 'src net 192.168.1.0/24 and tcp dst port 80 and greater 200'
抓取FTP控制流量(端口21)的数据包。
tcpdump tcp port 21
只抓取源地址和目标地址都不是本地子网的流量。
1 | tcpdump 'not (src net 192.168.1.0/24 or dst net 192.168.1.0/24)' |
组合多种过滤条件练习题
抓取来自子网 192.168.1.0/24 并且目的端口为443的流量。
tcpdump 'net 192.168.1.0/24 and tcp dst port 443' -nn
抓取来自IP地址 192.168.1.100 的TCP流量,且目的端口在1000到2000之间的流量。
tcpdump 'src 192.168.1.100 and dst portrange 1000-2000' -nn
抓取源地址在 10.0.0.0/8 网段并且协议为UDP的数据包。
tcp 'udp src net 10.0.0.0/8' -nn
抓取目的端口为80并且数据包长度大于500字节的流量。
tcpdump 'tcp dst port 80 and greater 500' -nn
抓取特定MAC地址且TCP SYN标志的数据包
抓取源MAC地址为 00:11:22:33:44:55 且带有TCP SYN标志的数据包。
tcpdump -e 'ether src 00:11:22:33:44:55 and tcp[tcpflags] & tcp-syn != 0' -nn
抓取特定网络范围的流量且显示详细信息
抓取目的地址在 172.16.0.0/16 网络范围内的流量,并显示详细信息。
tcpdump -v 'dst net 172.16.0.0/16' -nn
抓取特定主机的HTTP和HTTPS流量
抓取来自或发送到IP地址 10.0.0.1 的HTTP和HTTPS流量。
tcpdump "tcp src host 10.0.0.1 port 80 or dst host 10.0.0.1 port 443" -nn tcpdump 'host 10.0.0.1 and (port 80 or port 443)' -nn # 修改后
抓取特定应用层协议流量且包含特定字符串的数据包
抓取FTP控制流量(端口21)并且数据包中包含字符串 "USER"。
tcpdump -A 'tcp port 21' | grep "USER" -nn
抓取特定网络范围且不包括本地地址的数据包
抓取源地址在 192.168.0.0/16 网段且目标地址不在本地子网 192.168.1.0/24 的数据包。
tcpdump 'src net 192.168.0.0/16 and not dst net 192.168.1.0/24' -nn
抓取源地址为特定IP且目标端口为HTTPS的数据包
抓取源地址为 192.168.2.1 并且目标端口为443的数据包。
tcpdump 'src host 192.168.2.1 dst port 443' -nn
只抓取源地址和目标地址都不是本地子网192.168.0.0/16的流量。
tcpdump 'not (src net 192.168.0.0/16 or dst net 192.168.0.0/16)' -nn
抓取来自子网 192.168.1.0/24,目的端口为80,并且数据包长度大于200字节的流量。
tcpdump 'src net 192.168.1.0/24 dst port 80 and greater 200' -nn
抓取来自IP地址 192.168.1.100 并且目标端口为22的TCP流量。
tcpdump 'tcp src host 192.168.1.100 dst port 22' -nn
描述:抓取来自子网 192.168.1.0/24 并且目的地址为子网 172.16.0.0/16 的流量。 适合于lvs,haproxy,nginx等代理服务器
tcpdump "src net 192.168.1.0/24 and dst net 172.16.0.0/16"
描述:抓取目标IP地址为 10.0.0.1 的TCP流量,且源端口在1000到2000之间的流量。
tcpdump "tcp dst host 10.0.0.1 and src portrange 1000-2000"
描述:抓取源地址在 192.168.1.0/24 网段并且协议为ICMP的数据包。
tcpdump icmp src net 192.168.1.0/24
描述:抓取目标端口为443并且数据包长度小于100字节的流量。
tcpdump "dst port 443 and less 100"
描述:抓取源MAC地址为 00:11:22:33:44:55 且带有TCP FIN标志的数据包。
tcpdump -e 'ether src 00:11:22:33:44:55 and tcp[tcpflags] & tcp-syn != 0' -nn
描述:抓取源地址在 10.0.0.0/8 网络范围内的流量,并不解析主机名。
tcpdump -nn "src net 10.0.0.0/8"
描述:抓取来自或发送到IP地址 8.8.8.8 的DNS请求和响应流量。
tcpdump host 8.8.8.8 port 53
描述:抓取HTTP流量(端口80)并且数据包中包含字符串 "password"。
tcpdump -A port 80 |grep -i password
描述:抓取源地址在 172.16.0.0/12 网段且目标地址不在本地子网 192.168.1.0/24 的数据包。
tcpdump "src net 172.16.0.0/12 and dst net ! 192.168.1.0/24"
描述:抓取源地址为 203.0.113.5 并且目标端口为22的数据包。
tcpdump tcp src host 203.0.113.5 and dst port 22
描述:抓取源地址在 10.1.1.0/24 子网且源端口在2000到3000之间的数据包。
tcpdump "src net 10.1.1.0/24 and src portrange 2000-30000"
描述:抓取目标地址为 192.168.0.10 且源端口不是80和443的数据包。
tcpdump "dst 192.168.0.10 and src port not (80 and 443)"
抓取 TCP 协议且源 IP 地址在 192.168.1.0/24 网段,目标端口为 80 或 443 的数据包。
tcpdump "tcp src net 192.168.1.0/24 and dst port (80 or 443)"
抓取来自 MAC 地址 00:11:22:33:44:55 且目标 IP 地址为 10.0.0.1 的 UDP 协议数据包。
tcpdump -e "udp src ether 00:11:22:33:44:55 and dst host 10.0.0.1"
抓取源 IP 地址在 172.16.0.0/16 网段且目标端口在 1000 到 2000 之间,并且数据包长度大于 500 字节的流量。
tcpdump "src net 172.16.0.0/16 and dst portrange 1000-2000 and greater 500"
抓取来自 192.168.1.100 且目标 IP 地址不在 172.16.0.0/16 网段,协议为 ICMP 的数据包。
tcp icmp "src host 192.168.1.100 and dst net ! 172.16.0.0/16"
抓取目标 IP 地址为 8.8.8.8 且 TCP 协议带有 SYN 标志的数据包。
tcpdump "tcp dst host 8.8.8.8 and tcp[tcpflags] & tcp-syn != 0" tcp[tcpflags] & tcp-syn != 0: 这是一个复杂的过滤表达式,用于检查TCP标志字段中是否设置了SYN标志。 tcp[tcpflags]: 访问TCP头中的标志字段。 & tcp-syn: 使用按位与操作检查SYN标志(位2)是否被设置。 != 0: 确保结果不为零,也就是确保SYN标志被设置。
包分析
三次握手
nmap
nmap -sP 192.168.1.0/24 #进行ping扫描,打印出对扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测) nmap -sL 192.168.1.0/24 #仅列出指定网络上的每台主机,不发送任何报文到目标主机 nmap -PS 192.168.1.234 #探测目标主机开放的端口,可以指定一个以逗号分隔的端口列表(如-PS22,23,25,80) nmap -PS -p 80,3306,22,23,21 172.18.0.69 nmap -sV 172.18.0.69 -p 22 -oN test6.txt //-oN 保存为txt oX保存为xml格式 nmap -PU 192.168.1.0/24 #使用UDP ping探测主机 nmap -sS 192.168.1.0/24 #使用频率最高的扫描选项:SYN扫描,又称为半开放扫描,它不打开一个完全的TCP连接,执行得很快 nmap -sT 192.168.1.0/24 #当SYN扫描不能用时,TCP Connect()扫描就是默认的TCP扫描 nmap -sU 192.168.1.0/24 #UDP扫描用-sU选项,UDP扫描发送空的(没有数据)UDP报头到每个目标端口 nmap -sO 192.168.1.19 #确定目标机支持哪些IP协议 (TCP,ICMP,IGMP等)
[root@ecs-62f4 ~]# nmap -sO 172.18.0.69 Starting Nmap 6.40 ( http://nmap.org ) at 2020-06-25 19:07 CST Nmap scan report for 172.18.0.69 Host is up (0.00028s latency). Not shown: 252 open|filtered protocols PROTOCOL STATE SERVICE 1 open icmp 6 open tcp 58 closed ipv6-icmp 112 closed vrrp MAC Address: FA:16:3E:99:A5:D4 (Unknown)
nmap -O 192.168.1.19 #探测目标主机的操作系统 nmap -A 192.168.1.19 #探测目标主机的操作系统 nmap -v scanme.nmap.org #这个选项扫描主机scanme.nmap.org中 所有的保留TCP端口。选项-v启用细节模式。 nmap -sS -O scanme.nmap.org/24 #进行秘密SYN扫描,对象为主机Saznme所在的“C类”网段 的255台主机。同时尝试确定每台工作主机的操作系统类型。因为进行SYN扫描 和操作系统检测,这个扫描需要有根权限。 nmap -sV -p 22,53,110,143,4564 198.116.0-255.1-127 #进行主机列举和TCP扫描,对象为B类188.116网段中255个8位子网。这 个测试用于确定系统是否运行了sshd、DNS、imapd或4564端口。如果这些端口 打开,将使用版本检测来确定哪种应用在运行。 nmap -v -iR 100000 -P0 -p 80 #随机选择100000台主机扫描是否运行Web服务器(80端口)。由起始阶段 发送探测报文来确定主机是否工作非常浪费时间,而且只需探测主机的一个端口,因 此使用-P0禁止对主机列表。 nmap -P0 -p80 -oX logs/pb-port80scan.xml -oG logs/pb-port80scan.gnmap 216.163.128.20/20 #扫描4096个IP地址,查找Web服务器(不ping),将结果以Grep和XML格式保存。 host -l company.com | cut -d -f 4 | nmap -v -iL - #进行DNS区域传输,以发现company.com中的主机,然后将IP地址提供给 Nmap。上述命令用于GNU/Linux – 其它系统进行区域传输时有不同的命令
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现