linux sniffer tcpdumo安装配置使用

安装系统:redhat linux as 4 2.6.9
在如今众多的黑客技术中,嗅探器 (sniffer) 是最常见,也是最重要的技术之一。用过 windows 平台上的 sniffer 工具 ( 例如, netxray sniffer pro 软件 ) 的朋友可能都知道,在共享式的局域网中,采用 sniffer 工具简直可以对网络中的所有流量一览无余! Sniffer 工具实际上就是一个网络上的抓包工具,同时还可以对抓到的包进行分析。由于在共享式的网络中,信息包是会广播到网络中所有主机的网络接口,只不过在没有使用 sniffer 工具之前,主机的网络设备会判断该信息包是否应该接收,这样它就会抛弃不应该接收的信息包, sniffer 工具却使主机的网络设备接收所有到达的信息包,这样就达到了网络监听的效果。其实, sniffer 工具既可以适合于黑客的使用,也同样有利于网络管理员和网络程序员。对于网络管理人员来说,使用嗅探器可以随时掌握网络的实际情况,在网络性能急剧下降的时候,可以通过 sniffer 工具来分析原因,找出造成网络阻塞的来源。对于网络程序员来说 , 通过 sniffer 工具来调试程序。

  下面就向大家介绍一个在 linux 下优秀的嗅探器 -------tcpdump.( 我们下面的操作都在 redhat 6.2 linux 2.2.14 的环境中经过实际测试 .)

   . Tcpdump 的安装

  在 linux tcpdump 的安装十分简单,一般由两种安装方式。一种是以 rpm 包的形式来进行安装。另外一种是以源程序的形式安装。

   1 rpm 包的形式安装

  这种形式的安装是最简单的安装方法, rpm 包是将软件编译后打包成二进制的格式,通过 rpm 命令可以直接安装,不需要修改任何东西。以超级用户登录,使用命令如下:

   #rpm -ivh tcpdump-3_ 4a 5.rpm

  这样 tcpdump 就顺利地安装到你的 linux 系统中。怎么样,很简单吧。

   2 源程序的安装

  既然 rpm 包的安装很简单 , 为什么还要采用比较复杂的源程序安装呢 ? 其实, linux 一个最大的诱人之处就是在她上面有很多软件是提供源程序的,人们可以修改源程序来满足自己的特殊的需要。所以我特别建议朋友们都采取这种源程序的安装方法。

   ? 第一步 取得源程序 在源程序的安装方式中,我们首先要取得 tcpdump 的源程序分发包,这种分发包有两种

  形式,一种是 tar 压缩包 (tcpdump-3_ 4a 5.tar.Z), 另一种是 rpm 的分发包 (tcpdump-3_ 4a 5.src.rpm) 。这两种

  形式的内容都是一样的,不同的仅仅是压缩的方式 .tar 的压缩包可以使用如下命令解开:

   #tar xvfz tcpdump-3_ 4a 5.tar.Z

   rpm 的包可以使用如下命令安装 :

   #rpm -ivh tcpdump-3_ 4a 5.src.rpm

  这样就把 tcpdump 的源代码解压到 /usr/src/redhat/SOURCES 目录下 .

   ? 第二步 做好编译源程序前的准备活动

  在编译源程序之前,最好已经确定库文件 libpcap 已经安装完毕,这个库文件是 tcpdump 软件所需的库文件

  。同样,你同时还要有一个标准的 c 语言编译器。在 linux 下标准的 c 语言编译器一般是 gcc tcpdump

  源程序目录中。有一个文件是 Makefile.in configure 命令就是从 Makefile.in 文件中自动产生 Makefile

  件。在 Makefile.in 文件中,可以根据系统的配置来修改 BINDEST MANDEST 这两个宏定义,缺省值是

   BINDEST = @sbindir@

   MANDEST = @mandir@

  第一个宏值表明安装 tcpdump 的二进制文件的路径名,第二个表明 tcpdump man 帮助页的路径名 , 你可以修

  改它们来满足系统的需求。

   ? 第三步 编译源程序

  使用源程序目录中的 configure 脚本,它从系统中读出各种所需的属性。并且根据 Makefile.in 文件自动生

  成 Makefile 文件,以便编译使用 .make 命令则根据 Makefile 文件中的规则编译 tcpdump 的源程序。使用 make

   install 命令安装编译好的 tcpdump 的二进制文件。

  总结一下就是 :

   # tar xvfz tcpdump-3_ 4a 5.tar.Z

   # vi Makefile.in

   # . /configure

   # make

   # make install

   . Tcpdump 的使用

   tcpdump 采用命令行方式,它的命令格式为:

   tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]

   [ -i 网络接口 ] [ -r 文件名 ] [ -s snaplen ]

   [ -T 类型 ] [ -w 文件名 ] [ 表达式 ]

   1. tcpdump 的选项介绍

   -a

  将网络地址和广播地址转变成名字;

   -d

  将匹配信息包的代码以人们能够理解的汇编格式给出;

   -dd

  将匹配信息包的代码以 c 语言程序段的格式给出;

   -ddd

  将匹配信息包的代码以十进制的形式给出;

   -e

  在输出行打印出数据链路层的头部信息;

   -f

  将外部的 Internet 地址以数字的形式打印出来;

   -l

  使标准输出变为缓冲行形式;

   -n

  不把网络地址转换成名字;

   -t

  在输出的每一行不打印时间戳;

   -v

  输出一个稍微详细的信息,例如在 ip 包中可以包括 ttl 和服务类型的信息;

   -vv

  输出详细的报文信息;

   -c

  在收到指定的包的数目后, tcpdump 就会停止;

   -F

  从指定的文件中读取表达式 , 忽略其它的表达式;

   -i

  指定监听的网络接口;

   -r

  从指定的文件中读取包 ( 这些包一般通过 -w 选项产生 )

   -w

  直接将包写入文件中,并不分析和打印出来;

   -T

  将监听到的包直接解释为指定的类型的报文,常见的类型有 rpc (远程过程 调用)和 snmp (简单

  网络管理协议;)

   2. tcpdump 的表达式介绍

  表达式是一个正则表达式, tcpdump 利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会被截获。

  在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括 host net port, 例如 host 210.27.48.2 ,指明 210.27.48.2 是一台主机, net 202.0.0.0 指明 202.0.0.0 是一个网络地址, port 23 指明端口号是 23 。如果没有指定类型,缺省的类型是 host. 第二种是确定传输方向的关键字,主要包括 src , dst ,dst or src, dst and src , 这些关键字指明了传输的方向。举例说明, src 210.27.48.2 , 指明 ip 包中源地址是 210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是 202.0.0.0 。如果没有指明方向关键字,则缺省是 src or dst 关键字。

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

  除了这三种类型的关键字之外,其他重要的关键字如下: gateway, broadcast,less,greater, 还有三种逻辑运算,取非运算是 not ! , 与运算是 and,&&; 或运算 or ,||

  这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来说明。

   (1) 想要截获所有 210.27.48.1 的主机收到的和发出的所有的数据包:

   #tcpdump host 210.27.48.1

   (2) 想要截获主机 210.27.48.1 和主机 210.27.48.2 210.27.48.3 的通信,使用命令:(在命令行中适用

  括号时,一定要

   #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

   (3) 如果想要获取主机 210.27.48.1 除了和主机 210.27.48.2 之外所有主机通信的 ip 包,使用命令:

   #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

   (4) 如果想要获取主机 210.27.48.1 接收或发出的 telnet 包,使用如下命令:

   #tcpdump tcp port 23 host 210.27.48.1

   3. tcpdump 的输出结果介绍

  下面我们介绍几种典型的 tcpdump 命令的输出信息

   (1) 数据链路层头信息

  使用命令 #tcpdump --e host ice

   ice 是一台装有 linux 的主机,她的 MAC 地址是 0 90 27 58 AF 1A

   H219 是一台装有 SOLARIC SUN 工作站,它的 MAC 地址是 8 0 20 79 5B 46 ;上一条命令的输出结果如下所示:

   21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af: 1a ip 60: h219.33357 > ice.telne

   t 0:0(0) ack 22535 win 8760 (DF)

  分析: 21 50 12 是显示的时间, 847509 ID 号, eth0 < 表示从网络接口 eth0 接受该数据包, eth0 > 表示从网络接口设备发送数据包 , 8:0:20:79:5b:46 是主机 H219 MAC 地址 , 它表明是从源地址 H219 发来的数据包 . 0:90:27:58:af: 1a 是主机 ICE MAC 地址 , 表示该数据包的目的地址是 ICE . ip 是表明该数据包是 IP 数据包 ,60 是数据包的长度 , h219.33357 > ice.telnet 表明该数据包是从主机 H219 33357 端口发往主机 ICE TELNET(23) 端口 . ack 22535 表明对序列号是 222535 的包进行响应 . win 8760 表明发送窗口的大小是 8760.

   (2) ARP 包的 TCPDUMP 输出信息

  使用命令 #tcpdump arp

  得到的输出结果是:

   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 )

  分析 : 22:32:42 是时间戳 , 802509 ID , eth0 > 表明从主机发出该数据包 , arp 表明是 ARP 请求包 , who-has route tell ice 表明是主机 ICE 请求主机 ROUTE MAC 地址。 0:90:27:58:af: 1a 是主机 ICE MAC 地址。

   (3) TCP 包的输出信息

  用 TCPDUMP 捕获的 TCP 包的一般输出信息是:

   src > dst: flags data-seqno ack window urgent options

   src > dst: 表明从源地址到目的地址 , flags TCP 包中的标志信息 ,S SYN 标志 , F (FIN), P (PUSH) , R (RST) "." ( 没有标记 ); data-seqno 是数据包中的数据的顺序号 , ack 是下次期望的
