Tcpdump示例教程(下)——实例
请先查看 Tcpdump示例教程(上)——基础知识
1. 提取HTTP用户代理
从HTTP请求标头中提取HTTP用户代理。
:~$ sudo tcpdump -nn -A -s1500 -l | grep "User-Agent:"
通过使用egrep和多个匹配,我们可以从请求中获取用户代理和主机(或任何其他标头)。
:~$ sudo tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'
2. 仅捕获HTTP GET和POST数据包
深入了解过滤器,我们只能指定与GET匹配的数据包。
:~$ sudo tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
或者,我们只能选择POST请求。请注意,POST数据可能不包含在使用此过滤器捕获的数据包中。POST请求很可能会跨多个TCP数据包进行拆分。
:~$ sudo tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'
在这些表达式中匹配的十六进制匹配GET和POST的ascii。
tcp[((tcp[12:1] & 0xf0) >> 2):4]
,首先确定我们需要的字节位置(在TCP Header 之后),然后选择我们希望匹配的4个字节。
3.提取HTTP请求URL
只需从访问中解析主机和HTTP请求位置即可。通过不针对端口80,我们可以在任何端口上找到这些请求,例如在高端口上运行的HTTP服务。
:~$ sudo tcpdump -s 0 -v -n -l | egrep -i "POST /|GET /|Host:"
tcpdump: listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes
POST /wp-login.php HTTP/1.1
Host: dev.example.com
GET /wp-login.php HTTP/1.1
Host: dev.example.com
GET /favicon.ico HTTP/1.1
Host: dev.example.com
GET / HTTP/1.1
Host: dev.example.com
4. 在POST请求中提取HTTP密码
让我们从POST数据中获取一些密码。将包括Host:和请求位置,以便我们知道密码的用途。
:~$ sudo tcpdump -s 0 -A -n -l | egrep -i "POST /|pwd=|passwd=|password=|Host:"
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:25:54.799014 IP 10.10.1.30.39224 > 10.10.1.125.80: Flags [P.], seq 1458768667:1458770008, ack 2440130792, win 704, options [nop,nop,TS val 461552632 ecr 208900561], length 1341: HTTP: POST /wp-login.php HTTP/1.1
.....s..POST /wp-login.php HTTP/1.1
Host: dev.example.com
.....s..log=admin&pwd=notmypassword&wp-submit=Log+In&redirect_to=http%3A%2F%2Fdev.example.com%2Fwp-admin%2F&testcookie=1
5.从服务器和客户端捕获Cookie
通过搜索Set-Cookie :(来自服务器)和Cookie :(来自客户端)从服务器捕获cookie。
:~$ sudo tcpdump -nn -A -s0 -l | egrep -i 'Set-Cookie|Host:|Cookie:'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp58s0, link-type EN10MB (Ethernet), capture size 262144 bytes
Host: dev.example.com
Cookie: wordpress_86be02xxxxxxxxxxxxxxxxxxxc43=admin%7C152xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxfb3e15c744fdd6; _ga=GA1.2.21343434343421934; _gid=GA1.2.927343434349426; wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_86be654654645645645654645653fc43=admin%7C15275102testtesttesttestab7a61e; wp-settings-time-1=1527337439
6. 捕获所有ICMP数据包
查看ICMP线路上的所有数据包。
:~$ sudo tcpdump -n icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:34:21.590380 IP 10.10.1.217 > 10.10.1.30: ICMP echo request, id 27948, seq 1, length 64
11:34:21.590434 IP 10.10.1.30 > 10.10.1.217: ICMP echo reply, id 27948, seq 1, length 64
11:34:27.680307 IP 10.10.1.159 > 10.10.1.1: ICMP 10.10.1.189 udp port 59619 unreachable, length 115
7. 显示非ECHO/REPLY的ICMP数据包(标准ping)
过滤icmp类型以选择icmp非标准ping的数据包。
:~$ sudo tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes
11:37:04.041037 IP 10.10.1.189 > 10.10.1.20: ICMP 10.10.1.189 udp port 36078 unreachable, length 156
8.捕获SMTP/POP3电子邮件
可以提取电子邮件正文和其他数据,在此示例中,我们仅解析电子邮件收件人。
:~$ sudo tcpdump -nn -l port 25 | grep -i 'MAIL FROM\|RCPT TO'
9. NTP查询和响应故障排除
在此示例中,我们看到了NTP查询和响应。
:~$ sudo tcpdump dst port 123
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
21:02:19.112502 IP test33.ntp > 199.30.140.74.ntp: NTPv4, Client, length 48
21:02:19.113888 IP 216.239.35.0.ntp > test33.ntp: NTPv4, Server, length 48
21:02:20.150347 IP test33.ntp > 216.239.35.0.ntp: NTPv4, Client, length 48
21:02:20.150991 IP 216.239.35.0.ntp > test33.ntp: NTPv4, Server, length 48
10.捕获SNMP查询和响应
使用快速SNMP协议扫描程序onesixtyone
,我们在本地网络上测试SNMP服务并捕获GetRequest
和GetResponse
。对于那些对SNMP进行故障排除的人来说,这是一个很好的方法,可以很好地查看线路上发生的情况。您可以在交通信中中清楚地看到OID
。
:~$ onesixtyone 10.10.1.10 public
Scanning 1 hosts, 1 communities
10.10.1.10 [public] Linux test33 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64
:~$ sudo tcpdump -n -s0 port 161 and udp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp58s0, link-type EN10MB (Ethernet), capture size 262144 bytes
23:39:13.725522 IP 10.10.1.159.36826 > 10.10.1.20.161: GetRequest(28) .1.3.6.1.2.1.1.1.0
23:39:13.728789 IP 10.10.1.20.161 > 10.10.1.159.36826: GetResponse(109) .1.3.6.1.2.1.1.1.0="Linux testmachine 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64"
11.捕获FTP凭据和命令
捕获FTP命令和登录详细信息是直截了当的。在建立认证之后,FTP会话可以是主动的或被动的,这将确定会话的数据部分是通过TCP端口20还是另一个短暂端口进行的。使用以下命令,输出中的USER和PASS(可以输入grep)以及LIST,CWD和PASSIVE等FTP命令。
:~$ sudo tcpdump -nn -v port ftp or ftp-data
12.循环捕获文件
当捕获大量流量或长时间捕获时,自动创建固定大小的新文件会很有帮助。这是使用参数完成的-W
,-G
和-C
。
在此命令中,将每隔(-G)3600秒(1小时)创建文件 capture-(hour).pcap
。第二天将覆盖这些文件。所以你最终应该使用capture-{1-24}.pcap
,如果为15小时,那么新建文件是(/tmp/capture-15.pcap
)。
:~$ tcpdump -w /tmp/capture-%H.pcap -G 3600 -C 200
13.捕获IPv6流量
使用ip6过滤器捕获IPv6流量。在这些示例中,我们使用proto 6
和指定了TCP和UDP协议proto 17
。
tcpdump -nn ip6 proto 6
IPv6使用UDP并从先前保存的捕获文件中读取。
tcpdump -nr ipv6-test.pcap ip6 proto 17
14.检测网络流量中的端口扫描
在以下示例中,您可以看到从单个源到单个目标的流量。可以看到标志[S]和[R],并与看似随机的一系列目标端口进行匹配。当SYN在目标系统上找到一个关闭的端口时,会在RESET中看到这些端口。这是Nmap等工具进行端口扫描的标准行为。
:~$ tcpdump -nn
21:46:19.693601 IP 10.10.1.10.60460 > 10.10.1.199.5432: Flags [S], seq 116466344, win 29200, options [mss 1460,sackOK,TS val 3547090332 ecr 0,nop,wscale 7], length 0
21:46:19.693626 IP 10.10.1.10.35470 > 10.10.1.199.513: Flags [S], seq 3400074709, win 29200, options [mss 1460,sackOK,TS val 3547090332 ecr 0,nop,wscale 7], length 0
21:46:19.693762 IP 10.10.1.10.44244 > 10.10.1.199.389: Flags [S], seq 2214070267, win 29200, options [mss 1460,sackOK,TS val 3547090333 ecr 0,nop,wscale 7], length 0
21:46:19.693772 IP 10.10.1.199.389 > 10.10.1.10.44244: Flags [R.], seq 0, ack 2214070268, win 0, length 0
21:46:19.693783 IP 10.10.1.10.35172 > 10.10.1.199.1433: Flags [S], seq 2358257571, win 29200, options [mss 1460,sackOK,TS val 3547090333 ecr 0,nop,wscale 7], length 0
21:46:19.693826 IP 10.10.1.10.33022 > 10.10.1.199.49153: Flags [S], seq 2406028551, win 29200, options [mss 1460,sackOK,TS val 3547090333 ecr 0,nop,wscale 7], length 0
21:46:19.695567 IP 10.10.1.10.55130 > 10.10.1.199.49154: Flags [S], seq 3230403372, win 29200, options [mss 1460,sackOK,TS val 3547090334 ecr 0,nop,wscale 7], length 0
21:46:19.695590 IP 10.10.1.199.49154 > 10.10.1.10.55130: Flags [R.], seq 0, ack 3230403373, win 0, length 0
21:46:19.695608 IP 10.10.1.10.33460 > 10.10.1.199.49152: Flags [S], seq 3289070068, win 29200, options [mss 1460,sackOK,TS val 3547090335 ecr 0,nop,wscale 7], length 0
21:46:19.695622 IP 10.10.1.199.49152 > 10.10.1.10.33460: Flags [R.], seq 0, ack 3289070069, win 0, length 0
21:46:19.695637 IP 10.10.1.10.34940 > 10.10.1.199.1029: Flags [S], seq 140319147, win 29200, options [mss 1460,sackOK,TS val 3547090335 ecr 0,nop,wscale 7], length 0
21:46:19.695650 IP 10.10.1.199.1029 > 10.10.1.10.34940: Flags [R.], seq 0, ack 140319148, win 0, length 0
21:46:19.695664 IP 10.10.1.10.45648 > 10.10.1.199.5060: Flags [S], seq 2203629201, win 29200, options [mss 1460,sackOK,TS val 3547090335 ecr 0,nop,wscale 7], length 0
21:46:19.695775 IP 10.10.1.10.49028 > 10.10.1.199.2000: Flags [S], seq 635990431, win 29200, options [mss 1460,sackOK,TS val 3547090335 ecr 0,nop,wscale 7], length 0
21:46:19.695790 IP 10.10.1.199.2000 > 10.10.1.10.49028: Flags [R.], seq 0, ack 635990432, win 0, length 0
15.显示Nmap NSE脚本测试的示例过滤器
在此示例中,显示Nmap NSE脚本http-enum.nse针对打开的HTTP服务测试有效URL。
在Nmap机器上:
:~$ nmap -p 80 --script=http-enum.nse targetip
在目标机器上:
:~$ tcpdump -nn port 80 | grep "GET /"
GET /w3perl/ HTTP/1.1
GET /w-agora/ HTTP/1.1
GET /way-board/ HTTP/1.1
GET /web800fo/ HTTP/1.1
GET /webaccess/ HTTP/1.1
GET /webadmin/ HTTP/1.1
GET /webAdmin/ HTTP/1.1
16.捕获每个非本地主机的开始和结束数据包
此示例直接来自tcpdump手册页。通过选择tcp-syn和tcp-fin数据包,我们可以显示每个已建立的带有时间戳但没有数据的TCP对话。与许多过滤器一样,这样可以减少噪音量,从而专注于您关注的信息。
:~$ tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'
17.捕获DNS请求和响应
可以在此捕获中看到对Google公共DNS的出站DNS请求和A记录(IP地址)响应。
:~$ sudo tcpdump -i wlp58s0 -s0 port 53
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlp58s0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:19:06.879799 IP test.53852 > google-public-dns-a.google.com.domain: 26977+ [1au] A? play.google.com. (44)
14:19:07.022618 IP google-public-dns-a.google.com.domain > test.53852: 26977 1/0/1 A 216.58.203.110 (60)
18.捕获HTTP数据包
仅捕获端口80上的HTTP数据包。避免捕获TCP会话设置(SYN / FIN / ACK)。
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
19.使用tcpdump捕获并在Wireshark中查看
解析和分析完整的应用程序流(如HTTP)比使用Wireshark(或tshark)更容易执行而不是tcpdump。使用tcpdumpwrite file选项捕获远程系统上的流量通常更实用。然后将其复制pcap到本地工作站以使用Wireshark进行分析。
除了手动将文件从远程系统移动到本地工作站之外,还可以通过SSH连接实时将捕获提供给Wireshark。这个技巧是最受欢迎的,将原始tcpdump输出直接输入wireshark到本地计算机上。不要忘记,not port 22所以你没有捕获你的SSH流量。
:~$ ssh root@remotesystem 'tcpdump -s0 -c 1000 -nn -w - not port 22' | wireshark -k -i -
另一个提示是使用-c遥控器上的计数tcpdump来允许捕获完成,否则击中ctrl-c不仅会杀死tcpdump而且还会使Wireshark和你的捕获。
20.数据包的热门主机
列出一段时间或数量的数据包的顶级谈话者。使用简单的命令行字段提取来获取IP地址,对事件进行排序和计数。捕获受计数选项的限制-c。
sudo tcpdump -nnn -t -c 200 | cut -f 1,2,3,4 -d '.' | sort | uniq -c | sort -nr | head -n 20
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes
200 packets captured
261 packets received by filter
0 packets dropped by kernel
108 IP 10.10.211.181
91 IP 10.10.1.30
1 IP 10.10.1.50
21.捕获所有明文密码
在这个命令中,我们专注于标准的纯文本协议,并选择与任何用户或密码相关的grep。通过选择目标的-B5选项grep是获得前面的5行,这些行可以提供围绕捕获的密码(主机名,IP地址,系统)的上下文。
:~$ sudo tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -l -A | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user '
22. DHCP示例
我们的最后一个tcpdump例子是监控DHCP请求和回复。在端口67上看到DHCP请求,并且回复在68上。使用verbose参数,-v我们可以看到协议选项和其他详细信息。
:~$ sudo tcpdump -v -n port 67 or 68
tcpdump: listening on enp7s0, link-type EN10MB (Ethernet), capture size 262144 bytes
14:37:50.059662 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:0c:xx:xx:xx:d5, length 300, xid 0xc9779c2a, Flags [none]
Client-Ethernet-Address 00:0c:xx:xx:xx:d5
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Request
Requested-IP Option 50, length 4: 10.10.1.163
Hostname Option 12, length 14: "test-ubuntu"
Parameter-Request Option 55, length 16:
Subnet-Mask, BR, Time-Zone, Default-Gateway
Domain-Name, Domain-Name-Server, Option 119, Hostname
Netbios-Name-Server, Netbios-Scope, MTU, Classless-Static-Route
NTP, Classless-Static-Route-Microsoft, Static-Route, Option 252
14:37:50.059667 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:0c:xx:xx:xx:d5, length 300, xid 0xc9779c2a, Flags [none]
Client-Ethernet-Address 00:0c:xx:xx:xx:d5
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Request
Requested-IP Option 50, length 4: 10.10.1.163
Hostname Option 12, length 14: "test-ubuntu"
Parameter-Request Option 55, length 16:
Subnet-Mask, BR, Time-Zone, Default-Gateway
Domain-Name, Domain-Name-Server, Option 119, Hostname
Netbios-Name-Server, Netbios-Scope, MTU, Classless-Static-Route
NTP, Classless-Static-Route-Microsoft, Static-Route, Option 252
14:37:50.060780 IP (tos 0x0, ttl 64, id 53564, offset 0, flags [none], proto UDP (17), length 339)
10.10.1.1.67 > 10.10.1.163.68: BOOTP/DHCP, Reply, length 311, xid 0xc9779c2a, Flags [none]
Your-IP 10.10.1.163
Server-IP 10.10.1.1
Client-Ethernet-Address 00:0c:xx:xx:xx:d5
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: ACK
Server-ID Option 54, length 4: 10.10.1.1
Lease-Time Option 51, length 4: 86400
RN Option 58, length 4: 43200
RB Option 59, length 4: 75600
Subnet-Mask Option 1, length 4: 255.255.255.0
BR Option 28, length 4: 10.10.1.255
Domain-Name-Server Option 6, length 4: 10.10.1.1
Hostname Option 12, length 14: "test-ubuntu"
T252 Option 252, length 1: 10
Default-Gateway Option 3, length 4: 10.10.1.1
总结
这些tcpdump示例,提示和命令旨在让您对可能性有基本的了解。根据您要实现的目标,有许多方法可以更深入或组合不同的捕获过滤器以满足您的要求。
结合tcpdumpWireshark是一个强大的组合,特别是当您希望深入了解完整的应用层会话时,因为解码器可以组装完整的流。我们最近对Wireshark教程进行了重大更新。