一、抓包工具tcpdump
tcpdump是一个用于截取网络分组,并输出分组内容的工具,简单说就是数据包抓包工具。tcpdump凭借强大的功能和灵活的截取策略,使其成为Linux系统下用于网络分析和问题排查的首选工具。
tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的Linux系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。
tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
1.tcpdump的表达式介绍
表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表 达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包 将会被截获。
在表达式中一般如下几种类型的关键字:
第一种是关于类型的关键字,主要包括host,net,port,例如 host 210.27.48.2, 指明 210.27.48.2是一台主机,net 202.0.0.0指明202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host。
第二种是确定传输方向的关键字,主要包括src,dst,dst or src,dst and src, 这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是 210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0。如果没有指明 方向关键字,则缺省是src or dst关键字。
第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI (分布式光纤数据接口网络)上的特定的网络协议,实际上它是”ether”的别名,fddi和ether 具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。 其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump 将会 监听所有协议的信息包。
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less, greater, 还有三种逻辑运算,取非运算是 ‘not ‘ ‘! ‘, 与运算是’and’,’&&’;或运算是’or’ ,’||’; 这些关键字可以组合起来构成强大的组合条件来满足人们的需要。
实际操作:
普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。
2.监视指定的网络接口数据包:
tcpdump -i eth1
若不指定网络接口则默认会监视第一个网络接口,一般为eth0。
3.也可抓取指定数量的数据包:
抓取eth0网卡5个数据包如下
[[email protected] ~]# tcpdump -c 5 -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
20:07:13.076347 IP bogon.ssh > bogon.51363: Flags [P.], seq 4241485249:4241485365, ack 2060186985, win 321, length 116
20:07:13.078052 IP bogon.ssh > bogon.51363: Flags [P.], seq 116:232, ack 1, win 321, length 116
20:07:13.078319 IP bogon.51363 > bogon.ssh: Flags [.], ack 232, win 254, length 0
20:07:13.086005 ARP, Request who-has bogon tell bogon, length 28
20:07:13.087084 ARP, Reply bogon is-at d0:c7:c0:9f:92:3e (oui Unknown), length 46
5 packets captured
在默认情况下tcpdump会一直抓包,直到按‘Ctrl+C’停止,我们可以使用-c选项抓取指定数量的数据包。
4.上例中tcpdump会对域名和端口进行解析,若不想让其解析则使用如下命令:
[[email protected] ~]# tcpdump -nn -c 5 -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
20:21:55.904586 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 4241488513:4241488709, ack 2060189605, win 321, length 196
20:21:55.906627 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 196:376, ack 1, win 321, length 180
20:21:55.906929 IP 192.168.1.100.51363 > 192.168.1.132.22: Flags [.], ack 376, win 252, length 0
20:21:55.908798 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 376:636, ack 1, win 321, length 260
20:21:55.911483 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 636:800, ack 1, win 321, length 164
5 packets captured
5.同时也可以在抓包时包含抓包日期:
[[email protected] ~]# tcpdump -nn -tttt -c 5 -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
2015-04-20 20:24:05.624340 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 4241490697:4241490893, ack 2060190717, win 321, length 196
2015-04-20 20:24:05.626165 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 196:392, ack 1, win 321, length 196
2015-04-20 20:24:05.626497 IP 192.168.1.100.51363 > 192.168.1.132.22: Flags [.], ack 392, win 250, length 0
2015-04-20 20:24:05.627070 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 392:668, ack 1, win 321, length 276
2015-04-20 20:24:05.628562 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 668:832, ack 1, win 321, length 164
5 packets captured
在使用-tttt时应注意:
-t 不在每一行中输出时间戳。
-tt 在每一行中输出非格式化的时间戳。
-ttt 输出本行和前面一行之间的时间差。
-tttt 在每一行中输出由date处理的默认格式的时间戳。
6.指定抓包的协议类型:
tcpdump支持指定以下协议:ip,ip6,arp,tcp,udp,wlan等。
[[email protected] ~]# tcpdump -nn tcp -c 5 -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
20:28:51.804033 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 4241496969:4241497165, ack 2060193653, win 321, length 196
20:28:51.805002 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 196:376, ack 1, win 321, length 180
20:28:51.805729 IP 192.168.1.100.51363 > 192.168.1.132.22: Flags [.], ack 376, win 251, length 0
20:28:51.812823 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 376:636, ack 1, win 321, length 260
20:28:51.814461 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 636:800, ack 1, win 321, length 164
5 packets captured
7.指定抓包的端口:
[[email protected] ~]# tcpdump -nn tcp -c 5 -i eth0 port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
20:30:31.359034 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 4241502953:4241503149, ack 2060196549, win 321, length 196
20:30:31.359953 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 196:376, ack 1, win 321, length 180
20:30:31.360207 IP 192.168.1.100.51363 > 192.168.1.132.22: Flags [.], ack 376, win 252, length 0
20:30:31.361648 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 376:636, ack 1, win 321, length 260
20:30:31.363741 IP 192.168.1.132.22 > 192.168.1.100.51363: Flags [P.], seq 636:800, ack 1, win 321, length 164
5 packets captured
8.指定目标IP的数据包:
[[email protected] ~]# tcpdump -nn -c 5 -i eth0 dst 192.168.1.132 and port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
21:11:34.383940 IP 192.168.1.100.51363 > 192.168.1.132.22: Flags [.], ack 4241521353, win 255, length 0
21:11:34.593992 IP 192.168.1.100.51363 > 192.168.1.132.22: Flags [.], ack 149, win 254, length 0
21:11:34.796001 IP 192.168.1.100.51363 > 192.168.1.132.22: Flags [.], ack 297, win 254, length 0
21:11:35.000980 IP 192.168.1.100.51363 > 192.168.1.132.22: Flags [.], ack 445, win 253, length 0
21:11:35.203034 IP 192.168.1.100.51363 > 192.168.1.132.22: Flags [.], ack 593, win 253, length 0
5 packets captured
9.可以将抓到的包写入文件中以及读取包文件:
[[email protected] ~]# tcpdump -nn -c 5 -i eth0 tcp and port 22 -w /tmp/0420.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
5 packets captured
5 packets received by filter
0 packets dropped by kernel
[[email protected] ~]# tcpdump -r /tmp/0420.pcap
reading from file /tmp/0420.pcap, link-type EN10MB (Ethernet)
21:14:25.727939 IP bogon.ssh > bogon.51363: Flags [P.], seq 4241525737:4241525789, ack 2060214305, win 321, length 52
21:14:25.729555 IP bogon.ssh > bogon.51363: Flags [P.], seq 52:168, ack 1, win 321, length 116
21:14:25.729826 IP bogon.51363 > bogon.ssh: Flags [.], ack 168, win 255, length 0
21:14:34.206036 IP bogon.51363 > bogon.ssh: Flags [P.], seq 1:37, ack 168, win 255, length 36
21:14:34.246534 IP bogon.ssh > bogon.51363: Flags [.], ack 37, win 321, length 0
保存为.pcap后缀的文件,方便我们使用wireshark等工具读取分析。
10.综合举例:
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
(2)-i eth1 : 只抓经过接口eth1的包
(3)-t : 不显示时间戳
(4)-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
(5)-c 100 : 只抓取100个数据包
(6)dst port ! 22 : 不抓取目标端口是22的数据包
(7)src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
(8)-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析
二、wireshark的简介及使用:
在Linux下,当我们需要抓取网络数据包分析时,通常是使用tcpdump抓取网络raw数据包存到一个文件,然后下载到本地使用wireshark界面网络分析工具进行网络包分析。
wireshark也提供有Linux命令行工具-tshark。tshark不仅有抓包的功能,还带了解析各种协议的能力。下面我们以两个实例来介绍tshark工具。
安装:yum install -y wireshark
常用命令:
- 显示访问http请求的域名以及uri
tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"
注意:有时若无输出可能是需要指定网卡,具体使用如下:
tshark -i eth0 -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"
2.以抓取mysql的查询
tshark -n -i eth1 -R ‘mysql.query‘ -T fields -e "ip.src" -e "mysql.query"
3.抓取指定类型的MySQL查询
tshark -n -i eth1 -R ‘mysql matches "SELECT|INSERT|DELETE|UPDATE"‘ -T fields -e "ip.src" -e "mysql.query"
4.统计http的状态
tshark -n -q -z http,stat, -z http,tree
这个命令,直到你ctrl + c 才会显示出结果
5.实时打印当前http请求的url(包括域名)
tshark -s 512 -i eth0 -n -f ‘tcp dst port 80‘ -R ‘http.host and http.request.uri‘ -T fields -e http.host -e http.request.uri -l | tr -d ‘\t‘
下面介绍参数含义:
-s 512 :只抓取前512个字节数据
-i eth0 :捕获eth0网卡
-n :禁止网络对象名称解析
-f ‘tcp dst port 80‘ :只捕捉协议为tcp,目的端口为80的数据包
-R ‘http.host and http.request.uri‘ :过滤出http.host和http.request.uri
-T fields -e http.host -e http.request.uri :打印http.host和http.request.uri
-l :输出到标准输出
6.实时打印当前mysql查询语句
tshark -s 512 -i eth0 -n -f ‘tcp dst port 3306‘ -R ‘mysql.query‘ -T fields -e mysql.query
下面介绍参数含义:
-s 512 :只抓取前512个字节数据
-i eth0 :捕获eth0网卡
-n :禁止网络对象名称解析
-f ‘tcp dst port 3306‘ :只捕捉协议为tcp,目的端口为3306的数据包
-R ‘mysql.query‘ :过滤出mysql.query
-T fields -e mysql.query :打印mysql查询语句
以上只是简单的使用抓包工具的命令,若想深挖还需在今后的工作中继续学习!