nmap介绍
Nmap(网络映射器)是一款广受欢迎的网络探测和安全评估工具,被誉为“上帝之眼”。它以其强大的扫描功能和广泛的应用场景,成为系统管理员和安全专家手中的得力助手。本文将对Nmap进行详细介绍,包括其优点、基本功能、常用命令等。
如此笼统的说你肯定不明白为什么它为什么会被称为“上帝之眼”,它的功能非常强大,(它可以扫描同学的计算机获取一些计算机的信息,寻找网络内活着的计算机,寻找开放端口等等)它在使用上也非常灵活,支持多种扫描方式。
本篇旨在介绍一些基本的功能以及概念,如果想要深入学习还需要自己发现它的功能,并且多使用才能更好得理解。本篇在介绍时会发散性地介绍较多的概念,我会尽量展开来叙述,让读者更好理解。
nmap简单功能的使用以及基本原理
一、主机扫描
主机扫描的功能是用来发现网络中的存活主机的,Nmap使用各种技术,如ping扫描、ARP扫描、ICMP探测等,来确定主机是否在线。这是进行后续扫描和评估的基础,有助于用户创建一个有效的目标主机清单。
我们首先介绍一下这些扫描方式。
ping扫描
ping扫描,通常是通过发送ICMP(Internet Control Message Protocol,因特网控制报文协议)回显请求数据包来探测目标主机是否在线。ICMP是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。它是网络层的一个协议,主要目的是向数据通信中的源主机报告错误,以及提供有关通信状态的信息。
ping命令是Windows和Linux等操作系统自带的一个网络工具,用于测试与远程计算机或本机的连接。它通过发送ICMP回显请求数据包给目标主机,并监听回显应答数据包来确定目标主机的存活状态。
例如,我想通过这种扫描的方式扫描某范围内的IP主机在线状态。我需要输入的是
nmap -sn <网段>
而网段的表达方式同样也是不局限的。
单个主机扫描
例如,我们现在是家长,我们已知电脑的IP是192.168.1.3
我们想偷偷检测一下孩子有没有打开电脑,我们可以在确认连接了家里的网络之后,对这个IP地址进行扫描。
这就是扫描的结果,我们发现从发送ICMP到对方给我们响应是非常快的。我们发现得到的结果是Host is up那么我们就不用多说什么了,直接去惩罚孩子就行。
通过起始IP和结束IP来规定扫描范围
在我们家连上网之后,我发现网络越来越慢,我们怀疑邻居蹭我们的网络,但是我们没有证据怎么办,一般在我们的网段内进行整体扫描然后看一下设备数量即可确定有没有额外的设备。
但是我们的设备IP是192.168.1.3那么我们的扫描范围应该是什么样的?是192.168.1.1->192.168.1.254还是192.168.1.3->192.168.254.3我们不得而知,但是,我们发现一般输入ip(if)config之后,我们还会得到子网掩码,什么是子网掩码?
子网掩码>
子网掩码是用于划分IP地址中的网络部分和主机部分的,那它的划分原理是什么呢?可以看到在上面的图片中我们的子网掩码是255.255.255.0,我们知道一般IP是由三个小数点分割的四个八位二进制数(00000000b-11111111b)组成的。那么这就注定了它的范围不会超过255,同时,这个数一般不会是0或者255。那么如果你会十进制到二进制的转换的话,你可以很容易的将上面的子网掩码翻译成二进制我们发现它就是11111111.11111111.11111111.00000000,我们规定为一的部分是网络部分,而为0的部分是主机部分,所以我们的主机和同一个局域网内的主机不同的地方就是主机的名字,也就是四个数里面的最后一个数,所以我们的扫描范围应该是192.168.1.1->192.168.1.254。
通常我们的扫描范围变得更大之后,我们就会等待更长的时间。
好吧,它扫了不到三秒就把所有的设备都扫出来了。
CIDR书写扫描表达式范围
在上面的扫描中通常我们认为书写是不够优雅和正规的,我们如果想扫了这个网段的所有的设备,我们可以输入以下的指令:
nmap -sn 192.168.1.0/24
可以看到,我们得到了所有的结果。但是如果你只想扫描0->100那么这种书写格式可能不如上一种通过直接书写范围扫描的合适了。
除了ping的扫描方式之外,它同样还有其他的方式来扫描。
ARP扫描
ARP扫描是在局域网内根据IP地址获取物理地址(MAC地址)的扫描方法。在Nmap中,可以使用-PR参数来进行ARP扫描。但请注意,ARP扫描仅适用于直接连接的网络(即同一局域网内)。它的扫描指令是:
nmap -PR <网段>
我们发现这种扫描的方式我们会得到更加完整的数据结果,甚至连开放的端口都给我们扫出来了,虽然它更快但是同样会耗费更长的时间,我们扫一个的时间上面已经扫了254个了。
在我们使用工具的时候,我们只是修改了一下-PR就可以让它实现不同的扫描方式,那么我们现在了解一下什么是ARP也是有必要的。
ARP介绍
ARP,全称Address Resolution Protocol,即地址解析协议,是一种网络协议,它的主要功能是在网络层(IP层)和数据链路层(MAC层)之间进行地址转换。具体来说,ARP协议允许网络设备(如计算机、打印机、路由器等)根据已知的IP地址找到对应的MAC地址,以便在局域网(LAN)内实现数据的正确传输。
APR是通过广播--请求--应答的方式来工作的。
请求:主机A会向局域网内的所有设备发送一个ARP请求包。这个请求包中包含主机A的IP地址和MAC地址,以及主机B的IP地址。由于不知道主机B的MAC地址,所以ARP请求包会被发送到局域网内的广播地址。
应答:局域网内的所有设备都会收到这个ARP请求包,并检查请求包中的IP地址是否与自己的IP地址匹配。如果某个设备(如主机B)发现请求包中的IP地址与自己的IP地址匹配,它就会生成一个ARP应答包,其中包含自己的MAC地址,并将这个应答包发送回主机A。
缓存:为了提高效率,主机A会将主机B的IP地址和MAC地址的对应关系存储在ARP缓存中。这样,当主机A下次需要向主机B发送数据时,就可以直接从ARP缓存中查找MAC地址,而无需再次发送ARP请求。
简单来说,就是我们的路由器要向姓名(MAC地址)为a的设备发送信息,但是并不知道这个a的id=1(IP),于是我们的路由器就会问所有的设备:“你是不是叫a?”(广播),当他问道正确的设备时,这个设备就会回复他:“我就是a。”(ARP相应包)。这个时候为了下次的数据传输更加方便,你的设备通常会创建一个键值对存储起来(缓存),在这个例子中就是a:1下次找的时候就会更加方便了。
这不禁让我想到了一种网络攻击的方式。如果在缓存中我们给设备注入错的ARP那么设备就会向错误的设备发送请求,让它把包发给我们而不是路由器,我们再把包丢了,这样他的设备就显示正常连接了网络,但是传输数据的功能就会失效。
ARP投毒
这种投毒的欺骗方式,一般有两种,我们既可以通过欺骗路由器我们是目标主机,从而让路由器把各种响应包发给我们,我们再丢弃掉。
欺骗路由器
在操作过程中我们必须要用root的用户权限,输入sudo su或者直接打开红色的终端都可以。
输入指令:
arpspoof -i <网络接口> -t 192.168.1.1 192.168.1.6
在上面的指令中,192.168.1.1是我们希望欺骗的路由器的地址,而192.168.1.6是我们希望欺骗的主机地址(我的手机)。
这个网络接口通常是指你的网卡,我们可以输入ifconfig查看网卡都有什么。一般在没有外接网卡的情况下,大家的电脑都是eth0和wlan0网卡两个,我们可以使用eth0网卡来欺骗。
接下来,我们输入指令测试一下。
可以看到,我们右上角显示的网络是正常的,但是我们就是无法访问浏览器界面。
输入指令之后就会得到这个界面,我们会舍弃路由器发送的响应包,但是这种攻击只是暂时的,它并不会长期影响,如果我们想进行长期的攻击就需要编写一个脚本,在python中有subprocess包它会成为一个不错的选择,或者编写shell脚本也是可以的。
而另一种就是让被攻击的主机认为我们是路由器,它会把各种请求发给我们,我们再丢弃掉即可。
欺骗主机
欺骗主机只需要把上面的指令的后两个IP地址调换过来即可,如果上面的欺骗会让我们的路由器无法找到目标主机,那么这种方法就会让我们的目标主机无法向路由器发送请求。
该欺骗我就不再过多演示,与上面的大差不差。
ICMP探测
虽然ICMP探测通常指的是使用ICMP数据包来探测网络设备的存活状态,但在Nmap中,这可以通过Ping扫描来实现,因为Ping扫描本质上就是使用ICMP(或其他协议)数据包进行探测。或者,为了更明确地指定使用ICMP协议进行探测(尽管Nmap通常会根据目标选择最合适的协议),可以使用-PE
参数(但这在大多数情况下与-sn
的效果相似,除非有特定的需求或配置)。在某些情况下,由于防火墙或网络配置的限制,ICMP数据包可能会被阻止。因此,如果Ping扫描失败,可以尝试使用其他协议或扫描方法。
二、端口扫描
用于确定目标主机上开放的网络端口。Nmap支持多种扫描技术,如TCP SYN扫描、TCP Connect扫描、UDP扫描等。通过分析响应和超时信息,Nmap可以识别主机上开放的端口,并确定所运行的服务类型。下面我们详细介绍这三种扫描的方式。
TCP SYN扫描
TCP SYN扫描利用TCP协议的三次握手过程来检测目标主机上的开放端口。攻击者发送一个SYN包给目标主机的每个端口,如果目标主机返回一个SYN/ACK包,则表示该端口是开放的;如果目标主机返回一个RST包,则表示该端口是关闭的。因为不必全部打开一个TCP连接,所以这项技术通常称为半开扫描(half-open)。
nmap -sS <目标IP/主机名>
TCP Connect扫描
TCP Connect扫描使用完整的TCP连接来检测目标主机上的开放端口。攻击者尝试建立一个TCP连接到目标主机的每个端口,如果连接成功,则表示该端口是开放的;如果连接失败,则表示该端口是关闭的。
nmap -sT <目标IP/主机名>
UDP扫描
UDP扫描用于检测UDP端口的开放状态。由于UDP是无连接的协议,没有像TCP三次握手那样的确认机制,因此UDP扫描需要发送一个UDP包到目标主机的每个端口,并根据目标主机的响应来判断端口状态。如果目标主机返回一个ICMP端口不可达的消息,则表示该端口是关闭的;如果目标主机没有返回任何消息(或在一定时间内没有响应),则表示该端口可能是开放的或者被过滤的。
nmap -sU <目标IP/主机名>
我们在主机上打开一个服务器然后用第二种方法扫一下试试。
我们先随便把一个简单的php代码部署到服务器,可以看到我们部署的是8000端口,我们知道浏览器浏览网页走的是TCP协议,所以我们按第一种第二种方式都是可以扫描到的。
我们扫了一千个端口发现只有我们服务器占用的8000端口是开着的,而且是tcp协议。
三、操作系统探测
用于确定目标主机运行的操作系统类型。Nmap通过分析目标主机的网络响应、TCP/IP栈行为和其他特征来进行操作系统识别,这有助于评估其安全性,并确定适当的安全策略和防护措施。
这个TCP/IP栈行为应该是计算机网络上比较入门级别的知识点了。我直接从网上搜索过来就不多说了。
TCP/IP栈行为,指的是TCP/IP协议栈在网络通信中的具体运作方式和过程。TCP/IP协议栈是一个网络通信协议集合,它定义了电子设备如何连入因特网,以及数据如何在它们之间进行传输。这个协议栈通常被分为四层或五层,每一层都负责不同的功能,共同协作以完成网络通信。
TCP/IP协议栈的分层结构
应用层:这是TCP/IP协议栈的最高层,主要负责处理特定的应用程序细节。它定义数据格式,并按照对应的格式解读数据。常见的协议有HTTP(用于Web通信)、FTP(用于文件传输)、SMTP(用于电子邮件发送)等。应用层将高层应用程序的需求转换为网络通信需求,并将网络响应转换为应用程序可以理解的形式。
传输层:这一层主要负责端到端的数据传输服务。它定义端口,确认主机上应用程序的身份,并将数据从一端主机传送到另一端主机。传输层的主要协议有TCP(传输控制协议)和UDP(用户数据报协议)。TCP提供可靠的数据传输服务,通过建立连接、确认接收、流量控制和拥塞控制等机制来确保数据的完整性和顺序性。而UDP则提供无连接的数据传输服务,适用于对实时性要求较高的应用,如视频会议和在线游戏。
网络层:网络层的主要任务是负责数据包从源主机到目的主机的路由选择和传输。它使用IP协议(互联网协议)来标识和寻址不同的网络设备,并将数据包从一个网络传输到另一个网络。IP协议负责将数据包封装成IP数据报,并添加源地址和目的地址信息,以便在网络中进行传输。网络层还负责处理数据包的分片和重组,以及处理网络拥塞控制。
数据链路层(或网络接口层):这一层负责本地网络连接和数据帧传输。它包括了以太网、Wi-Fi等物理网络技术,负责将数据包封装成帧,并在物理介质上传输。数据链路层还负责错误检测和纠正,确保数据在物理介质上的正确传输。它使用MAC地址(媒体访问控制地址)来标识网络接口。
物理层(在某些五层模型中):这是TCP/IP协议栈的最底层,负责建立设备与设备间的物理连接。它将二进制数据转换为电信号或其他形式的信号,通过物理介质(如电缆、光纤或无线信号)进行传输。
这种探测操作起来也是非常简单,因为操作系统的英文是operating system或者os所以输入的指令就是-O。
nmap -O <目标IP/主机名>
我们用kali扫描一下主机192.168.1.3使用的是Windows系统。
如果你想获得更加详细的信息,包括操作系统版本、内核信息等,你可以使用:
nmap -A <目标IP/主机名>
给我扫了三分钟了,这种的确没有上面的那一种更加方便,扫出来的东西似乎有用的不多。因此我还是更倾向于使用-O扫描。
四、服务器版本探测
用于确定目标主机上运行的具体服务及其版本信息。Nmap使用各种技术和指纹库来识别服务类型和版本,包括分析响应信息、探测已知漏洞等。这有助于评估目标主机上运行的服务的安全性和漏洞风险,以及进行服务管理和升级计划。
输入的指令是:
nmap -p 8000 -sV 192.168.1.18
我们用django开发了一个服务器端,我们扫描一下看看都有什么结果。
上图左边是nmap扫描得到的结果,右边是django服务端的报表,最终nmap还是很能干地发现了我们的服务器是python服务器。
以上是一些基本的操作,有兴趣的同学可以再深入了解。