刘鹏 北京大学信息科学技术学院软件研究所 网络和信息安全研究室 网络扫描技术 刘鹏 北京大学信息科学技术学院软件研究所 网络和信息安全研究室
内容 TCP/IP基础 网络信息收集 目标探测 网络扫描 查点 从系统中获取有效账号或资源名 网络监听 截获网络上的数据包
安全层次 应用安全 系统安全 网络安全 安全协议 安全的密码算法
TCP/IP基础 网络体系架构 重要协议的数据包格式 IP、ICMP TCP、UDP TCP连接 一些上层协议
网络体系架构 OSI参考模型 TCP/IP模型
TCP/IP协议栈
协议栈各层数据包结构
IP数据包格式
IP首部说明 版本号,目前取值4 首部长度,4个字节为单位,取值范围5~15 服务类型,指定传输的优先级、传输速度、可靠性和吞吐量等 报文总长度,最大长度为65535字节 报文标识,唯一标识一个数据报,如果数据报分段,则每个分段的标识都一样 标志,最高位未使用,定义为0,其余两位为DF(不分段)和MF(更多分段) 段偏移量,以8个字节为单位,指出该分段的第一个数据字在原始数据报中的偏移位置
IP首部说明(续) 生存时间,取值0~255,以秒为单位,每经过一个路由节点减1,为0时被丢弃 协议,指明该数据报的协议类型,1为ICMP,4为IP,6为TCP,17为UDP等 首部校验和,每通过一次网关都要重新计算该值,用于保证IP首部的完整性 选项,长度可变,提供某些场合下需要的控制功能,IP首部的长度必须是4个字节的整数倍,如果选项长度不是4的整数倍,必须填充数据
IP地址 1.0.0.0-127.255.255.255 128.0.0.0-191.255.255.255 192.0.0.0-223.255.255.255 224.0.0.0-239.255.255.255 240.0.0.0-247.255.255.255 保留地址,只用于内部通信: 10.0.0.0 - 10.255.255.255 172.16.0.0 - 172.31.255.255 192.168.0.0 - 192.168.255.255
特殊意义的IP地址 全0的IP地址表示本机 以0作网络号的IP地址表示当前的网络 32比特全为1的IP地址表示局域网的广播地址 127.xx.yy.zz保留做回路(loopback)测试
ICMP协议 Internet Control Message Protocol,本身是IP的一部分,用途 在IP协议栈中必须实现 特点: 用于报告错误 在IP协议栈中必须实现 特点: 其控制能力并不用于保证传输的可靠性 它本身也不是可靠传输的 并不用来反映ICMP报文的传输情况
ICMP数据包 ICMP数据包直接包含在IP数据包的净荷数据中,IP头中协议类型为1
ICMP报文类型 0 Echo Reply 3 Destination Unreachable 4 Source Quench 5 Redirect 8 Echo 11 Time Exceeded 12 Parameter Problem 13 Timestamp 14 Timestamp Reply 15 Information Request 16 Information Reply 17 Address Mask Request 18 Address Mask Reply
ICMP报文分类 ICMP差错报文 ICMP控制报文 ICMP请求/应答报文 其他 目的不可达报文(类型3) 超时报文(类型11) 参数出错报文(类型12) ICMP控制报文 报源抑制报文(类型4) 重定向(类型5) ICMP请求/应答报文 回送请求和响应报文(类型0和8) 时间戳请求和响应报文(类型13和14) 地址掩码请求和响应报文(类型17和18) 其他
ICMP Echo报文 类型:0表示Echo Reply,8表示Echo 代码:0 标识符:标识一个会话,例如,用进程ID 序号:可能这样用:每个请求增1 选项数据:回显
ICMP Time Exceeded报文 类型:11 代码:0表示传输过程中时间到,1表示分片装配过程中时间到 出错的IP包IP首部+原始IP数据包中前8个字节
ICMP Destination Unreachable报文 类型:3 代码:0表示网络不可达,1表示主机不可达; 2表示协议不可达;3表示端口不可达;等等 出错的IP包的IP首部+原始IP数据包中前8个字节
TCP数据包格式
TCP首部说明 源端口号和目的端口号:源和目的主机的IP地址加上端口号构成一个TCP连接 首部长度,以4个字节为单位,通常为20个字节 6个标志位: URG:如果使用了紧急指针,URG置1,紧急指针为当前序号到紧急数据位置的偏移量 ACK:为1表示确认号有效,为0表示该TCP数据包不包含确认信息 PSH:表示是带有PUSH标志的数据,接收到数据后不必等缓冲区满再发送
TCP首部说明(续) 窗口大小:表示在确认字节后还可以发送字节数,用于流量控制 校验和:覆盖了整个数据包,包括对数据包的首部和数据 RST:用于连接复位,也可用于拒绝非法的数据或拒绝连接请求 SYN:用于建立连接,连接请求时SYN=1,ACK=0;响应连接请求时SYN=1,ACK=1 FIN:用于释放连接,表示发送方已经没有供发送的数据 窗口大小:表示在确认字节后还可以发送字节数,用于流量控制 校验和:覆盖了整个数据包,包括对数据包的首部和数据 选项:常见的选项是MSS(Maximum Segment Size)
UDP数据包格式
TCP连接的建立和终止
TCP连接若干要点 TCP/IP的一些实现原则 当一个不包含SYN位的数据包到达一个监听端口时,数据包被丢弃 当一个SYN或者FIN数据包到达一个关闭的端口,TCP丢弃数据包同时发送一个RST数据包 当一个RST数据包到达一个监听端口,RST被丢弃 当一个RST数据包到达一个关闭的端口,RST被丢弃 当一个包含ACK的数据包到达一个监听端口时,数据包被丢弃,同时发送一个RST数据包 当一个不包含SYN位的数据包到达一个监听端口时,数据包被丢弃 当一个SYN数据包到达一个监听端口时,正常的三阶段握手继续,回答一个SYN|ACK数据包 当一个FIN数据包到达一个监听端口时,数据包被丢弃
常用的上层协议 DNS: 53/tcp,udp FTP: 20,21/tcp telnet: 23/tcp HTTP: 80/tcp NNTP: 119/tcp SMTP: 25/tcp POP3: 110/tcp …… 参考:IANA提供的port-numbers.txt
网络攻击的完整过程
信息收集 实时 入侵 检测 漏洞扫描 评估 加固 知己知彼,百战不殆 信息收集技术是一把双刃剑 攻击机制 目标系统 攻击工具 系统漏洞 黑客在攻击之前需要收集信息,才能实施有效的攻击 安全管理员用信息收集技术来发现系统的弱点并进行修补 攻击机制 目标系统 实时 入侵 检测 漏洞扫描 评估 加固 系统漏洞 攻击工具 攻击命令 攻击过程 网络漏洞 目标网络 攻击者 知己知彼,百战不殆
信息收集过程 信息收集(踩点,footprint)是一个综合过程 从一些社会信息入手 找到网络地址范围 找到关键的机器地址 找到开放端口和入口点 找到系统的制造商和版本 ……
攻击者需要的信息 域名 经过网络可以到达的IP地址 每个主机上运行的TCP和UDP服务 系统体系结构 访问控制机制 系统信息(用户名和用户组名、系统标识、路由表、SNMP信息等) 其他信息,如模拟/数字电话号码、认证机制等 ……
社会信息 DNS域名 新闻报道 这样的信息可以合法地获取 网络实名 管理人员在新闻组或者论坛上的求助信息也会泄漏信息 网站的网页中 例如:XX公司采用XX系统,… 这样的信息可以合法地获取
例:来自网站的公开信息
网站上令人感兴趣的信息 机构所在位置 与其关系紧密的公司或实体 电话号码 联系人姓名和电子邮件地址 指示所用安全机制的类型的私密或安全策略 与其相关联的Web服务器链接 此外,尝试查阅HTML源代码
非网络技术的探查手段 社会工程 查电话簿、XX手册(指南) 通过搜索引擎可以获取到大量的信息 通过一些公开的信息,获取支持人员的信任 假冒网管人员,骗取员工的信任(安装木马、修改口令等) 查电话簿、XX手册(指南) 在信息发达的社会中,只要存在,就没有找不到的,是这样吗? 通过搜索引擎可以获取到大量的信息 搜索引擎提供的信息的有效性?(google、AltaVista)
信息收集:whois Whois Client/Server结构 客户程序 为Internet提供目录服务,包括名字、通讯地址、电话号码、电子邮箱、IP地址等信息 Client/Server结构 Client端 发出请求,接受结果,并按格式显示到客户屏幕上 Server端 建立数据库,接受注册请求 提供在线查询服务 客户程序 UNIX系统自带whois程序 Windows也有一些工具 直接通过Web查询
例:Sam Spade工具
各种whois数据来源 http://www.networksolution.com http://www.arin.net 多数Unix提供了whois,fwhois由Chris Cappuccio创建 http://www.ipswitch.com http://www.samspade.org …… 如果需要查询com、net、edu、org以外的域可以查询以下的whois服务器 http://www.ripe.net 欧洲IP地址分配 http://whois.apnic.net 亚太IP地址分配 http://whois.nic.mil 美国军事部门
各种whois数据来源(续) http://whois.nic.gov 美国政府部门 http://whois.nic.gov 美国政府部门 www.allwhois.com 美国以外的whois服务器 通过这些查询可以得到黑客感兴趣的一些信息: 注册机构:显示特定的注册信息和相关的whois服务器; 机构本身:显示与某个特定机构相关的所有信息; 域名:显示与某个特定域名相关的所有信息 网络:显示与某个特定网络或IP地址相关的所有信息; 联系点:显示与某位特定人员(通常是管理方面联系人)相关的所有信息
公共数据库安全对策 考虑使用免费电话或不在本机构电话交换机范围内的电话,避免拨入攻击和社交工程 伪造虚假的管理方面联系人,期望以此捕获潜在的社交工程师 加强注册机构的信息更新方式,可以使用安全的认证机制 弱的认证方式:电子邮件的FROM字段 1998年对AOL的攻击-修改其域名信息
信息收集:DNS查询 关于DNS 熟悉nslookup,就可以把DNS数据库中的信息挖掘出来 是一个全球分布式数据库,对于每一个DNS节点,包含有该节点所在的机器的信息、邮件服务器的信息、主机CPU和操作系统等信息 Nslookup是一个功能强大的客户程序 熟悉nslookup,就可以把DNS数据库中的信息挖掘出来 分两种运行模式 非交互式,通过命令行提交命令 交互式:可以访问DNS数据库中所有开放的信息 UNIX/LINUX环境下的host命令有类似的功能
DNS节点的例子
DNS & nslookup 通过nslookup可以做什么? 从一台域名服务器可以得到哪些信息? 这是为了主DNS和辅DNS之间同步复制才使用的 查看一个域名,根据域名找到该域的域名服务器 反向解析,根据IP地址得到域名名称 从一台域名服务器可以得到哪些信息? 如果支持区域传送,可以从中获取大量信息 否则的话,至少可以发现以下信息 邮件服务器的信息,在实用环境中,邮件服务器往往在防火墙附近,甚至就在同一台机器上 其他,比如ns、www、ftp等,这些机器可能被托管给ISP
nslookup交互环境中常用命令 server, 指定DNS服务器 set type=XXX,设定查询类型 ls, 列出记录 [domain name, or IP address] ……
关于DNS & nslookup的安全 注意的地方 Windows 2000中的DNS 关闭未授权区域传送(zone transfer)功能 或者,在防火墙上禁止53号TCP端口,DNS查询请求使用53号UDP端口 区分内部DNS和外部DNS 内部信息不出现在外部DNS中 DNS中该公开的信息总是要公开的,否则,域名解析的功能就无效了,没有MX记录就不能支持邮件系统 Windows 2000中的DNS 与AD集成在一起,增加了新的功能 SRV记录 动态DNS 在获得灵活性的同时,更加要注意安全
网络勘察 最常用的工具: Ping和Traceroute Ping: Packet InterNet Groper Traceroute 用来判断远程设备可访问性最常用的方法 原理:发送ICMP Echo消息,然后等待ICMP Reply消息 Traceroute 用来发现实际的路由路径 原理:给目标的一个无效端口发送一系列UDP,其TTL依次增一,中间路由器返回一个ICMP Time Exceeded消息 Windows中为tracert
Ping工具 发送ICMP Echo消息,等待Echo Reply消息 每秒发送一个包,显示响应的输出,计算网络来回的时间 可以确定网络和外部主机的状态 可以用来调试网络的软件和硬件 每秒发送一个包,显示响应的输出,计算网络来回的时间 最后显示统计结果——丢包率
关于Ping Ping有许多命令行参数,可以改变缺省的行为 可以用来发现一台主机是否active 为什么不能ping成功? 没有路由,网关设置? 网卡没有配置正确 增大timeout值 被防火墙阻止 …… “Ping of death” 发送特大ping数据包(>65535字节)导致机器崩溃 许多老的操作系统都受影响
traceroute 发送一系列UDP包(缺省大小为38字节),其TTL字段从1开始递增,然后监听来自路径上网关发回来的ICMP Time Exceeded应答消息 UDP包的端口设置为一个不太可能用到的值(缺省为33434),因此,目标会送回一个ICMP Destination Unreachable消息,指示端口不可达
关于traceroute traceroute有一些命令行参数,可以改变缺省的行为 可以用来发现到一台主机的路径,为勾画出网络拓扑图提供最基本的依据 Traceroute允许指定宽松的源路由选项。 许多防火墙是禁止带源路由的包的
指定源路由示例
网络勘察的对策 防火墙:设置过滤规则 使用NIDS(Network Intrusion Detection System):商用以及免费的NIDS(Snort) 使用其他工具:如rotoroutor,它可以记录外来的traceroute请求,产生虚假的应答
信息收集:扫描技术 基于TCP/IP协议,对各种网络服务,无论是主机或者防火墙、路由器都适用 扫描可以确认各种配置的正确性,避免遭受不必要的攻击 用途,双刃剑 安全管理员可以用来确保自己系统的安全性 黑客用来探查系统的入侵点 端口扫描的技术已经非常成熟,目前有大量的商业、非商业的扫描器
扫描器的重要性 扫描器能够暴露网络上潜在的脆弱性 无论扫描器被管理员利用,或者被黑客利用,都有助于加强系统的安全性 它能使得漏洞被及早发现,而漏洞迟早会被发现的 扫描器可以满足很多人的好奇心 扫描器除了能扫描端口,往往还能够 发现系统存活情况,以及哪些服务在运行 用已知的漏洞测试这些系统 对一批机器进行测试,简单的迭代过程 有进一步的功能,包括操作系统辨识、应用系统识别
扫描器历史 早期 SATAN: Security Administrator's Tool for Analyzing Networks 80年代,网络没有普及,上网的好奇心驱使许多年轻人通过Modem拨号进入到UNIX系统中。这时候的手段需要大量的手工操作 于是,出现了war dialer——自动扫描,并记录下扫描的结果 现代的扫描器要先进得多 SATAN: Security Administrator's Tool for Analyzing Networks 1995年4月发布,引起了新闻界的轰动 界面上的突破,从命令行走向图形界面(使用HTML界面),不依赖于X 两位作者的影响(Dan Farmer写过网络安全检查工具COPS,另一位Weitse Venema是TCP_Wrapper的作者) Nmap 作者为Fyodor,技术上,是最先进的扫描技术大集成 结合了功能强大的通过栈指纹来识别操作系统的众多技术
扫描技术 主机扫描:确定在目标网络上的主机是否可达,同时尽可能多映射目标网络的拓扑结构,主要利用ICMP数据包 端口扫描:发现远程主机开放的端口以及服务 操作系统指纹扫描:根据协议栈判别操作系统
传统主机扫描技术 ICMP Echo Request (type 8) 和 Echo Reply (type 0) 通过简单地向目标主机发送ICMP Echo Request 数据包,并等待回复的ICMP Echo Reply 包,如Ping ICMP Sweep(Ping Sweep) 使用ICMP Echo Request一次探测多个目标主机。通常这种探测包会并行发送,以提高探测效率 Broadcast ICMP 设置ICMP请求包的目标地址为广播地址或网络地址,则可以探测广播域或整个网络范围内的主机,这种情况只适合于UNIX/Linux系统 Non-Echo ICMP 其它ICMP服务类型(13和14、15和16、17和18)也可以用于对主机或网络设备如路由器等的探测
高级主机扫描技术 利用被探测主机产生的ICMP错误报文来进行复杂的主机探测 异常的IP包头 在IP头中设置无效的字段值 向目标主机发送包头错误的IP包,目标主机或过滤设备会反馈ICMP Parameter Problem Error信息。常见的伪造错误字段为Header Length 和IP Options。不同厂家的路由器和操作系统对这些错误的处理方式不同,返回的结果也不同。 在IP头中设置无效的字段值 向目标主机发送的IP包中填充错误的字段值,目标主机或过滤设备会反馈ICMP Destination Unreachable信息。这种方法同样可以探测目标主机和网络设备
高级主机扫描技术(续) 通过超长包探测内部路由器 反向映射探测 若构造的数据包长度超过目标系统所在路由器的PMTU且设置禁止分片标志, 该路由器会反馈 Fragmentation Needed and Don’t Fragment Bit was Set差错报文。 反向映射探测 用于探测被过滤设备或防火墙保护的网络和主机 。 构造可能的内部IP地址列表,并向这些地址发送数据包。当对方路由器接收到这些数据包时,会进行IP识别并路由,对不在其服务的范围的IP包发送ICMP Host Unreachable或ICMP Time Exceeded 错误报文,没有接收到相应错误报文的IP地址可被认为在该网络中
主机扫描的对策 使用可以检测并记录ICMP扫描的工具 使用入侵检测系统 在防火墙或路由器中设置允许进出自己网络的ICMP分组类型
端口扫描技术 开放扫描(Open Scanning) 半开放扫描(Half-Open Scanning) 需要扫描方通过三次握手过程与目标主机建立完整的TCP连接 可靠性高,产生大量审计数据,容易被发现 半开放扫描(Half-Open Scanning) 扫描方不需要打开一个完全的TCP连接 秘密扫描(Stealth Scanning) 不包含标准的TCP三次握手协议的任何部分 隐蔽性好,但这种扫描使用的数据包在通过网络时容易被丢弃从而产生错误的探测信息
端口扫描技术 基本的TCP connect()扫描(开放) Reverse-ident扫描(开放) TCP SYN扫描(半开放) IP ID header aka “dump”扫描(半开放) TCP Fin扫描(秘密) TCP XMAS扫描(秘密) TCP ftp proxy扫描(bounce attack) 用IP分片进行SYN/FIN扫描(躲开包过滤防火墙) UDP ICMP端口不可达扫描 UDP recvfrom扫描
TCP connect()扫描 原理 优点 缺点 扫描器调用socket的connect()函数发起一个正常的连接 简单,不需要特殊的权限 如果端口是打开的,则连接成功 否则,连接失败 优点 简单,不需要特殊的权限 缺点 服务器可以记录下客户的连接行为,如果同一个客户轮流对每一个端口发起连接,则一定是在扫描
Reverse-ident扫描 Ident协议(RFC1413)使得可以发现任何一个通过TCP连接的进程的所有者的用户名,即使该进程并没有发起该连接 只有在TCP全连接之后才有效 TCP端口113 例如 可以先连接到80端口,然后通过identd来发现服务器是否在root下运行 建议关闭ident服务,或者在防火墙上禁止,除非是为了审计的目的
TCP SYN扫描 原理 优点 缺点 向目标主机的特定端口发送一个SYN包 由于连接没有完全建立,所以称为“半开连接扫描” 如果应答包为RST包,则说明该端口是关闭的 否则,会收到一个SYN|ACK包。于是,发送一个RST,停止建立连接 由于连接没有完全建立,所以称为“半开连接扫描” 优点 很少有系统会记录这样的行为 缺点 在UNIX平台上,需要root权限才可以建立这样的SYN数据包
IP ID header aka “dump” 扫描 由Antirez首先使用,并在Bugtraq上公布 原理: 扫描主机通过伪造第三方主机IP地址向目标主机发起SYN扫描,并通过观察其IP序列号的增长规律获取端口的状态 优点 不直接扫描目标主机也不直接和它进行连接,隐蔽性较好 缺点 对第三方主机的要求较高
TCP Fin扫描 原理 优点 缺点 扫描器发送一个FIN数据包 变种,组合其他的标记 不是TCP建立连接的过程,所以比较隐蔽 如果端口关闭的,则远程主机丢弃该包,并送回一个RST包 否则的话,远程主机丢弃该包,不回送 变种,组合其他的标记 优点 不是TCP建立连接的过程,所以比较隐蔽 缺点 与SYN扫描类似,也需要构造专门的数据包 在Windows平台无效,总是发送RST包
TCP XMAS扫描 原理 优点 缺点 扫描器发送的TCP包包头设置所有标志位 比较隐蔽 关闭的端口会响应一个同样设置所有标志位的包 开放的端口则会忽略该包而不作任何响应 优点 比较隐蔽 缺点 主要用于UNIX/Linux/BSD的TCP/IP的协议栈 不适用于Windows系统
分片扫描 它本身并不是一种新的扫描方法,而是其他扫描技术的变种,特别是SYN扫描和FIN扫描 思想是,把TCP包分成很小的分片,从而让它们能够通过包过滤防火墙 注意,有些防火墙会丢弃太小的包 而有些服务程序在处理这样的包的时候会出现异常,或者性能下降,或者出现错误
TCP ftp proxy扫描 FTP bounce attack 原理 优点:这种技术可以用来穿透防火墙 用PORT命令让ftp server与目标主机建立连接,而且目标主机的端口可以指定 如果端口打开,则可以传输否则,返回"425 Can't build data connection: Connection refused." Ftp这个缺陷还可以被用来向目标(邮件,新闻)传送匿名信息 优点:这种技术可以用来穿透防火墙 缺点:慢,有些ftp server禁止这种特性
UDP ICMP端口不可达扫描 利用UDP协议(主机扫描?) 原理 缺点 一个应用例子 开放的UDP端口并不需要送回ACK包,而关闭的端口也不要求送回错误包,所以利用UDP包进行扫描非常困难 有些协议栈实现的时候,对于关闭的UDP端口,会送回一个ICMP Port Unreach错误 缺点 速度慢,而且UDP包和ICMP包都不是可靠的 需要root权限,才能读取ICMP Port Unreach消息 一个应用例子 Solaris的rpcbind端口(UDP)位于32770之上,这时可以通过这种技术来探测
UDP recvfrom() & write()扫描 非root用户不能直接读取ICMP Port Unreach消息,但是Linux提供了一种方法可以间接通知到 原理 第二次对一个关闭的UDP端口调用write()总是会失败 经验:在ICMP错误到达之前,在UDP端口上调用recvfrom()会返回EAGAIN(重试),否则会返回ECONNREFUSED(连接拒绝…)
端口扫描的对策 设置防火墙过滤规则,阻止对端口的扫描 使用入侵检测系统 禁止所有不必要的服务,把自己的暴露程度降到最低 例如可以设置检测SYN扫描而忽略FIN扫描 使用入侵检测系统 禁止所有不必要的服务,把自己的暴露程度降到最低 Unix或linux中,在/etc/inetd.conf中注释掉不必要的服务,并在系统启动脚本中禁止其他不必要的服务 Windows中通过Services禁止敏感服务,如IIS
操作系统辨识 操作系统辨识的动机 如何辨识一个操作系统 许多漏洞是系统相关的,而且往往与相应的版本对应 从操作系统或者应用系统的具体实现中发掘出来的攻击手段都需要辨识系统 操作系统的信息还可以与其他信息结合起来,比如漏洞库,或者社会诈骗(社会工程,social engineering) 如何辨识一个操作系统 一些端口服务的提示信息,例如,telnet、http、ftp等服务的提示信息 TCP/IP栈指纹 DNS泄漏出OS系统
端口服务提供的信息 Telnet服务 Http服务 Ftp服务
某大学的ftp进站页面
栈指纹技术 定义:利用TCP/IP协议栈实现上的特点来辨识一个操作系统 技术导向 一些工具 可辨识的OS的种类,包括哪些操作系统 结论的精确度,细微的版本差异是否能识别 一些工具 Checkos, by Shok Queso, by Savage Nmap, by Fyodor
主动栈指纹识别技术 原理:寻找不同操作系统之间在处理网络数据包上的差异,并且把足够多的差异组合起来,以便精确地识别出一个系统的OS版本 配置能力 扩展性,新的OS,版本不断推出 定义一种配置语言或者格式
主动栈指纹识别方法 常用的手段 给一个开放的端口发送FIN包,有些操作系统有回应,有的没有回应 对于非正常数据包的反应 比如,发送一个包含未定义TCP标记的数据包 根据TCP连接的序列号风格 寻找初始序列号之间的规律 ACK值 有些系统会发送回所确认的TCP分组的序列号,有些会发回序列号加1 TCP初始化窗口 有些操作系统会使用一些固定的窗口大小 DF位(Don't Fragment bit ) 某些操作系统会设置IP头的DF位来改善性能
主动栈指纹识别方法(续) 分片处理方式 ICMP协议 TCP选项(RFC793和更新的RFC1323) 分片重叠的情况下,处理会不同:用后到的新数据覆盖先到的旧数据或者反之 ICMP协议 ICMP错误消息的限制 发送一批UDP包给高端关闭的端口,然后计算返回来的不可达错误消息 ICMP端口不可达消息的大小 通常情况下送回IP头+8个字节,但是个别系统送回的数据更多一些 ICMP回应消息中对于校验和的处理方法不同 ICMP回应消息中,TOS域的值 TCP选项(RFC793和更新的RFC1323) 这里充满了各种组合的可能性 应答方式“Query-Reply”,可以把多个选项放到一个包中 有些高级选项在新的协议栈实现中加入
主动栈指纹识别方法(续) SYN flooding 测试
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 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
Nmap的指纹库(续) 例如 Fingerprint Linux kernel 2.2.13 TSeq(Class=RI%gcd=<6%SI=<E5F68C&>24CA0) T1(DF=Y%W=7F53%ACK=S++%Flags=AS%Ops=MENNTNW) 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)
Nmap的指纹库(续) Fingerprint Windows 2000/XP/ME TSeq(Class=RI%gcd=<20%SI=<E92A&>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%Flags=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)
Nmap的指纹库参数说明 1.TSeq: class---指sequence的类型,有如下几种值: C:sequence为常数。 64K:sequence的差值为64000。 800i:sequence的差值为800。 TD:time dependant,sequence的取值与时间相关。 RI:random incremental,sequence随机递增。 TR:ture random,sequence随机取值。 val---仅在class为C时判断,其值为sequence常数。 gcd---sequence差值的最大公约数。仅在class为RI或TD时判断。 SI---nmap在sequence规律不明显时对sequence套用某种算法得到的一个值,仅在class为RI或TD时判断。
linux内核在回应中保持这个标记。有些操作系统在收到这种包会复位连接 Nmap的指纹库参数说明(续) 2.TCP探测(T1-T7): Resp---是否有应答,'Y'或'N'。 DF---分片标志,'Y'或'N'。 W---窗口大小,tcp->th_win。 ACK---应答序列号的类型,有如下几种值: S : ack == syn。 S++ : ack == syn + 1。 O : 其他情况。 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内核在回应中保持这个标记。有些操作系统在收到这种包会复位连接
Nmap的指纹库参数说明(续) 2.TCP探测(T1-T7)(续): 3.UDP探测(pu): Ops---TCP选项,为以下几种值的组合: L :End of List。 N :No Op。 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"。
Nmap的指纹库参数说明(续) 3.UDP探测(pu)(续): RIPCK---返回的"请求IP_checksum",取值为: F:不正确。 UCK---返回的"请求IP_udp_checksum",取值为: ULEN---返回的"请求IP_udp_len"。 DAT---返回包的IP长度与实际长度是否相符,取值为: E:正确。(大多数实现不回送我们的任何UDP包,默认为E)
Nmap识别操作系统的例子
被动栈指纹识别方法 它和主动栈指纹识别方法类似 不是向目标系统发送分组,而是被动监测网络通信,以确定所用的操作系统 如根据TCP/IP会话中的几个属性: TTL 窗口大小 DF TOS Siphon工具,http://siphon.datanerds.net/ osprints.conf
例:被动栈指纹识别方法 telnet 192.168.102.245(发起方为192.168.102.155 ) 利用snort监听到的数据包: 192.168.102.245:23-> 192.168.102.155:2300 TCP TTL:255 TOS:0x0 ID:58955 DF **S***A* Seq:0xD3B709A4 Ack:0xBE09B2B7 Win:0x2798 TCP Options => NOP NOP TS:9688775 9682347 NOP WS:0 MSS:1460 和osprints.conf比较, 可猜测192.168.102.245的操作系统为 Solaris 2.6-2.7
操作系统识别的对策 端口扫描监测工具监视操作系统检测活动 让操作系统识别失效的补丁 防火墙和路由器的规则配置 使用入侵检测系统 修改OS的源代码或改动某个OS参数以达到改变单个独特的协议栈特征的目的 防火墙和路由器的规则配置 使用入侵检测系统
其他扫描方法 延时扫描和分布式扫描 原因:各IDS常采用的检测方法-在某个时间段内特定主机对本地端口的访问频度是否大于事先预定的阈值来判断入侵。 延时扫描是加大各连接之间的时间间隔,逃避检测。 比较有效但是延缓了扫描速度。 分布式扫描解决连接数问题的同时也解决了扫描进度的问题。把扫描任务分配到地理位置和网络拓扑分布的扫描主机上。 同时也解决了大量信息收集时单机扫描面临的主机负载和网络负载过重的问题。
nmap By Fyodor 源码开放,C语言 两篇技术文档 除了扫描功能,更重要的是,可以识别操作系统,甚至是内核的版本 The Art of Port Scanning Remote OS detection via TCP/IP Stack FingerPrinting 除了扫描功能,更重要的是,可以识别操作系统,甚至是内核的版本
Nmap用于扫描
Nmap用于扫描(续)
X-scan
扫描器 ISS (安氏) SATAN Pinger SAINT Portscan SSS Superscan Strobe 流光 X-Scan ……
查点 如果黑客从一开始的目标探测中没有找到任何可以直接利用的入侵途径,他就会转向收集目标有效的用户账号或保护不当的共享资源,这就是查点(enumeration)。 查点要对目标系统进行连接和查询,查点活动有可能会被目标系统记录。 查点通常是针对特定操作系统进行。
查点的信息 攻击者查点时感兴趣的信息类型: 网络资源和共享资源 用户和用户组 服务器程序及其标记(banner)
Windows NT/2000的查点 Windows NT的网络服务依赖于CIFS/SMB(Common Internet File System/Server Message Block)和NetBIOS数据传输协议,很容易泄漏共享信息。Windows 2000也同样具有NT的不安全特性。 Windows提供了很多工具用于管理网络,同时也具有副作用。 NTRK(NT Resource Kit) 2000 Server安装盘的Support\Tools目录
Windows NT/2000空会话 原理 实例 Windows 2000还有另一个SMB端口445 利用Windows NT/2000对NetBIOS的缺省信赖 通过TCP端口139返回主机的大量信息 实例 如果通过端口扫描获知TCP端口139已经打开 net use \\192.168.102.230\IPC$ "" /USER: "" 在攻击者和目标主机间建立连接 Windows 2000还有另一个SMB端口445
NT/2000 NetBIOS网络资源查点 NT/2000中有很多工具可用于提供对网络资源的查询 nbtstat,可以获取NetBIOS远程主机名字表
NT/2000 NetBIOS网络资源查点(续) nbtscan,一次可对多个网络进行查询,弥补了nbtstat一次只能对一台主机进行查询的缺陷
NT/2000 NetBIOS 网络资源查点(续) net view查看域、计算机或计算机共享资源的列表
NT/2000 NetBIOS 网络资源查点工具 两个常用的网络资源查点工具:legion和NAT Legion
NT/2000 NetBIOS 网络资源查点工具 NAT
NT/2000 NetBIOS 网络资源查点工具 NTRK中的网络资源查点工具 nltest、rmtshare、srvcheck、srvinfo、 netdom等 其他网络资源查点工具 epdump、getmac、netviewx、enum、dumpsec等
NT/2000 NetBIOS 用户查点 攻击者对目标主机的用户名和密码更感兴趣 一旦获取用户名,50%的努力花在窃取账号上 用户通常使用弱密码 在查询资源的同时可以查询用户 前面介绍的一些工具,如NAT、enum、dumpsec等 Rudnyi的sid2user和user2sid,从用户名查找SID(Security Identifier)或从SID查找用户名 参看文章“What is a SID ” http://www.windows2000faq.com/Articles/Index.cfm?ArticleID=14781
NT/2000服务器程序及标记查点 连接目标主机的应用程序并根据输出来获取标记 可以确认服务器上运行的软件和版本 常用的方法 telnet和nc(瑞士军刀) c:\telnet 192.168.102.155 80 许多常用服务器程序对某个固定端口作出响应
NT/2000服务器程序及标记查点 nc –v 192.168.102.233 80 在确定了服务器软件的厂商和版本之后,攻击者就可以使用特定平台的技术和方法进行攻击
NT/2000服务器程序及标记查点 注册表查点 通常情况下正常安装在系统上的应用程序都会在注册表中留下信息 注册表中有大量和用户有关的信息 从目的地得到Windows注册表的内容 NT/2000的缺省配置是只允许Administrator访问注册表 HKEY_Local_Machine\SYSTEM\CurrentControlSet\Control\SecurePipeServers\winreg 注册表访问工具:regdump、dumpsec等
NT/2000查点的对策 在路由器、防火墙或其他网络关口设置,不允许对TCP和UDP的135~139端口的访问 2000中,还要禁止445端口。
NT/2000查点的对策 Hkey_Local_Machine\SYSTEM\CurrentControlSet\Control\LSA,增加一个数据项RestrictAnonymous,数据类型为REG_DWORD,NT下数值为1,2000下为2 2000下,“管理工具”中的“本地安全设置”|“本地策略”|“安全选项”中对匿名连接的额外限制(相当于设置RestrictAnonymous为2)
NT/2000查点的对策 对服务程序标记查点的对策: 对具有风险的应用程序,尽可能隐藏其标记中的厂商和版本信息; 定期使用端口扫描和netcat工具连接活动端口进行网络系统检查,确保没有泄露信息 锁定注册表,不能对它进行远程访问
Unix/Linux的查点 Unix/Linux的具体实现依赖于标准的TCP/IP,无法通过传统的NetBIOS获取信息 网络资源查点 showmount,用于查点网络中使用NFS的文件系统(使用端口2049) 网络信息服务NIS 用户查点 finger:自动获取远程主机用户信息的简便方法,finger服务(端口号为79)常运行在不安全的缺省配置上
Unix/Linux的查点 rusers和rwho也可以获取登录到远程主机的用户 SMTP的命令vrfy和expn
Unix/Linux的查点 服务器程序和标记查点 和NT/2000中一样,可以使用telnet和nc进行查点 rpcinfo 通过访问portmapper(端口111)查询服务器程序
Unix/Linux查点的对策 在防火墙或路由器中阻塞对特定端口如(79)的访问 想办法去掉服务程序的标记 尽可能对服务程序进行升级 ……
一个利用空会话进行攻击的实例 利用扫描器得知对方已打开端口139
一个利用空会话进行攻击的实例(续) 考虑用空会话进行远程密码猜测 轻松获取administrator密码1234
一个利用空会话进行攻击的实例(续) 映射驱动器,安装后门nc
一个利用空会话进行攻击的实例(续) 远程启动nc,并添加每日运行计划
网络监听 截获网络上的数据包 监听数据包的技术 Libpcap WinPcap
网络监听 在一个共享式网络,可以听取所有的流量 是一把双刃剑 目前有大量商业的、免费的监听工具,俗称嗅探器(sniffer) 管理员可以用来监听网络的流量情况 开发网络应用的程序员可以监视程序的网络情况 黑客可以用来刺探网络情报 目前有大量商业的、免费的监听工具,俗称嗅探器(sniffer)
以太网络的工作原理 载波侦听/冲突检测(CSMA/CD, carrier sense multiple access with collision detection)技术 载波侦听:是指在网络中的每个站点都具有同等的权利,在传输自己的数据时,首先监听信道是否空闲 如果空闲,就传输自己的数据 如果信道被占用,就等待信道空闲 而冲突检测则是为了防止发生两个站点同时监测到网络没有被使用时而产生冲突 以太网采用了CSMA/CD技术,由于使用了广播机制,所以,所有与网络连接的工作站都可以看到网络上传递的数据
以太网卡的工作模式 网卡的MAC地址(48位) 正常情况下,网卡应该只接收这样的包 网卡完成收发数据包的工作,两种接收模式 通过ARP来解析MAC与IP地址的转换 用ipconfig/ifconfig可以查看MAC地址 正常情况下,网卡应该只接收这样的包 MAC地址与自己相匹配的数据帧 广播包 网卡完成收发数据包的工作,两种接收模式 混杂模式:不管数据帧中的目的地址是否与自己的地址匹配,都接收下来 非混杂模式:只接收目的地址相匹配的数据帧,以及广播数据包(和组播数据包) 为了监听网络上的流量,必须设置为混杂模式
一个简单的sniffer程序
共享网络和交换网络 共享式网络 交换式网络 通过网络的所有数据包发往每一个主机 最常见的是通过HUB连接起来的子网 通过交换机连接网络 由交换机构造一个“MAC地址-端口”映射表 发送包的时候,只发到特定的端口上
共享式网络示意图
应用程序抓包的技术 UNIX系统提供了标准的API支持 Windows平台上通过驱动程序来获取数据包 Packet socket BPF WinPcap
Packet socket 设置混杂(promiscuous)模式 打开一个packet socket 用ioctl()函数可以设置 打开一个packet socket packet_socket = socket(PF_PACKET, int socket_type, int protocol); 以前的做法, socket(PF_INET, SOCK_PACKET, protocol) 不同的UNIX或者Linux版本可能会有不同的函数调用,本质上 打开一个socket(或者通过open打开一个设备) 通过ioctl()或者setsockopt()设置为混杂模式
BPF(Berkeley Packet Filter) BSD抓包法 BPF是一个核心态的组件,也是一个过滤器 Network Tap接收所有的数据包 Kernel Buffer,保存过滤器送过来的数据包 User buffer,用户态上的数据包缓冲区 Libpcap(一个抓包工具库)支持BPF Libpcap是用户态的一个抓包工具 Libpcap几乎是系统无关的 BPF是一种比较理想的抓包方案 在核心态,所以效率比较高, 但是,只有少数OS支持(主要是一些BSD操作系统)
BPF和libpcap
关于libpcap 用户态下的数据包截获 系统独立的API接口,C语言接口 目前最新为1.10版本 广泛应用于: 支持过滤机制,BPF 网络数据收集 安全监控 网络调试 支持过滤机制,BPF Programming with pcap http://www.tcpdump.org/pcap.htm
libpcap介绍 为捕获数据包做准备的几个函数 char *pcap_lookupdev(char *errbuf); 返回一个指向网络设备的指针,这个指针下面用到 pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf); 用来获取一个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,从中读取数据包
Libpcap: 设置filter 设置过滤器用到的函数 int pcap_lookupnet(char *device, bpf_u_int32 *netp, bpf_u_int32 *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) 设置一个过滤器
Libpcap: 捕获数据 捕获数据用到的两个函数 int pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, 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()打开的文件中
Windows平台下的抓包技术 内核本身没有提供标准的接口 通过增加一个驱动程序或者网络组件来访问内核网卡驱动提供的数据包 不同sniffer采用的技术不同 WinPcap是一个重要的抓包工具,它是libpcap的Windows版本
WinPcap WinPcap包括三个部分 packet.dll和Wpcap.dll 第一个模块NPF(Netgroup Packet Filter),是一个虚拟设备驱动程序文件。它的功能是过滤数据包,并把这些数据包原封不动地传给用户态模块,这个过程中包括了一些操作系统特有的代码 第二个模块packet.dll为win32平台提供了一个公共的接口。不同版本的Windows系统都有自己的内核模块和用户层模块。Packet.dll用于解决这些不同。调用Packet.dll的程序可以运行在不同版本的Windows平台上,而无需重新编译 第三个模块 Wpcap.dll是不依赖于操作系统的。它提供了更加高层、抽象的函数。 packet.dll和Wpcap.dll packet.dll直接映射了内核的调用 Wpcap.dll提供了更加友好、功能更加强大的函数调用
WinPcap和NPF
Windows的网络结构 NDIS(Network Driver Interface Specification,网络驱动接口规范)描述了网络驱动与底层网卡之间的接口规范,以及它与上层协议之间的规范 NPF作为一个核心驱动程序而提供的
WinPcap的优势 提供了一套标准的抓包接口 除了与libpcap兼容的功能之外,还有 http://winpcap.polito.it/ 与libpcap兼容,可使得原来许多UNIX平台下的网络分析工具快速移植过来 便于开发各种网络分析工具 除了与libpcap兼容的功能之外,还有 充分考虑了各种性能和效率的优化,包括对于NPF内核层次上的过滤器支持 支持内核态的统计模式 提供了发送数据包的能力 http://winpcap.polito.it/
在交换式网络上监听数据包 1 B打开IP转发功能 A B 2 B发送假冒的arp包给A,声称自己是GW的IP地址 4 B再转发给GW GW 原理:利用dsniff中的arpredirect工具
发送数据包——Libnet 利用Libnet构造数据包并发送出去 关于Libnet 支持多种操作系统平台 提供了50多个C API函数,功能涵盖 内存管理(分配和释放)函数 地址解析函数 各种协议类型的数据包构造函数 数据包发送函数(IP层和链路层) 一些辅助函数,如产生随机数、错误报告等
使用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(…);
Sniffer的反措施 合理的网络分段,在网络中使用网桥和交换机;相互信任的主机处于同一网段 使用加密技术传送敏感数据,如SSH 为了防止ARP欺骗,使用永久的ARP缓存条目 如何检测处于混杂模式的节点 ……
检测处于混杂模式的节点 网卡和操作系统对于是否处于混杂模式会有一些不同的行为,利用这些特征可以判断机器是否运行在混杂模式下 一些检测手段 观测DNS 很多网络监听软件会尝试进行地址反向解析,可以通过观测DNS上是否有明显增多的解析请求 根据操作系统的特征 Linux内核的特性:正常情况下,只处理本机MAC地址或者以太广播地址的包。在混杂模式下,许多版本的Linux内核只检查 数据包中的IP地址以确定是否送到IP堆栈。因此,可以构造无效以太地址而IP地址有效的ICMP ECHO请求,看机器是否返回应答包(混杂模式),或忽略(非混杂模式)。 Windows 9x/NT:在混杂模式下,检查一个包是否为以太广播包时,只看MAC地址前八位是否为0xff。
检测处于混杂模式的节点(续) L0pht的AntiSniff产品,参考它的技术文档 根据网络和主机的性能 根据响应时间:向本地网络发送大量的伪造数据包,然后,看目标主机的响应时间,首先要测得一个响应时间基准和平均值 L0pht的AntiSniff产品,参考它的技术文档
Windows平台下一些sniffer工具 Buttsniffer 简单,不需要安装,可以在Windows NT下运行,适合于后台运作 NetMon 友好的图形界面,分析功能强 NetXRay 界面友好,统计分析功能强,过滤器功能 基于WinPcap的工具 WinDump(tcpdump的Windows版本) Analyzer
Windump
SnifferPro
UNIX/Linux平台下的一些sniffer工具 dsniff linux_sniffer Snort tcpdump sniffit ……
tcpdump
参考资料 书籍 文章 Web站点 “Computer Networks”,中文版《计算机网络》第三版,熊桂喜等 “Hackers Beware”,中文版《黑客——攻击透析与防范 》 戴英侠等 系统安全与入侵检测,清华大学出版社,2002 “Hacking Exposed”,中文版《黑客大曝光》钟向群,杨继张等 文章 Remote OS detection via TCP/IP Stack FingerPrinting,http://www.insecure.org/nmap/nmap-fingerprinting-article.html The Art of Port Scanning, http://www.insecure.org/nmap/nmap_doc.html Web站点 UNIX/Linux Programmer’s Manual WinPcap, http://winpcap.polito.it/default.htm Libnet, http://www.packetfactory.net/Projects/Libnet/ STAT, http://www.cs.ucsb.edu/~rsg/STAT Snort, http://www.snort.org/ http://www.tucows.com/,搜索和下载各种工具