诸神之眼——Nmap网络安全审计技术揭秘(txt+pdf+epub+mobi电子书下载)


发布时间:2020-10-12 05:42:39

点击下载

作者:李华峰

出版社:清华大学出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

诸神之眼——Nmap网络安全审计技术揭秘

诸神之眼——Nmap网络安全审计技术揭秘试读:

前言

为什么要写这本书

很多人在年少时,都曾经有一个黑客梦。

还记得我第一次接触“黑客”这个词是在很早的一部名为《战争游戏》的电影,虽然那时我甚至还没见过真正的计算机,但是里面的情节却深深地印在了我的脑海之中。从那以后,我开始对每部电影中出现的黑客情节都十分感兴趣,也经常推敲电影中这些情节在现实中的可行性。1999年,一部名为《黑客帝国》的影片风靡了整个世界。对我来说,这部影片的意义更为深刻,在这部影片中,我居然见识到了一个真实中存在的极客工具——Nmap。这个发现让我兴奋不已。

要知道,极客技术在外人看起来神奇无比,对于这方面的学习者来说却是头疼无比。数量众多的知识需要学习,各种各样的工具需要掌握,在我刚开始接触极客技术的时候,几乎每天都将精力用在对各种工具的掌握上。不过,很快我也意识到了自己的失误——在“鱼”与“渔”之间,错误地选了“鱼”。我缺乏的不是一款万能的黑客工具,而是一个能将自己想法快速实现的工具,而这个问题随着Nmap的出现迎刃而解。

Nmap是网络安全方面极为常用的工具,它的使用相当广泛。凡是从事网络安全技术的人员几乎都接触过这款工具。Nmap作为世界渗透测试行业公认最优秀的网络安全审计工具,它可以通过对设备的探测来审计其安全性,而且功能极为完备,单是对端口状态的扫描技术就有数十种。不过很可惜的是,由于国内Nmap方面的学习资料相对匮乏,很多人都将Nmap作为一种普通的端口扫描工具来使用,却忽略Nmap中强大的编程能力。NSE是Nmap中革命性的创新。通过Nmap强大的脚本引擎(NSE),每一个用户都可以向Nmap中添加自己编写的代码,从而将Nmap打造成用户自由定制功能的强大工具。可以这样说,NSE的使用才是真正的“授人以渔”。

在本书的编写过程中,我一直在学校从事网络安全的教学工作。这使得每当我在进行一个章节编写时,可以预先在课堂上进行讲授,从而直接感受到学生对此的反映,他们其实是本书的第一批读者。现在成书之时,也正值他们毕业之际。在这里希望书中的知识能够为他们以后的工作提供一些帮助。同样也希望这本书能为读者们带来帮助。本书特色

Nmap的强大功能是毋庸置疑的,它几乎是当前的极客必备工具,你几乎可以在任何经典的网络安全图书中找到它的名字,甚至可以在大量的影视作品(例如《Matrix |黑客帝国》《极乐空间》《谍影重重》《虎胆龙威4》等)中看到它的身影。目前,国内对于Nmap的研究越来越热。近年来正是国内网络安全飞速发展的阶段,Nmap这个曾经只有顶尖高手才能使用的“旧时王谢堂前燕”,到如今终于飞入了普通网络安全工作人员的“寻常百姓家”,受到广大网络安全行业从业人员的喜爱,假以时日,它必将成为国内最为流行的网络安全审计工具之一。本人从2009年开始正式涉足网络渗透领域,对于Nmap的使用,花费了大量的时间和精力进行研究,尤其是阅读了大量国外的相关文献。在本书中将会分享自己学习Nmap的使用经验、方法和总结,希望可以减少其他Nmap学习者的学习成本。

本书是第一本系统深入将Nmap应用实例与网络原理相结合进行讲解的工具书,不仅仅讲述Nmap的实际应用方法,更从网络原理的角度来分析Nmap实现网络安全审计的技术,将各种网络协议、各种数据包格式等知识与Nmap的实践应用相结合,真正做到理论与实践相结合。本书还将对Nmap强大的脚本引擎(NSE)进行系统而又深入的讲解,以达到通过Lua编程来扩展Nmap的功能,将Nmap打造成为用户可以自由定制功能的强大工具,真正地做到“授人以渔”。这里之所以将本书命名为“诸神之眼”,就是暗示Nmap在网络中强大的信息收集能力。读者对象

本书的读者群主要是网络安全渗透测试人员、运维工程师、网络管理人员、网络安全设备设计人员、网络安全软件开发人员、安全课程培训人员、高校网络安全专业方向的学生等,其他读者还包括各种非专业但却热衷于网络安全研究的人员。

目前随着极客文化的盛行,以及网络安全爱好者日益增多,本书将对网络安全的宣传与教育起到重要作用。如何阅读本书

本书可分为三大部分。

基础知识:从Nmap的基础讲起,系统讲述了网络安全审计的作用、价值、方法论,Nmap在网络安全管理上的应用,以及Nmap在实现这些应用时相关的网络原理和技术等。

网络安全审计:结合实例讲解使用Nmap进行网络安全审计的方式和方法,以及在实际渗透中的各种应用。

脚本:介绍Nmap的强大脚本编写功能,使读者可以最终将Nmap打造成为个性化的工具。阅读本书的建议

没有Nmap基础的读者,建议从第1章顺次阅读并演练每一个实例。

