对目标主机的扫描是渗透过程中信息收集阶段的重要组成部分,由于现在大部分的网络都是基于TCP/IP协议栈的,所以根据TCP/IP协议栈的特性进行的扫描往往十分实用,nmap就是众多扫描工具中的佼佼者。

网络上不同的进程间通信常常通过具有以下的五元组,即:源IP地址、目的IP地址、协议号、源端口、目的端口,网络上提供服务的主机正是在自己的对应端口绑定特定的服务来对到来的请求进行处理并回复。由于IP和和TCP协议在整个协议栈中占据重要地位,所以这里贴出两种报文的头部格式:



基于TCP协议的通信的正常通信的过程中通常有以下的三次握手和四次挥手的过程:


在通信的过程中各个TCP报文中的控制位扮演了重要的角色,可以通过发送带有不同标志位组合的TCP报文然后通过返回报文中的被设置的标志位对目标主机和目标主机上的端口进行判断。

各标志位的作用如下:

  1. URG:紧急指针有效
  2. ACK:确认有效
  3. PSH:请求推送
  4. RST:连接复位
  5. SYN:同步序号
  6. FIN:终止连接

nmap的扫描就是巧妙的利用这些标志位的特性对目标进行扫描,下边就是一些扫描命令的分析。

环境

运行nmap的主机(centos7):192.168.66.10

被扫描主机(centos7):192.168.66.11

现成的靶机(owasp):192.168.66.13

由于linux的防火墙机制太复杂,所以这里吧里边的规则清空,只添加一条自定的规则,方便对原理的分析

清空centos的iptables

iptables -F 清空已有的规则

iptables -X 清空用用户自定义的chain

iptables -Z 清空chain的技术与流量统计

可以看到关于用户的filter表已经所有规则被清除,这时候被扫描机器相当于没有防备

为了查看防火墙对扫描的影响,这里添加一条简单的规则

iptables -I/A INPUT -p tcp --dport 1503 -j DROP

表示在INPUT链中添加tcp规则,当目标端口是1503的时候就丢掉数据包

添加了一条规则

其中被扫描主机开放了的端口和状态分别为:

1500:用socker监听,udp服务,收到udp数据会发送hello回复

1501:用nc的udp模式监听,不会回复数据包

1502:用nc的tcp模式监听

1503:用nc的tcp模式监听,但是设置了iptables的INPUT链阻挡了进入的tcp包

按照以上规则设置侦听的端口,用netstat命令查看端口是否打开成功

