关于windump 获取网帧

编程知识 更新时间:2023-04-17 12:34:03

1.眼花缭乱的命令

D:\>windump -h

windump version current-cvs.Windump, based on Windump versioncurrent-cvs.tc
pdump
WinPcap version 3.0 alpha, based on libpcap version current-cvs.Windump
Usage: windump [-aAdDeflnNOpqRStuvxX] [-B size] [-c count] [ -C file_size ]
[ -F file ] [ -i interface ] [ -r file ] [ -s snaplen ]
[ -T type ] [ -w file ] [ -E algo:secret ] [ expression ]


下面好多参数都没用 其实我也不会用

大小写是有区分的

windump -D 好多资料里都没有 它是列出网卡名称列表用的

windump -l 使标准输出变为缓冲行形式;如Windump -l>tcpcap.txt


-a    将网络地址和广播地址转变成名字;
   -d    将匹配信息包的代码以人们能够理解的汇编格式给出;
   -dd    将匹配信息包的代码以c语言程序段的格式给出;
   -ddd    将匹配信息包的代码以十进制的形式给出;
   -e    在输出行打印出数据链路层的头部信息;
   -f    将外部的Internet地址以数字的形式打印出来;
-n    不把网络地址转换成名字;
-N 不打印出默认的域名。
-nn 不进行端口名称的转换。
-O 不进行匹配代码的优化
-t    在输出的每一行不打印时间戳;
-tt 打印原始的、未格式化过的时间。
   -v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
   -vv    输出详细的报文信息;
   -c    在收到指定的包的数目后,Windump就会停止;
   -F    从指定的文件中读取表达式,忽略其它的表达式;
   -i    指定监听的网络接口;
   -r    从指定的文件中读取包(这些包一般通过-w选项产生);
   -w    直接将包写入文件中,并不分析和打印出来;
-T    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议;)


 Windump表达式介绍

有三种表达式

ü 第一种是关于类型的关键字,

    主要包括host,net,port,

     例如 host 192.168.0.111,

    指明192.168.0.111是一台主机,net 192.168.0.0 指明192.168.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.

第二种是确定传输方向的关键字,

    主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。

    举例说明,

          src192.168.0.94 ,指明ip包中源地址是192.168.0.94,

          dst net 192.168.0.0 指明目的网络地址是192.168.0.0。

          如果没有指明方向关键字,则缺省是src or dst关键字。

第三种是协议的关键字,

     主要包括fddi,ip,arp,rarp,tcp,udp等类型。

       Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则Windump将会监听所有协议的信息包。


