NMAP
1.名称
nmap-网络探测和安全扫描工具
2.语法
nmap [Scan Type(s)] [Options]
3.描述
nmap是一个网络探测和安全扫描程序,系统管理者和个人可以使用这个软件扫描大型的网络,获取那台主机正在运行以及提供什么服务等信息。nmap支持很多扫描技术,例如:UDP、TCP connect()、TCP SYN(半开扫描)、ftp代理(bounce攻击)、反向标志、ICMP、FIN、ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描。从扫描类型一节可以得到细节。nmap还提供了一些高级的特征,例如:通过TCP/IP协议栈特征探测操作系统类型,秘密扫描,动态延时和重传计算,并行扫描,通过并行ping扫描探测关闭的主机,诱饵扫描,避开端口过滤检测,直接RPC扫描(无须端口影射),碎片扫描,以及灵活的目标和端口设定。
为了提高nmap在non-root状态下的性能,软件的设计者付出了很大的努力。很不幸,一些内核界面(例如raw socket)需要在root状态下使用。所以应该尽可能在root使用nmap。
nmap运行通常会得到被扫描主机端口的列表。nmap总会给出well known端口的服务名(如果可能)、端口号、状态和协议等信息。每个端口的状态有:open、filtered、unfiltered。open状态意味着目标主机能够在这个端口使用accept()系统调用接受连接。filtered状态表示:防火墙、包过滤和其它的网络安全软件掩盖了这个端口,禁止 nmap探测其是否打开。unfiltered表示:这个端口关闭,并且没有防火墙/包过滤软件来隔离nmap的探测企图。通常情况下,端口的状态基本都是unfiltered状态,只有在大多数被扫描的端口处于filtered状态下,才会显示处于unfiltered状态的端口。
根据使用的功能选项,nmap也可以报告远程主机的下列特征:使用的操作系统、TCP序列、运行绑定到每个端口上的应用程序的用户名、DNS名、主机地址是否是欺骗地址、以及其它一些东西。
4.功能选项
功能选项可以组合使用。一些功能选项只能够在某种扫描模式下使用。nmap会自动识别无效或者不支持的功能选项组合,并向用户发出警告信息。
如果你是有经验的用户,可以略过结尾的示例一节。可以使用nmap -h快速列出功能选项的列表。
4.1 扫描类型
-sT
TCP connect()扫描:这是最基本的TCP扫描方式。connect()是一种系统调用,由操作系统提供,用来打开一个连接。如果目标端口有程序监听, connect()就会成功返回,否则这个端口是不可达的。这项技术最大的优点是,你勿需root权限。任何UNIX用户都可以自由使用这个系统调用。这种扫描很容易被检测到,在目标主机的日志中会记录大批的连接请求以及错误信息。
-sS
TCP同步扫描(TCP SYN):因为不必全部打开一个TCP连接,所以这项技术通常称为半开扫描(half-open)。你可以发出一个TCP同步包(SYN),然后等待回应。如果对方返回SYN|ACK(响应)包就表示目标端口正在监听;如果返回RST数据包,就表示目标端口没有监听程序;如果收到一个SYN|ACK包,源主机就会马上发出一个RST(复位)数据包断开和目标主机的连接,这实际上有我们的操作系统内核自动完成的。这项技术最大的好处是,很少有系统能够把这记入系统日志。不过,你需要root权限来定制SYN数据包。
-sF -sF -sN
秘密FIN数据包扫描、圣诞树(Xmas Tree)、空(Null)扫描模式:即使SYN扫描都无法确定的情况下使用。一些防火墙和包过滤软件能够对发送到被限制端口的SYN数据包进行监视,而且有些程序比如synlogger和courtney能够检测那些扫描。这些高级的扫描方式可以逃过这些干扰。这些扫描方式的理论依据是:关闭的端口需要对你的探测包回应RST包,而打开的端口必需忽略有问题的包(参考RFC 793第64页)。FIN扫描使用暴露的FIN数据包来探测,而圣诞树扫描打开数据包的FIN、URG和PUSH标志。不幸的是,微软决定完全忽略这个标准,另起炉灶。所以这种扫描方式对Windows95/NT无效。不过,从另外的角度讲,可以使用这种方式来分别两种不同的平台。如果使用这种扫描方式可以发现打开的端口,你就可以确定目标注意运行的不是Windows系统。如果使用-sF、-sX或者-sN扫描显示所有的端口都是关闭的,而使用SYN扫描显示有打开的端口,你可以确定目标主机可能运行的是Windwos系统。现在这种方式没有什么太大的用处,因为nmap有内嵌的操作系统检测功能。还有其它几个系统使用和windows同样的处理方式,包括Cisco、BSDI、HP/UX、MYS、IRIX。在应该抛弃数据包时,以上这些系统都会从打开的端口发出复位数据包。
-sP
ping扫描:有时你只是想知道此时网络上哪些主机正在运行。通过向你指定的网络内的每个IP地址发送ICMP echo请求数据包,nmap就可以完成这项任务。如果主机正在运行就会作出响应。不幸的是,一些站点例如:microsoft.com阻塞ICMP echo请求数据包。然而,在默认的情况下nmap也能够向80端口发送TCP ack包,如果你收到一个RST包,就表示主机正在运行。nmap使用的第三种技术是:发送一个SYN包,然后等待一个RST或者SYN/ACK包。对于非root用户,nmap使用connect()方法。
在默认的情况下(root用户),nmap并行使用ICMP和ACK技术。
注意,nmap在任何情况下都会进行ping扫描,只有目标主机处于运行状态,才会进行后续的扫描。如果你只是想知道目标主机是否运行,而不想进行其它扫描,才会用到这个选项。
-sU
UDP扫描:如果你想知道在某台主机上提供哪些UDP(用户数据报协议,RFC768)服务,可以使用这种扫描方法。nmap首先向目标主机的每个端口发出一个0字节的UDP包,如果我们收到端口不可达的ICMP消息,端口就是关闭的,否则我们就假设它是打开的。
有些人可能会想UDP扫描是没有什么意思的。但是,我经常会想到最近出现的solaris rpcbind缺陷。rpcbind隐藏在一个未公开的UDP端口上,这个端口号大于32770。所以即使端口111(portmap的众所周知端口号) 被防火墙阻塞有关系。但是你能发现大于30000的哪个端口上有程序正在监听吗?使用UDP扫描就能!cDc Back Orifice的后门程序就隐藏在Windows主机的一个可配置的UDP端口中。不考虑一些通常的安全缺陷,一些服务例如:snmp、tftp、NFS 使用UDP协议。不幸的是,UDP扫描有时非常缓慢,因为大多数主机限制ICMP错误信息的比例(在RFC1812中的建议)。例如,在Linux内核中 (在net/ipv4/icmp.h文件中)限制每4秒钟只能出现80条目标不可达的ICMP消息,如果超过这个比例,就会给1/4秒钟的处罚。 solaris的限制更加严格,每秒钟只允许出现大约2条ICMP不可达消息,这样,使扫描更加缓慢。nmap会检测这个限制的比例,减缓发送速度,而不是发送大量的将被目标主机丢弃的无用数据包。
不过Micro$oft忽略了RFC1812的这个建议,不对这个比例做任何的限制。所以我们可以能够快速扫描运行Win95/NT的主机上的所有65K个端口。
-sA
ACK扫描:这项高级的扫描方法通常用来穿过防火墙的规则集。通常情况下,这有助于确定一个防火墙是功能比较完善的或者是一个简单的包过滤程序,只是阻塞进入的SYN包。
这种扫描是向特定的端口发送ACK包(使用随机的应答/序列号)。如果返回一个RST包,这个端口就标记为unfiltered状态。如果什么都没有返回,或者返回一个不可达ICMP消息,这个端口就归入filtered类。注意,nmap通常不输出unfiltered的端口,所以在输出中通常不显示所有被探测的端口。显然,这种扫描方式不能找出处于打开状态的端口。
-sW
对滑动窗口的扫描:这项高级扫描技术非常类似于ACK扫描,除了它有时可以检测到处于打开状态的端口,因为滑动窗口的大小是不规则的,有些操作系统可以报告其大小。这些系统至少包括:某些版本的AIX、Amiga、BeOS、BSDI、Cray、Tru64 UNIX、DG/UX、OpenVMS、Digital UNIX、OpenBSD、OpenStep、QNX、Rhapsody、SunOS 4.x、Ultrix、VAX、VXWORKS。从nmap-hackers邮件3列表的文档中可以得到完整的列表。
-sR
RPC扫描。这种方法和nmap的其它不同的端口扫描方法结合使用。选择所有处于打开状态的端口向它们发出SunRPC程序的NULL命令,以确定它们是否是RPC端口,如果是,就确定是哪种软件及其版本号。因此你能够获得防火墙的一些信息。诱饵扫描现在还不能和RPC扫描结合使用。
-b
FTP反弹攻击(bounce attack):FTP协议(RFC 959)有一个很有意思的特征,它支持代理FTP连接。也就是说,我能够从evil.com连接到FTP服务器target.com,并且可以要求这台 FTP服务器为自己发送Internet上任何地方的文件!1985年,RFC959完成时,这个特征就能很好地工作了。然而,在今天的Internet 中,我们不能让人们劫持FTP服务器,让它向Internet上的任意节点发送数据。如同Hobbit在1995年写的文章中所说的,这个协议"能够用来做投递虚拟的不可达邮件和新闻,进入各种站点的服务器,填满硬盘,跳过防火墙,以及其它的骚扰活动,而且很难进行追踪"。我们可以使用这个特征,在一台代理FTP服务器扫描TCP端口。因此,你需要连接到防火墙后面的一台FTP服务器,接着进行端口扫描。如果在这台FTP服务器中有可读写的目录,你还可以向目标端口任意发送数据(不过nmap不能为你做这些)。
传递给-b功能选项的参数是你要作为代理的FTP服务器。语法格式为:
-b username:password@server:port。
除了server以外,其余都是可选的。如果你想知道什么服务器有这种缺陷,可以参考我在Phrack 51发表的文章。还可以在nmap的站点得到这篇文章的最新版本。
4.2 通用选项
这些内容不是必需的,但是很有用。
-P0
在扫描之前,不必ping主机。有些网络的防火墙不允许ICMP echo请求穿过,使用这个选项可以对这些网络进行扫描。microsoft.com就是一个例子,因此在扫描这个站点时,你应该一直使用-P0或者-PT 80选项。
-PT
扫描之前,使用TCP ping确定哪些主机正在运行。nmap不是通过发送ICMP echo请求包然后等待响应来实现这种功能,而是向目标网络(或者单一主机)发出TCP ACK包然后等待回应。如果主机正在运行就会返回RST包。只有在目标网络/主机阻塞了ping包,而仍旧允许你对其进行扫描时,这个选项才有效。对于非 root用户,我们使用connect()系统调用来实现这项功能。使用-PT <端口号>来设定目标端口。默认的端口号是80,因为这个端口通常不会被过滤。
-PS
对于root用户,这个选项让nmap使用SYN包而不是ACK包来对目标主机进行扫描。如果主机正在运行就返回一个RST包(或者一个SYN/ACK包)。
-PI
设置这个选项,让nmap使用真正的ping(ICMP echo请求)来扫描目标主机是否正在运行。使用这个选项让nmap发现正在运行的主机的同时,nmap也会对你的直接子网广播地址进行观察。直接子网广播地址一些外部可达的IP地址,把外部的包转换为一个内向的IP广播包,向一个计算机子网发送。这些IP广播包应该删除,因为会造成拒绝服务攻击(例如 smurf)。
-PB
这是默认的ping扫描选项。它使用ACK(-PT)和ICMP(-PI)两种扫描类型并行扫描。如果防火墙能够过滤其中一种包,使用这种方法,你就能够穿过防火墙。
-O
这个选项激活对TCP/IP指纹特征(fingerprinting)的扫描,获得远程主机的标志。换句话说,nmap使用一些技术检测目标主机操作系统网络协议栈的特征。nmap使用这些信息建立远程主机的指纹特征,把它和已知的操作系统指纹特征数据库做比较,就可以知道目标主机操作系统的类型。
-I
这个选项打开nmap的反向标志扫描功能。Dave Goldsmith 1996年向bugtap发出的邮件注意到这个协议,ident协议(rfc 1413)允许使用TCP连接给出任何进程拥有者的用户名,即使这个进程并没有初始化连接。例如,你可以连接到HTTP端口,接着使用identd确定这个服务器是否由root用户运行。这种扫描只能在同目标端口建立完全的TCP连接时(例如:-sT扫描选项)才能成功。使用-I选项是,远程主机的 identd精灵进程就会查询在每个打开的端口上监听的进程的拥有者。显然,如果远程主机没有运行identd程序,这种扫描方法无效。
-f
这个选项使nmap使用碎片IP数据包发送SYN、FIN、XMAS、NULL。使用碎片数据包增加包过滤、入侵检测系统的难度,使其无法知道你的企图。不过,要慎重使用这个选项!有些程序在处理这些碎片包时会有麻烦,我最喜欢的嗅探器在接受到碎片包的头36个字节时,就会发生 segmentation faulted。因此,在nmap中使用了24个字节的碎片数据包。虽然包过滤器和防火墙不能防这种方法,但是有很多网络出于性能上的考虑,禁止数据包的分片。
注意这个选项不能在所有的平台上使用。它在Linux、FreeBSD、OpenBSD以及其它一些UNIX系统能够很好工作。
-v
冗余模式。强烈推荐使用这个选项,它会给出扫描过程中的详细信息。使用这个选项,你可以得到事半功倍的效果。使用-d选项可以得到更加详细的信息。
-h
快速参考选项。
-oN
把扫描结果重定向到一个可读的文件logfilename中。
-oM
把扫描结果重定向到logfilename文件中,这个文件使用主机可以解析的语法。你可以使用-oM -来代替logfilename,这样输出就被重定向到标准输出stdout。在这种情况下,正常的输出将被覆盖,错误信息荏苒可以输出到标准错误 stderr。要注意,如果同时使用了-v选项,在屏幕上会打印出其它的信息。
-oS thIs l0gz th3 r3suLtS of YouR ScanZ iN a s| THe fiL3 U sPecfy 4s an arGuMEnT! U kAn gIv3 the 4rgument -
(wItHOUt qUOteZ) to sh00t output iNT0 stDouT!@!! 莫名其妙,下面是我猜着翻译的,相形字?
把扫描结果重定向到一个文件logfilename中,这个文件使用一种"黑客方言"的语法形式(作者开的玩笑?)。同样,使用-oS -就会把结果重定向到标准输出上。
-resume
某个网络扫描可能由于control-C或者网络损失等原因被中断,使用这个选项可以使扫描接着以前的扫描进行。logfilename是被取消扫描的日志文件,它必须是可读形式或者机器可以解析的形式。而且接着进行的扫描不能增加新的选项,只能使用与被中断的扫描相同的选项。nmap会接着日志文件中的最后一次成功扫描进行新的扫描。
-iL
从inputfilename文件中读取扫描的目标。在这个文件中要有一个主机或者网络的列表,由空格键、制表键或者回车键作为分割符。如果使用-iL -,nmap就会从标准输入stdin读取主机名字。你可以从指定目标一节得到更加详细的信息。
-iR
让nmap自己随机挑选主机进行扫描。
-p <端口范围>
这个选项让你选择要进行扫描的端口号的范围。例如,-p 23表示:只扫描目标主机的23号端口。-p 20-30,139,60000-表示:扫描20到30号端口,139号端口以及所有大于60000的端口。在默认情况下,nmap扫描从1到1024号以及nmap-services文件(如果使用RPM软件包,一般在/usr/share/nmap/目录中)中定义的端口列表。
-F
快速扫描模式,只扫描在nmap-services文件中列出的端口。显然比扫描所有65535个端口要快。
-D
使用诱饵扫描方法对目标网络/主机进行扫描。如果nmap使用这种方法对目标网络进行扫描,那么从目标主机/网络的角度来看,扫描就象从其它主机 (decoy1,等)发出的。从而,即使目标主机的IDS(入侵检测系统)对端口扫描发出报警,它们也不可能知道哪个是真正发起扫描的地址,哪个是无辜的。这种扫描方法可以有效地对付例如路由跟踪、response-dropping等积极的防御机制,能够很好地隐藏你的IP地址。
每个诱饵主机名使用逗号分割开,你也可以使用ME选项,它代表你自己的主机,和诱饵主机名混杂在一起。如果你把ME放在第六或者更靠后的位置,一些端口扫描检测软件几乎根本不会显示你的IP地址。如果你不使用ME选项,nmap会把你的IP地址随机夹杂在诱饵主机之中。
注意:你用来作为诱饵的主机应该正在运行或者你只是偶尔向目标发送SYN数据包。很显然,如果在网络上只有一台主机运行,目标将很轻松就会确定是哪台主机进行的扫描。或许,你还要直接使用诱饵的IP地址而不是其域名,这样诱饵网络的域名服务器的日志上就不会留下关于你的记录。
还要注意:一些愚蠢的端口扫描检测软件会拒绝路由试图进行端口扫描的主机。因而,你需要让目标主机和一些诱饵断开连接。如果诱饵是目标主机的网关或者就是其自己时,会给目标主机造成很大问题。所以你需要慎重使用这个选项。
诱饵扫描既可以在起始的ping扫描也可以在真正的扫描状态下使用。它也可以和-O选项组合使用。
使用太多的诱饵扫描能够减缓你的扫描速度甚至可能造成扫描结果不正确。同时,有些ISP会把你的欺骗包过滤掉。虽然现在大多数的ISP不会对此进行限制。
-S
在一些情况下,nmap可能无法确定你的源地址(nmap会告诉你)。在这种情况下,可以使用这个选项给出你的IP地址。
在欺骗扫描时,也使用这个选项。使用这个选项可以让目标认为是其它的主机对自己进行扫描。
-e
告诉nmap使用哪个接口发送和接受数据包。nmap能够自动对此接口进行检测,如果无效就会告诉你。
-g
设置扫描的源端口。一些天真的防火墙和包过滤器的规则集允许源端口为DNS(53)或者FTP-DATA(20)的包通过和实现连接。显然,如果攻击者把源端口修改为20或者53,就可以摧毁防火墙的防护。在使用UDP扫描时,先使用53号端口;使用TCP扫描时,先使用20号端口。注意只有在能够使用这个端口进行扫描时,nmap才会使用这个端口。例如,如果你无法进行TCP扫描,nmap会自动改变源端口,即使你使用了-g选项。
对于一些扫描,使用这个选项会造成性能上的微小损失,因为我有时会保存关于特定源端口的一些有用的信息。
-r
告诉nmap不要打乱被扫描端口的顺序。
--randomize_hosts
使nmap在扫描之前,打乱每组扫描中的主机顺序,nmap每组可以扫描最多2048台主机。这样,可以使扫描更不容易被网络监视器发现,尤其和--scan_delay 选项组合使用,更能有效避免被发现。
-M
设置进行TCP connect()扫描时,最多使用多少个套接字进行并行的扫描。使用这个选项可以降低扫描速度,避免远程目标宕机。
4.3 适时选项
通常,nmap在运行时,能够很好地根据网络特点进行调整。扫描时,nmap会尽量减少被目标检测到的机会,同时尽可能加快扫描速度。然而,nmap默认的适时策略有时候不太适合你的目标。使用下面这些选项,可以控制nmap的扫描timing:
-T
设置nmap的适时策略。Paranoid:为了避开IDS的检测使扫描速度极慢,nmap串行所有的扫描,每隔至少5分钟发送一个包; Sneaky:也差不多,只是数据包的发送间隔是15秒;Polite:不增加太大的网络负载,避免宕掉目标主机,串行每个探测,并且使每个探测有0.4 秒种的间隔;Normal:nmap默认的选项,在不是网络过载或者主机/端口丢失的情况下尽可能快速地扫描;Aggressive:设置5分钟的超时限制,使对每台主机的扫描时间不超过5分钟,并且使对每次探测回应的等待时间不超过1.5秒钟;b>Insane:只适合快速的网络或者你不在意丢失某些信息,每台主机的超时限制是75秒,对每次探测只等待0.3秒钟。你也可是使用数字来代替这些模式,例如:-T 0等于-T Paranoid,-T 5等于-T Insane。
这些适时模式不能下面的适时选项组合使用。
--host_timeout
设置扫描一台主机的时间,以毫秒为单位。默认的情况下,没有超时限制。
--max_rtt_timeout
设置对每次探测的等待时间,以毫秒为单位。如果超过这个时间限制就重传或者超时。默认值是大约9000毫秒。
--min_rtt_timeout
当目标主机的响应很快时,nmap就缩短每次探测的超时时间。这样会提高扫描的速度,但是可能丢失某些响应时间比较长的包。使用这个选项,可以让nmap对每次探测至少等待你指定的时间,以毫秒为单位。
--initial_rtt_timeout
设置初始探测的超时值。一般这个选项只在使用-P0选项扫描有防火墙保护的主机才有用。默认值是6000毫秒。
--max_parallelism
设置最大的并行扫描数量。--max_parallelism 1表示同时只扫描一个端口。这个选项对其它的并行扫描也有效,例如ping sweep, RPC scan。
--scan_delay
设置在两次探测之间,nmap必须等待的时间。这个选项主要用于降低网络的负载。
4.4 目标设定
在nmap的所有参数中,只有目标参数是必须给出的。其最简单的形式是在命令行直接输入一个主机名或者一个IP地址。如果你希望扫描某个IP地址的一个子网,你可以在主机名或者IP地址的后面加上/掩码。掩码在0(扫描整个网络)到32(只扫描这个主机)。使用/24扫描C类地址,/16扫描B类地址。
除此之外,nmap还有更加强大的表示方式让你更加灵活地指定IP地址。例如,如果要扫描这个B类网络128.210.*.*,你可以使用下面三种方式来指定这些地址:128.210.*.*、128.21-.0-255.0-255或者128.210.0.0/16这三种形式是等价的。
5.例子
本节将由浅入深地举例说明如何使用nmap。
nmap -v target.example.com
扫描主机target.example.com的所有TCP端口。-v打开冗余模式。
nmap -sS -O target.example.com/24
发起对target.example.com所在网络上的所有255个IP地址的秘密SYN扫描。同时还探测每台主机操作系统的指纹特征。需要root权限。
nmap -sX -p 22,53,110,143,4564 128.210.*.1-127
对B类IP地址128.210中255个可能的8位子网的前半部分发起圣诞树扫描。确定这些系统是否打开了sshd、DNS、pop3d、imapd和4564端口。注意圣诞树扫描对Micro$oft的系统无效,因为其协议栈的TCP层有缺陷。
nmap -v --randomize_hosts -p 80 *.*.2.3-5
只扫描指定的IP范围,有时用于对这个Internet进行取样分析。nmap将寻找Internet上所有后两个字节是.2.3、.2.4、.2.5的 IP地址上的WEB服务器。如果你想发现更多有意思的主机,你可以使用127-222,因为在这个范围内有意思的主机密度更大。
host -l company.com | cut -d -f 4 | ./nmap -v -iL -
列出company.com网络的所有主机,让nmap进行扫描。注意:这项命令在GNU/Linux下使用。如果在其它平台,你可能要使用 其它的命令/选项。
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和e
ther具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。
其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会
监听所有协议的信息包。
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o
r' ,'||';
这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来
说明。
(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:5
8:af:1a是主机ICE的MAC地址。
(3) TCP包的输出信息
用TCPDUMP捕获的TCP包的一般输出信息是:
src >; dst: flags data-seqno ack window urgent options
src >; dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (F
IN), P (PUSH) , R (RST) "." (没有标记); data-seqno是数据包中的数据的顺序号, ack是
下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针.
Options是选项.
(4) UDP包的输出信息
用TCPDUMP捕获的UDP包的一般输出信息是:
route.port1 >; ice.port2: udp lenth
UDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机ICE的
port2端口,类型是UDP, 包的长度是lenth
Snoop
Snoop 可将捕获的包以一行的形式加以总结或用多行加以详细的描述(有调用不同的参数-v -V来实现). 在总结方式下(-V ) , 将仅显示最高层的相关协议, 例如一个NFS 包将仅显示NFS 信息, 其低层的RPC, UDP, IP, Ethernet 帧信息将不会显示, 但是当加上相应的参数(-v ), 这些信息都能被显示出来.
参数简介:
[ -a ] # Listen to packets on audio
[ -d device ] # settable to le, ie, bf, tr
[ -s snaplen ] # Truncate packets
[ -c count ] # Quit after count packets
[ -P ] # Turn OFF promiscuous mode
[ -D ] # Report dropped packets
[ -S ] # Report packet size
[ -i file ] # Read previously captured packets
[ -o file ] # Capture packets in file
[ -n file ] # Load addr-to-name table from file
[ -N ] # Create addr-to-name table
[ -t r|a|d ] # Time: Relative, Absolute or Delta
[ -v ] # Verbose packet display
[ -V ] # Show all summary lines
[ -p first[,last] ] # Select packet(s) to display
[ -x offset[,length] ] # Hex dump from offset for length
[ -C ] # Print packet filter code
# snoop host1 host2
host1 -> host2 ICMP Echo request
host2 -> host1 ICMP Echo reply
# snoop -a dhcp
# snoop 监听所有以本机为源和目的的包并将其显示出来.
# snoop A 监听所有以主机A为源和目的的包并将其显示出来. ( A为主机名, 下同)
# snoop -o file A B 监听所有A和B之间的包并将其保存到文件file.
查看主机A和主机B之间的NFS 包(命令中的and 和or 为相应的逻辑运算)
# snoop - i file rpc nfs and A and B
1 0.0000 A -> B NFS C GETATTR FH=8E6C
2 0.0046 B -> A NFS R GETATTR OK
3 0.0080 A -> B NFS C RENAME FH=8E6C MTra00192 to .nfs08
# snoop - i file -o file2 rpc nfs A B 将这些符合条件的包保存到另一文件file2 中
# snoop A and B and (tcp or udp) and port 80 监听主机A和主机B间所有TCP 80 端口或UDP80端口的包
# snoop broadcast 监听所有的广播包
Using device /dev/hme (promiscuous mode)
10.10.10.50 -> BROADCAST UDP D=177 S=2541 LEN=35
10.10.10.50 -> BROADCAST UDP D=177 S=2541 LEN=35
10.10.10.50 -> BROADCAST UDP D=177 S=2541 LEN=35
# snoop -v multicast 监听所有的多播包, 并显示详细内容
# snoop |grep - i NTP 监听所有的NTP 协议包
Using device /dev/hme (promiscuous mode)
ts1 -> 224.0.1.1 NTP broadcast (Tue Jul 23 12:48:50 2002)
ts1 -> 224.0.1.1 NTP broadcast (Tue Jul 23 12:49:54 2002)
ts1 -> 224.0.1.1 NTP broadcast (Tue Jul 23 12:50:58 2002)
ts1 -> 224.0.1.1 NTP broadcast (Tue Jul 23 12:52:02 2002)
ts1 -> 224.0.1.1 NTP broadcast (Tue Jul 23 12:53:06 2002)
ts1 -> 224.0.1.1 NTP broadcast (Tue Jul 23 12:54:10 2002)
这里我们也可看到NTP server 每隔约一分钟即向多播地址广播一次.
# snoop -d le0 port 123 指定网口
snoop -d pcelx0
/* Watch all network packets on device pcelx0 */
snoop -o /tmp/mylog pcelx0
/* Saves packets from device pcelx0 to a file */
snoop -i /tmp/mylog host1 host2
/* View packets from logfile between host1 & host2 */
snoop -i /tmp/mylog -v -p101
/* Show all info on packet number 101 from a logfile */
snoop -i /tmp/mylog -o /tmp/newlog host1
/* Write a new logfile with all host1 packets */
snoop -s 120
/* Return the first 120 bytes in the packet header */
snoop -v arp
/* Capture arp broadcasts on your network */
在Solaris系统下,有一个系统内置的网络数据分析和诊断工具snoop,可以抓取以太网中的
数据包进行分析,功能和大名鼎鼎的Tcpdump与Sniffer Pro类似。snoop早在SunOS 4.x
开始就作为SunOS系统的内置命令存在,可惜Unix世界中有优秀的Tcpdump和Ethereal存在
加上Snoop本身的功能比较简单,所以Snoop只能在Solaris的世界中屈居一隅,而且大家对
他也所用甚少,所幸不久前偶竟然发现一个如此强大的Snoop数据分析工具:Chaosreader,
顿然发觉snoop也有了新活力。
先简单回顾一下snoop的命令参数和用法。
snoop本身能够运行在以太网环境下的solaris系统中,然后依靠网卡的混杂模式从网络中读
取流过的所有数据包,当然,这依赖于网络必须是共享式以太网(使用Hub),或者在Switch上
配置SPAN功能把所有流量镜像到snoop所运行的机器。如果网络是运行在除以上两者之外的交
换网络上的话,那么snoop只能够获取到广播数据,以及发往主机自身的数据。
snoop本身支持以太网帧(ethernet frame),TCP|UDP/IP协议,以及之上的一些应用层协
议,例如X,RPC,NFS。大家都知道,作为一个优秀的网络分析工具,必须具备良好的宏观和微
观两方面的分析能力,而Sniffer类的工具,则更突出在他的微观-数据解析和分析能力方面,
这就依赖于工具所能够理解和解析的网络协议(应用协议)类型数量,比如作为网络分析工具无
冕之王的Ethereal就能够理解超过六百种不同的网络协议。这方面恰恰是snoop的劣势所在,
所以传统的snoop仅仅是作为简单的sniffer类工具来使用的,chaosreader恰恰弥补了snoop
在这方面的缺点,同时在Session分析和数据可视化重现方面大大加强了它的功能。
Chaosreader主页:
下载地址:
在Solaris系统里,只要直接运行/usr/sbin/snoop就可以启动一个监听进程:
========================================================================
[tracy@ketty]# /usr/sbin/snoop
Using device /dev/pcn0 (promiscuous mode)
192.168.0.2 -> Katty TELNET C port=1366
Katty -> 192.168.0.2 TELNET R port=1366 Using device /dev/pc
192.168.0.2 -> Katty TELNET C port=1366
192.168.0.2 -> Katty TELNET C port=1368
192.168.0.2 -> Katty TELNET C port=1368
Katty -> 192.168.0.2 TELNET R port=1368
.......(省略telnet协商过程)
Katty -> 192.168.0.2 TELNET R port=1368
192.168.0.2 -> Katty TELNET C port=1368
Katty -> 192.168.0.2 TELNET R port=1368 \377\376\1login:
192.168.0.2 -> Katty TELNET C port=1368
Katty -> 192.168.0.2 TELNET R port=1368
192.168.0.2 -> Katty TELNET C port=1368 e
Katty -> 192.168.0.2 TELNET R port=1368 e
192.168.0.2 -> Katty TELNET C port=1368 l
Katty -> 192.168.0.2 TELNET R port=1368 l
192.168.0.2 -> Katty TELNET C port=1368 l
Katty -> 192.168.0.2 TELNET R port=1368 l
192.168.0.2 -> Katty TELNET C port=1368 y
Katty -> 192.168.0.2 TELNET R port=1368 y
192.168.0.2 -> Katty TELNET C port=1368
192.168.0.2 -> Katty TELNET C port=1368
Katty -> 192.168.0.2 TELNET R port=1368
192.168.0.2 -> Katty TELNET C port=1368
Katty -> 192.168.0.2 TELNET R port=1368 Password:
192.168.0.2 -> Katty TELNET C port=1368
192.168.0.2 -> Katty TELNET C port=1368 e
Katty -> 192.168.0.2 TELNET R port=1368
192.168.0.2 -> Katty TELNET C port=1368 l
Katty -> 192.168.0.2 TELNET R port=1368
192.168.0.2 -> Katty TELNET C port=1368 l
Katty -> 192.168.0.2 TELNET R port=1368
192.168.0.2 -> Katty TELNET C port=1368 y
Katty -> 192.168.0.2 TELNET R port=1368
192.168.0.2 -> Katty TELNET C port=1368
Katty -> 192.168.0.2 TELNET R port=1368
192.168.0.2 -> Katty TELNET C port=1368
Katty -> 192.168.0.2 TELNET R port=1368 Last login: Tue Feb
192.168.0.2 -> Katty TELNET C port=1368
Katty -> 192.168.0.2 TELNET R port=1368 Sun Microsystems Inc
192.168.0.2 -> Katty TELNET C port=1368
192.168.0.2 -> Katty TELNET C port=1368 w
Katty -> 192.168.0.2 TELNET R port=1368 w
192.168.0.2 -> Katty TELNET C port=1368
192.168.0.2 -> Katty TELNET C port=1368
Katty -> 192.168.0.2 TELNET R port=1368
192.168.0.2 -> Katty TELNET C port=1368
Katty -> 192.168.0.2 TELNET R port=1368
192.168.0.2 -> Katty TELNET C port=1368
192.168.0.2 -> Katty TELNET C port=1368 e
Katty -> 192.168.0.2 TELNET R port=1368 e
192.168.0.2 -> Katty TELNET C port=1368
192.168.0.2 -> Katty TELNET C port=1368 x
Katty -> 192.168.0.2 TELNET R port=1368 x
192.168.0.2 -> Katty TELNET C port=1368 i
Katty -> 192.168.0.2 TELNET R port=1368 i
192.168.0.2 -> Katty TELNET C port=1368
192.168.0.2 -> Katty TELNET C port=1368 t
Katty -> 192.168.0.2 TELNET R port=1368 t
192.168.0.2 -> Katty TELNET C port=1368
192.168.0.2 -> Katty TELNET C port=1368
Katty -> 192.168.0.2 TELNET R port=1368
192.168.0.2 -> Katty TELNET C port=1368
Katty -> 192.168.0.2 TELNET R port=1368 logout\r\n
192.168.0.2 -> Katty TELNET C port=1368
Katty -> 192.168.0.2 TELNET R port=1368
========================================================================
在上面这个范例中,我们用snoop监视了一个telnet会话,简要过程如下:
Client Server
1 TCP三步握手
2 Telnet协议协商
3 Username: elly
5 Password: elly
7 发送命令,执行w
9 发送命令,执行exit
11 断开连接
========================================================================
login: elly
Password:
Last login: Tue Feb 15 18:03:14 from 192.168.0.2
Sun Microsystems Inc. SunOS 5.10 Generic January 2005
[elly@Katty]$ w
下午 6点03分 运行 49 分钟 4 用户, 平均负载:0.04, 0.02, 0.14
用户名 终端号 登入时间 闲置 JCPU PCPU 执行命令
root console 下午 5点30分 34 1 /usr/dt/bin/sdt_shell
-c ? u
root pts/2 下午 5点26分 1 1 bash
root pts/5 下午 5点35分 23 bash
elly pts/6 下午 6点02分 snoop
elly pts/7 下午 6点03分 w
[elly@Katty]$ exit
logout
在实际的抓包分析过程中,就不会那么轻松了,因为会有大量你不想看到的干扰信息出现,例如
额外的网络连接,网络中的广播数据包等,这时要看到自己想要的信息简直就像大海捞针一样,
幸好snoop提供了一系列的参数和选项来回避这些无用信息,先看一些常用的选项:
-P 不使用混杂模式,只能获取广播包和到本地主机的数据包
-c [maxCount] 记录最大包数,超过则自动停止
-d [dev] 接受包的设备名(网络接口)
-i [filename] 从文件输入(从一个以前的记录文件而不是网络设备中输入)
-p first[,last] 当从文件输入时,只显示从first指定到last的包
-o [filename] 保存所有数据包输出到文件,格式为RFC 1761-compliant
-q 当记录到文件时,使用安静模式,不回显数据
-N 解析IP地址到主机名(默认使用/etc/hosts作为解析列表)
-r 不解析主机名
-n 指定解析主机名所用的列表文件
-v 冗余模式,显示详细的数据包信息
========================================================================
192.168.0.2 -> Katty ETHER Type=0800 (IP), size = 60 bytes
192.168.0.2 -> Katty IP D=192.168.0.31 S=192.168.0.2 LEN=40,
ID=60866, TOS=0x0, TTL=128
192.168.0.2 -> Katty TCP D=22 S=1315 Ack=624914001 Seq=2987322768
Len=0 Win=65535
========================================================================
除了命令选项以外,snoop还允许通过filter expression过滤模式来对数据包进行析取,以
进行更精确的数据抓取和分析。snoop中expr的格式与Tcpdump基本兼容。
地址
host [hostname] 指定主机名,snoop将只获取此主机(源和目标)的数据包
from 或 src 指定源地址,后面必须跟host或ipaddr指令,将只获取以此地址为源的
数据
to 或 dst 指定目标地址,后面必须跟host或ipaddr指令,将只获取以此地址为目
的的数据
ipaddr 指定IP地址,功能同host
atalkaddr 指定appletalk地址,适用于appletalk协议
etheraddr 指定以太网MAC地址,适用于Ethernet协议
net [net] 指定网络地址,将抓取指定目标网络的数据
port [port] 指定TCP|UDP端口号,将只抓取指定端口的数据,适用于TCP|UDP协议
也可以根据/etc/services文件中指定的协议名字使用字符串
gateway [hostname|IP] 指定网关地址,将只抓取发送到指定网关的数据
协议
inet 指定抓取IPV4协议
inet6 指定抓取IPV6协议
ethertype 抓取指定的Ethernet协议
ip, ip6, arp, rarp, pppoed, pppoes
udp, tcp, icmp, icmp6, ah, esp
分别指定以上类型的协议
pppoe PPPOE协议
broadcast 广播协议
multicast 多播协议
bootp, dhcp bootp和dhcp协议
apple applenet协议
decnet decnet协议
rpc prog [ , vers [ , proc ] ] 对应类型的RPC协议数据
ldap ldap协议
slp slp协议
sctp sctp协议
ospf ospf协议
类型
nofrag 不抓取分片数据包
此外,ether,ip,udp等协议关键字,都可以通过指定对应标志位的方式进行更
详细的控制,例如使用ip[0]指定某一个位的标志。
操作符
在snoop过滤表达式中同样可以使用逻辑表达式来进行控制,对应的功能则与c,perl等
语言中的类似。
and 与
or 或 , 或
not or ! 非
例如:
ipaddr 10.1.1.1 and port 23 抓取10.0.0.1:23的数据
host a or host b 抓取主机a和b的数据
not ipaddr 192.168.0.2 不抓取192.168.0.2的数据
指定 网络接口:/dev/pcn0 , 目标主机: Katty, 目标端口: TCP 23
这将只抓取到Katty的Telnet登录请求,以及所执行的命令。
========================================================================
[Tracy@Katty]# snoop -d pcn0 dst host Katty and tcp port 23
Using device /dev/pcn0 (promiscuous mode)
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380 e
192.168.0.2 -> Katty TELNET C port=1380 l
192.168.0.2 -> Katty TELNET C port=1380 l
192.168.0.2 -> Katty TELNET C port=1380 y
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380 e
192.168.0.2 -> Katty TELNET C port=1380 l
192.168.0.2 -> Katty TELNET C port=1380 l
192.168.0.2 -> Katty TELNET C port=1380 y
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380 w
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380 e
192.168.0.2 -> Katty TELNET C port=1380 x
192.168.0.2 -> Katty TELNET C port=1380 i
192.168.0.2 -> Katty TELNET C port=1380 t
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
192.168.0.2 -> Katty TELNET C port=1380
========================================================================
现在可以看到,客户端的输入依次为
elly (Username)
elly (Password)
w (Command1)
exit (Command2)
Tips: 如果要看更详细的数据信息,只要加上-v参数就可以了哦。
现在对Snoop应该有个基本了解了吧,不过要使用...还是非常困难的,幸好现在有了
Chaosreader。
Chaosreader是一个Snoop数据输出的分析工具,完全Perl写成,因此可以运行在所有支持
Perl的操作系统上。Chaosreader能够支持对TCP/UDP/HTTP/FTP...等等一系列协议的跟
踪和Session解析,甚至能够解析出ftp和http传输的文件,跟踪X-window的动作,对Telnet
的数据进行回放等等。有了Chaosreader,就相当于在Snoop之上加了一双明亮的眼睛,非常
方便。
Chaosreader支持有Tcpdump、snoop和Ethereal输出的数据包记录文件,自动解析之后
会生成一系列文件,包含HTML格式的数据输出文件,协议传输中的图形附件,以及一些用于
进行协议回放的perl脚本。
要使用Chaosreader,有下面几种快捷方法:
tcpdump -w outfile
snoop -o outfile
ethereal (或tethereal)保存cap数据
之后,适用chaosreader.pl outfile对文件进行分析处理,完成后即可在当前目录下生成
一系列输出文件,可以使用任何一个Web浏览器打开index.html进行查看。
如果直接执行 chaosreader -s 5; netscape index.html ,那么chaosreader将自动
运行当前系统中可用的sniffer类程序(自动搜索snoop或tcpdump),然后生成分析文件。
-s参数指定一定时间的抓取时间,以分钟为单位。
在每次分析中,Chaosreader可能会生成如下文件:
index.html Html index (本次抓包统计信息)
index.text Text index
index.file File index for standalone redo mode
image.html HTML report of images
getpost.html HTML report of HTTP GET/POST requests
session_0001.info TCP session #1的相关信息(如果有抓包过程中
包含多个TCP Session,则每个Session都会生
成一系列的Session文件)
session_0001.telnet.html 按时间顺序存放的html格式telnet数据
session_0001.telnet.raw 按时间顺序存档的telnet session数据
session_0001.telnet.raw1 server->client的telnet数据
session_0001.telnet.raw2 client->server的telnet数据
session_0002.web.html 按请求顺序存放的HTTP Session数据
session_0002.part_01.html HTTP portion of the above, a HTML file
session_0003.web.html HTML coloured 2-way
session_0003.part_01.jpeg HTTP portion of the above, a JPEG file
session_0004.web.html HTML coloured 2-way
session_0004.part_01.gif HTTP portion of the above, a GIF file
session_0005.part_01.ftp-data.gz 如果是ftp session,则传输数据存放
在此文件中
...
总结所有的文件类型如下:
session_* TCP Sessions
stream_* UDP Streams
icmp_* ICMP 数据包
index.html HTML Index 文件
index.text Text Index 文件
index.file File Index for standalone redo mode only
image.html HTML report of images
getpost.html HTTP GET/POST 请求记录
*.info Session/Stream的描述信息
*.raw 按时间顺序排列的CS二路原始数据
*.raw1 server->client的原始数据
*.raw2 client->server的原始数据
*.replay Session回放程序,perl脚本,执行将在终端上模拟任务
发生时的状况
*.partial.* Partial capture (tcpdump/snoop were aware of drops)
*.hex.html 2-way Hex dump, rendered in coloured HTML
*.hex.text 2-way Hex dump in plain text
*.X11.replay X-Window回放脚本,必须运行在X-Window下
*.textX11.replay X11通讯的文本模拟回放程序
*.textX11.html 2-way text report, rendered in red/blue HTML
*.keydata SSH通讯中的密钥中继传输数据
先在控制台上开启一个snoop,只记录IP数据:
========================================================================
[Tracy@Katty]# snoop -d pcn0 -o out ip
Using device /dev/pcn0 (promiscuous mode)
358 ^C
========================================================================
之后,我们通过网络分别执行了以下操作:
1. telnet
用户 elly 由192.168.0.2 telnet登录到Katty:23,并执行w,uname -a,exit ;
2. ssh
root 由 192.168.0.2 ssh登录到Katty:22,并执行w,pwd ;
3. http
root在dtconsole(控制台X窗口)上打开Mozilla访问
;
4. ftp
用户elly 由192.168.0.2通过ftp下载文件/etc/passwd;
5. X-Window
用户elly 由192.168.0.2执行xeye -display Katty:0,运行了一个xeye到远程的X桌面。
完成所有操作后,运行Chaosreader分析刚才snoop所记录的网络数据:
========================================================================
[Tracy@Katty]# chaosreader out
Chaosreader ver 0.94
Opening, out
Reading file contents,
100% (58408/58408)
Reassembling packets,
100% (358/358)
Creating files...
Num Session (host:port host:port) Service
0012 192.168.0.31:32925,64.233.189.104:80 web
0005 192.168.0.2:1591,192.168.0.31:21 ftp
0004 192.168.0.31:6000,192.168.0.2:1590 X11
0009 192.168.0.2:1593,192.168.0.31:23 telnet
0001 192.168.0.2:1589,192.168.0.31:22 ssh
0008 192.168.0.2:1592,192.168.0.31:20 ftp-data
0013 10.0.0.1:138,10.255.255.255:138 netbios-dgm
0007 192.168.0.31:33242,202.96.209.6:53 domain
0003 192.168.0.31:33240,202.96.209.6:53 domain
0002 192.168.0.31:33239,202.96.209.6:53 domain
0010 192.168.0.31:33243,202.96.209.6:53 domain
0006 192.168.0.31:33241,202.96.209.6:53 domain
0011 192.168.0.31:33244,202.96.209.6:53 domain
index.html created.
========================================================================
Chaosreader分析snoop的输出文件out,识别出刚才进行过的所有网络连接,包含
web、ftp、X11、telnet、ssh,以及dns和netbios-dgm。其中前五种分别是我们
进行的网络操作,而netbios是windows网络中定期广播产生的干扰数据,domain则
是在访问google时web请求前产生的dns解析请求。
经过分析产生了统计报告index.html和以下文件:
getpost.html Web访问时的get/post请求
httplog.text 文本格式的http访问日志
image.html 空
index.html 索引页面
index.text 文本索引页面
session_0001.textSSH.html ssh连接日志
session_0001.textSSH.keydata ssh key
session_0001.textSSH.replay ssh连接回放脚本
session_0004.X11.replay X-Window Session回放脚本
session_0004.textX11.html
session_0004.textX11.replay
session_0005.ftp.html ftp连接日志
session_0008.part_01.ftp-data.data ftp传输的文件
session_0009.telnet.html telnet连接日志
session_0009.telnet.replay telnet连接回放脚本
session_0012.part_01.html
session_0012.web.html web连接详细日志
stream_0002.domain.html DNS请求
stream_0003.domain.html
stream_0006.domain.html
stream_0007.domain.html
stream_0010.domain.html
stream_0011.domain.html
看一下记录下的详细日志:
ftp: session_0005.ftp.html
========================================================================
ftp: 192.168.0.2:1591 -> 192.168.0.31:21
File out, Session 5
220 Katty FTP server ready.
USER elly
331 Password required for elly.
PASS elly
230 User elly logged in.
CWD /etc
250 CWD command successful.
PORT 192,168,0,2,6,56
200 PORT command successful.
RETR passwd
150 Opening ASCII mode data connection for passwd (628 bytes).
226 Transfer complete.
QUIT
221-You have transferred 644 bytes in 1 files.
221-Total traffic for this session was 985 bytes in 1 transfers.
221-Thank you for using the FTP service on Katty.
221 Goodbye.
========================================================================
另外,在session_0008.part_01.ftp-data.data文件中记录下了本次连接传输的文件副本。
telnet: session_0009.telnet.html
========================================================================
telnet: 192.168.0.2:1593 -> 192.168.0.31:23
File out, Session 9
..%..%..%..%...........%.......&..&..&..&........#..'..$.............P.
....#..'..$..#..'..$........#..'..$....ANSI..........................
login: ...eellllyy
Password: elly
Last login: Tue Feb 15 21:32:09 from 192.168.0.2
Sun Microsystems Inc. SunOS 5.10 Generic January 2005
-bash-3.00$ ww
.... 9..32.. .... 4:18, 3 ...., ..........0.08, 0.18, 0.13
...... ...... ........ .... JCPU PCPU ........
root console .... 9..24.. 8 1 /usr/dt/bin/sdt_shell -c ?
root pts/2 .... 9..31.. 1 -sh
root pts/5 .... 9..25.. 1 snoop -o out ip
elly pts/6 .... 9..32.. w
-bash-3.00$ uunnaammee --aa
SunOS Katty 5.10 Generic i86pc i386 i86pc
-bash-3.00$ eexxiitt
logout
========================================================================
注意,由于telnet的回显协议,所以每个字符都会重复显示一遍,如果要避免这种
情况可以在snoop设置中指定dst参数。
web:
session_0012.part_01.html 记录下了访问的页面镜像;
httplog.text 记录下了访问页面的连接过程;
session_0012.web.html 记录下了访问页面的详细信息;
ssh:
由于ssh连接加密算法协商阶段完成之后,通讯就完全加密了,所以只有部分数据可见。
X-Window:
本身没有记录太多信息,但是生成了一个session_0004.X11.replay脚本,来模拟
回放当时的操作。
另外,telnet连接也生成了一个相应的回放脚本session_0009.telnet.replay。
回放只是模拟当时的操作,并按对应的时间顺序显示出来,并不进行真实的操作,因此
可以放心测试。但是X-Window回放需要注意,因为X的回放是完全真实的操作,有可能
会影响到系统哦。另外,如果X回放无法运行,可以先在当前X桌面上执行xhost +,然
后再运行回放脚本。
总结...Chaosreader的连接重组,协议解析,数据析取,模拟回放功能都是极为强大
的,给原本鸡肋的snoop注入了极大的生命力,另外还提供了对tcpdump、dsniff和
ethereal的支持,的确是网络分析中的一个好工具。
一点Tips:
记住,几乎任何网络抓包工具的数据报都是可以相互转换的(虽然在软件自身可能不兼
容)。Ethereal当前就已经可以支持大多数抓包工具所生成的数据记录文件,而以前我
推荐过的更加强大的Wildpackets ProCovert更是可以转换当前几乎所有抓包软件生
成的数据记录。因此我们可以用一种工具抓包,转换过之后很灵活方便的使用最适合分
析它的软件来进行细化的分析,例如在Windows上用Sniffer Pro,Linux上用TCPDump
SunOS上用Snoop,之后可以任意把它转换成对方的数据类型进行分析,就方便多了吧。
route.port1 >; ice.port2: udp lenth
UDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机
ICE的port2端口,类型是UDP, 包的长度是lenth