网络扫描技术是一种针对Internet远程目标网络或本地主机进行判断的技术,该技术在主机安全性、漏洞的判断、服务发现、设备监控等领域都有具体的应用。本书概述了网络扫描技术的概念、原理和分类,并用实例讲解了几种扫描器的设计方法和使用场景,例如:TCP/UDP端口、NETBIOS、SNMP、应用服务、ICMP扫描器,最后还给出了防扫描器的研究成果。本书适合网络开发人员、安全技术人员参考,也适合所有想了解网路扫描技术的学生、教师以及安全技术爱好者。
网络扫描技术是一类重要的网络安全技术。通过对网络的扫描,网络管理员可以了解网络的安全配置和运行的应用服务缺陷,赶在黑客攻击之前发现安全漏洞,客观评估网络风险等级,随后根据扫描的结果弥补网络安全漏洞,更正系统中的错误配置。如果说防火墙和网络监控系统是被动的防御手段,那么网络扫描就是一种主动的排查措施,可以有效减少黑客攻击成功的概率,做到防患于未然。
本书全面系统地介绍网络扫描技术的概念、原理和分类,用实例讲解了各种扫描器的设计方法,涉及ICMP、SNMP、SSDP、HTTP、FTP、Telnet等与网络安全息息相关的协议内容,最后给出了防扫描技术的研究成果。本书所有实例都直接来自实战操作,并且所有扫描器均提供源代码工程文件,可帮助读者快速上手,设计出自己需要的扫描器。
本书最大的特点就是几乎囊括了当前所有的扫描方式,而每一种方式又是八仙过海,各显神通。这些扫描方式包括:
ICMP扫描:快速ICMP扫描可以扫描出哪些主机是运行的,进而初步预测一下对方的操作系统类型。这便于在某一不熟悉的网段中快速定位哪些主机可以作为下一步的扫描对象。
端口扫描:以快速、非顺序的扫描算法高效率地扫出对方TCP/UDP端口的状态。相对于后续的扫描,端口扫描通常是网络攻击的第一步。
NetBIOS扫描:扫描出对方的组名、用户名、目录,甚至是密码。如果有幸扫出对方管理员的密码,那随后的操作和使用自己的计算机差别就不大了。
SNMP扫描:只要对方提供SNMP协议的支持,那么你在本地任务管理器中能看到什么,就能在对方任务管理器中看到什么。
基于协议和基于应用的扫描:该扫描的最大优势就是发现对方提供的服务类型,对于常规的WWW、FTP、Telnet服务,一切尽收眼底,为后面的漏洞扫描搜集素材。
漏洞扫描:漏洞扫描的主要目的就是发现漏洞、实现攻击,其作用不言而喻。
命名管道扫描:作为一种冷僻的扫描方式,自然有其独特的使用领域,对于一些专有的场景,正是该扫描方式大显身手的场所,也许别人花费九牛二虎之力完成的任务,在这里只是探囊取物。
服务发现扫描:服务发现扫描是“温柔一刀”,因为这种扫描方式不用背负黑客工具的神秘名声,完全可以作为一个受欢迎的网络管理工具。
总之,系统主机五花八门,而扫描的方式也是多种多样,无论怎样的系统,总能找到合适的扫描方式。
光盘内容:端口扫描、SNMP扫描、NetBIOS扫描、ICMP扫描、服务扫描、应用扫描、命名管道扫描、服务发现扫描、漏洞扫描,以及反扫描技术等各种扫描器的全部源代码……包含多达25个扫描器的工程文件代码。
网络安全是一个永恒的话题。中国是一个早在五千年前就发现面对困难时“堵”不如“疏”的伟大国家,面对网络安全也是一样,与其“讳疾忌医”,不如“坦然面对”。
网络扫描是一切网络攻击的基础,也是检测自身安全防护系统的有效方法。因此,网络管理员和安全技术人员完全有必要掌握端口、服务等概念和技术,并利用扫描技术扫描自身系统,通过对扫描结果的判断,关闭无实质性作用的端口或服务,而对于必须开放的端口和服务,则尽可能地安装其漏洞补丁程序。
李瑞民 工学博士,资深网络安全专家兼高级系统架构师,多年来一直专注于计算机安全技术、网络设备与信号监控等领域的研究与应用,对网络扫描技术以及串口监控、网口监控等设备类监控技术有深刻的认识,并在实践中总结出了串口通信中的嗅探技术以及通用串口协议语法。曾参与多个网络应用软件项目的研发,涉及网络安全、广播电视、通信等多个行业。曾发表论文二十余篇,拥有专利和著作权六项。此外,还积极倡导和推动开源事业,将自己精心编写的扫描器代码全部开源,旨在推动我国软件事业的发展。
计算机网络的普及,使人们越来越关注网络的安全。而网络安全又取决于网络管理员和网络用户对网络的了解,这种了解不仅包括如何使用网络应用程序,还包括网络的配置甚至网络的技术细节。
网络中,协议是任意两台主机之间进行通信的前提和始终贯彻的原则。因此本书首先在第1章中对网络扫描的概念、原理、目的、算法、历史进行了综述,然后在第2章着眼于现在网络,特别是互联网中网络协议的意义,以及如何通过协议进行编程,由浅入深,逐步分析了网络协议的各项技术细节。
网络服务是一台主机对外开放的最终目的,而端口又是服务的对外窗口。因此以前很多人对网络扫描的理解就是端口扫描。端口直接与服务对应的关系,使得端口越来越成为人们关注的目标,打开一种服务就意味着打开了一个或几个端口,同时也打开了一扇“大门”,因此在第3章中,对端口扫描进行了全面详细的论述。
协议不同,对端口的扫描也不同,因此在随后的第4、5、6章中,分别介绍了基于NetBIOS、SNMP、ICMP扫描的协议、原理、扫描器实现方法等细节。
网络服务必然存在端口,但由于端口本身不具有强制性,所以即使扫描到端口,也不意味着必然对应某一服务,因此端口扫描只能作为初判,服务扫描才是真正判断对方是否提供某服务的最终方式。在第7章中,详细地介绍了完全基于服务的扫描方式,主要有WWW服务、FTP服务、Telnet服务、E-mail服务等应用层服务。这些服务极具扫描的普遍性,可以说,有了针对这些服务的扫描器设计框架和设计思路,任何一个新协议、新服务都可以用此方法做出相应的扫描器。在第8章中,介绍了另一种基于应用的扫描方式,在这里,除了WWW服务、FTP服务之外,还包括了对网络资源的扫描。这种扫描由于使用了应用层的API,所以程序简捷、透明性强,但对底层的控制不多。
在第9、10两章中,介绍了几种特殊应用领域的扫描方式:命名管道扫描器和服务发现扫描器。这两种扫描器是较新的技术,并且可以使网络扫描从仅限于安全领域内的应用,转换到生活领域内的应用。
第11章的漏洞扫描器则是对网络中存在的漏洞进行扫描,从而发现漏洞以及漏洞的位置。这种扫描方式具有很大的实用性,但这类漏洞扫描器的编制有一定的难度,且具有较强的时效性。
第12章介绍扫描防范技术,通过这些技术,可以检测或防止别人对主机本身或网络进行扫描。
为了统一形式,书中在介绍各扫描器时都先介绍协议,使读者对该协议有个初步的了解。然后对其API,特别是扫描器中要使用的API函数进行详细介绍,使读者知道该扫描器要实现的各种技术细节。再针对Windows中该协议程序的安装、配置、测试和验证进行详述,使读者有演习场地。最后是扫描器的编程实例。采用这种循序渐进、逐步深入的方式,读者不仅能深入全面地了解扫描器细节,也能在遇到新情况时举一反三,对代码进行修改或调整。
在全书的组织上,虽然按技术人为地分了很多章,但实际上各章内容则是你中有我,我中有你,相互解释,相互引用,建议读者先读第1、2章,第3~10章则可以按需要酌情选读,最后再看第11、12章。
纵观这些扫描器系统及扫描监测、防护系统,无论是“攻”,还是“防”,都不取决于程序的设计程度,而是取决于使用程序的人。对于黑客,会利用攻方系统刺探、入侵别人的系统,用防方系统保护自己不被发现或刺探;而对于网络普通用户或网络管理员,则要通过攻方系统扫描自身缺点,防患于未然,同时利用防方系统及时发现别人的扫描操作。再安全的系统,都有漏洞,再全面的技术,都有不足,真正的网络安全,需要丰富的安全常识和强烈的安全意识。
全书中的说明和编程实例均以Microsoft Windows XP(SP3)作为默认的操作系统、以Microsoft Visual C++ 6.0(SP6)作为默认的开发环境。
本书附带光盘,内容包括本书所有程序的源码工程文件,以及个别程序所需的必要支持文件。
声明
本书、光盘所有例程,其源码部分版权归本书作者。本书、光盘(包括由例程编译生成的可执行文件)的源码、可执行文件不得用于以下目的:
q 商业销售。
q 网站下载。
q 攻击任意对方未授权的网站。
计算机科学及应用
网络扫描技术是一类重要的网络安全技术。通过对网络的扫描,网络管理员可以了解网络的安全配置和运行的应用服务缺陷,赶在黑客之前发现安全漏洞,客观评估网络风险等级。随后根据扫描的结果弥补网络安全漏洞和更正系统中的错误配置。如果说防火墙和网络监控系统是被动的防御手段,那么网络扫描就是一种主动的排查措施,可以有效避免黑客攻击行为,做到防患于未然。
网络扫描技术主要基于TCP/IP协议、NetBIOS协议,对各种主流网络服务,无论是主机或者防火墙、路由器都适用。同时,扫描可以确认各种配置的正确性,避免遭受不必要的攻击。网络扫描是一把双刃剑,对于安全管理员来说,可以用来验证自己系统的安全性,也能被黑客用来搜索对方系统的入侵点。扫描器的重要性体现在:暴露网络上潜在的漏洞,通过对脆弱性的分析,使得漏洞被及早发现、发现系统存活情况以及哪些服务在运行、用已知的漏洞测试这些系统、对一批机器进行测试、操作系统或应用系统的识别。
本书概述了网络扫描技术的概念、原理和分类,用实例讲解了几种扫描技术,并通过扫描器的设计方法验证此理论,最后还给出了防扫描技术的研究成果。本书是网络安全技术人员的技术书籍。
李瑞民 著:暂无简介
前 言
第 1 章 绪论 / 1
1.1 网络安全的概念 / 1
1.2 网络扫描的概念 / 2
1.2.1 服务和端口 / 2
1.2.2 网络扫描 / 4
1.3 网络扫描原理概述 / 5
1.4 扫描编程与客户端编程的区别 / 5
1.5 网络扫描的目的 / 5
1.6 网络扫描算法 / 6
1.6.1 非顺序扫描 / 6
1.6.2 高速扫描 / 8
1.6.3 分布式扫描 / 8
1.6.4 服务扫描 / 8
1.6.5 指纹识别算法 / 8
1.6.6 漏洞扫描 / 9
1.6.7 间接扫描 / 9
1.6.8 秘密扫描 / 9
1.6.9 认证扫描 / 10
1.6.10 代理扫描 / 10
1.6.11 手工扫描 / 10
1.6.12 被动扫描 / 10
1.7 网络扫描器的分类 / 11
1.8 网络扫描技术的发展史 / 12
1.8.1 手工扫描阶段 / 12
1.8.2 使用通用扫描器阶段 / 13
1.8.3 设计专用扫描器阶段 / 14
1.9 扫描器的限制 / 14
1.10 当前网络常见的漏洞 / 14
1.10.1 DOS和DDOS / 15
1.10.2 缓冲区溢出 / 15
1.10.3 注入式攻击 / 17
1.10.4 明文传输 / 17
1.10.5 简单密码 / 18
第 2 章 网络协议和网络编程例程 / 19
2.1 常用的网络编程 / 19
2.1.1 TCP/IP协议编程 / 20
2.1.2 NetBIOS/NetBEUI协议编程 / 41
2.1.3 Win Inet高层编程 / 47
2.1.4 命名管道和邮槽高层编程 / 48
2.2 扫描器中公用编程示例 / 49
2.2.1 CTreeCtrl控件的应用 / 49
2.2.2 CListCtrl控件的应用 / 51
2.2.3 INI文件的操作 / 53
2.2.4 数据库ADO的简单应用 / 56
2.2.5 IP格式的互换 / 59
2.2.6 Windows操作系统类型的判断 / 62
2.2.7 多线程的局限性和使用方式 / 63
2.2.8 VC++下Windows Socket的使用 / 66
2.2.9 网卡的混杂模式 / 69
2.3 嵌入外部程序 / 71
2.3.1 可执行外部程序的几个函数 / 71
2.3.2 编程实例:使用重定向接收外部程序运行结果 / 76
2.3.3 编程实例:使用管道接收外部程序运行结果 / 80
第 3 章 TCP/UDP端口扫描器的设计 / 85
3.1 端口扫描的概念 / 85
3.1.1 端口的概念 / 85
3.1.2 端口扫描原理 / 87
3.2 端口扫描技术 / 87
3.2.1 网络通信实例分析 / 87
3.2.2 TCP扫描 / 90
3.2.3 UDP扫描 / 92
3.3 手工扫描 / 93
3.3.1 检测单主机单端口开与否 / 93
3.3.2 检测单主机单端口是否有相应服务 / 94
3.3.3 检测多主机或多端口 / 95
3.4 编程实例:TCP端口扫描器 / 98
3.4.1 程序主界面 / 99
3.4.2 程序代码 / 100
3.5 编程实例:UDP端口扫描器 / 112
3.5.1 程序主界面 / 112
3.5.2 程序代码 / 113
第 4 章 NetBIOS扫描器的设计 / 120
4.1 NetBIOS协议的使用 / 120
4.1.1 查看和修改NetBIOS配置 / 120
4.1.2 查看NetBIOS配置的命令 / 122
4.2 IP和主机名的互换 / 127
4.2.1 主机名转IP地址 / 127
4.2.2 IP地址转主机名 / 127
4.3 MAC地址的读取 / 128
4.4 本地域名、子网掩码、网卡类型的读取 / 129
4.5 用户名、共享目录、组列表的读取 / 134
4.5.1 Unicode编程与ANSI之间的互换 / 134
4.5.2 用户名列表的读取 / 137
4.5.3 共享目录的读取 / 150
4.5.4 组列表的读取 / 156
4.5.5 远端主机时间的读取 / 159
4.5.6 远端服务支持类型的读取 / 161
4.5.7 主机信息的读取 / 163
4.6 NetBIOS的安全性 / 166
4.7 编程实例:反“IP欺骗”—MAC地址扫描器的设计 / 169
4.7.1 反“IP欺骗”的原理 / 169
4.7.2 MAC地址扫描器的主界面 / 170
4.7.3 程序代码 / 170
4.8 编程实例:NetBIOS的通用扫描器 / 176
4.8.1 程序主界面 / 176
4.8.2 程序代码 / 177
第 5 章 SNMP扫描器的设计 / 186
5.1 SNMP协议 / 186
5.1.1 管理信息结构 / 187
5.1.2 管理信息库 / 187
5.1.3 通信协议 / 191
5.2 SNMP的API / 193
5.2.1 数据类型和常用结构 / 194
5.2.2 管理程序API / 197
5.3 SNMP安装和验证 / 204
5.4 编程实例:SNMP通用读设工具 / 207
5.4.1 程序主界面 / 208
5.4.2 程序代码 / 209
5.5 编程实例:基于SNMP的主机扫描器 / 213
5.5.1 程序主界面 / 214
5.5.2 程序代码 / 214
第 6 章 ICMP扫描器的设计 / 221
6.1 ICMP协议简介 / 222
6.2 ping与tracert命令简介 / 222
6.2.1 ping程序使用 / 222
6.2.2 tracert程序使用 / 224
6.3 ICMP通信实例分析 / 226
6.4 ICMP协议内容 / 227
6.4.1 目的不可达消息 / 227
6.4.2 超时消息 / 228
6.4.3 参数问题消息 / 229
6.4.4 源拥塞消息 / 229
6.4.5 重定向消息 / 230
6.4.6 回送请求或回送响应消息 / 231
6.4.7 时间戳请求和时间戳响应消息 / 231
6.4.8 信息请求或信息响应消息 / 232
6.5 ICMP扫描的安全性 / 233
6.6 编程实例:快速多IP的ICMP扫描器 / 234
6.6.1 程序主界面 / 234
6.6.2 程序原理 / 237
6.6.3 程序代码 / 238
第 7 章 基于协议的服务扫描器的设计 / 250
7.1 WWW服务扫描 / 251
7.1.1 WWW服务器架构 / 251
7.1.2 协议消息格式 / 254
7.1.3 WWW服务器的安装与配置 / 260
7.2 编程实例:WWW服务扫描器 / 264
7.2.1 扫描原理 / 265
7.2.2 程序主界面 / 266
7.2.3 程序代码 / 266
7.3 FTP服务扫描 / 272
7.3.1 FTP简介 / 272
7.3.2 FTP服务器的安装与配置 / 274
7.4 编程实例:FTP服务扫描器 / 278
7.4.1 程序主界面 / 278
7.4.2 程序代码 / 278
7.5 Telnet服务扫描 / 281
7.5.1 Telnet协议简介 / 281
7.5.2 Telnet的安装与配置 / 284
7.6 编程实例:Telnet服务扫描器 / 286
7.6.1 程序主界面 / 287
7.6.2 程序代码 / 287
7.7 Email服务扫描 / 291
7.7.1 电子邮件协议简介 / 291
7.7.2 电子邮件服务器的安装与配置 / 299
7.8 编程实例:Email服务扫描器 / 306
7.8.1 程序主界面 / 306
7.8.2 程序代码 / 307
第 8 章 基于应用的服务扫描器的设计 / 314
8.1 Win Inet编程接口 / 314
8.1.1 CInternetSession类 / 315
8.1.2 CInternetConnection类 / 322
8.1.3 CHttpConnection类 / 323
8.1.4 CFtpConnection类 / 324
8.1.5 CInternetFile类 / 237
8.1.6 CInternetException类 / 329
8.2 编程实例:基于应用的WWW服务扫描器 / 329
8.3 编程实例:基于应用的FTP服务扫描器 / 330
8.4 网络资源协议 / 332
8.4.1 NETRESOURCE结构 / 332
8.4.2 WNetOpenEnum函数 / 333
8.4.3 WNetEnumResource函数 / 334
8.4.4 WNetCloseEnum函数 / 335
8.5 编程实例:网络资源扫描器 / 336
8.5.1 程序主界面 / 336
8.5.2 程序代码 / 337
第 9 章 命名管道扫描器的设计 / 341
9.1 命名管道 / 341
9.2 命名管道API / 342
9.2.1 命名管道的UNC格式 / 342
9.2.2 命名管道编程的API / 342
9.3 命名管道编程示例 / 349
9.3.1 命名管道服务器端 / 349
9.3.2 命名管道客户端 / 350
9.4 邮槽 / 352
9.4.1 邮槽的UNC格式 / 352
9.4.2 邮槽编程的API / 352
9.5 邮槽编程示例 / 354
9.5.1 邮槽服务器端编程 / 354
9.5.2 邮槽客户端编程 / 355
9.6 编程实例:SQL Server命名管道扫描器的设计 / 356
9.6.1 Microsoft SQL Server
简介 / 356
9.6.2 程序主界面 / 359
9.6.3 程序代码 / 360
第10章 服务发现扫描器的设计 / 364
10.1 服务发现简介 / 364
10.2 UPnP协议 / 365
10.2.1 寻址 / 367
10.2.2 发现 / 367
10.2.3 描述 / 368
10.2.4 控制 / 369
10.2.5 事件 / 369
10.2.6 展示 / 370
10.3 XML协议 / 371
10.4 SSDP协议分析实例 / 373
10.4.1 设备类型 / 374
10.4.2 协议消息格式 / 377
10.5 编程实例:服务发现扫描器 / 381
10.5.1 程序主界面 / 382
10.5.2 程序代码 / 383
第11章 漏洞扫描器的设计 / 395
11.1 注入式漏洞扫描器 / 395
11.1.1 SQL注入式攻击原理 / 396
11.1.2 注入式攻击的局限性 / 398
11.1.3 单机模式或C/S模式的攻击 / 398
11.1.4 B/S模式下扫描程序设计 / 401
11.2 主机弱密码扫描 / 412
11.2.1 网络连接的API / 412
11.2.2 密码穷举分析 / 416
11.2.3 程序主界面 / 418
11.2.4 程序代码 / 419
11.3 DOS/DDOS攻击 / 425
11.3.1 程序主界面 / 427
11.3.2 程序代码 / 427
11.4 明文密码嗅探 / 432
11.4.1 程序主界面 / 433
11.4.2 程序代码 / 434
11.5 端口对照 / 443
11.5.1 程序主界面 / 443
11.5.2 程序代码 / 445
第12章 扫描防范技术的研究 / 451
12.1 更换端口 / 452
12.2 预留陷阱技术 / 453
12.3 基于哨兵的端口扫描监测 / 454
12.3.1 程序主界面 / 455
12.3.2 程序代码 / 456
12.4 基于嗅探的端口扫描监测及DDOS拒绝服务监测 / 460
12.4.1 程序主界面 / 461
12.4.2 程序代码 / 462
12.5 实时监测本地所有TCP/UDP连接及端口 / 467
12.5.1 程序主界面 / 467
12.5.2 结构与函数API / 468
12.5.3 程序代码 / 471
12.6 如何关闭端口 / 478
12.6.1 FTP端口 / 478
12.6.2 WWW端口 / 480
12.6.3 Telnet端口 / 480
12.6.4 NetBIOS端口 / 481
附录A 本书容易混淆概念解析 / 482
附录B Windows Socket错误返回码 / 486
附录C Win Inet错误返回码 / 491
附录D HTTP错误返回码 / 493
参考文献 / 498
后记 / 499