tcpdump抓包实战分享

网络抓包,是运维工程师很一项重要,也需要的技能。但实现生活中却少有运维工程师能掌握。因为一来学习比较难,二来工作中用得少,一段时间没用就忘光光了~~

但是这个技能可以大大减少运维人员背锅的机率。有好几次,开发都说我:我的代码没问题,是请求没有进来; 或是说网络有问题;或者说是你负载均衡转发时把参数搞丢了;等*4。最后都被我用抓包技能成功反杀。也就是说在实际工作中遇到某些问题,它是可以做为解决问题的一种手段!
我相信,应该有些朋友在遇到问题时,也想过要抓包,但是却不知道从哪里入手好,希望听过这个分享后,能帮你形成一个思路。

至于抓包的工具,在windows平台下,一般我用wireshark,这个工具很叼的,抓了包后还能帮你把数据包整理得一清二楚,GUI界面的用起来也比较方便。而linux下的一般用的是tcpdump,这个工具也是非常叼的,不过它是个命令行工具,用起来可不是一般地难,但是做为运维工程师,面对最多的系统就是linux了。所以今天的分享,不难的就算了,要讲就讲点有难度的。所以这次分享用的就是tcpdump。又因为是实战性的分享,所以就没有那么多的文字材料可以给大家,不过分享之后,我回头会做个总结性的东西放共享里,方便大家记忆。目前群空间里有两个本次分享要用到的图片,可以先下载一来。一边听一边看最好了。

然后我会以http流量为示例进行抓包讲解,因为在实际工作环境下,需要用到抓包分析的,十有八九是http流量。了解所以然后,其实其他类型的流量均是换汤不换药的。

OK。用tcpdump抓包,有两个东西要先学。一个是工作参数(废话),另一个是BPF(全称Berkeley Packet Filter 伯克利封包过滤器,没错,就是著名的加州大学伯克利分校,创造的一种专门过滤网络数据包的过滤语言)

参数多的不讲,讲几个实用的。大家记住就好。

  • -X:很重要:以16进制和ASCII码显示包数据。现场分析数据包内容必备
  • -nnn:比较重要:让tcpdump不要把IP地址转化为网络名称,不要把端口显示为服务名

  • -s0:一般重要:抓包最好带上,-s指定数据包截断的长度,0表示不截断,tcpdump默认截断68字节

  • -i :一般重要 :指定要抓包的网络接口,eth0/eth1/wlan0/lo等等,BPF明明没写错,就是抓不到包,就要注意一下这里是不是写错了。还有,强调一点127.0.0.1是属于lo环回接口

  • -w:记得就好:保存到文件里,可以后期结合wireshark来分析。屏幕不会输出。

  • -c:记得就好:-c 10 抓满10个包就退出

(这时可以现场演示一下各个参数)

BPF:

讲BPF包过滤语言前,大家先了解一下网络五元组是什么。源IP地址,目的IP地址,源端口,目的端口,协议 这五个。网络请求的发起方(源),用一个随机端口去连接远端计算机一个具体的端口,远端计算机响应此请求时,会把源IP端口和目的IP端口反过来,把响应报文发回去。

有几点要先让大家记得的:

  • BPF支持加减乘除,包括移位运算
  • BPF支持and(&&) or(||) not(!)逻辑运算
  • BPF可以用括号等改变运算顺序
  • 使用时请用单引号包起来防止shell误读

OK。进入正式BPF内容:

请住以下三段中的单词或字母:

一,tcp(tcp协议) udp(udp协议) icmp(icmp协议,就是ping用的)
二,src(源source缩写) dst(目的destination缩写)
三,host(主机IP/网络名) port(端口) portrange(端口范围) net(网段)

这三段可以自由组合,但是要注意,
一是协议类型放在第一位置。二是icmp协议没有端口一说。
比如tcp src host 192.168.0.1 ,表示源IP地址为192.168.0.1的TCP数据包
udp dst port 53,表示发到远端服务器53端口(目的端口为53)的udp数据包
icmp src 192.168.1.0/24,表示来自(源地址)为192.168.1.0网段(192.168.1.0~192.168.1.255)的ICMP数据包

加上逻辑判断的:

  • tcp dst port 80 and dst host 192.168.0.100 目的IP为192.168.0.100,目的端口为80的TCP数据包
  • dst host 192.168.0.100 and ! udp port 53 目的IP为192.168.0.100,但不是udp53端口的所有数据包

OK。到这里,其实就可以满足大部分工作需求了。
今天就讲到这里的话,那也太LOW了~~~

接下来是BPF的高级部分,一定要认真听了。