有一定Nmap基础的读者,可以根据实际情况有重点地选择阅读各个技术要点。

对于每一个知识点和项目案例,先通读一遍有个大概印象,然后将每个知识点的示例代码都在开发环境中操作一遍,加深对知识点的印象。勘误和支持

由于作者的水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。欢迎您通过清华大学出版社网站(www.tup.com.cn)与我们联系,同时也欢迎大家与作者交流,作者的邮箱是lihuafeng1999@163.com,期待能够得到你们的真挚反馈。致谢

首先要感谢我的单位提供的自由而又宽松的科研工作环境,正是这种完全自由的氛围才使得年少时的梦想成为我现实生活中的工作。

感谢清华大学出版社的秦健编辑,在本书的编写过程中始终支持我的写作,你的鼓励和帮助引导我能顺利完成全部书稿。

最后感谢我的母亲,是她将我培养成人,并在人生的每一个关键阶段帮助我成长,感谢我深爱的妻子、我可爱的儿子,感谢你们在我编写本书的时候给予的无条件的理解和支持。

谨以此书献给我最亲爱的家人以及众多热爱极客技术的朋友们!第1章走近Nmap

刘开缓缓地睁开眼睛。

此刻他正处在一个阴冷的房间内,这个房间除了一扇门之外再无任何出口。“这是在哪里?”

刘开支撑着身体慢慢坐了起来,他注意到身边只有一台笔记本电脑。

他站起身,走向门口,试图打开门,然而这一切都是徒劳的,门是锁着的,无论怎么撞都无法打开。房子十分密实,屋里的声音根本传不出去,呼救也只能是徒劳无功。

在仔细检查这个房间后再也没有找到任何其他东西,唯一可以利用的只有那台笔记本电脑,他只好返身回来,蹲下身子,将笔记本电脑打开。

刚刚开机,笔记本电脑就发出了电量过低,将在20分钟后自动关机的警报。

随即笔记本电脑屏幕上赫然出现了一行如同鲜血写成的文字!“房间的门锁由一台计算机X控制,在网络上找到并侵入它,在取得它的控制权之后,就可以打开门锁。否则你将永远被关在这个房间里!”

这是一个看起来很像密室逃生故事的开头,不过不同的是,故事中的刘开不再像其他电影中的人物一样要找出一些隐藏的物品,在这个空荡的房间里,他可以依靠的只有这一台笔记本电脑,而仅有的这一丝希望也将会在20分钟后因停电而消失。

在这仅有的20分钟内,刘开该如何才能成功逃脱呢?

好了,我们正在开始一个精彩的故事,随着剧情的进展,你将领略到网络世界的神奇,并掌握保卫这个世界的技能。

在这一章中,除了开头这个紧张的故事之外,还将学习以下内容。

传奇般的安全审计工具Nmap。

Nmap的下载与安装。

Nmap的基本操作。

Nmap扫描范围的确定。1.1 Nmap简介

对于已经陷入困境的刘开,什么能够给他带来一丝希望呢?如果没有从天而降的救兵的话,刘开所能依靠的只有自己娴熟的技术,以及某个强大的工具。此时,刘开最希望得到的工具又是什么呢?

如果可以选择,Nmap(Network Mapper)绝对是此时刘开的最佳选择。作为当今顶尖的网络审计工具,Nmap在国外已经被大量的网络安全人员所使用,它的身影甚至出现在很多优秀影视作品中,其中影响力最大的要数经典巨著《黑客帝国》系列。在《黑客帝国2》中,影片中的女主人公Tritnity就曾使用Nmap攻击SSH服务,从而破坏了发电厂的工作,如图1-1所示。图1-1 《黑客帝国2》中女主人公Tritnity正在使用Nmap攻击SSH服务

Nmap是由Gordon Lyon设计并实现的,于1997开始发布。Gordon Lyon最初设计Nmap的目的只是希望打造一款强大的端口扫描工具。但是随着时间的发展,Nmap的功能越来越全面。2009年7月17日,开源网络安全扫描工具Nmap正式发布了5.00版,这是自1997年以来最重要的发布,代表着Nmap从简单的网络连接端扫描软件变身为全方面的安全和网络工具组件。目前Nmap已经更新到7.30版。

现在的Nmap已经具备了如下各种功能。

主机发现功能:向目标计算机发送特制的数据包组合,然后根据目标的反应来确定它是否处于开机并连接到网络的状态。

端口扫描:向目标计算机的指定端口发送特制的数据包组合,然后根据目标端口的反应来判断它是否开放。

服务及版本检测:向目标计算机的目标端口发送特制的数据包组合,然后根据目标的反应来检测它运行服务的服务类型和版本。

操作系统检测:向目标计算机发送特制的数据包组合,然后根据目标的反应来检测它的操作系统类型和版本。

除了这些基本功能之外,Nmap还实现一些高级审计技术,例如伪造发起扫描端的身份,进行隐蔽扫描,规避目标的安全防御设备(例如防火墙),对系统进行安全漏洞检测,并提供完善的报告选项等。在后来的不断发展中,随着Nmap强大的脚本引擎(NSE)的推出,任何人都可以向Nmap中添加新的功能模块。

如果使用Nmap对一台计算机进行审计,最终可以获得目标如下的信息。

目标主机是否在线。

目标主机所在网络的结构。

