tcpdump抓取指定报文

如题所述

第1个回答  2022-07-28
关于tcpdump命令的详细用法,下面两图分别显示了IP和TCP报文的首部

https://segmentfault.com/a/1190000015044878

1. 抓取 http GET/POST请求:

解析:

1) 获取tcp报文头长度:tcp[12:1]&0xf0 >> 2

首先,因为tcp 报文的data-offset(数据偏移)字段长度为4位,我们取 data-offset所在字节,并AND 0xf0取数据偏移位,即 tcp[12:1]&0xf0

其次,因为data-offset字段位于字节高位,帮右移4位后才是真实的数据长度:tcp[12:1]&0xf0 >> 4

最后,因为data-offset字段单位为32位字(1字长为4字节),因此需要将结果乘以4(左移2位),因此得 tcp[12:1]&0xf0 >> 4 << 2,得到最后结果为:tcp[12:1] & 0xf0) >> 2

2) 获取tcp报文内容头4字节:

‘GET ’ = 0x47455420

‘POST’ = 0x504f5354

查ASCII表:

0x47:‘G’

0x45:‘E’

0x54:‘T’

0x20:’空格‘

详细解释请参考此处:https://security.stackexchange.com/questions/121011/wireshark-tcp-filter-tcptcp121-0xf0-24

tcpdump详细用法: https://hackertarget.com/tcpdump-examples/

2. 只抓取有数据的HTTP报文内容

 不抓取 TCP session setup (SYN / FIN / ACK).

tcpdump 'tcp port 80 and(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

1) 从IP报文中获取I报文总长度: ip[2:2]

2) 从IP报文中获取IP报文头长度: (ip[0]&0xf)<<2

3) 从TCP报文中获取TCP报文头长度:(tcp[12]&0xf0)>>2

4) 计算数据包长度:报文总长度-IP报文头长度-TCP报文头长度

5) 获取HTTP数据包长度非空的报文:(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

3. 抓取发包最多的IP地址

tcpdump -nnn -t-c 200| cut -f 1,2,3,4 -d '.' | sort | uniq -c | sort -nr | head -n 20

完整报文内容:

IP 52.231.189.25.20523 > 192.168.1.117.16414: Flags [P.], seq 2274221020:2274221373, ack 4123247268, win 1452, options [nop,nop,TS val 1627996351 ecr 949364960], length 353

1) 选项释意:

-t: 不打印时间

-c:抓200个数据包

2) 切割报文:

cut -f 1,2,3,4 -d '.'  :以'.'为分隔符切割报文,并取 1,2,3,4 段域

3) 排序:sort

4) 计算并打印相同数据出现的次数:uniq -c

5) 以数字倒序排序: sort -nr

6) 取前20条数据:head -n 20

4. 抓所有协议的明文密码:

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 '
相似回答