查看 arp 欺骗 病毒
由于内网无法正常连接网关,远程登陆网关已无法实现。因此一切操作均在网关服务器本地进行。
1        在服务器本地端口抓包
  tcpdump -nn -i eth1 > error.network
# 将通过 eth1 端口的包抓下来,存为 error.network 文件
2                    ARP 包截取出来
 grep ‘arp’ error.network > arp.virus
# 将所有 ARP 包截取,另存为文件
3                    分析 ARP
 vi  arp.virus
10:43:26.086278 arp reply 192.168.2.2 is-at 0:14:78:80:d9:e4
10:43:26.181051 arp reply 192.168.2.3 is-at 0:14:78:80:d9:e4
10:43:26.211026 arp reply 192.168.2.11 is-at 0:14:78:80:d9:e4
10:43:26.242212 arp reply 192.168.2.4 is-at 0:14:78:80:d9:e4
10:43:26.304441 arp reply 192.168.2.162 is-at 0:14:78:80:d9:e4
10:43:26.398826 arp reply 192.168.2.167 is-at 0:14:78:80:d9:e4
# 问题出来了,可以看到以上几个包括网关 IP 在内的 IP 地址都宣称其位于 MAC 地址
#
“00:14:78:80;d9:e 4” 的网卡
4                    查看网关( 192.168.2.11 )的 MAC 地址
[root@Routed-Server tmp]# ifconfig eth1 |grep -A1 'HWaddr'
eth1      Link encap:Ethernet  HWaddr 00: 0A :EB:55:D1:72
          inet addr:192.168.2.11  Bcast:192.168.2.255  Mask:255.255.255.0