目标主机上开放的端口,例如80端口、135端口、443端口等。

目标主机所使用的操作系统,例如Windows 7、Windows 10、Linux 2.6.18、Android 4.1.2等。

目标主机上所运行的服务以及版本,例如Apache httpd 2.2.14、OpenSSH 5.3p1、Debian 3、Ubuntu 4等。

目标主机上所存在的漏洞,例如弱口令、ms08_067、ms10_054等。

收集目标信息是整个安全审计环节中至关重要的一部分工作。如此一来,对目标的信息将了若指掌。1.2 Nmap的下载与安装

在开始正式工作之前,首先需要从Nmap的官方网站(https://Nmap.org/download.html)下载这款软件,要注意这个页面中提供了对应不同操作系统的软件版本,在使用的时候选择对应所使用的操作系统的版本。1.2.1 在Windows系统下安装与下载Nmap

步骤1:下载Nmap。在Windows下安装Nmap时,注意网站提供两个版本的Nmap,一个是最新版,另一个是稳定版。这里以稳定版Nmap-7.12-setup.exe为例,图1-2给出了适用于Windows操作系统的Nmap下载地址。图1-2 适用于Windows操作系统的Nmap下载地址

步骤2:启动Nmap安装程序,选择默认安装(推荐),就可以自动将如图1-3所示全部的组件都装好。图1-3 Nmap安装过程中的组件选择

步骤3:在安装过程中,将会安装一个WinPcap插件,如果之前没有安装过WinPcap,就需要对其进行安装。如果之前你的计算机上安装过处理数据包的软件,将会弹出一个如图1-4所示的对话框,只需要单击“确定”按钮就可以了。图1-4 Nmap安装所需要的WinPcap

步骤4:之后的操作只需要一路单击Next按钮即可,直到完成安装,如图1-5所示。图1-5 Nmap安装完毕

步骤5:安装完成以后,可以在Windows命令行窗口中输入Nmap命令启动Nmap,如图1-6所示。图1-6 Windows工作环境下Nmap的运行界面1.2.2 在Linux系统下安装Nmap

一些专门用来进行网络安全工作的Linux操作系统中已经预装了Nmap,比如BackTrack系统和Kali系统。大部分Linux操作系统中还需要自行安装。如果系统中已经安装了RPM Package Manager(RPM软件包管理器),那么Nmap的安装将会变得十分简单。如果系统没有安装RPM,也可以先行安装。下面以Ubuntu为例,使用如下命令安装RPM。 sudo apt-get install rpm

之后只需要输入如下命令就可以完成Nmap及其组件的安装。 rpm -vhU https://Nmap.org/dist/Nmap-7.25BETA2-1.x86_64.rpm rpm -vhU https://Nmap.org/dist/zeNmap-7.25BETA2-1.noarch.rpm rpm -vhU https://Nmap.org/dist/ncat-7.25BETA2-1.x86_64.rpm rpm -vhU https://Nmap.org/dist/nping-0.7.25BETA2-1.x86_64.rpm

注意,图形化的Nmap版本Zenmap采用了noarch格式。1.3 Nmap的基本操作

使用Nmap最简单的方式就是在命令行中输入Nmap和<目标IP地址>,例如: Nmap 192.168.0.1

下面就是执行这条命令的扫描结果。 Starting Nmap 7.12 ( https://Nmap.org ) at 2016-09-07 09:39 ① Nmap scan report for 192.168.0.1 ② Host is up (0.030s latency). ③ Not shown: 997 closed ports ④ PORT STATE SERVICE ⑤ 23/tcp open telnet ⑥ 80/tcp open http 5431/tcp open park-agent MAC Address: D8:FE:E3:B3:87:A9 (D-Link International) ⑦ Nmap done: 1 IP address (1 host up) scanned in 4.71 seconds ⑧

扫描结果中,①给出了当前使用的Nmap版本为7.12,扫描开始时间为2016-09-07 09:39。

②是一个标题,生成的是关于192.168.0.1主机的报告。

③给出目标主机的状态为up(意味着这台主机处于开机并连上了互联网的状态)。

④表示在进行检查的1000个端口中,有997个是关闭的。

⑤是一张表,这张表中一共有三个字段,分别是PORT、STATE、SERVICE,其中PORT指的是端口,STATE指的是状态,SERVICE指的是运行的服务。

例如,⑥中PORT列的值为23/tcp,STATE列的值为open,SERVICE列的值为telnet,完整的含义就是Nmap发现目标计算机上的23号端口目前处于开放状态,这个端口提供telnet服务。

⑦给出了目标主机的硬件地址为D8:FE:E3:B3:87:A9,从后面括号中的信息可以看出这是一台D-Link的家用路由器。

⑧给出了经过对1台主机进行扫描,发现1台状态为up的主机,耗时4.71秒。1.4 扫描范围的确定

刘开快速检查了笔记本电脑中的软件,幸运的是,居然找到了Nmap,接下来正戏就要上演了。刘开现在并不知道计算机X的IP地址,因此当前最首要的任务就是找到这台计算机。首先刘开检查这台计算机的网络情况,发现这台计算机无法连接到互联网。这意味着X很有可能就与刘开现在所使用的笔记本电脑在同一个网络中,否则这个难题就真的无解了。

刘开快速查看了本机的IP信息,发现IP地址是192.168.0.2,掩码是255.255.255.0,那么X的地址应该就在192.168.0.1到192.168.0.255之间。现在最简单的做法就是先将这个范围内所有处于开机并联网状态的主机都找出来。

接下来我们来看如何确定扫描的范围。1.4.1 对连续范围内的主机进行扫描

1.3节已经介绍了如何对一个目标的可能IP地址进行确定,下面对指定范围内的多个目标进行扫描。 命令语法:Nmap [IP 地址的范围]

例如,在1.3节的情形中,刘开就可以输入如下命令来选择扫描范围为192.168.0.1 ~192.168.0.255的主机。 Nmap -sn 192.168.0.1-255

下面给出的是扫描的结果。 Starting Nmap 7.12 ( https://Nmap.org ) at 2016-09-14 13:03 Nmap scan report for 192.168.0.1 Host is up (0.041s latency). MAC Address: D8:FE:E3:B3:87:A9 (D-Link International) Nmap scan report for 192.168.0.3 Host is up (0.090s latency). MAC Address: CC:D2:9B:2B:11:78 (Shenzhen Bopengfa Elec&Technology) Nmap scan report for 192.168.0.2 Host is up. Nmap done: 255 IP addresses (3 hosts up) scanned in 6.40 seconds

在这里可以看到通过这次扫描,在这个子网中共有3台设备。另外,为了节约扫描时间,使用了-sn参数,-sn具体的含义将在第2章介绍。1.4.2 对整个子网进行扫描

Nmap支持使用CIDR(Classless Inter-Domain Routing,无类别域间路由)的方式来扫描整个子网。 命令语法:Nmap [IP 地址/ 掩码位数]

还是以1.3节的情形为例,如果要扫描192.168.0.1 ~ 192.168.0.255这个子网范围的主机,还可以使用如下命令。 Nmap -sn 192.168.0.1/24

下面给出的是扫描的结果。 Starting Nmap 7.12 ( https://Nmap.org ) at 2016-09-14 13:19 Nmap scan report for 192.168.0.1 Host is up (0.0040s latency). MAC Address: D8:FE:E3:B3:87:A9 (D-Link International) Nmap scan report for 192.168.0.3 Host is up (0.065s latency). MAC Address: CC:D2:9B:2B:11:78 (Shenzhen Bopengfa Elec&Technology) Nmap scan report for 192.168.0.2 Host is up. Nmap done: 256 IP addresses (3 hosts up) scanned in 5.57 seconds1.4.3 对多个不连续的主机进行扫描

Nmap可以一次扫描多个主机,如果这些扫描的目标地址没有任何的关系,那么可以通过将目标地址用空格分隔开的方式来同时对这些主机进行扫描。 命令语法:Nmap [ 扫描目标1 扫描目标2 … 扫描目标n]

如果对192.168.0.1、192.168.0.2、192.168.0.3、192.168.0.4进行扫描,可以使用如下命令。 Nmap -sn 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.4

扫描的结果如下。 Starting Nmap 7.12 ( https://Nmap.org ) at 2016-09-14 13:33 Nmap scan report for 192.168.0.1 Host is up (0.0040s latency). MAC Address: D8:FE:E3:B3:87:A9 (D-Link International) Nmap scan report for 192.168.0.3 Host is up (0.055s latency). MAC Address: CC:D2:9B:2B:11:78 (Shenzhen Bopengfa Elec&Technology) Nmap scan report for 192.168.0.2 Host is up. Nmap done: 3 IP addresses (3 hosts up) scanned in 1.99 seconds1.4.4 在扫描的时候排除指定的目标

在对一些主机进行扫描时,如果需要排除某些指定主机,可以使用exclude选项。 命令语法:Nmap [ 目标] --exclude [ 目标]

例如,如果我们希望在扫描192.168.0.0/24子网的时候,并不对192.168.0.2进行扫描,就可以使用如下命令。 Nmap -sn 192.168.0.0/24 --exclude 192.168.0.2

扫描的结果如下。 Starting Nmap 7.12 ( https://Nmap.org ) at 2016-09-14 13:51 Nmap scan report for 192.168.0.1 Host is up (0.0040s latency). MAC Address: D8:FE:E3:B3:87:A9 (D-Link International) Nmap scan report for 192.168.0.3 Host is up (0.057s latency). MAC Address: CC:D2:9B:2B:11:78 (Shenzhen Bopengfa Elec&Technology) Nmap scan report for 192.168.0.5 Host is up (0.077s latency). MAC Address: D8:55:A3:D9:DC:1D (zte) Nmap done: 255 IP addresses (3 hosts up) scanned in 45.35 seconds1.4.5 对一个文本文件中的地址列表进行扫描图1-7 使用记事本list.txt保存目标地址

如果需要经常性地对某些地址进行扫描,那么每次都在命令中输入这些地址是相当麻烦的,可以将常用的地址保存在一个记事本文件中,例如List.txt,如图1-7所示。

以后,每次想对这些地址进行扫描,无须重新输入,只需要将这个文本文件设定为目标即可。 命令语法:Nmap -iL [ 文本文件]

可以使用命令对List.txt中的这些地址进行扫描。 Nmap -sn -iL List.txt

扫描的结果如下。 Starting Nmap 7.12 ( https://Nmap.org ) at 2016-09-14 14:20 Nmap scan report for 192.168.0.1 Host is up (0.0040s latency). MAC Address: D8:FE:E3:B3:87:A9 (D-Link International) Nmap scan report for 192.168.0.3Host is up (0.057s latency). MAC Address: CC:D2:9B:2B:11:78 (Shenzhen Bopengfa Elec&Technology) Nmap done: 7 IP addresses (2 hosts up) scanned in 3.35 seconds1.4.6 随机确定扫描目标

Nmap中还提供了一个非常有意思的功能,那就是随机产生一些目标,然后Nmap会对这些目标进行扫描。 命令语法:Nmap -iR [ 目标的数量]

下面随机地在互联网上对3个IP地址进行扫描,使用的命令如下。 Nmap -sn -iR 3

扫描的结果如下。 Starting Nmap 7.12 ( https://Nmap.org ) at 2016-09-14 14:35 Nmap scan report for softbank219036207070.bbtec.net (219.36.207.70) Host is up (0.12s latency). Nmap done: 3 IP addresses (1 host up) scanned in 4.40 seconds小结

本章以一个故事作为开始,详细介绍了Nmap的强大功能,也简单介绍了Nmap的基本用法。在本章的结束时,你应该已经掌握了如何下载和安装Nmap,明白Nmap扫描结果的含义以及基本的操作,如何使用Nmap对指定范围内的主机进行扫描等。下一章将开始介绍Nmap中的第一个功能:如何远程检测一台主机是否处于活跃状态,以及检测原理。第2章活跃主机发现技术“这个世界是否存在一台绝对安全的主机,它绝对不会受到来自网络上的攻击?”

这个问题的答案是肯定的,而且其实这种主机在日常生活中很常见,打造这样一台安全主机的方法就是“拔掉主机的网线”,如果觉得还不够安全,那么最好将系统电源也切断。不过这样做,这个系统实际上也没有任何用处了。在现实生活中,如果一台主机是这种“绝对安全”的状态,那么也就不可能再对其进行任何扫描了,我们关心的是那些已经于运行状态并且网络功能正常的主机,通常这些主机又被称为活跃主机。本章的工作就是想办法来判断一台主机是否是活跃主机。

本章将介绍以下内容。

网络协议与活跃主机发现技术。

基于ARP协议的活跃主机发现技术。

基于ICMP协议的活跃主机发现技术。

基于TCP协议的活跃主机发现技术。

基于UDP协议的活跃主机发现技术。

基于SCTP协议的活跃主机发现技术。

Nmap活跃主机发现中与DNS协议相关的选项。2.1 活跃主机发现技术简介

如何知道一台主机是不是活跃主机呢?这就要用到活跃主机发现技术。先看一个现实生活中很常见的例子。

推销员在销售产品的时候,经常选择上门销售的方式。他们的做法是首先敲门,如果房子的主人在家,通常就会隔着门问“谁啊”,当然也有些人会直接打开门,这时销售员就知道了这间房子现在是有人的,而屋子里的人很可能就是他的下一个客户。

请注意这个过程中很关键的一点,那就是在生活中有这样一个默认的约定,当听到有人敲门的时候,屋子里的人会做出相应的回应,可能会询问,也可能会开门。有些时候一些居心不良的人就利用了这一点进行所谓的“踩点”。

了解这个例子以后,就可以很简单地讲述活跃主机发现技术了。如果想知道网络中的某台主机是否处于活跃状态,同样可以采用这种“敲门”的方式,只不过需要使用发送数据包的形式来代替现实生活中的“敲门”动作,也就是说活跃主机发现技术其实就是向目标计算机发送数据包,如果对方主机收到了这些数据包,并给出了回应,就可以判断这台主机是活跃主机。如图2-1所示,PC0就在向PC1发送数据包。图2-1 主机PC0向主机PC1发送数据包

接下来有两个很关键的问题:

要向目标主机发送什么数据包呢?

为什么对方主机收到了这个数据包,就要给出回应呢?2.2 网络协议与主机发现技术

如今互联网结构极其复杂,各种不同硬件架构,运行着各种不同操作系统的设备却令人惊讶地连接在一起。这一切都能正常运行要归功于网络协议。网络协议通常是按照不同层次开发出来的,每个不同层次的协议负责的通信功能也各不相同。这些协议是为计算机网络中进行数据交换而建立的规则、标准或约定的集合,它们“各尽其能,各司其职”。目前分层模型有OSI和TCP/IP两种。本书中涉及的模型都采用了TCP/IP分层结构,因为这个结构更简洁实用。

TCP/IP协议包括的层如图2-2所示,从下到上依次为网络接口层、网络层、传输层、应用层。图2-2 TCP/IP分层协议

网络接口层的功能是接收IP数据包,并负责把这些数据包送至目标网络。

网络层的功能为实现网络之间的互连,根据数据包的IP地址将数据包从一个网络通过路由器传到另一网络。人所熟知的ARP协议、IP协议、ICMP协议、IGMP协议都在这一层。

传输层的协议目前比较少,主要是TCP和UDP两个,功能是为通信双方的主机提供端到端的服务。

应用层的功能为针对客户发出的请求,服务器做出响应并提供相应的服务。例如,平时最为常见的HTTP协议、FTP协议、SMTP协议等都处在这一层,应用层的协议数量是最多的。

这些协议与2.1节中讲的例子又有什么关系呢?你还记得为什么有人敲门,屋里的人就会有回应吗?对,因为这是生活中一个默认的约定。而现在讲述的协议恰恰就如同这个约定一样,这些协议中明确规定了如果一台计算机收到来自另一台计算机的特定格式数据包后应该如何处理。比如,这里有一个TEST协议(这个协议目前并不存在,这里只是为了举例方便,假设A主机和B主机都遵守这个协议),它规定了如果一台主机A收到来自于主机B的格式为“请求”的数据包,那么它必须在一定时间内向主机B再发送一个格式为“回应”的数据包(实际上这个过程在很多真实的网络协议中都存在)。

那么,如果现在想知道主机A是否为活跃主机的话,该怎么办?只需要在你的主机上构造一个“请求”,然后将它发送给主机B。如果主机B是活跃主机,那么就会收到来自它的“回应”数据包,否则的话,就会什么都收不到。

实际操作中,可以利用哪些真实的协议,又有哪些协议做出了如同前面所述的规定呢?最好的方法就是去阅读Request For Comments (RFC)文档,所有的协议规范都可以参考这个文档,这是一系列以编号排定的文件。基本的互联网通信协议在RFC文件内都有详细说明。

接下来介绍Nmap的第一个参数-sn(之前的版本中是-sP,现在采用了-sn的写法)。这个参数在这一章中很重要,因为Nmap在扫描时,默认会将目标例如端口之类的信息也扫描出来,但是如果只是想要知道目标是否为活跃主机,则并不需要这些信息,反倒会浪费大量的时间,这里就可以使用这个参数来指定不对目标的端口和其他信息进行扫描。 命令语法:Nmap –sn [ 目标]

例如,对192.168.0.1进行扫描,可以执行下面的命令。 Nmap 192.168.0.1

扫描完成后,Nmap默认显示如下的信息。 Starting Nmap 7.12 ( https://Nmap.org ) at 2016-09-17 11:36 Nmap scan report for 192.168.0.1 Host is up (0.040s latency). Not shown: 997 closed ports PORT STATE SERVICE 23/tcp open telnet 80/tcp open http 5431/tcp open park-agent MAC Address: D8:FE:E3:B3:87:A9 (D-Link International) Nmap done: 1 IP address (1 host up) scanned in 4.01 seconds

而如果使用-sn参数,则只会显示是否为活跃主机这一条,在Nmap中执行如下命令。 Nmap -sn 192.168.0.1

扫描完成后,Nmap默认显示如下信息。 Starting Nmap 7.12 ( https://Nmap.org ) at 2016-09-17 11:39 Nmap scan report for 192.168.0.1 Host is up (0.0040s latency).MAC Address: D8:FE:E3:B3:87:A9 (D-Link International) Nmap done: 1 IP address (1 host up) scanned in 1.94 seconds

下面就已经被广泛用来进行主机发现的协议进行讲解。2.3 基于ARP协议的活跃主机发现技术2.3.1 ARP协议解析

ARP协议位于TCP/IP协议族中的网络层,这个协议的目的主要是解决逻辑地址和物理地址的转换关系。网络上的通信要使用到两个地址:物理地址和逻辑地址。同一网段中的通信一般使用物理地址,不同网段之间的通信一般使用逻辑地址。这一点可能你已经知道了,但是为什么要这样做呢?只有一个地址不是会更简单一些吗?

还是先来看现实生活中的一个例子。一个小男孩想送给远在另一个城市的好朋友一份礼物,那么他所需要做的就是将礼物包装好,将好朋友家的地址写在包装袋上,然后将包装袋交给快递,接下来快递公司就会将这份礼物送到好朋友的家中。

如果这个小男孩还想送给住在一起的妈妈一份礼物呢?他怎么做,还要交给快递员吗?显然这样太麻烦了,他只需要拿着这份礼物,走进妈妈的房间,然后将礼物放下就行了。

可以将这里面的小男孩和他的好朋友理解为处在不同网段的两台主机,而小男孩和生活在一起的妈妈就像同一网段的两台主机。世界上所有的网络都可以按照这个方式进行分割,和你处在同一网段的主机是一部分,和你处在不同网段的主机是另一部分。

如果按照上面介绍的例子,那么是不是在设计软件的时候,就要同时考虑两种情况,在和不同网段通信的时候,使用逻辑地址,否则使用物理地址呢?结果显然并非如此,在设计各种应用的时候,仅仅使用了逻辑地址就可以完成所有的任务。那么处于同一网段的通信又是如何完成的呢?

在同一网段中,所有的主机都会连接到一个叫作交换机(曾经是集线器,现在已经很少用了)的设备上,交换机上有很多接口,每个接口与一个主机通过网线相连。交换机中有一个内容寻址寄存器,这个寄存器中存储了每个接口所连接的主机的物理地址表。它会使用这张表来确定应该向哪一个接口发送数据包。但是如果目标的物理地址是未知的话,这个地址就需要通过额外的通信进行解析了。

例如,一台逻辑地址为192.168.0.1的主机A想与逻辑地址为192.168.0.2的主机B进行通信,但是主机A又不知道主机B的物理地址,这时就需要一个可以将逻辑地址解析为物理地址的协议,这个协议名为地址解析协议(ARP),它在RFC826中进行了定义。

在上面例子的情景中,按照ARP的规定,主机A就会发出一个ARP请求,内容大概就是“注意了,我的逻辑地址是192.168.0.1,我的物理地址是22:22:22:22:22:22,逻辑地址为192.168.0.2的主机在吗?我需要和你进行通信,请告诉我你的物理地址,收到请回答!”,这个数据包是以广播的形式发送给网段中所有设备的,不过只有主机B会给出回应,他的回应包大概就是“嗨,我就是那个逻辑地址为192.168.0.2的主机,我的物理地址是33:33:33:33:33:33”。主机A在收到这个数据包之后,就知道了主机B的物理地址。完成这个过程后,主机A和主机B就可以开始通信了。

好了,你有没有发现ARP和我们之前虚拟的TEST协议有什么相同之处呢?按照ARP规定,当主机B收到来自主机A的ARP请求的时候,主机B就应当向主机A发回一个回应。那么好了,实际上我们的第一个活跃主机发现技术已经产生了。

基于ARP协议的活跃主机发现技术的原理是:如果想要知道处在同一网段的IP地址为*.*.*.*的主机是否为活跃主机,只需要构造一个ARP请求数据包,并广播出去,如果得到了回应,则说明该主机为活跃主机。

这种发现技术的优点在于准确度高,任何处于同一网段的设备都没有办法防御这种技术,因为如果不遵守ARP,那么将意味着无法通信。缺点在于这种发现技术不能对处于不同网段的目标主机进行扫描。好的,接下来看看Nmap是如何利用这种技术实现活跃主机发现的。2.3.2 在Nmap中使用ARP协议进行主机发现

当目标主机与我们处于同一网段的时候,使用ARP协议扫描技术就是最佳的选择。不仅速度最快,扫描结果也是最为精准的。这是因为没有任何安全措施会阻止正常的ARP请求。

使用Nmap的选项-PR就可以实现ARP协议的主机发现。 命令语法:Nmap -PR [ 目标]

例如对192.168.1.1利用ARP协议进行一次扫描,执行如下的代码。 Nmap -sn -PR 192.168.1.1

得到的结果如下。 Starting Nmap 7.12 ( https://Nmap.org ) at 2016-08-13 11:29 Nmap scan report for 192.168.0.1 Host is up (0.0030s latency). ① MAC Address: D8:FE:E3:B3:87:A9 (D-Link International). ② Nmap done: 1 IP address (1 host up) scanned in 1.82 seconds

上例中对IP地址为192.168.1.1的设备是否为活跃主机进行了检测,从结果中可以看到,①中的“Host is up”这说明设备为活跃主机,而②中给出了192.168.1.1设备的物理地址(D8:FE:E3:B3:87:A9)。

这种技术的工作原理其实非常简单,只需要两个步骤。

步骤1:将一个内容为“who-has 192.168.0.1 tell 192.168.0.4”的ARP请求(详细内容如下)发送给目标。 Frame 3221: 42 bytes on wire (336 bits), 42 bytes captured (336 bits) on interface 0 Ethernet II, Src: 08:10:76:6a:ad:30 (08:10:76:6a:ad:30), Dst: Broadcast (ff:ff:ff:ff:ff:ff) Destination: Broadcast (ff:ff:ff:ff:ff:ff) Source: 08:10:76:6a:ad:30 (08:10:76:6a:ad:30) Type: ARP (0x0806) ① Address Resolution Protocol (request) Hardware type: Ethernet (1) Protocol type: IPv4 (0x0800) Hardware size: 6 Protocol size: 4 Opcode: request (1) ② Sender MAC address: 08:10:76:6a:ad:30 (08:10:76:6a:ad:30) Sender IP address: 192.168.0.4 Target MAC address: 00:00:00_00:00:00 (00:00:00:00:00:00) Target IP address: 192.168.0.1

上面给出了这个ARP请求数据包的完整格式。通过以太网帧头(Ethernet II)的Destination字段可以看出,这是一个广播数据包,这个数据包的源地址Source字段为08:10:76:6a:ad:30。目的地址Destination为ff:ff:ff:ff:ff:ff,这是一个广播地址,整个网段中的全部主机都会接收到这个ARP请求数据包。

在Address Resolution Protocol部分,①中的“Type:ARP (0x0806)”表示这是一个ARP数据包,②中的“Opcode:request (1)”表示这是一个请求类型的数据包。这个包头中列出了扫描方的逻辑地址“Sender IP address:192.168.0.4”和物理地址“Sender MAC address:08:10:76:6a:ad:30”,以及被扫描方的逻辑地址192.168.0.1,但是此时被扫描方的MAC地址还是未知的,所以这里的目的地址字段为“Target MAC address:00:00:00_00:00:00”。

步骤2:如果目标主机给出了一个相应的ARP回应“ARP reply 192.168.0.1 is-at D8:FE:E3:B3:87:A9”(详细内容如下)的话,那么说明它是活跃主机。 Frame 3222: 42 bytes on wire (336 bits), 42 bytes captured (336 bits) on interface 0 Ethernet II, Src: D-LinkIn_b3:87:a9 (d8:fe:e3:b3:87:a9), Dst: 08:10:76:6a:ad:30 (08:10:76:6a:ad:30) Destination: 08:10:76:6a:ad:30 (08:10:76:6a:ad:30) Source: D-LinkIn_b3:87:a9 (d8:fe:e3:b3:87:a9) Type: ARP (0x0806) ① Address Resolution Protocol (reply) Hardware type: Ethernet (1) Protocol type: IPv4 (0x0800) Hardware size: 6 Protocol size: 4 Opcode: reply (2) ② Sender MAC address: D-LinkIn_b3:87:a9 (d8:fe:e3:b3:87:a9) Sender IP address: 192.168.0.1 Target MAC address: 08:10:76:6a:ad:30 (08:10:76:6a:ad:30) Target IP address: 192.168.0.4

在这个ARP响应数据包中,以太网帧头(Ethernet II)的Destination部分的值就是之前ARP请求数据包中的Source地址。这两个数据包的格式是一样的。

在Address Resolution Protocol部分,①中的“Type:ARP (0x0806)”表示这是一个ARP数据包,②中的Opcode字段的值为reply (2),可以看到这是一个ARP响应包,原来ARP请求包中的发送方的物理地址和逻辑地址现在变成了这个ARP响应包中目的的物理地址和逻辑地址,也就是说ARP请求包和ARP响应包中的地址信息是颠倒的。

如果在发出了ARP请求数据包之后,却迟迟得不到ARP响应数据包的话,就可以认为该IP地址所在的设备不是活跃主机。2.4 基于ICMP协议的活跃主机发现技术2.4.1 ICMP协议解析

ICMP协议也位于TCP/IP协议族中的网络层,它的目的是在IP主机、路由器之间传递控制消息。没有任何系统是完美的,互联网也一样。互联网也经常会出现各种错误,为了发现和处理这些错误,ICMP(Internet Control Message Protocol,互联网控制报文协议)应运而生。同样这种协议也可以用来实现活跃主机发现。有了之前ARP主机发现技术的经验之后,再来了解一下ICMP协议是如何进行活跃主机发现的。相比起ARP简单明了的工作模式,ICMP则要复杂很多,但ICMP同样是互联网中不可或缺的协议。表2-1中给出了ICMP报文的种类。表2-1 ICMP报文的种类

从表2-1可以看出,ICMP的报文可以分成两类:差错和查询。查询报文是用一对请求和应答定义的。也就是说,主机A为了获得一些信息,可以向主机B发送ICMP数据包,主机B在收到这个数据包之后,会给出应答。这一点正好符合我们进行活跃主机扫描的要求。所以这里的ICMP活跃主机发现技术使用的就是查询报文。

ICMP中适合使用的查询报文包括如下3类。1.响应请求和应答

用来测试发送与接收两端链路及目标主机TCP/IP协议是否正常,只要收到就是正常。我们日常使用最多的是ping命令,利用响应请求和应答,主机A向一个主机B发送一个ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则主机B返回ICMP报文,说明主机B处于活跃主机。2.时间戳请求和应答

ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,即协调世界时(Coordinated Universal Time, UTC)(早期的参考手册认为UTC是格林尼治时间)。如果想知道B主机是否在线,还可以向B主机发送一个ICMP时间戳请求,如果得到应答的话就可以视为B主机在线。当然,其实数据包内容并不重要,重要的是是否收到了回应。3.地址掩码请求和应答

ICMP地址掩码请求由源主机发送,用于无盘系统在引导过程中获取自己的子网掩码。这里很多人可能会觉得我们的系统大多数时候都不是无盘系统,是不是这个技术就没有用了呢?

虽然RFC规定,除非系统是地址掩码的授权代理,否则它不能发送地址掩码应答(为了成为授权代理,它必须进行特殊配置,以发送这些应答)。但是,大多数主机在收到请求时都发送一个应答。如果想知道B主机是否在线,还可以向B主机发送一个ICMP掩码地址请求,如果得到应答的话就可以视为B主机在线。

在ICMP主机发现技术中,可以利用的就是上述3种查询报文。2.4.2 使用ICMP协议进行主机发现

这里的ICMP协议可以使用3种类型的查询报文来进行主机发现的任务,下面分别进行介绍。1.通过ICMP响应请求和应答进行主机发现

发送ICMP响应请求,如果得到目标主机发回的ICMP响应,则说明该主机处于活跃状态。这个查询报文可以通过最常使用的ping命令来发送。很多人都有过这样的经历,在检查网络中的某个设备是否在线的时候,经常会通过在命令行中输入ping <目标IP地址>的方式来查看目标是否在线。读到这里,有些人可能会有这样一个疑惑,既然有了这么高效的ping工具,为什么还要去研究这么多主机在线发现技术呢?

这主要是由于ping工具在过去被滥用了,因此很多用于防护主机的防火墙设备都隔绝ICMP数据包通过。这样就造成了明明可以和一台设备通信,但是ping的结果却始终显示为得不到响应。

使用Nmap的选项-PE就可以实现ICMP协议的主机发现。这个过程实质上和ping是一样的。 命令语法:Nmap -PE[ 目标]

执行如下命令。 Nmap -sn -PE 60.2.22.35

执行的结果如下。 Starting Nmap 7.12 ( https://Nmap.org ) at 2016-08-14 21:34 Nmap scan report for 60.2.22.35 Host is up (0.13s latency). Nmap done: 1 IP address (1 host up) scanned in 1.86 seconds

这个过程很简单,以发送和接收到的数据包来查看一下。这个过程是Nmap(192.168.0.4)向目标(60.2.22.35)发送了一个ICMP echo请求的数据包,注意结果中Type字段的值为8。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载