因为IP包头的东西比较简单,上面讲的东西会用了,也没IP包头什么事了。难点重点在于TCP报文,因为TCP报文是带了数据的,TCP头之后就是数据的开始。要玩高端的抓包,就是要针对TCP头或是数据内容进行抓包,比如只抓握手包,只抓POST提交的包,比如只抓某个URL的包,特别后面两个,直接从四层捕获七层的内容,很爽吧!所以大家一定要打开TCP数据包分解图,一边听我讲,一边看。

有些群友是不是一看这个图头都大了?

不过我们不是网工,我们不用去记那么多东西的。让我们来过滤过滤
首先橙色和浅蓝色的两段number不用看它,蓝色的window size,绿色的tcp checksum跟它旁边的紫色不用看它。现在剩下三段半的东西而已。

现在大家看到的都是是计算机基础知识。图中的一段长度是32bit,就是32比特,比特是计算机最小的基础单位了。每个比特就只能表示0或者1,8个比特表示一字节。就是图中黑格白格的那些,每格表示一个字节。一段就是4个字节。一个字符占用一个字节,所以每一段32比特的长度只能表示4个字符。

先看第一段的源端口和目的端口,各占16个比特的长度,16比特范围能表示多大呢,也就是二进制的0000000000000000到1111111111111111,打开你们电脑的科学计算器,二进制16个1转为10进制是多少?65535啊亲,这就是为什么系统的端口最大只能是65535的原因。

红白黄一会再聊,看白色的option,这个是可变长的选项字段,长度从0到40字节,且必须是4字节的整倍数,直白点就是要加就是一段一段加。
最后我们第七层应用层的数据就跟在option后面以ascii码的形式出现了。所以要找到数据位置,就得先确定tcp头部长度,但是option长度是可变的,那要怎么得知位置呢?

这里就要靠上面的红格子啦。我先直接给你们bpf,再解释为什么。

tcp[12] >> 2

在tcpdump里。tcp[12]表示tcp报文中的第12个字节,看图,第12字节就是红白格子。事实上,有用的只有红色格子,它只占4比特,半个字节。白色格子是预留的空位,不起作用的,恒定为0.

看回tcp[12] >> 2,这里是将12字节的值做右移位处理,这里其实是做了数字上的简化,原操作应该是这样的
( tcp[12] >> 4 ) << 2,先做4位右移,再做2位左移,用乘除的方式表达就是( tcp[12] / 16 ) × 4
为什么要这么计算,因为红格子里面记录的是TCP报名头的长度,是一个偏移量,单位为4字节(1段),所以我们用长度×4,就能计数出整个个TCP头的字节了。那么除以16又是什么鬼?我们来看一下数据包例子。包的tcp[12]是整个字节,例子中是80(注意:这是十六进制)。刚才说了,有用的红色格子只占了半个字节,也就是只有前面的8是要用到的,0是无用的。
在10进制里,要把一个整数最后的0去掉,是做除法,除以10,在十六进制里也是做除法,不过是除以16。

所以简化一下就是tcp[12] / 4,正好是右移2位(也是因为计算机做移位操作比除法快,所以换成移位操作)

确定TCP头长度后,后面的就是数据了。那我们现在就开始针对数据内容来抓包。

我们先来抓POST请求的包。

让我们先来看一下HTTP协议是怎么做HTTP请求的。
http请求由三部分组成,分别是:请求行、消息报头、请求正文

POST /index.html HTTP/1.1
Host: www.xxx.com
Content-Length:22
Connection:Keep-Alive
Cache-Control:no-cache

user=jeffrey&pwd=1234

POST这几个字符正好是出现在数据最前面的四个字节。

在tcpdump里tcp[x:n]表示tcp报文,偏移x个字节后,长度为n字节的数据。
所以我们用tcp[(tcp[12] >> 2):4]表示数据开始的前4个字节。注意:数据内容是用16进制ascii码来表示的。

POST的十六进制ascii为0x504f534(python中用ord(‘P’)获取P的十进制ascii码,用hex(ord(‘P’))获取P的十六进制ascii码)

所以我们的BPF可以这样写:

tcp[(tcp[12] >> 2):4] = 0x504f5354

注意,这里的:4不是随便填的。tcpdump只支持1,2,4这三种长度

之后可以再举例抓路径名的,介绍+的使用

最后看喜好介绍TCP标志位的抓包方法
外国友人记忆标记位的方法:

Unskilled Attackers Pester Real Security Folks

蹩脚的攻击者缠住了真正的安全人员
(不知道是不是可以翻译成:盲拳打死老师傅)

Unskilled = URG
Attackers = ACK
Pester = PSH
Real = RST
Security = SYN
Folks = FIN