其中1500端口的UDP服务程序如下

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/ip.h>const int SERV_PORT = 1500;
const int MAXLINE = 2048;void dg_echo(int sockfd , struct sockaddr *pcliaddr , socklen_t clilen)
{int n;socklen_t len;char mesg[MAXLINE];char reply[6] = "hello"for( ; ;){len = clilen;if((n = recvfrom(sockfd , mesg , MAXLINE , 0 , pcliaddr , &len))<0){perror("recvfrom error");exit(1);}//ifif((n = sendto(sockfd , reply, 6 , 0 , pcliaddr , len)) < 0){perror("sendto error");exit(1);}//if}//for}int main(int argc , char **argv)
{int sockfd;struct sockaddr_in servaddr , cliaddr;bzero(&servaddr , sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);if((sockfd = socket(AF_INET , SOCK_DGRAM , 0)) < 0){perror("socket error");exit(1);}//ifif(bind(sockfd , (struct sockaddr *)&servaddr , sizeof(servaddr))){perror("bind error");exit(1);}//ifdg_echo(sockfd , (struct sockaddr *)&cliaddr , sizeof(cliaddr));
}

现在开始对端口的检测

nc对端口的检测:

nc -vz 192.168.66.11 port




可以看出1500、1501端口直接回送了设置了RST标识的报文,说明该端口没有TCP服务,
1502端口发生了完整的三次握手和四次挥手过程(四次挥手中服务器端将ACK和FIN标志整合到了一个报文中发送,所以只有三个包,实质还是四次挥手的过程),1503端口过滤了SYN请求,nc重发了三次SYN包之后输出超时信息。

使用udp模式进行端口扫描



wireshark抓包结果,可见,端口对于收到的udp包会发送端口不可达的ICMP报文,但是可以接受udp的端口就不会回复报文或者回复一些信息,可以通过这些信息判断目标主机的目标端口是否开启的是udp服务,可以通过和tcp扫描配合使用判断端口状态。

下边开始用nnap对目标主机进行探测

nmap主要是进行端口检测、主机检测、服务版本的检测、操作系统的检测,甚至可以自己编写一些检测脚本去扫描目标的漏洞。这里只说一些简单的原理。

nmap -A -T4 domain_name/target_ip
这个是简单也是最全面的扫描,缺点就是太慢了。。。

例如对owasp靶机进行以上命令的扫描,结果如下:

可以看出这个扫描对目标主机进行全面的扫描,输出了开放的端口、协议、服务、服务的版本等信息,通过这些信息就可以决定后期的渗透方式。但在owasp用上用tcpdump进行抓包,可以看到nmap发送的包的信息,隐蔽性也是扫描过程中要重点关注的问题。

其次,nmap可以对多个目标进行扫描,还可以指定扫描的端口,格式为:

nmap xxx.xxx.0.0/16 -p target_port
nmap xxx.xxx.a-b.c-d -p port1, port2, port3…
nmap xxx.xxx.a-b.c-d -p port_start-port_end

这样大大减少了操作人员的操作时间,可以一次扫描大量主机的大量端口。

一般对端口的分类有打开和关闭两中状态,nmap里边对端口的状态进行了细分

  1. open:端口是打开状态,应用程序在此端口上接受tcp连接、dup数据报、sctp关联
  2. closed:端口可访问,但是没有程序在监听
  3. filtered:无法确定端口的状态,因为目标主机加了筛选机制将探测的包过滤了
  4. unfiltered:可以访问端口,但是无法确定目标端口是打开的还是关闭的,通过ACK扫描得到此状态
  5. open|filtered:无法确定是打开的还是过滤的状态,因为对应的目标没有响应,udp、ip、FIN、 NULL扫描获得此种状态
  6. close|filtered:无法确定是关闭的还是过滤的,ip空闲扫描的时候得到此状态

一些端口扫描的命令抓包分析(为了方便分析,所有命令都扫描按照前文描述设置好的端口,还额外扫描一个关闭的端口):

nmap -sS target -p port/ports

通过发送带有SYN标志位的tcp报文进行的扫描,但是不会和目标主机进行三次握手的连接,可以区分open、closed、filered状态

对1500-1504进行了扫描,得到了对应的信息,抓包分析



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210109225034708.png
其中1500、1501、1504发送了RST回复,说明没有TCP服务,判断为close;1502进行了两次握手,第三次握手的时候nmap主动断开了连接;1503长时间没有收到回复,超时,判断为filter。

nmap的两次握手

TCP连接扫描

nmap -sS target -p port/ports

结果和sS扫描的一致,但是观察nc监听的端口,发现nc关闭


wireshark抓包进行分析,在1502端口上发现如下的包

从端口判断,nmap先发起了三次握手和1502端口进行了连接,扫描结束后nmap发送了RST断开了连接,这种方式会在目标主机留下痕迹,所以不是那么的优秀。这种情况下nmap调用了系统的connect调用而不是使用原始套接字,而且每次都要建立连接并且断开连接,所以效率比较低。

UDP扫描

nmap -sS target -p port/ports



发现了一个可以自动回复信息的端口,判断为open;其它端口回送了端口不可达的报文,表示端口关闭,若是其它ICMP类型的则表示端口是filtered。UDP扫描的好处在一它可以穿过一些只过滤了TCP包的防火墙,但是UDP扫描的一个问题是效率较低。

SCTP INIT扫描

nmap -sY target -p port/ports

可以分化open、closed、filtered状态,通过发送INIT快然后查看回复判断结果,SCTP协议还不熟悉,这里就不讲了,,,

NULL、FIN、Xmas扫描

nmap -sN -sF -sX target -p port/ports

其中sN扫描没有设置任何标志位,sF设置了FIN位,sX设置了FIN、PUSH、URG位。因为closed的端口会对不包含RST的报文回复RST,open状态的端口会忽略不包含前边三个标志的报文,所以可以判断端口的打开或者关闭状态。收到RST则表示端口关闭,没有回复则判断位打开或者过滤。

可以看出得到的结果相同,wireshark抓到的包也和论证的一样

ACK扫描

nmap -sN target -p port/ports

在发送的报文中设置了ACK位,这个主要是为了探测防火墙,返回的状态状态也是filtered或者unfiltered,open或者closed状态对于ACK标记都返回RST



区分出了被过滤的端口

SCTP COOKIE ECHO扫描

nmap -sZ target -p port/ports

这个命令用了SCTP扫描,可以区分出closed和open | filtered状态,相对于sY隐蔽一点

空闲扫描

nmap -sI target -p port/ports

这也是老师讲的僵尸扫描的方式,老师的知乎中已经讲的很详细了,这里就不多叙述了

IP协议扫描

nmap -sI target -p port/ports

扫描目标主机支持的协议,用p指定协议号

–scanflags

自定义扫描的标志,通过将给定的数组的二进制形式设置标志位字段,还可以通过指定的扫描类型告诉nmap如何解释响应。

一些其他的选项

-p 指定端口

–exclude-port 扫描时跳过指定端口

-F 快速扫描,扫描的端口从默认的1000缩减到一百,扫描一些常用端口

-sV 版本检测,可以检测对应端口上服务的版本和类型

-O 操作系统扫描,这个选项的猜测不一定准

主机扫描:
主机扫描的原理和端口扫描是一样的,其中会加入一些ICMP报文的扫描进行辅助判断目标主机的状态,主机扫描更多的时候是为了判断目标主机是否开启,所以为了增加扫描速度主机扫描一般不会对每一台扫描出来的主机进行全面细致的扫描,故主机扫描的许多选项只会扫描有限的端口,通常是一些开启了重要服务的端口,例如80、443、22等。主机扫描的选项就不再一一演示了,这里给出简单解释。

-sn 无端口扫描,但是会用ICMP、对端口443的SYN、对端口80的ACK和ICMP时间戳请求

-Pn 无ping扫描

-PS TCP SYN Ping扫描

-PA TCP的ACK扫描

-PU UDP扫描

-PY SCTP INIT Pint扫描

-PO IP扫描

-PE ICMP回显请求

-PP ICMP时间戳请求

-PM ICMP地址掩码请求

–disable-arp-ping 没有ARP的ping

–discover-ignore-rst 忽略RST响应

–resolve-all 扫描多个解析的地址

–system-dsn 使用系统DNS解析

关于nmap的更多详细的信息和源码大家可以参考:nmap官网

通过wireshark抓包对nmap一些原理分析相关推荐

  1. wireshark抓包数据:理解与分析

    wireshark是一个非常好用的抓包工具,本文根据平时抓包经验,对之前wireshark抓包的一些常见知识点进行了整理. 有不当之处,欢迎指正 注明:本文为原创文章,转载请注明出处.参考文章见本文末 ...

  2. wireshark抓包工具的使用及分析

    前段时间看到群里在讨论Wireshark抓包工具,想写一篇使用笔记但一直没来得及写,本篇就通过实例来分享wireshark抓包工具的使用. Wireshark简介 Wireshark 是一个网络封包分 ...

  3. 网络知识===wireshark抓包,三次握手分析

    TCP需要三次握手建立连接: 网上的三次握手讲解的太复杂抽象,尝试着使用wireshark抓包分析,得到如下数据: 整个过程分析如下: step1 client给server发送:[SYN] Seq ...

  4. 使用wireshark抓包并进行网络协议分析

    前言 今天想通过抓包实验,巩固一下所学习的网络协议.同时,在知识点上会加上以前遇到的一些问题.这次实验并不是对所有的网络协议都进行分析,而是从下面这个问题出发(面试常被问).从这一过程中复习学过的网络 ...

  5. 通过Wireshark抓包分析谈谈DNS域名解析的那些事儿

    本文主要想通过动手实际分析一下是如何通过DNS服务器来解析域名获取对应IP地址的,毕竟,纸上得来终觉浅,绝知此事要躬行. 域名与IP地址 当在浏览器上敲下"www.baidu.com&quo ...

  6. 计算机网络实验 ——wireshark抓包简要分析TCP、UDP协议

    [计算机网络实验 --wireshark抓包简要分析TCP.UDP协议] (1)分析 TCPheader: Source Port:16bit源端口,数据发起者的端口号: Destination Po ...

  7. Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)

    [网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持.MAC泛洪)及数据流追踪和图像抓取(二) 2019年09月22日 21:55:44 Eastmount 阅读数 3515 文章标签:  ...

  8. [网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)

    这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步.前文分享了Wireshark安装入门和一个抓取网站用户名和密码的案例,本篇文章将继 ...

  9. Wireshark抓包分析交换机工作原理

    [实验名称] 交换机工作原理 [实验目的] 1.熟悉Linux虚拟网络环境: 2.熟悉Linux中network namespace的基本操作: 3.熟悉Linux中虚拟以太网设备Tap和veth p ...

最新文章

  1. 【总结】IE6,IE7,IE8,Firefox兼容的css hack 补充!
  2. javascript:面向对象编程基础:继承
  3. 采用集成的Windows验证和使用Sql Server身份验证进行数据库的登录
  4. Gauss-Newton算法代码详细解释(转载+自己注释)
  5. 延迟开学?这些教育读书公众号可以帮助孩子学习! 你都关注了吗?
  6. 当程序发布特别慢的时候,如何高效使用Eclipse
  7. k3c路由怎么设置虚拟服务器,搭建ngrok服务器!!给k3.k3c.K2.k2p路由器使用!!详细教程!!!...
  8. 通俗讲解深度学习和神经网络!
  9. 光纤线上线缆标识信息解读
  10. 智慧零售四年,来酷科技好大一盘棋
  11. 【数理统计】卡方检验
  12. 八皇后问题python_八皇后问题 Python实现
  13. monorepo npm publish 显示404
  14. (3.8)一个按键所能涉及的:内核按键标准驱动gpio-keys
  15. 基于英雄大作战龙奥的Unity骨骼动画初探
  16. 数据结构习题集作业代码(第一章)
  17. 网口压线顺序_家里网线的接法和顺序
  18. 由安卓开发中的一个坑引发的问题解决之道浅析
  19. 『broadview2006』博文视点在SD2.0大会上以书会友
  20. 计算机毕业设计springboot安卓小说阅读源码

热门文章

  1. Altium Designer笔记之有效低信号的顶线
  2. RNA-seq:最长转录本提取
  3. RNA编辑基本形式与相关技术的研究现状(阅读小结)
  4. 单片机AC220V过零检测电路仿真及改进仿真
  5. sap怎么删除服务器文件,SAP服务器的文件管理
  6. 语音识别(ASR)论文优选:Adapting GPT, GPT-2 and BERT Language Models for Speech Recognition
  7. TCP/IP网络通信协议
  8. 简化版SAAS——业务开单选择材料,选择的是库存是40的货品,实际出库的是-38的货品
  9. 物体检测及分类方法总结(提供了很多论文和代码链接)
  10. po是什么java_java中po层