nmap
nmap(一)
端口扫描在百度百科上的定义是:
端口扫描是指某些别有用心的人发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关),但是端口扫描不但可以为黑客所利用,同时端口扫描还是网络安全工作者的必备的利器,通过对端口的扫描,了解网站中出现的漏洞以及端口的开放情况,对网站安全方面有着不可或缺的贡献,是你学习网络安全的第一门课程的首选
目前在市面上主要的端口扫描工具是X_Scan、SuperScan、nmap,其中在这里主推的是nmap,因为nmap具有以下的这一些优点:
1、多种多样的参数,丰富的脚本库,满足用户的个人定制需求,其中脚本库还提供了很多强大的功能任你选择
2、强大的可移植性,基本上能在所有的主流系统上运行,而且代码是开源的
3、详细的文档说明,和强大的社区团队进行支持,方面新人上手
Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Auditing)工具,但是nmap也是有一些缺点的,比如说上手较难,但是难上手是相对的,与其他达到这种功能性的软件产品相比,还是比较容易上手的,但是这也不妨碍nmap成为世界千万安全专家列为必备的工具之一,在其中的一些影视作品中《黑客帝国2》、《特警判官》中都有亮相
废话不多说,开始今天的nmap学习:
nmap的安装:直接从百度上下载,然后安装的步骤跟其他的软件一样,最后确认安装成功只需要在命令行中输入nmap回车,有相关的参数输出即为安装成功,安装的具体步骤可以查看:http://jingyan.baidu.com/article/5bbb5a1b1e0a7713eba179cb.html,在此就不多说了
Nmap包含四项基本功能:
- 主机发现(Host Discovery)
- 端口扫描(Port Scanning)
- 版本侦测(Version Detection)
- 操作系统侦测(Operating System Detection)
下面就从主机发现一步一步进行探讨
主机发现顾名思义就是发现所要扫描的主机是否是正在运行的状态,接下来就来一个简单例子
例子要求:获取http://nmap.org 的主机是否开启
输入命令:nmap -F -sT -v nmap.org
-F:扫描100个最有可能开放的端口 -v 获取扫描的信息 -sT:采用的是TCP扫描 不写也是可以的,默认采用的就是TCP扫描
运行如下:
由图中的1,我们可以发现对URL进行解析花了16.5秒,这个地方花费的时间是可以进行优化的,优化的方法会稍后介绍
图中的2,是总共的运行时间
图中的3是说明有96个端口被屏蔽了,也就是说明了网站的防火墙是开启的,因为没有开启防火墙是不会对端口进行屏蔽的,
补充说明:
端口端口一般是有下面这几种状态的
状态 | 详细的参数说明 |
Open | 端口开启,数据有到达主机,有程序在端口上监控 |
Closed | 端口关闭,数据有到达主机,没有程序在端口上监控 |
Filtered | 数据没有到达主机,返回的结果为空,数据被防火墙或者是IDS过滤 |
UnFiltered | 数据有到达主机,但是不能识别端口的当前状态 |
Open|Filtered | 端口没有返回值,主要发生在UDP、IP、FIN、NULL和Xmas扫描中 |
Closed|Filtered |
只发生在IP ID idle扫描 |
图中的4是本次返回的关键信息,其中我们要主要关注的是端口号,端口状态,端口上的服务
那你可能就会要问为什么要关注这些端口呢?那这个问题就要转到探讨为什么要进行扫描?
扫描对于黑客和安全人员来说,主要的流程是这样的
上面的图中的IP写错了,应该改为FTP
从这个图中我们不难发现,我们主要关注的区域就是这些内容
接下来就来讨论下面上面提出来的问题?怎样对URL解析的时间进行优化,在Nmap重提供了不进行解析的参数(-n),这样就不会对域名进行解析了
其中关于域名解析的相关参数还有:
-R 为所有的目标主机进行解析
--system-dns 使用系统域名解析器进行解析,这个解析起来会比较慢
--dns-server 服务器选择DNS解析
说到-R注释的意思你会有所体会,其实nmap的扫描解析不止是对一个目标主机进行解析,还可以对一定范围内的目标主机群进行解析
例如:查找45.33.49.119-120的主机的状态以及端口状态
分析:
1、虽然查找的主机的数量不多,但是这样查找起来也是很浪费时间的, 所有我们可以通过使用快速查找的方法来节约时间
快速查找端口方法的原理如下:
默认的情况下,我们的查找是查找最有可能开放的1000端口,但是使用快速端口查找(参数 -F )会查找最有可能开放的100个端口,这样也就节约了10倍的时间
2、这里我们需要获取端口的状态,所以就不能使用参数(-sn),这个参数是可以跳过端口扫描,直接进行主机发现的
输入命令:nmap -F -sT -v -n 45.33.49.119-120 45.33.49.119:nmap.org的IP地址
PS:1、-sn参数只能扫描的主机,不能扫描端口,另一个参数也要特别注意的是(-PE)通过ICMP echo判定主机是否存活
运行情况如下:
图片中的1处指的是,采用sT的扫描方法,这种扫描方法准确,速度快,但是这样的扫描容易被防火墙和IDS发现并记录,所以这种方法,实际中并不多用
由图中的3处我们可以知道在不进行解析的情况下扫描用时为26.92秒,比解析的时候用的时间节约了不少
图中的4说明了扫描了2个主机,然后只有一个主机为开启
提示:
在nmap运行的时候,如果我们可以像其他编程一样打“断点”,直接按键盘的d键就行了,如果想知道运行的进度可以按下X键
好了,示例也讲完了,下面我们就来分析一下扫描的各种方法:
端口扫描
1、TCP扫描(-sT)
这是一种最为普通的扫描方法,这种扫描方法的特点是:扫描的速度快,准确性高,对操作者没有权限上的要求,但是容易被防火墙和IDS(防入侵系统)发现
运行的原理:通过建立TCP的三次握手连接来进行信息的传递
① Client端发送SYN;
② Server端返回SYN/ACK,表明端口开放;
③ Client端返回ACK,表明连接已建立;
④ Client端主动断开连接。
2、SYN扫描(-sS)
这是一种秘密的扫描方式之一,因为在SYN扫描中Client端和Server端没有形成3次握手,所以没有建立一个正常的TCP连接,因此不被防火墙和日志所记录,一般不会再目标主机上留下任何的痕迹,但是这种扫描是需要root权限(对于windows用户来说,是没有root权限这个概念的,root权限是linux的最高权限,对应windows的管理员权限)
运行的原理图如下:
3、NULL扫描
NULL扫描是一种反向的扫描方法,通过发送一个没有任何标志位的数据包给服务器,然后等待服务器的返回内容。这种扫描的方法比前面提及的扫描方法要隐蔽很多,但是这种方法的准确度也是较低的, 主要的用途是用来判断操作系统是否为windows,因为windows不遵守RFC 793标准,不论端口是开启还是关闭的都返回RST包
但是虽然NULL具有这样的一些用处,但是本人却认为不宜使用NULL
1、NULL方法的精确度不高,端口的状态返回的不是很准确
2、要获取目标主机的运行系统,可以使用参数(-O),来获取对于一些操作系统无法准确判断的,可以加上参数(-osscan-guess)
3、NULL扫描易被过滤
4、FIN扫描
FIN扫描的原理与NULL扫描的原理基本上是一样的在这里就不重复了
5、ACK扫描
ACK扫描的原理是发送一个ACK包给目标主机,不论目标主机的端口是否开启,都会返回相应的RST包,通过判断RST包中的TTL来判断端口是否开启
运行原理图:
TTL值小于64端口开启,大于64端口关闭
大致上主要的扫描方法就是这些,除了我们可以按照这样些参数去执行扫描外,还可以自己定义一个TCP扫描包
6、自定义TCP扫描包的参数为(--scanflags)
例如:定制一个包含ACK扫描和SYN扫描的安装包
命令:nmap --scanflags ACKSYN nmap.org
好了,接下来还有各种扫描方法的端口列表参数
-PS 端口列表用,隔开[tcp80 syn 扫描]
-PA 端口列表用,隔开[ack扫描](PS+PA测试状态包过滤防火墙【非状态的PA可以过】)【默认扫描端口1-1024】
-PU 端口列表用,隔开[udp高端口扫描 穿越只过滤tcp的防火墙]
其他的常见命令
输出命令
-oN 文件名 输出普通文件
-oX 文件名 输出xml文件
错误调试:
--log-errors 输出错误日志
--packet-trace 获取从当前主机到目标主机的所有节点
其他的相关参数可以参考:http://www.2cto.com/Article/201203/125686.html 到时候需要再进行查找
相关资料:
http://www.tuicool.com/articles/ZBvmYrN
http://www.2cto.com/Article/201203/125686.html
nmap(二)
接着讲上节的内容,上节中提到了一个时间优化的问题是使用参数-n,通过不解析地址来进行优化时间的,但是优化时间的方法还有很多,比如说我们可以通过时间优化(0-5),指定单位时间内的探针数,设置组的大小
时间优化(0-5)
时间优化的参数是(-T0~5),最快的扫描速度为-T5,最慢的扫描速度为-T0,实现的原理:通过设置各个端口的扫描周期,从而来控制整个扫描的时间,比如说T0各个端口的扫描周期大约为5分钟,而T5各个端口的扫描周期为5ms,但是过快的扫描也是有缺点的,扫描的周期过快,会很容易被防火墙和IDS发现并记录,因为防火墙大多数会将端口周期过段识别为扫描从而屏蔽掉,如果不对其进行设置的话,默认值为T4
--min-hostgroup/--max-hostgroup size 设置组的大小
--min-parallelism/--max-parellelism time指定时间内的探针数
具体的使用方法就不做介绍了,有兴趣的话,可以试一试研究一下变知道怎样使用了
在上节中还讲漏了一个知识点获取指定端口的参数(-p),这个参数的意义在于对于我们有时候只想监控某个特定的端口的状态,这个参数是即为有用的,可以节约了不少的时间
例如:监控nmap.org的80端口的状态
命令:nmap -p 80 nmap.org
接下来就进行这一节的主要内容,如果上节没有了解清楚的同学,建议返回上节理解清楚再开始这一节
这一节我们就来讲讲怎样规避被防火墙或IDS发现的风险以及操作的步骤
上节中我们假设的是在一个网络安全较为薄弱的情况下就可以正常进行的,但是正常的网站或者个人都是对安全有一定的防范的,网站中基本上都会存在安全狗、防火墙等规避风险的措施,个人电脑也会安装各种安全软件,所以对于做扫描工作的人来说,我们不知道通过扫描获取相关的信息,同时也要保护好自己的隐私,比如IP等信息,防止被防火墙或者是网络日志所记录下来
在讲这节之前我们来了解一下什么事防火墙?
防火墙的原理图:
防火墙是通过在客户端与服务器端之间搭建一个监控(运行的原理有点像Fiddler),通过对特定开放的端口进行屏蔽掉,从而达到网络安全的作用,防火墙在其功能上也会有一些其他的功能,这个要看防火墙的实际情况
规避的基本思路是:
1、通过伪造访问的IP地址
2、通过对发送信息进行处理
3、将风险进行嫁接
4、其他的技术
伪造IP地址
伪造IP地址有很多种方法,可以通过下面的这几种方法是我认为比较常见的希望大家能喜欢
一、诱饵扫描(-D)
诱饵扫描的工作原理是:通过伪造大量的IP与自己真实的IP一起访问网站,从而混淆管理员的判断,其中问你们使用ME来代表自己的真实地址
例子:虚构一个IP为203.88.163.34与自己的真实地址去扫描nmap.org
命令:nmap -F -D 203.88.163.34,ME nmap.org
运行的结果如下:
但是在使用伪造的IP的同时,我们要注意要对伪造的IP进行主机发现,来判断主机是否存在,是否开启,因为有些防火墙策略是有这样规定的:如果访问的IP主机是关闭或者是为空的话,就讲所有的返回内容过滤掉。试想一下,如果主机关闭或者是不存在,那么怎么可能会发送扫描的命令给目标主机呢?
要找到开启的目标主机理论上是没有什么要求的,但是为了节约时间,我建议是直接使用某个网站的IP地址,这样有一下的几个好处
1、IP地址容易获得,一般的网站是通过ping参数就可以直接获取该网站的IP地址,除了一些不让进行Ping操作的网站除外
2、容易保证IP的正常开启,因为谁家的网站会经常关闭服务器,服务器一般是总是开启的
二、源地址欺骗(-S)
源地址欺骗的原理是:通过将自己的IP伪装成为其他的IP去扫描目标主机从而骗过目标主机的追踪
假设要伪装成为1.1.1.1:参数-S 1.1.1.1 使用1.1.1.1进行扫描,让防火墙误以为是来自1.1.1.1的扫描行为
在使用的时候要注意与-e进行使用,因为除了制定要伪装成为的对象IP外,还要指定返回的IP地址
三、时间优化(-T)
通过时间优化也提高通过防火墙和IDS的通过率
发送信息处理
指定使用分片(-f)
分片的工作原理是:将可疑的探测包进行分片处理(例如将TCP包拆分成多个IP包发送过去),某些简单的防火墙为了加快处理速度可能不会进行重组检查,以此避开其检查。
将风险责任进行嫁接
空闲扫描(-sI):
这里有一篇比较全面的文章http://www.2cto.com/Article/201505/396631.html 再次就不多做介绍
其他的相关技术:
有MAC伪造技术等
防火墙/IDS躲避和哄骗
-f; --mtu value 指定使用分片、指定数据包的MTU.
-D decoy1,decoy2,ME 使用诱饵隐蔽扫描
-S IP-ADDRESS 源地址欺骗
-e interface 使用指定的接口
-g/ --source-port PROTNUM 使用指定源端口
--proxies url1,[url2],... 使用HTTP或者SOCKS4的代理
--data-length NUM 填充随机数据让数据包长度达到NUM
--ip-options OPTIONS 使用指定的IP选项来发送数据包
--ttl VALUE 设置IP time-to-live域
--spoof-mac ADDR/PREFIX/VEBDOR MAC地址伪装
--badsum 使用错误的checksum来发送数据包