19:53:32.320702 IP 10.0.0.91.49808 > 202.104.101.103.http: Flags [P.], seq 0:582, ack 1, win 115, options [nop,nop,TS val 3307698431 ecr 10667605], length 582
0x0000: 4500 027a a33d 4000 4006 5b16 0a00 005b E..z.=@.@.[….[
0x0010: ca68 6567 c290 0050 cc09 dbc4 da97 f8e2 .heg…P……..
0x0020: 8018 0073 6aad 0000 0101 080a c527 78ff …sj……..’x.
0x0030: 00a2 c655 504f 5354 202f 696e 6465 782e …UPOST./index.
0x0040: 7068 703f 633d 7363 6826 613d 6765 7453 php?c=sch&a=getS
0x0050: 6368 6564 756c 6520 4854 5450 2f31 2e31 chedule.HTTP/1.1
0x0060: 0d0a 582d 5265 616c 2d69 703a 2032 3131 ..X-Real-ip:.211
0x0070: 2e31 3534 2e31 3536 2e33 380d 0a58 2d46 .154.156.38..X-F
0x0080: 6f72 7761 7264 6564 2d46 6f72 3a20 3231 orwarded-For:.21
0x0090: 312e 3135 342e 3135 362e 3338 0d0a 4854 1.154.156.38..HT
0x00a0: 5450 5f43 4c49 454e 545f 4950 3a20 3231 TP_CLIENT_IP:.21
0x00b0: 312e 3135 342e 3135 362e 3338 0d0a 4854 1.154.156.38..HT
0x00c0: 5450 5f58 5f46 4f52 5741 5244 4544 5f46 TP_X_FORWARDED_F
0x00d0: 4f52 3a20 3231 312e 3135 342e 3135 362e OR:.211.154.156.
0x00e0: 3338 0d0a 5245 4d4f 5445 5f41 4444 523a 38..REMOTE_ADDR:
0x00f0: 2032 3131 2e31 3534 2e31 3536 2e33 380d .211.154.156.38.
0x0100: 0a57 4c2d 5072 6f78 792d 436c 6965 6e74 .WL-Proxy-Client
0x0110: 2d49 503a 2032 3131 2e31 3534 2e31 3536 -IP:.211.154.156
0x0120: 2e33 380d 0a50 726f 7879 2d43 6c69 656e .38..Proxy-Clien
0x0130: 742d 4950 3a20 3231 312e 3135 342e 3135 t-IP:.211.154.15
0x0140: 362e 3338 0d0a 436f 6e74 656e 742d 4c65 6.38..Content-Le
0x0150: 6e67 7468 3a20 3933 0d0a 436f 6e74 656e ngth:.93..Conten
0x0160: 742d 5479 7065 3a20 6170 706c 6963 6174 t-Type:.applicat
0x0170: 696f 6e2f 782d 7777 772d 666f 726d 2d75 ion/x-www-form-u
0x0180: 726c 656e 636f 6465 643b 2063 6861 7273 rlencoded;.chars
0x0190: 6574 3d55 5446 2d38 0d0a 486f 7374 3a20 et=UTF-8..Host:.
0x01a0: 7773 6170 692e 3931 3136 302e 636f 6d0d wsapi.91160.com.
0x01b0: 0a43 6f6e 6e65 6374 696f 6e3a 204b 6565 .Connection:.Kee
0x01c0: 702d 416c 6976 650d 0a55 7365 722d 4167 p-Alive..User-Ag
0x01d0: 656e 743a 2041 7061 6368 652d 4874 7470 ent:.Apache-Http
0x01e0: 436c 6965 6e74 2f34 2e35 2028 4a61 7661 Client/4.5.(Java
0x01f0: 2f31 2e37 2e30 5f37 3929 0d0a 4163 6365 /1.7.0_79)..Acce
0x0200: 7074 2d45 6e63 6f64 696e 673a 2067 7a69 pt-Encoding:.gzi
0x0210: 702c 6465 666c 6174 650d 0a0d 0a75 6964 p,deflate….uid
0x0220: 3d33 2664 6f63 6964 3d32 3336 3726 656e =3&docid=2367&en
0x0230: 645f 6461 7465 3d32 3031 362d 3037 2d31 d_date=2016-07-1
0x0240: 3326 746f 6b65 6e3d 686a 2a71 6b2d 3538 3&token=hj*qk-58
0x0250: 3536 3326 6265 6769 6e5f 6461 7465 3d32 563&begin_date=2
0x0260: 3031 362d 3036 2d32 3926 6465 7069 643d 016-06-29&depid=
0x0270: 3436 3126 6369 643d 3237 461&cid=27

印象笔记,让记忆永存。下载印象笔记

标签:Tcpdump 发布于:2019-11-10 07:27:16