tcpdump 是一款強(qiáng)大的網(wǎng)絡(luò)抓包工具,它使用 libpcap 庫(kù)來(lái)抓取網(wǎng)絡(luò)數(shù)據(jù)包,這個(gè)庫(kù)在幾乎在所有的 Linux/Unix 中都有。熟悉 tcpdump 的使用能夠幫助你分析調(diào)試網(wǎng)絡(luò)數(shù)據(jù),本文將通過(guò)一個(gè)個(gè)具體的示例來(lái)介紹它在不同場(chǎng)景下的使用方法。不管你是系統(tǒng)管理員,程序員,云原生工程師還是 yaml 工程師,掌握 tcpdump 的使用都能讓你如虎添翼,升職加薪。
1. 基本語(yǔ)法和使用方法
tcpdump 的常用參數(shù)如下:
$ tcpdump -i eth0 -nn -s0 -v port 80復(fù)制代碼
-i : 選擇要捕獲的接口,通常是以太網(wǎng)卡或無(wú)線網(wǎng)卡,也可以是 vlan 或其他特殊接口。如果該系統(tǒng)上只有一個(gè)網(wǎng)絡(luò)接口,則無(wú)需指定。
-nn : 單個(gè) n 表示不解析域名,直接顯示 IP;兩個(gè) n 表示不解析域名和端口。這樣不僅方便查看 IP 和端口號(hào),而且在抓取大量數(shù)據(jù)時(shí)非常高效,因?yàn)橛蛎馕鰰?huì)降低抓取速度。
-s0 : tcpdump 默認(rèn)只會(huì)截取前 96 字節(jié)的內(nèi)容,要想截取所有的報(bào)文內(nèi)容,可以使用 -s number, number 就是你要截取的報(bào)文字節(jié)數(shù),如果是 0 的話,表示截取報(bào)文全部?jī)?nèi)容。
-v : 使用 -v,-vv 和 -vvv 來(lái)顯示更多的詳細(xì)信息,通常會(huì)顯示更多與特定協(xié)議相關(guān)的信息。
port 80 : 這是一個(gè)常見的端口過(guò)濾器,表示僅抓取 80 端口上的流量,通常是 HTTP。
額外再介紹幾個(gè)常用參數(shù):
-p : 不讓網(wǎng)絡(luò)接口進(jìn)入混雜模式。默認(rèn)情況下使用 tcpdump 抓包時(shí),會(huì)讓網(wǎng)絡(luò)接口進(jìn)入混雜模式。一般計(jì)算機(jī)網(wǎng)卡都工作在非混雜模式下,此時(shí)網(wǎng)卡只接受來(lái)自網(wǎng)絡(luò)端口的目的地址指向自己的數(shù)據(jù)。當(dāng)網(wǎng)卡工作在混雜模式下時(shí),網(wǎng)卡將來(lái)自接口的所有數(shù)據(jù)都捕獲并交給相應(yīng)的驅(qū)動(dòng)程序。如果設(shè)備接入的交換機(jī)開啟了混雜模式,使用 -p 選項(xiàng)可以有效地過(guò)濾噪聲。
-e : 顯示數(shù)據(jù)鏈路層信息。默認(rèn)情況下 tcpdump 不會(huì)顯示數(shù)據(jù)鏈路層信息,使用 -e 選項(xiàng)可以顯示源和目的 MAC 地址,以及 VLAN tag 信息。例如:
$ tcpdump -n -e -c 5 not ip6
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on br-lan, link-type EN10MB (Ethernet), capture size 262144 bytes
18:27:53.619865 24:5e:be:0c:17:af > 00:e2:69:23:d3:3b, ethertype IPv4 (0x0800), length 1162: 192.168.100.20.51410 > 180.176.26.193.58695: Flags [.], seq 2045333376:2045334484, ack 3398690514, win 751, length 1108
18:27:53.626490 00:e2:69:23:d3:3b > 24:5e:be:0c:17:af, ethertype IPv4 (0x0800), length 68: 220.173.179.66.36017 > 192.168.100.20.51410: UDP, length 26
18:27:53.626893 24:5e:be:0c:17:af > 00:e2:69:23:d3:3b, ethertype IPv4 (0x0800), length 1444: 192.168.100.20.51410 > 220.173.179.66.36017: UDP, length 1402
18:27:53.628837 00:e2:69:23:d3:3b > 24:5e:be:0c:17:af, ethertype IPv4 (0x0800), length 1324: 46.97.169.182.6881 > 192.168.100.20.59145: Flags [P.], seq 3058450381:3058451651, ack 14349180, win 502, length 1270
18:27:53.629096 24:5e:be:0c:17:af > 00:e2:69:23:d3:3b, ethertype IPv4 (0x0800), length 54: 192.168.100.20.59145 > 192.168.100.1.12345: Flags [.], ack 3058451651, win 6350, length 0
5 packets captured復(fù)制代碼
顯示 ASCII 字符串
-A 表示使用 ASCII 字符串打印報(bào)文的全部數(shù)據(jù),這樣可以使讀取更加簡(jiǎn)單,方便使用 grep 等工具解析輸出內(nèi)容。-X 表示同時(shí)使用十六進(jìn)制和 ASCII 字符串打印報(bào)文的全部數(shù)據(jù)。這兩個(gè)參數(shù)不能一起使用。例如:
$ tcpdump -A -s0 port 80復(fù)制代碼
抓取特定協(xié)議的數(shù)據(jù)
后面可以跟上協(xié)議名稱來(lái)過(guò)濾特定協(xié)議的流量,以 UDP 為例,可以加上參數(shù) udp 或 protocol 17,這兩個(gè)命令意思相同。
$ tcpdump -i eth0 udp
$ tcpdump -i eth0 proto 17復(fù)制代碼
同理,tcp 與 protocol 6 意思相同。
抓取特定主機(jī)的數(shù)據(jù)
使用過(guò)濾器 host 可以抓取特定目的地和源 IP 地址的流量。
$ tcpdump -i eth0 host 10.10.1.1復(fù)制代碼
也可以使用 src 或 dst 只抓取源或目的地:
$ tcpdump -i eth0 dst 10.10.1.20復(fù)制代碼
將抓取的數(shù)據(jù)寫入文件
使用 tcpdump 截取數(shù)據(jù)報(bào)文的時(shí)候,默認(rèn)會(huì)打印到屏幕的默認(rèn)輸出,你會(huì)看到按照順序和格式,很多的數(shù)據(jù)一行行快速閃過(guò),根本來(lái)不及看清楚所有的內(nèi)容。不過(guò),tcpdump 提供了把截取的數(shù)據(jù)保存到文件的功能,以便后面使用其他圖形工具(比如 wireshark,Snort)來(lái)分析。
-w 選項(xiàng)用來(lái)把數(shù)據(jù)報(bào)文輸出到文件:
$ tcpdump -i eth0 -s0 -w test.pcap復(fù)制代碼
行緩沖模式
如果想實(shí)時(shí)將抓取到的數(shù)據(jù)通過(guò)管道傳遞給其他工具來(lái)處理,需要使用 -l 選項(xiàng)來(lái)開啟行緩沖模式(或使用 -c 選項(xiàng)來(lái)開啟數(shù)據(jù)包緩沖模式)。使用 -l 選項(xiàng)可以將輸出通過(guò)立即發(fā)送給其他命令,其他命令會(huì)立即響應(yīng)。
$ tcpdump -i eth0 -s0 -l port 80 | grep 'Server:'復(fù)制代碼
組合過(guò)濾器
過(guò)濾的真正強(qiáng)大之處在于你可以隨意組合它們,而連接它們的邏輯就是常用的 與/AND/&& 、 或/OR/|| 和 非/not/!。
and or &&
or or ||
not or !復(fù)制代碼
2. 過(guò)濾器
關(guān)于 tcpdump 的過(guò)濾器,這里有必要單獨(dú)介紹一下。
機(jī)器上的網(wǎng)絡(luò)報(bào)文數(shù)量異常的多,很多時(shí)候我們只關(guān)系和具體問(wèn)題有關(guān)的數(shù)據(jù)報(bào)(比如訪問(wèn)某個(gè)網(wǎng)站的數(shù)據(jù),或者 icmp 超時(shí)的報(bào)文等等),而這些數(shù)據(jù)只占到很小的一部分。把所有的數(shù)據(jù)截取下來(lái),從里面找到想要的信息無(wú)疑是一件很費(fèi)時(shí)費(fèi)力的工作。而 tcpdump 提供了靈活的語(yǔ)法可以精確地截取關(guān)心的數(shù)據(jù)報(bào),簡(jiǎn)化分析的工作量。這些選擇數(shù)據(jù)包的語(yǔ)句就是過(guò)濾器(filter)!
Host 過(guò)濾器
Host 過(guò)濾器用來(lái)過(guò)濾某個(gè)主機(jī)的數(shù)據(jù)報(bào)文。例如:
$ tcpdump host 1.2.3.4復(fù)制代碼
該命令會(huì)抓取所有發(fā)往主機(jī) 1.2.3.4 或者從主機(jī) 1.2.3.4 發(fā)出的流量。如果想只抓取從該主機(jī)發(fā)出的流量,可以使用下面的命令:
$ tcpdump src host 1.2.3.4復(fù)制代碼
Network 過(guò)濾器
Network 過(guò)濾器用來(lái)過(guò)濾某個(gè)網(wǎng)段的數(shù)據(jù),使用的是 CIDR 模式?梢允褂盟脑M(x.x.x.x)、三元組(x.x.x)、二元組(x.x)和一元組(x)。四元組就是指定某個(gè)主機(jī),三元組表示子網(wǎng)掩碼為 255.255.255.0,二元組表示子網(wǎng)掩碼為 255.255.0.0,一元組表示子網(wǎng)掩碼為 255.0.0.0。例如,
抓取所有發(fā)往網(wǎng)段 192.168.1.x 或從網(wǎng)段 192.168.1.x 發(fā)出的流量:
$ tcpdump net 192.168.1復(fù)制代碼
抓取所有發(fā)往網(wǎng)段 10.x.x.x 或從網(wǎng)段 10.x.x.x 發(fā)出的流量:
$ tcpdump net 10復(fù)制代碼
和 Host 過(guò)濾器一樣,這里也可以指定源和目的:
$ tcpdump src net 10復(fù)制代碼
也可以使用 CIDR 格式:
$ tcpdump src net 172.16.0.0/12復(fù)制代碼
Proto 過(guò)濾器
Proto 過(guò)濾器用來(lái)過(guò)濾某個(gè)協(xié)議的數(shù)據(jù),關(guān)鍵字為 proto,可省略。proto 后面可以跟上協(xié)議號(hào)或協(xié)議名稱,支持 icmp, igmp, igrp, pim, ah, esp, carp, vrrp, udp和 tcp。因?yàn)橥ǔ5膮f(xié)議名稱是保留字段,所以在于 proto 指令一起使用時(shí),必須根據(jù) shell 類型使用一個(gè)或兩個(gè)反斜杠(/)來(lái)轉(zhuǎn)義。Linux 中的 shell 需要使用兩個(gè)反斜杠來(lái)轉(zhuǎn)義,MacOS 只需要一個(gè)。
例如,抓取 icmp 協(xié)議的報(bào)文:
$ tcpdump -n proto \\icmp
# 或者
$ tcpdump -n icmp復(fù)制代碼
Port 過(guò)濾器
Port 過(guò)濾器用來(lái)過(guò)濾通過(guò)某個(gè)端口的數(shù)據(jù)報(bào)文,關(guān)鍵字為 port。例如:
$ tcpdump port 389復(fù)制代碼
3. 理解 tcpdump 的輸出
截取數(shù)據(jù)只是第一步,第二步就是理解這些數(shù)據(jù),下面就解釋一下 tcpdump 命令輸出各部分的意義。
21:27:06.995846 IP (tos 0x0, ttl 64, id 45646, offset 0, flags [DF], proto TCP (6), length 64)
192.168.1.106.56166 > 124.192.132.54.80: Flags [S], cksum 0xa730 (correct), seq 992042666, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 663433143 ecr 0,sackOK,eol], length 0
21:27:07.030487 IP (tos 0x0, ttl 51, id 0, offset 0, flags [DF], proto TCP (6), length 44)
124.192.132.54.80 > 192.168.1.106.56166: Flags [S.], cksum 0xedc0 (correct), seq 2147006684, ack 992042667, win 14600, options [mss 1440], length 0
21:27:07.030527 IP (tos 0x0, ttl 64, id 59119, offset 0, flags [DF], proto TCP (6), length 40)
192.168.1.106.56166 > 124.192.132.54.80: Flags [.], cksum 0x3e72 (correct), ack 2147006685, win 65535, length 0復(fù)制代碼
最基本也是最重要的信息就是數(shù)據(jù)報(bào)的源地址/端口和目的地址/端口,上面的例子第一條數(shù)據(jù)報(bào)中,源地址 ip 是 192.168.1.106,源端口是 56166,目的地址是 124.192.132.54,目的端口是 80。 > 符號(hào)代表數(shù)據(jù)的方向。
此外,上面的三條數(shù)據(jù)還是 tcp 協(xié)議的三次握手過(guò)程,第一條就是 SYN 報(bào)文,這個(gè)可以通過(guò) Flags [S] 看出。下面是常見的 TCP 報(bào)文的 Flags:
[S] : SYN(開始連接)
[.] : 沒(méi)有 Flag
[P] : PSH(推送數(shù)據(jù))
[F] : FIN (結(jié)束連接)
[R] : RST(重置連接)
而第二條數(shù)據(jù)的 [S.] 表示 SYN-ACK,就是 SYN 報(bào)文的應(yīng)答報(bào)文。
4. 例子
下面給出一些具體的例子,每個(gè)例子都可以使用多種方法來(lái)獲得相同的輸出,你使用的方法取決于所需的輸出和網(wǎng)絡(luò)上的流量。我們?cè)谂耪蠒r(shí),通常只想獲取自己想要的內(nèi)容,可以通過(guò)過(guò)濾器和 ASCII 輸出并結(jié)合管道與 grep、cut、awk 等工具來(lái)實(shí)現(xiàn)此目的。
例如,在抓取 HTTP 請(qǐng)求和響應(yīng)數(shù)據(jù)包時(shí),可以通過(guò)刪除標(biāo)志 SYN/ACK/FIN 來(lái)過(guò)濾噪聲,但還有更簡(jiǎn)單的方法,那就是通過(guò)管道傳遞給 grep。在達(dá)到目的的同時(shí),我們要選擇最簡(jiǎn)單最高效的方法。下面來(lái)看例子。
提取 HTTP 用戶代理
從 HTTP 請(qǐng)求頭中提取 HTTP 用戶代理:
$ tcpdump -nn -A -s1500 -l | grep "User-Agent:"復(fù)制代碼
通過(guò) egrep 可以同時(shí)提取用戶代理和主機(jī)名(或其他頭文件):
$ tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'復(fù)制代碼
只抓取 HTTP GET 和 POST 流量
抓取 HTTP GET 流量:
$ tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'復(fù)制代碼
也可以抓取 HTTP POST 請(qǐng)求流量:
$ tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'復(fù)制代碼
注意:該方法不能保證抓取到 HTTP POST 有效數(shù)據(jù)流量,因?yàn)橐粋(gè) POST 請(qǐng)求會(huì)被分割為多個(gè) TCP 數(shù)據(jù)包。
上述兩個(gè)表達(dá)式中的十六進(jìn)制將會(huì)與 GET 和 POST 請(qǐng)求的 ASCII 字符串匹配。例如,tcp[((tcp[12:1] & 0xf0) >> 2):4] 首先會(huì)確定我們感興趣的字節(jié)的位置(在 TCP header 之后),然后選擇我們希望匹配的 4 個(gè)字節(jié)。
提取 HTTP 請(qǐng)求的 URL
提取 HTTP 請(qǐng)求的主機(jī)名和路徑:
$ 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復(fù)制代碼
提取 HTTP POST 請(qǐng)求中的密碼
從 HTTP POST 請(qǐng)求中提取密碼和主機(jī)名:
$ 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復(fù)制代碼
提取 Cookies
提取 Set-Cookie(服務(wù)端的 Cookie)和 Cookie(客戶端的 Cookie):
$ 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復(fù)制代碼
抓取 ICMP 數(shù)據(jù)包
查看網(wǎng)絡(luò)上的所有 ICMP 數(shù)據(jù)包:
$ 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復(fù)制代碼
抓取非 ECHO/REPLY 類型的 ICMP 數(shù)據(jù)包
通過(guò)排除 echo 和 reply 類型的數(shù)據(jù)包使抓取到的數(shù)據(jù)包不包括標(biāo)準(zhǔn)的 ping 包:
$ 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復(fù)制代碼
抓取 SMTP/POP3 協(xié)議的郵件
可以提取電子郵件的正文和其他數(shù)據(jù)。例如,只提取電子郵件的收件人:
$ tcpdump -nn -l port 25 | grep -i 'MAIL FROM\|RCPT TO'復(fù)制代碼
抓取 NTP 服務(wù)的查詢和響應(yīng)
$ 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復(fù)制代碼
抓取 SNMP 服務(wù)的查詢和響應(yīng)
通過(guò) SNMP 服務(wù),滲透測(cè)試人員可以獲取大量的設(shè)備和系統(tǒng)信息。在這些信息中,系統(tǒng)信息最為關(guān)鍵,如操作系統(tǒng)版本、內(nèi)核版本等。使用 SNMP 協(xié)議快速掃描程序 onesixtyone,可以看到目標(biāo)系統(tǒng)的信息:
$ 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復(fù)制代碼
可以通過(guò) tcpdump 抓取 GetRequest 和 GetResponse:
$ 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"復(fù)制代碼
切割 pcap 文件
當(dāng)抓取大量數(shù)據(jù)并寫入文件時(shí),可以自動(dòng)切割為多個(gè)大小相同的文件。例如,下面的命令表示每 3600 秒創(chuàng)建一個(gè)新文件 capture-(hour).pcap,每個(gè)文件大小不超過(guò) 200*1000000 字節(jié):
$ tcpdump -w /tmp/capture-%H.pcap -G 3600 -C 200復(fù)制代碼
這些文件的命名為 capture-{1-24}.pcap,24 小時(shí)之后,之前的文件就會(huì)被覆蓋。
抓取 IPv6 流量
可以通過(guò)過(guò)濾器 ip6 來(lái)抓取 IPv6 流量,同時(shí)可以指定協(xié)議如 TCP:
$ tcpdump -nn ip6 proto 6復(fù)制代碼
從之前保存的文件中讀取 IPv6 UDP 數(shù)據(jù)報(bào)文:
$ tcpdump -nr ipv6-test.pcap ip6 proto 17復(fù)制代碼
檢測(cè)端口掃描
在下面的例子中,你會(huì)發(fā)現(xiàn)抓取到的報(bào)文的源和目的一直不變,且?guī)в袠?biāo)志位 [S] 和 [R],它們與一系列看似隨機(jī)的目標(biāo)端口進(jìn)行匹配。當(dāng)發(fā)送 SYN 之后,如果目標(biāo)主機(jī)的端口沒(méi)有打開,就會(huì)返回一個(gè) RESET。這是 Nmap 等端口掃描工具的標(biāo)準(zhǔn)做法。
$ 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復(fù)制代碼
過(guò)濾 Nmap NSE 腳本測(cè)試結(jié)果
本例中 Nmap NSE 測(cè)試腳本 http-enum.nse 用來(lái)檢測(cè) HTTP 服務(wù)的合法 URL。
在執(zhí)行腳本測(cè)試的主機(jī)上:
$ nmap -p 80 --script=http-enum.nse targetip復(fù)制代碼
在目標(biāo)主機(jī)上:
$ 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復(fù)制代碼
抓取 DNS 請(qǐng)求和響應(yīng)
向 Google 公共 DNS 發(fā)起的出站 DNS 請(qǐng)求和 A 記錄響應(yīng)可以通過(guò) tcpdump 抓取到:
$ 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)復(fù)制代碼
抓取 HTTP 有效數(shù)據(jù)包
抓取 80 端口的 HTTP 有效數(shù)據(jù)包,排除 TCP 連接建立過(guò)程的數(shù)據(jù)包(SYN / FIN / ACK):
$ tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'復(fù)制代碼
將輸出內(nèi)容重定向到 Wireshark
通常 Wireshark(或 tshark)比 tcpdump 更容易分析應(yīng)用層協(xié)議。一般的做法是在遠(yuǎn)程服務(wù)器上先使用 tcpdump 抓取數(shù)據(jù)并寫入文件,然后再將文件拷貝到本地工作站上用 Wireshark 分析。
還有一種更高效的方法,可以通過(guò) ssh 連接將抓取到的數(shù)據(jù)實(shí)時(shí)發(fā)送給 Wireshark 進(jìn)行分析。以 MacOS 系統(tǒng)為例,可以通過(guò) brew cask install wireshark 來(lái)安裝,然后通過(guò)下面的命令來(lái)分析:
$ ssh root@remotesystem 'tcpdump -s0 -c 1000 -nn -w - not port 22' | /Applications/Wireshark.app/Contents/MacOS/Wireshark -k -i -復(fù)制代碼
例如,如果想分析 DNS 協(xié)議,可以使用下面的命令:
$ ssh root@remotesystem 'tcpdump -s0 -c 1000 -nn -w - port 53' | /Applications/Wireshark.app/Contents/MacOS/Wireshark -k -i -復(fù)制代碼
抓取到的數(shù)據(jù):
-c 選項(xiàng)用來(lái)限制抓取數(shù)據(jù)的大小。如果不限制大小,就只能通過(guò) ctrl-c 來(lái)停止抓取,這樣一來(lái)不僅關(guān)閉了 tcpdump,也關(guān)閉了 wireshark。
找出發(fā)包最多的 IP
找出一段時(shí)間內(nèi)發(fā)包最多的 IP,或者從一堆報(bào)文中找出發(fā)包最多的 IP,可以使用下面的命令:
$ 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復(fù)制代碼
cut -f 1,2,3,4 -d '.' : 以 . 為分隔符,打印出每行的前四列。即 IP 地址。
sort | uniq -c : 排序并計(jì)數(shù)
sort -nr : 按照數(shù)值大小逆向排序
抓取用戶名和密碼
本例將重點(diǎn)放在標(biāo)準(zhǔn)純文本協(xié)議上,過(guò)濾出于用戶名和密碼相關(guān)的報(bào)文:
$ 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 '復(fù)制代碼
抓取 DHCP 報(bào)文
最后一個(gè)例子,抓取 DHCP 服務(wù)的請(qǐng)求和響應(yīng)報(bào)文,67 為 DHCP 端口,68 為客戶機(jī)端口。
$ 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復(fù)制代碼
5. 總結(jié)
本文主要介紹了 tcpdump 的基本語(yǔ)法和使用方法,并通過(guò)一些示例來(lái)展示它強(qiáng)大的過(guò)濾功能。將 tcpdump 與 wireshark 進(jìn)行組合可以發(fā)揮更強(qiáng)大的功效,本文也展示了如何優(yōu)雅順滑地結(jié)合 tcpdump 和 wireshark。如果你想了解更多的細(xì)節(jié),可以查看 tcpdump 的 man 手冊(cè)。