除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'or','││';这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来说明。
A想要截获所有192.168.0.94 的主机收到的和发出的所有的数据包:
#Windump host 192.168.0.94
B想要截获主机192.168.0.94 和主机192.168.0.168或192.168.0.111的通信,使用命令:(在命令行中适用括号时,一定要
#Windump host 192.168.0.94 and (192.168.0.168 or 192.168.0.111)
C如果想要获取主机192.168.0.94除了和主机192.168.0.111之外所有主机通信的ip包,使用命令:
#Windump ip host 192.168.0.94 and ! 192.168.0.111
D如果想要获取主机192.168.0.94接收或发出的telnet包,使用如下命令:
#Windump tcp port 23 host 192.168.0.94
1.2.4 Windump的输出结果介绍

Windump网络数据的过滤

如果不指定表达式,所有通过指定接口的packet都输出,否则只把表达式expression为真的输出。
最基本的表达式是这样的:
[proto] [dir] [type] [id]

proto 协议,可以是ether, fddi, tr, ip,ip6, arp, rarp, decnet, tcp , udp中任一个或它们的表达式组合,如果不指定,所有和后面的type一致的都考虑在内。
dir packet传输的方向,可以是src, dst中的任一个或它们的表达式组合。不指定的话,相当于src or dst 。
type 指定后面的id是网络地址、主机地址还是端口号,可以是host,net ,port中任一个,如果不指定,默认为host。
id 就是希望监听的网络或主机或端口地址。

此外还可以用 与或非 进一步进行组合

接下来的完全没看懂 

此外,有gateway, broadcast , multicast , mask , protochain ,proto , less , greater 四个关键字和一些算术表达式、逻辑符合等。
gateway foo 其中,foo是主机名,如果某个packet以foo为gateway,表达式为真,也就是该packet的ether源或目的地址是foo,而ip源和目的地址都不是foo。
broadcast,multicast 跟在ether或者ip、ip6后面表示某个packet是广播包、多播包,比如“ether broadcast”,“ip multicast”。
mask 和net一起说明网络地址,例如“net192.168.0 mask 255.255.255.0”。
protochain 跟在ip、ip6后面说明更上层的协议字,比如“ip protochain 6”。
proto 跟在ether或者ip、ip6后面表示更上层的协议,跟在“ether proto”之后的可以是ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso,跟在“ip proto”或“ip6 proto”之后的可以是icmp, icmp6, igmp, igrp, pim, ah, esp, udp, tcp,注意对于有些本身就是关键字的要加“\”转义,比如“ether proto \ip”。

其他表达式是这样的格式:
expr relop expr
其中,relop 可以是 >, <, >=,<=, =, !=, 中任一个,expr是由C语言规范描述的整数常量、二进制运算符(+, -, *, /, &, |)、len(取长度的关键字)、包数据构成,包数据这样访问:
proto [ offset : size ] proto是ether, fddi, tr, ip, arp,rarp, tcp, udp, icmp , ip6中任一个,表示要取的数据是该协议头范围内的,相对于PDU开始处的偏移由offset指定,size可选、说明要取数据的字节数,可以是1~4,默认是1。例如,
“ether[0] & 1 != 0”匹配所有multicast数据包,因为01:00:5e:00:00:00到 01:00:5e:7f:ff:ff都是多播地址。
“ip[0] & 0xf != 5”匹配所有带选项的ip包,根据ip协议,“ip[0] & 0xf”取到的是IP协议头长度,而不带选项的ip协议头长度刚好是5。
“ip[6:2] & 0x1fff = 0”,“ip[6:2] & 0x1fff”取到该ip包的Fragment Offset,所以匹配所有不分段的ip包或所有分段ip包中的第一段。

其它操作法有!(相当于not )、&&(相当于and )、||(相当于or)。

下面是例子

D:\>Windump srchost 192.168.0.1 and dst net 192.168.0.0/24
过滤的是源主机为192.168.0.1与目的网络为192.168.0.0的报头。


D:\>Windump ether src 00:50:04:BA:9B and dst……
过滤源主机物理地址为XXX的报头(为什么ether src后面没有host或者net?物理地址当然不可能有网络喽)。


D:\>Windump src host 192.168.0.1 and dst port not telnet
过滤源主机192.168.0.1和目的端口不是telnet的报头。


D:\>Windump ip src……
只过滤数据-链路层上的IP报头。

D:\>Windump udp and src host 192.168.0.1
只过滤源主机192.168.0.1的所有udp报头

最后Windump实战解析

-n表示源地址和目的地址不采用主机名的形式显示而采用IP地址的形式;-S是显示TCP/IP的实际进程数,如果不选择这个选项,可能出现的就是近似值,比如:如果现在的进程数是87334271,下一秒变成了多了一个,就会显示出来是87334272.-v和-vv是让机器显示更加全面的信息,显示诸如存活时间/IP的ID等信息.,
接着我们对TCP握手过程进行嗅探分析,在windows命令行界面下,运行windump,如下:


D:\>windump –n
windump: listening on\Device\Packet_{9D9A4413-7F41-463A-BA3C-B17145F4A626}
02:53:03.541838 192.168.0.194.4423 > 192.168.0.168.80: S4057648491:4057648491(0) win 16384 <mss 1460,nop,nop,sackOK> (DF)
/*
这此TCP第一次握手过程,所表示的含义是IP地址为192.168.0.194的电脑向IP地址为192.168.0.168的电脑发起一个TCP的连接请求。
其中02:53:03.541838表示时间戳与ID号;192.168.0.194为源IP地址,端口4423;192.168.0.168是目的地址,端口80,我们可以判断这是连接在远程主机的WEB服务上;S4057648491:4057648491(0)表示IP194主机主动发起了一个SYN请求,这是第一步握手,4057648491是请求端的初始序列号;win 16384 表示发端通告的窗口大小;mss 1460表示由发端指明的最大报文段长度。
*/


02:53:03.542005 192.168.0.168.1234 > 192.168.0.194.4423: S1391008532:1391008532(0) ack 4057648492 win 17520 <mss1460,nop,nop,sackOK> (DF)
/*
同上一样,时间戳&ID号为02:53:03.542005;源IP地址为192.168.0.168端口80,而目的IP地址变为192.168.0.194端4423;接着是S 1391008532:1391008532(0) ack4057648492,这是第二步握手,1391008532是服务器端所给的初始序列号,ack 4057648492是确认序号,是对第一次握手中客户端发起请求的初始序列号加1。该行表示服务器端接受客户端发起的TCP连接请求,并发出自己的初始序列号。
*/


02:53:03.542167 192.168.0.194.4423 > 192.168.0.168.1234: . ack 1 win 17520(DF)
/*
这是三步握手的最后一步,客户端发送ack 1,表示三步握手已经正常结束,下面就可以传送数据了。
*/


当TCP三次握手不成功又是怎么样的呢?接着telnet到一台没有开telnet服务的计算机上面,插看windump抓获的数据包
C:\Documents and Settings\wh>telnet 192.168.0.194
Connecting To 192.168.0.194...Could not open a connection to host on port 23 :Connect failed
/*
上面说明从192.168.0.168 telnet192.168.0.194 失败.
*/


D:\>windump –n
windump: listening on\Device\Packet_{9D9A4413-7F41-463A-BA3C-B17145F4A626}
18:19:45.278916 arp who-has 192.168.0.194 tell 192.168.0.168
/*
上面的信息说明192.168.0.168因为不知道192.168.0.194的MAC地址,所以首先向网络种发送ARP广播包
*/


18:19:45.279090 arp reply 192.168.0.194 is-at 0:d0:f8:38:de:ab
/*
接着192.168.0.194回应192.168.0.168的请求,告诉192.168.0.168它的MAC地址是0:d0:f8:38:de:ab
*/


18:19:45.279108 192.168.0.168.1148 > 192.168.0.194.23: S2869223552:2869223552(0) win 16384 <mss 1460,nop,nop,sackOK> (DF)
/*
然后192.168.0.168向192.168.0.194发起SYN请求
*/


18:19:45.279269 192.168.0.194.23 > 192.168.0.168.1148: R 0:0(0) ack2869223553 win 0
/*
上面这行信息表示目标主机拒绝了这一请求,故发送R 0:0(0)的响应,表示不接受192.168.0.168的请求。在接下面的几行中我们看见192.168.0.168连续向192.168.0.194发送SYN请求,一共三次请求,但都被目标主机拒绝
*/


18:19:45.769542 192.168.0.168.1148 > 192.168.0.194.23: S2869223552:2869223552(0) win 16384 <mss 1460,nop,nop,sackOK> (DF)
18:19:45.769757 192.168.0.194.23 > 192.168.0.168.1148: R 0:0(0) ack 1 win 0
18:19:46.316397 192.168.0.168.1148 > 192.168.0.194.23: S2869223552:2869223552(0) win 16384 <mss 1460,nop,nop,sackOK> (DF)
18:19:46.316636 192.168.0.194.23 > 192.168.0.168.1148: R 0:0(0) ack 1 win 0
以上是利用Windump对TCP的三次握手过程进行分析,Windump的参数很多,功能也非常强大,实际运用中根据实际的需求,来设置参数,获得你所需要的信息.相信每次使用都会有不同的收获.  



附录

几种典型的Windump命令的输出信息


ü A,数据链路层头信息
使用命令
#Windump --e host test100
16:20:51.602645 arp who-has TEST100 tell wh
16:20:51.602931 arp reply TEST100 is-at 0:1:2:9a:d:24
16:20:51.602979 wh.137 > TEST100.137:
16:29:26.397806 TEST100.139 > wh.1226: . 4218060367:4218060368(1) ack4122708076 win 17223
分析:16:20:51是显示的时间,602645是ID号,首先主机wh发出arp请求test100的MAC地址,接着test100返回了它的MAC地址,wh的137与test100的137端口发送.test100的139端口向wh的1226端口发送数据,ack 4122708076 表明对序列号是4122708076的包进行响应.win 17223表明发送窗口的大小是17223


ü B,ARP包的WINDUMP输出信息
使用命令
#Windump arp
得到的输出结果是:
22:32:42.802509 arp who-has 192.168.0.168 tell 192.168.0.94
22:32:42.802902 arp reply 192.168.0.168 is-at 0:1:2:9a:d:24
分析: 22:32:42是时间戳,802509是ID号, arp表明是ARP请求包, who-has 192.168.0.168 tell 192.168.0.94 表示主机192.168.0.94请求主机192.168.0.168的MAC地址.接着arpreply 192.168.0.168 is-at 0:1:2:9a:d:24表示主机192.168.0.168收到请求并返回自己的MAC地址.
Unix下的Tcpdump格式略有不同,如下
22:32:42.802509 eth0 > arp who-has route tell ice (0:90:27:58:af:1a)
22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66(0:90:27:58:af:1a)
eth0 <表示从网络接口eth0 接受该数据包,eth0 >表示从网络接口设备发送数据包, 其他与windump一样.


ü C,TCP包的输出信息
用WINDUMP捕获的TCP包的一般输出信息是:
时间戳&ID号 src.port1>dst.port2 : flags data-seqno ack windowurgent options
02:53:03是时间戳, 541838是ID号,src> dst:表明从源地址到目的地址, port1,port2代表端口号,flags是TCP包中的标志信息,S 是SYN标志, F(FIN), P (PUSH) , R (RST) "." (没有标记);data-seqno是数据包中的数据的顺序号, ack是下次期望的顺序号, window是接收缓存的窗口大小,urgent表明数据包中是否有紧急指针. Options是选项.


ü D,UDP包的输出信息
用WINDUMP捕获的UDP包的一般输出信息是:
时间戳&ID号 src.port1>dst.port2: udp length
UDP十分简单,上面的输出行表明从主机src的port1端口发出的一个UDP数据包到主机dst的port2端口,类型是UDP, 包的长度是length


更多推荐

关于windump 获取网帧

本文发布于:2023-04-13 23:57:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/5babd456ee403ac6f7d7cf5cbc5e937f.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:windump

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 74098文章数
  • 14阅读数
  • 0评论数