#
可以看到网关的 MAC 地址为 “00: 0A :EB:55:D1: 72” ,与上面 arp-reply 包不相符
#
这里基本上可以份析出中毒的机器 MAC 地址为 “00:14:78:80:d9:e 4”
5                    准确定位中毒机器
知道可能中毒机器的 MAC 地址,对其定位应该不是件难事。对于小型的网络我们可以对每台机器的 MAC 地址进行查询,但是对于大型网络,机器台数超过 200 台的环境,这样做并不是最高效的办法。由于使用 DHCP ,这里我想到了 DHCP 的租约记录。
/var        /lib/dhcp/dhcpd.leases 记录中查找 MAC 地址对应的 IP 记录
[root@Routed-Server tmp]# vi  /var/lib/dhcp/dhcpd.leases
~
省略
lease 192.168.2.161 {
  starts 3 2006/10/25 02:56:22;
  ends 2 2038/01/19 03:14:06;
  binding state active;
  next binding state free;
  hardware ethernet 00:14:78:80:d9:e4;
  uid "\001\000\024x\200\331\344";
  client-hostname "ABEAAF6E64884EB";
}
~ 省略
#
dhcpd.leases 文件中,我找到如上记录
#
可以看出 MAC 地址为 “00:14:78:80:d9:e 4” 的机器, IP 地址为 192.168.2.161
#
机器名为 “ABEAAF6E64884EB”

到这里,中毒机器的机器名, IP 地址均已查出。
 
 

你可能感兴趣的:(linux,安装,配置,sniffer,tcpdumo)