关于tcpdump命令的详细用法,下面两图分别显示了IP和TCP报文的首部
https://segmentfault.com/a/1190000015044878
1. 抓取 http GET/POST请求:
tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
解析:
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 '
网友评论