安装系统: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
地址均已查出。