1、网络扫描技术,主讲:程光 东南大学计算机系网络中心 E-mail: ,2,内容,网络信息收集 目标探测 网络扫描 网络监听 截获网络上的数据包,3,信息收集过程,信息收集(踩点,footprint)是一个综合过程 从一些社会信息入手 找到网络地址范围 找到关键的机器地址 找到开放端口和入口点 找到系统的制造商和版本 ,4,攻击者需要的信息,域名 经过网络可以到达的IP地址 每个主机上运行的TCP和UDP服务 系统体系结构 访问控制机制 系统信息(用户名和用户组名、系统标识、路由表、SNMP信息等) 其他信息,如模拟/数字电话号码、认证机制等 ,5,社会信息,DNS域名 网络实名 管理人员在新闻
2、组或者论坛上的求助信息也会泄漏信息 网站的网页中 新闻报道 例如:XX公司采用XX系统, 这样的信息可以合法地获取,6,例:来自网站的公开信息,7,网站上令人感兴趣的信息,机构所在位置 与其关系紧密的公司或实体 电话号码 联系人姓名和电子邮件地址 指示所用安全机制的类型的私密或安全策略 与其相关联的Web服务器链接,此外,尝试查阅HTML源代码,8,非网络技术的探查手段,社会工程 通过一些公开的信息,获取支持人员的信任 假冒网管人员,骗取员工的信任(安装木马、修改口令等) 查电话簿、XX手册(指南) 在信息发达的社会中,只要存在,就没有找不到的,是这样吗? 通过搜索引擎可以获取到大量的信息 搜
3、索引擎提供的信息的有效性?(google、AltaVista),9,信息收集:whois,Whois 为Internet提供目录服务,包括名字、通讯地址、电话号码、电子邮箱、IP地址等信息 Client/Server结构 Client端 发出请求,接受结果,并按格式显示到客户屏幕上 Server端 建立数据库,接受注册请求 提供在线查询服务 客户程序 UNIX系统自带whois程序 Windows也有一些工具 直接通过Web查询,10,各种whois数据来源,http:/ http:/ 多数Unix提供了whois,fwhois由Chris Cappuccio创建 http:/ http:/w
4、ww.samspade.org 如果需要查询com、net、edu、org以外的域可以查询以下的whois服务器 http:/ 欧洲IP地址分配 http:/ 亚太IP地址分配 http:/whois.nic.mil 美国军事部门,11,http:/whois.nic.gov 美国政府部门 美国以外的whois服务器通过这些查询可以得到黑客感兴趣的一些信息: 注册机构:显示特定的注册信息和相关的whois服务器; 机构本身:显示与某个特定机构相关的所有信息; 域名:显示与某个特定域名相关的所有信息 网络:显示与某个特定网络或IP地址相关的所有信息; 联系点:显示与某位特定人员(通常是管理方面
5、联系人)相关的所有信息,各种whois数据来源(续),12,信息收集:DNS查询,关于DNS 是一个全球分布式数据库,对于每一个DNS节点,包含有该节点所在的机器的信息、邮件服务器的信息、主机CPU和操作系统等信息 Nslookup是一个功能强大的客户程序 熟悉nslookup,就可以把DNS数据库中的信息挖掘出来 分两种运行模式 非交互式,通过命令行提交命令 交互式:可以访问DNS数据库中所有开放的信息 UNIX/LINUX环境下的host命令有类似的功能,13,DNS & nslookup,通过nslookup可以做什么? 区域传送:可以列出DNS节点中所有的配置信息 这是为了主DNS和辅
6、DNS之间同步复制才使用的 查看一个域名,根据域名找到该域的域名服务器 反向解析,根据IP地址得到域名名称 从一台域名服务器可以得到哪些信息? 如果支持区域传送,可以从中获取大量信息 否则的话,至少可以发现以下信息 邮件服务器的信息,在实用环境中,邮件服务器往往在防火墙附近,甚至就在同一台机器上 其他,比如ns、www、ftp等,这些机器可能被托管给ISP,14,nslookup交互环境中常用命令,server, 指定DNS服务器 set type=XXX,设定查询类型 ls, 列出记录 domain name, or IP address ,15,16,网络勘察,最常用的工具: Ping和T
7、raceroute Ping: Packet InterNet Groper 用来判断远程设备可访问性最常用的方法 原理:发送ICMP Echo消息,然后等待ICMP Reply消息 Traceroute 用来发现实际的路由路径 原理:给目标的一个无效端口发送一系列UDP,其TTL依次增一,中间路由器返回一个ICMP Time Exceeded消息 Windows中为tracert,17,Ping工具,发送ICMP Echo消息,等待Echo Reply消息 可以确定网络和外部主机的状态 可以用来调试网络的软件和硬件 每秒发送一个包,显示响应的输出,计算网络来回的时间 最后显示统计结果丢包率,
8、18,关于Ping,Ping有许多命令行参数,可以改变缺省的行为 可以用来发现一台主机是否active 为什么不能ping成功? 没有路由,网关设置? 网卡没有配置正确 增大timeout值 被防火墙阻止 “Ping of death” 发送特大ping数据包(65535字节)导致机器崩溃 许多老的操作系统都受影响,19,traceroute,发送一系列UDP包(缺省大小为38字节),其TTL字段从1开始递增,然后监听来自路径上网关发回来的ICMP Time Exceeded应答消息 UDP包的端口设置为一个不太可能用到的值(缺省为33434),因此,目标会送回一个ICMP Destinati
9、on Unreachable消息,指示端口不可达,20,关于traceroute,traceroute有一些命令行参数,可以改变缺省的行为 可以用来发现到一台主机的路径,为勾画出网络拓扑图提供最基本的依据 Traceroute允许指定宽松的源路由选项。 许多防火墙是禁止带源路由的包的,21,网络勘察的对策,防火墙:设置过滤规则 使用NIDS(Network Intrusion Detection System):商用以及免费的NIDS(Snort) 使用其他工具:如rotoroutor,它可以记录外来的traceroute请求,产生虚假的应答,22,信息收集:扫描技术,基于TCP/IP协议,对
10、各种网络服务,无论是主机或者防火墙、路由器都适用 扫描可以确认各种配置的正确性,避免遭受不必要的攻击 用途,双刃剑 安全管理员可以用来确保自己系统的安全性 黑客用来探查系统的入侵点 端口扫描的技术已经非常成熟,目前有大量的商业、非商业的扫描器,23,扫描器的重要性,扫描器能够暴露网络上潜在的脆弱性 无论扫描器被管理员利用,或者被黑客利用,都有助于加强系统的安全性 它能使得漏洞被及早发现,而漏洞迟早会被发现的 扫描器可以满足很多人的好奇心 扫描器除了能扫描端口,往往还能够 发现系统存活情况,以及哪些服务在运行 用已知的漏洞测试这些系统 对一批机器进行测试,简单的迭代过程 有进一步的功能,包括操作
11、系统辨识、应用系统识别,24,扫描技术,主机扫描:确定在目标网络上的主机是否可达,同时尽可能多映射目标网络的拓扑结构,主要利用ICMP数据包 端口扫描:发现远程主机开放的端口以及服务操作系统指纹扫描:根据协议栈判别操作系统,25,传统主机扫描技术,ICMP Echo Request (type 8) 和 Echo Reply (type 0) 通过简单地向目标主机发送ICMP Echo Request 数据包,并等待回复的ICMP Echo Reply 包,如Ping ICMP Sweep(Ping Sweep) 使用ICMP Echo Request一次探测多个目标主机。通常这种探测包会并行
12、发送,以提高探测效率 Broadcast ICMP 设置ICMP请求包的目标地址为广播地址或网络地址,则可以探测广播域或整个网络范围内的主机,这种情况只适合于UNIX/Linux系统 Non-Echo ICMP 其它ICMP服务类型(13和14、15和16、17和18)也可以用于对主机或网络设备如路由器等的探测,26,高级主机扫描技术,利用被探测主机产生的ICMP错误报文来进行复杂的主机探测 异常的IP包头 向目标主机发送包头错误的IP包,目标主机或过滤设备会反馈ICMP Parameter Problem Error信息。常见的伪造错误字段为Header Length 和IP Options
13、。不同厂家的路由器和操作系统对这些错误的处理方式不同,返回的结果也不同。在IP头中设置无效的字段值 向目标主机发送的IP包中填充错误的字段值,目标主机或过滤设备会反馈ICMP Destination Unreachable信息。这种方法同样可以探测目标主机和网络设备,27,高级主机扫描技术(续),通过超长包探测内部路由器 若构造的数据包长度超过目标系统所在路由器的PMTU且设置禁止分片标志, 该路由器会反馈 Fragmentation Needed and Dont Fragment Bit was Set差错报文。反向映射探测 用于探测被过滤设备或防火墙保护的网络和主机 。 构造可能的内部I
14、P地址列表,并向这些地址发送数据包。当对方路由器接收到这些数据包时,会进行IP识别并路由,对不在其服务的范围的IP包发送ICMP Host Unreachable或ICMP Time Exceeded 错误报文,没有接收到相应错误报文的IP地址可被认为在该网络中,28,主机扫描的对策,使用可以检测并记录ICMP扫描的工具 使用入侵检测系统 在防火墙或路由器中设置允许进出自己网络的ICMP分组类型,29,端口扫描技术,开放扫描(Open Scanning) 需要扫描方通过三次握手过程与目标主机建立完整的TCP连接 可靠性高,产生大量审计数据,容易被发现 半开放扫描(Half-Open Scann
15、ing) 扫描方不需要打开一个完全的TCP连接 秘密扫描(Stealth Scanning) 不包含标准的TCP三次握手协议的任何部分 隐蔽性好,但这种扫描使用的数据包在通过网络时容易被丢弃从而产生错误的探测信息,30,端口扫描技术,基本的TCP connect()扫描(开放) Reverse-ident扫描(开放) TCP SYN扫描(半开放) IP ID header aka “dump”扫描(半开放) TCP Fin扫描(秘密) TCP XMAS扫描(秘密) TCP ftp proxy扫描(bounce attack) 用IP分片进行SYN/FIN扫描(躲开包过滤防火墙) UDP ICM
16、P端口不可达扫描 UDP recvfrom扫描,31,TCP connect()扫描,原理 扫描器调用socket的connect()函数发起一个正常的连接 如果端口是打开的,则连接成功 否则,连接失败 优点 简单,不需要特殊的权限 缺点 服务器可以记录下客户的连接行为,如果同一个客户轮流对每一个端口发起连接,则一定是在扫描,32,Reverse-ident扫描,Ident协议(RFC1413)使得可以发现任何一个通过TCP连接的进程的所有者的用户名,即使该进程并没有发起该连接 只有在TCP全连接之后才有效 TCP端口113 例如 可以先连接到80端口,然后通过identd来发现服务器是否在r
17、oot下运行 建议关闭ident服务,或者在防火墙上禁止,除非是为了审计的目的,33,TCP SYN扫描,原理 向目标主机的特定端口发送一个SYN包 如果应答包为RST包,则说明该端口是关闭的 否则,会收到一个SYN|ACK包。于是,发送一个RST,停止建立连接 由于连接没有完全建立,所以称为“半开连接扫描” 优点 很少有系统会记录这样的行为 缺点 在UNIX平台上,需要root权限才可以建立这样的SYN数据包,34,IP ID header aka “dump” 扫描,由Antirez首先使用,并在Bugtraq上公布 原理: 扫描主机通过伪造第三方主机IP地址向目标主机发起SYN扫描,并通
18、过观察其IP序列号的增长规律获取端口的状态 优点 不直接扫描目标主机也不直接和它进行连接,隐蔽性较好 缺点 对第三方主机的要求较高,35,TCP Fin扫描,原理 扫描器发送一个FIN数据包 如果端口关闭的,则远程主机丢弃该包,并送回一个RST包 否则的话,远程主机丢弃该包,不回送 变种,组合其他的标记 优点 不是TCP建立连接的过程,所以比较隐蔽 缺点 与SYN扫描类似,也需要构造专门的数据包 在Windows平台无效,总是发送RST包,36,TCP XMAS扫描,原理 扫描器发送的TCP包包头设置所有标志位 关闭的端口会响应一个同样设置所有标志位的包 开放的端口则会忽略该包而不作任何响应
19、优点 比较隐蔽 缺点 主要用于UNIX/Linux/BSD的TCP/IP的协议栈 不适用于Windows系统,37,分片扫描,它本身并不是一种新的扫描方法,而是其他扫描技术的变种,特别是SYN扫描和FIN扫描 思想是,把TCP包分成很小的分片,从而让它们能够通过包过滤防火墙 注意,有些防火墙会丢弃太小的包 而有些服务程序在处理这样的包的时候会出现异常,或者性能下降,或者出现错误,38,TCP ftp proxy扫描,FTP bounce attack 原理 用PORT命令让ftp server与目标主机建立连接,而且目标主机的端口可以指定 如果端口打开,则可以传输否则,返回“425 Cant
20、build data connection: Connection refused.“ Ftp这个缺陷还可以被用来向目标(邮件,新闻)传送匿名信息 优点:这种技术可以用来穿透防火墙 缺点:慢,有些ftp server禁止这种特性,39,UDP ICMP端口不可达扫描,利用UDP协议(主机扫描?) 原理 开放的UDP端口并不需要送回ACK包,而关闭的端口也不要求送回错误包,所以利用UDP包进行扫描非常困难 有些协议栈实现的时候,对于关闭的UDP端口,会送回一个ICMP Port Unreach错误 缺点 速度慢,而且UDP包和ICMP包都不是可靠的 需要root权限,才能读取ICMP Port
21、Unreach消息 一个应用例子 Solaris的rpcbind端口(UDP)位于32770之上,这时可以通过这种技术来探测,40,UDP recvfrom() & write()扫描,非root用户不能直接读取ICMP Port Unreach消息,但是Linux提供了一种方法可以间接通知到 原理 第二次对一个关闭的UDP端口调用write()总是会失败 经验:在ICMP错误到达之前,在UDP端口上调用recvfrom()会返回EAGAIN(重试),否则会返回ECONNREFUSED(连接拒绝),41,端口扫描的对策,设置防火墙过滤规则,阻止对端口的扫描 例如可以设置检测SYN扫描而忽略FI
22、N扫描 使用入侵检测系统 禁止所有不必要的服务,把自己的暴露程度降到最低 Unix或linux中,在/etc/inetd.conf中注释掉不必要的服务,并在系统启动脚本中禁止其他不必要的服务 Windows中通过Services禁止敏感服务,如IIS,42,操作系统辨识,操作系统辨识的动机 许多漏洞是系统相关的,而且往往与相应的版本对应 从操作系统或者应用系统的具体实现中发掘出来的攻击手段都需要辨识系统 操作系统的信息还可以与其他信息结合起来,比如漏洞库,或者社会诈骗(社会工程,social engineering) 如何辨识一个操作系统 一些端口服务的提示信息,例如,telnet、http、
23、ftp等服务的提示信息 TCP/IP栈指纹 DNS泄漏出OS系统,43,端口服务提供的信息,Telnet服务 Http服务 Ftp服务,44,栈指纹技术,定义:利用TCP/IP协议栈实现上的特点来辨识一个操作系统 技术导向 可辨识的OS的种类,包括哪些操作系统 结论的精确度,细微的版本差异是否能识别 一些工具 Checkos, by Shok Queso, by Savage Nmap, by Fyodor,45,主动栈指纹识别技术,原理:寻找不同操作系统之间在处理网络数据包上的差异,并且把足够多的差异组合起来,以便精确地识别出一个系统的OS版本 配置能力 扩展性,新的OS,版本不断推出 定义
24、一种配置语言或者格式,46,主动栈指纹识别方法,常用的手段 给一个开放的端口发送FIN包,有些操作系统有回应,有的没有回应 对于非正常数据包的反应 比如,发送一个包含未定义TCP标记的数据包 根据TCP连接的序列号风格 寻找初始序列号之间的规律 ACK值 有些系统会发送回所确认的TCP分组的序列号,有些会发回序列号加1 TCP初始化窗口 有些操作系统会使用一些固定的窗口大小 DF位(Dont Fragment bit ) 某些操作系统会设置IP头的DF位来改善性能,47,主动栈指纹识别方法(续),分片处理方式 分片重叠的情况下,处理会不同:用后到的新数据覆盖先到的旧数据或者反之 ICMP协议
25、ICMP错误消息的限制 发送一批UDP包给高端关闭的端口,然后计算返回来的不可达错误消息 ICMP端口不可达消息的大小 通常情况下送回IP头+8个字节,但是个别系统送回的数据更多一些 ICMP回应消息中对于校验和的处理方法不同 ICMP回应消息中,TOS域的值 TCP选项(RFC793和更新的RFC1323) 这里充满了各种组合的可能性 应答方式“Query-Reply”,可以把多个选项放到一个包中 有些高级选项在新的协议栈实现中加入,48,主动栈指纹识别方法(续),SYN flooding 测试 如果发送太多的 伪造SYN包,一些操作系统会停止建立新的连接。许多操作系 统只能处理8 个包。,
26、49,Nmap的指纹库,指纹模板文件:nmap-os-fingerprints.txt 首先定义一组测试,例如,# TEST DESCRIPTION: # Tseq is the TCP sequenceability test # T1 is a SYN packet with a bunch of TCP options to open port # T2 is a NULL packet w/options to open port # T3 is a SYN|FIN|URG|PSH packet w/options to open port # T4 is an ACK to open
27、 port w/options # T5 is a SYN to closed port w/options # T6 is an ACK to closed port w/options # T7 is a FIN|PSH|URG to a closed port w/options # PU is a UDP packet to a closed port,50,Nmap的指纹库(续),例如 Fingerprint Linux kernel 2.2.13 TSeq(Class=RI%gcd=24CA0) T1(DF=Y%W=7F53%ACK=S+%Flags=AS%Ops=MENNTNW)
28、 T2(Resp=N) T3(Resp=Y%DF=Y%W=7F53%ACK=S+%Flags=AS%Ops=MENNTNW) T4(DF=N%W=0%ACK=O%Flags=R%Ops=) T5(DF=N%W=0%ACK=S+%Flags=AR%Ops=) T6(DF=N%W=0%ACK=O%Flags=R%Ops=) T7(DF=N%W=0%ACK=S%Flags=AR%Ops=) PU(DF=N%TOS=C0|A0|0%IPLEN=164%RIPTL=148%RID=E%RIPCK=E%UCK=F%ULEN=134%DAT=E),51,Nmap的指纹库(续),Fingerprint Win
29、dows 2000/XP/ME TSeq(Class=RI%gcd=240) T1(DF=Y%W=40E8|5B8E|FAF0|7FFF%ACK=S+%Flags=AS%Ops=MNWNNT|MNW|M) T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=) T3(Resp=Y%DF=Y%W=40E8|5B8E|FAF0|7FFF%ACK=S+%Flags=AS%Ops=MNWNNT|MNW|M) T4(DF=N%W=0%ACK=O%Flags=R%Ops=) T5(DF=N%W=0%ACK=S+%Flags=AR%Ops=) T6(DF=N%W=0%ACK=O%Fl
30、ags=R%Ops=) T7(DF=N%W=0%ACK=S+%Flags=AR%Ops=) PU(TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E),52,Nmap的指纹库参数说明,1.TSeq: class-指sequence的类型,有如下几种值: C:sequence为常数。 64K:sequence的差值为64000。 800i:sequence的差值为800。 TD:time dependant,sequence的取值与时间相关。 RI:random incremental,sequence随机递增。 TR:ture
31、 random,sequence随机取值。 val-仅在class为C时判断,其值为sequence常数。 gcd-sequence差值的最大公约数。仅在class为RI或TD时判断。 SI-nmap在sequence规律不明显时对sequence套用某种算法得到的一个值,仅在class为RI或TD时判断。,53,Nmap的指纹库参数说明(续),2.TCP探测(T1-T7): Resp-是否有应答,Y或N。 DF-分片标志,Y或N。 W-窗口大小,tcp-th_win。 ACK-应答序列号的类型,有如下几种值: S : ack = syn。 S+ : ack = syn + 1。 O : 其他
32、情况。 Flags-tcp控制位,为以下几种值的组合: B : Bogus (64, not a real TCP flag)。 U : Urgent。 A : Acknowledgement。 P : Push。 R : Reset。 S : Synchronize。 F : Final。,在SYN包的tcp头中设置bogus 标记,版本号2.0.35之前的 linux内核在回应中保持这个标记。有些操作系统在收到这种包会复位连接,54,Nmap的指纹库参数说明(续),2.TCP探测(T1-T7)(续): Ops-TCP选项,为以下几种值的组合: L :End of List。 N :No O
33、p。 M :MSS。 E :返回的MSS与请求的MSS相同。 W :Window Scale。 T :Timestamp。 3.UDP探测(pu): Resp-是否有应答,Y或N。 DF-分片标志,Y或N。 TOS-服务类型域的值。 IPLEN-返回包的IP长度。 RIPTL-返回的“请求IP长度“。 RID-返回的“请求IP_ID“。,55,Nmap的指纹库参数说明(续),3.UDP探测(pu)(续): RIPCK-返回的“请求IP_checksum“,取值为: 0:checksum为0。 E:正确。 F:不正确。 UCK-返回的“请求IP_udp_checksum“,取值为: 0:chec
34、ksum为0。 E:正确。 F:不正确。 ULEN-返回的“请求IP_udp_len“。 DAT-返回包的IP长度与实际长度是否相符,取值为: E:正确。(大多数实现不回送我们的任何UDP包,默认为E) F:不正确。,56,被动栈指纹识别方法,它和主动栈指纹识别方法类似 不是向目标系统发送分组,而是被动监测网络通信,以确定所用的操作系统 如根据TCP/IP会话中的几个属性: TTL 窗口大小 DF TOS Siphon工具,http:/ osprints.conf,57,操作系统识别的对策,端口扫描监测工具监视操作系统检测活动 让操作系统识别失效的补丁 修改OS的源代码或改动某个OS参数以达到
35、改变单个独特的协议栈特征的目的 防火墙和路由器的规则配置 使用入侵检测系统,58,其他扫描方法,延时扫描和分布式扫描 原因:各IDS常采用的检测方法在某个时间段内特定主机对本地端口的访问频度是否大于事先预定的阈值来判断入侵。 延时扫描是加大各连接之间的时间间隔,逃避检测。 比较有效但是延缓了扫描速度。 分布式扫描解决连接数问题的同时也解决了扫描进度的问题。把扫描任务分配到地理位置和网络拓扑分布的扫描主机上。 同时也解决了大量信息收集时单机扫描面临的主机负载和网络负载过重的问题。,59,nmap,By Fyodor 作者研究了诸多扫描器,每一种扫描器都有自己的优点,它把所有这些技术集成起来,写成
36、了nmap 源码开放,C语言 两篇技术文档 The Art of Port Scanning Remote OS detection via TCP/IP Stack FingerPrinting 除了扫描功能,更重要的是,可以识别操作系统,甚至是内核的版本,60,Nmap用于扫描,61,网络监听,截获网络上的数据包 监听数据包的技术 Libpcap WinPcap,62,网络监听,在一个共享式网络,可以听取所有的流量 是一把双刃剑 管理员可以用来监听网络的流量情况 开发网络应用的程序员可以监视程序的网络情况 黑客可以用来刺探网络情报 目前有大量商业的、免费的监听工具,俗称嗅探器(sniffe
37、r),63,以太网络的工作原理,载波侦听/冲突检测(CSMA/CD, carrier sense multiple access with collision detection)技术 载波侦听:是指在网络中的每个站点都具有同等的权利,在传输自己的数据时,首先监听信道是否空闲 如果空闲,就传输自己的数据 如果信道被占用,就等待信道空闲 而冲突检测则是为了防止发生两个站点同时监测到网络没有被使用时而产生冲突 以太网采用了CSMA/CD技术,由于使用了广播机制,所以,所有与网络连接的工作站都可以看到网络上传递的数据,64,以太网卡的工作模式,网卡的MAC地址(48位) 通过ARP来解析MAC与IP
38、地址的转换 用ipconfig/ifconfig可以查看MAC地址 正常情况下,网卡应该只接收这样的包 MAC地址与自己相匹配的数据帧 广播包 网卡完成收发数据包的工作,两种接收模式 混杂模式:不管数据帧中的目的地址是否与自己的地址匹配,都接收下来 非混杂模式:只接收目的地址相匹配的数据帧,以及广播数据包(和组播数据包) 为了监听网络上的流量,必须设置为混杂模式,65,共享网络和交换网络,共享式网络 通过网络的所有数据包发往每一个主机 最常见的是通过HUB连接起来的子网交换式网络 通过交换机连接网络 由交换机构造一个“MAC地址-端口”映射表 发送包的时候,只发到特定的端口上,66,应用程序抓
39、包的技术,UNIX系统提供了标准的API支持 Packet socket BPFWindows平台上通过驱动程序来获取数据包 驱动程序 WinPcap,67,Packet socket,设置混杂(promiscuous)模式 用ioctl()函数可以设置 打开一个packet socket packet_socket = socket(PF_PACKET, int socket_type, int protocol); 以前的做法, socket(PF_INET, SOCK_PACKET, protocol) 不同的UNIX或者Linux版本可能会有不同的函数调用,本质上 打开一个socket
40、(或者通过open打开一个设备) 通过ioctl()或者setsockopt()设置为混杂模式,68,BPF(Berkeley Packet Filter),BSD抓包法 BPF是一个核心态的组件,也是一个过滤器 Network Tap接收所有的数据包 Kernel Buffer,保存过滤器送过来的数据包 User buffer,用户态上的数据包缓冲区 Libpcap(一个抓包工具库)支持BPF Libpcap是用户态的一个抓包工具 Libpcap几乎是系统无关的 BPF是一种比较理想的抓包方案 在核心态,所以效率比较高, 但是,只有少数OS支持(主要是一些BSD操作系统),69,关于libp
41、cap,用户态下的数据包截获 系统独立的API接口,C语言接口 目前最新为1.10版本 广泛应用于: 网络数据收集 安全监控 网络调试 支持过滤机制,BPF Programming with pcap http:/www.tcpdump.org/pcap.htm,70,libpcap介绍,为捕获数据包做准备的几个函数char *pcap_lookupdev(char *errbuf); 返回一个指向网络设备的指针,这个指针下面用到 pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *eb
42、uf); 用来获取一个packet capture descriptor;snaplen指定了抓取数据包的最大长度 pcap_dumper_t *pcap_dump_open(pcap_t *p, char *fname); 打开一个savefile文件,用于dump pcap_t *pcap_open_offline(char *fname, char *ebuf); 打开一个savefile,从中读取数据包,71,Libpcap: 设置filter,设置过滤器用到的函数 int pcap_lookupnet(char *device, bpf_u_int32 *netp, bpf_u_in
43、t32 *maskp, char *errbuf) 获得与网络设备相关的网络号和掩码int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask) 把字符串str编译成一个过滤器程序int pcap_setfilter(pcap_t *p, struct bpf_program *fp) 设置一个过滤器,72,Libpcap: 捕获数据,捕获数据用到的两个函数 int pcap_dispatch(pcap_t *p, int cnt, pcap_handler c
44、allback, u_char *user) int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user) 参数含义: cnt指定了捕获数据包的最大数目 pcap_handler是一个回调函数 二者区别在于pcap_loop不会因为read操作超时而返回。 另一个函数:void pcap_dump(u_char *user, struct pcap_pkthdr *h, u_char *sp) 把数据包写到一个由pcap_dump_open()打开的文件中,73,Windows平台下的抓包,内核本身没有提供标准的接
45、口 通过增加一个驱动程序或者网络组件来访问内核网卡驱动提供的数据包 在Windows不同操作系统平台下有所不同 不同sniffer采用的技术不同 WinPcap是一个重要的抓包工具,它是libpcap的Windows版本,74,WinPcap,WinPcap包括三个部分 第一个模块NPF(Netgroup Packet Filter),是一个虚拟设备驱动程序文件。它的功能是过滤数据包,并把这些数据包原封不动地传给用户态模块,这个过程中包括了一些操作系统特有的代码 第二个模块packet.dll为win32平台提供了一个公共的接口。不同版本的Windows系统都有自己的内核模块和用户层模块。Pa
46、cket.dll用于解决这些不同。调用Packet.dll的程序可以运行在不同版本的Windows平台上,而无需重新编译 第三个模块 Wpcap.dll是不依赖于操作系统的。它提供了更加高层、抽象的函数。 packet.dll和Wpcap.dll packet.dll直接映射了内核的调用 Wpcap.dll提供了更加友好、功能更加强大的函数调用,75,WinPcap的优势,提供了一套标准的抓包接口 与libpcap兼容,可使得原来许多UNIX平台下的网络分析工具快速移植过来 便于开发各种网络分析工具 除了与libpcap兼容的功能之外,还有 充分考虑了各种性能和效率的优化,包括对于NPF内核层
47、次上的过滤器支持 支持内核态的统计模式 提供了发送数据包的能力 http:/winpcap.polito.it/,76,在交换式网络上监听数据包,ARP重定向技术,一种中间人攻击,GW,1 B打开IP转发功能,2 B发送假冒的arp包给A,声称自己是GW的IP地址,3 A给外部发送数据,首先发给B,4 B再转发给GW,原理:利用dsniff中的arpredirect工具,A,B,77,发送数据包Libnet,利用Libnet构造数据包并发送出去 关于Libnet 支持多种操作系统平台 提供了50多个C API函数,功能涵盖 内存管理(分配和释放)函数 地址解析函数 各种协议类型的数据包构造函数
48、 数据包发送函数(IP层和链路层) 一些辅助函数,如产生随机数、错误报告等,78,使用Libnet的基本过程,数据包内存初始化 网络接口初始化 构造所需的数据包 计算数据包的校验和 发送数据包 关闭网络接口 释放数据包内存,libnet_init_packet(); libnet_open_raw_sock(); libnet_build_ip(); libnet_build_tcp(); libnet_do_checksum(); libnet_write_ip(); libnet_close_raw_sock(); libnet_destroy_packet();,79,Sniffer的反措施,合理的网络分段,在网络中使用网桥和交换机;相互信任的主机处于同一网段 使用加密技术传送敏感数据,如SSH 为了防止ARP欺骗,使用永久的ARP缓存条目 如何检测处于混杂模式的节点 ,80,UNIX/Linux平台sniffer工具,dsniff linux_sniffer Snort tcpdump sniffit ,