freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

端口扫描技术实现分析
2022-05-06 23:07:08
所属地 山东省

0x01 端口

端口的百科定义:

端口(port),可以认为是设备与外界通讯交流的出口,端口的范围是从0 到 65535,主机通常通过“IP地址+端口号”来区分不同的服务的。

端口号在 0~1023之间的为通用端口。

端口分类

“端口”可分为 虚拟端口物理端口

  • 虚拟端口:计算机内部或交换机路由器内的端口,不可见例如计算机中的80端口、21端口、23端口等
  • 物理端口:又称为接口,可见,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口,电话使用RJ11插口也属于物理端口的范畴

我们今天关注的就是计算机的虚拟端口。

根据协议,端口又可分为TCP 和 UDP

  • TCP端口Transmission Control Protocol传输控制协议,TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能。
  • UDP端口:User Datagram Protocol用户数据报协议,UDP是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序。

0x02 基础知识补充

在理解TCP与UDP之前,我们要先明确OSI七层模型,OSI七层模型在1984年前后被引入。TCP与UDP如同其他统称为协议,网络协议是决定系统如何在网络中通信的规则标准集,采用相同的协议,不同的系统就可以进行通信。

1651849269_627538358d8d5b282ae9b.png!small

应用层提供文件传输、消息转换等功能,当应用需要发送数据时,会将数据发送给这一层上对应的协议;
应用层协议例如:简单邮件传输协议(SMTP),超文本传输协议(HTTP)、行式打印机后台程序(LPD)、文件传输协议(FTP)、普通文件传输协议(TFTP)、Telnet;

表示层用于接收应用层的消息,并将消息转换成标准的格式(可用于计算机);
应用层协议例如:应用ASCII码(美国信息交换标准编码)转换字符,利用标签图像文件格式(TIFF)、图形交换格式(GIF)、联合图像专家组(JPEG)、扩展二进制编码十进制交换模式(RBCDIM);

会话层用于对两侧的应用程序建立连接,包括三个步骤“链接建立”、“数据传输”,“连接释放”,会话层运用三种模式进行程序之间的通信:

  • 单工模式:通信单向发生
  • 半双工模式:双向通行,但不能同时发送数据
  • 全双工模式:双向通行,能同时发送数据

传输层用于建立计算机间的联系;
传输层协议例如:传输控制协议(TCP)、用户数据报协议(UDP)、安全套接字层(SSL)、序列包交换(SPX);

网络层用于在数据包的首部插入具体信息,可以将数据正确的编址和路由,发送到目的地;
网络层协议例如:网际控制消息协议(ICMP)、路由信息协议(RIP)、开放最短路径优先(OSPF)、边界网关协议(BGP)、互联网组管理协议(IGMP);

数据链路层:负责通信,将数据转换为物理层能看得懂的格式;
数据链路层分为两个子层,逻辑链路控制(LLC)层,介质访问控制(MAC)层;
数据链路层协议例如:点对点协议(PPP)、ATM、第2层隧道协议(L2TP)、FDDI、以太网(IEEE 802.3)、令牌环(IEEE 802.5)、无线以太网(IEEE 802.11);

物理层用于将转换成的数据用于电压;
物理层协议例如:综合服务数字网络(ISDN)、数字用户线路(DSL)、同步光纤网络(SONET)。

0x03 TCP 与 UDP

TCP

1651849276_6275383cd7529bf9eebfb.png!small

图片地址:https://hmurl.cn/6n8GKdDc

运用TCP协议,两个消息在传送之前,会经过三次握手,这也就是为什么TCP为面向连接的协议,握手完成就会建立虚拟链接,并且为全双工。

TCP可以确保数据到达目的地,接收到数据包会返回ACK,使用序列号,可以保证每一个数据包都被接收,经常用于可靠的传输。

SMTP简单邮件传输协议在传送消息时需要确保数据的传递,就会使用TCP。

三次握手

1651849284_627538445dadbd15f80bd.png!small

图片地址:https://hmurl.cn/aHk40hhW

发送方在通信前,会先给接收方发送一个同步包(SYN),接收方返回给一个同步包(SYN),一个应答包(ACK),之后发送方通过发送应答包(ACK)进行应答。

UDP

UDP是无连接协议,相比TCP速度较快,但不能保证数据到达目的地,是一种不可靠协议,也不是用序列号。

0x04 TCP CONNECT SCAN

TCP CONNECT SCAN本质是通过尝试建立三次握手,建立成功则返回“端口开放”,若发送方接收到 RST 则表示“端口未开放”。

但是TCP CONNECT扫描速度比较慢,而且建立了完整的TCP连接,会在目标主机上留下记录信息,不够隐蔽。所以,TCP connect是TCP SYN无法使用才考虑使用的方式。

1651849290_6275384ab8290090ee8a4.png!small

python实现

# -*- coding = utf-8 -*-
# @Time : 2022/2/26 9:52 上午
# @Author : lmn
# @File : TCP_CONNECT_SCAN_lmn.py
# @Software : PyCharm

import threading
from socket import *

lock = threading.Lock()


def PortScanner(host, port):
    try:
        s = socket(AF_INET, SOCK_STREAM)
        # AF_INET 服务器之间网络通信
        # SOCK_STREAM 流式socket,for TCP
        s.connect((host, port))
        # s.connect('192.168.1.1','80'))  错误
        # s.connect('192.168.1.1',80))  正确
        lock.acquire()
        # 只有一个线程能成功地获取锁
        print("[+] PORT: %d open" % port)
        lock.release()
        # 释放锁
        s.close()
    except:
        pass


def main():
    setdefaulttimeout(1)
    # 1秒后,如果还未成功,自动跳入下一次操作,此次运行失败
    print("Welcome to use TCP CONNECT SCAN!!!")
    IP = input("Please Input IP:>")
    PORT = input("Please Input PORT(Separated by ','):>")
    portList = PORT.split(',')
    for i in portList:
        if i.isdigit():
            t = threading.Thread(target=PortScanner, args=(IP, int(i)))
            # args 动态参数就是传入的参数的个数是动态的
            t.start()
        else:
            newPortList = i.split('-')
            startPort = int(newPortList[0])
            endPort = int(newPortList[0])
            for port in range(int(newPortList[0]), int(newPortList[0])):
                t = threading.Thread(target=PortScanner, args=(IP, port))
                t.start()
    print('[*] The TCP CONNECT SCAN is complete!')


if __name__ == '__main__':
    main()

知识点补充:
socket.AF_UNIX 只能够用于单一的Unix系统进程间通信
socket.AF_INET 服务器之间网络通信
socket.AF_INET6 IPv6
socket.SOCK_STREAM 流式 socket,for TCP
socket.SOCK_DGRAM 数据报式 socket,for UDP

创建 TCP Socket:
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

创建 UDP Socket:
s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


使用nmap

nmap -h 

SCAN TECHNIQUES:
  -sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans

nmap -sT 地址
1651849302_627538568183813970a4e.png!small

MSF

use auxiliary/scanner/portscan/tcp
1651849309_6275385d10e398f0f1069.png!small

0x05 TCP SYN SCAN

TCP SYN SCAN 是TCP 半连接扫描,该方式发送 SYN 到目标端口

  • 如果收到SYN/ACK回复,可以判断端口是开放的
  • 如果收到RST包,该端口是关闭的
  • 如果没有收到回复,该端口被屏蔽了

该方式仅发送SYN包对目标主机的特定端口,但不建立完整的TCP连接,相对较隐蔽,而且效率比较高,适用范围广。
1651849315_6275386368a5c0534bdaf.png!small

使用nmap

nmap -h 

SCAN TECHNIQUES:
  -sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans

nmap -sS 地址
1651849320_62753868f1ec9508972e2.png!small

MSF

use auxiliary/scanner/portscan/syn
1651849328_627538704ca1df44e7e16.png!small

如果遇到这种情况:
1651849336_62753878ddd5949c94d2a.png!smallsudo一下

0x06 TCP Xmas Tree SCAN

该扫描模式通过发送带有下列标志位的 TCP 数据包 :

  • URG:urgent紧急
  • PSH:PSH为1表示的是有真正的TCP数据包内容被传递
  • FIN:finish结束,在结束会话时使用

正常情况下,三个标志位不能被同时设置,但在此种扫描中可以用来判断哪些端口关闭还是开放。
1651849343_6275387fdf412a2170c9a.png!small

当端口关闭时,计算机接收到的数据包不包含SYN,RST,或者ACK位,会向发送方发送一个RST,若在端口开放时,则不返回任何消息。

总的来说Xmas tree 就是指 flags 中 FIN、URG、PSH 被置为1的TCP包。

使用nmap

nmap -h 

SCAN TECHNIQUES:
  -sN/sF/sX: TCP Null, FIN, and Xmas scans

MSF

use auxiliary/scanner/portscan/xmas

0x07 TCP NULL SCAN

NULL包是指所有的flags都为0的TCP包,

如果没有收到接收方的回复,则认为端口开放,收到RST则为端口关闭。
1651849352_62753888980759a337380.png!small

使用nmap

nmap -h 

SCAN TECHNIQUES:
  -sN/sF/sX: TCP Null, FIN, and Xmas scans

nmap -sN 地址

MSF

use auxiliary/scanner/portscan/xmas

0x08 TCP ACK SCAN

使用TCP ACK扫描不能够确定端口的关闭或者开放

向目标主机的端口发送ACK包

如果收到RST包,说明该端口没有被防火墙屏蔽
没有收到RST包,说明被屏蔽

该方式只能用于确定防火墙是否屏蔽某个端口,可以辅助TCP SYN的方式来判断目标主机防火墙的状况。

1651849360_6275389042ec9898f2a06.png!small

使用nmap

nmap -h 

SCAN TECHNIQUES:
-sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans

nmap -sA 地址

MSF

use auxiliary/scanner/portscan/ack
1651849366_627538968551d3bfc4152.png!small

0x09 TCP WINDOW SCAN

窗口扫描与 ACK 扫描完全相同,它利用某些系统的实现细节来区分端口是否打开,而不是总是 unfiltered 在返回 RST 时打印。简单说就是检查数据包的大小来衡量端口是否打开。如果 RST 数据包中的窗口大小不为零,则说明目标端口是开放的。

1651849372_6275389c9c51e9fc5b734.png!small

使用nmap

1651849378_627538a22015b77576d7e.png!small

图片地址:https://nmap.org/

0x10 TCP Idle Scan

空闲扫描允许完全盲端口扫描,攻击者实际上可以扫描目标,而无需从他们自己的 IP 地址向目标发送单个数据包,可以使用巧妙的侧信道攻击允许扫描从一个“僵尸主机”反弹 。入侵检测系统 (IDS) 报告会将僵尸指为攻击者。除了非常隐蔽之外,这种扫描方式允许挖掘机器之间基于IP的信任关系。

空闲扫描的步骤:

  1. 探测僵尸的 IP ID 并记录下来。
  2. 僵尸机主机上伪造一个包,并将其发送到目标主机上所需的端口,并根据端口状态,目标的反应可能会导致僵尸机的 IP ID 增加
  3. 再探查僵尸机的IP ID,比较两次得到IP ID值

若僵尸机的IP ID增加了1,说明僵尸机还没有发出任何包,响应攻击者的探查请求除外。没有发送包也就意味着目标端口没有被打开。若僵尸机的IP ID增加了2,说明在两次探测之间发送了一个数据包,这个额外的数据包通常意味着端口是开放的。

僵尸机空闲扫描

1651849534_6275393ea34a14708ba9e.png!small?1651849534877

nmap官网上有一张特别详细的图:
1651849385_627538a9a707020525905.png!small

为了能让读者更明白一些,我通过更直白的语言讲解一下。

端口开放

  1. 攻击者向僵尸发送SYN/ACK报文,僵尸机发送回一个RST,并透露它的IP ID。

1651849391_627538af7c8fcea05aa02.png!small

  1. 目标主机发送SYN/ACK给僵尸机,以响应看起来是来自于僵尸机的来自于攻击方的SYN,僵尸返回一个SYN/ACK,在进程中增加它的IP ID。

1651849409_627538c126e81f65cfd0d.png!small

  1. 重复第一步,僵尸机的IP ID + 2。

1651849416_627538c8c186d6fb44bf7.png!small

端口关闭

  1. 攻击者向僵尸发送SYN/ACK报文,僵尸机发送回一个RST,并透露它的IP ID。

1651849423_627538cf1f827261ae9fc.png!small

  1. 目标主机发送SYN/ACK给僵尸机,以响应看起来是来自于僵尸机的来自于攻击方的SYN,僵尸返回一个RST。

1651849428_627538d48b56da31207e4.png!small

  1. 重复第一步,僵尸机的IP ID + 1。

1651849434_627538da2f18f211aa8f2.png!small

端口被过滤

  1. 攻击者向僵尸发送SYN/ACK报文,僵尸机发送回一个RST,并透露它的IP ID。

1651849439_627538df1033201f45da4.png!small

  1. 目标主机忽略了SYN,也没有向僵尸机发送RST,没有任何相应IP ID也没有增加。

1651849444_627538e487989c0165a2b.png!small

  1. 重复第一步,僵尸机的IP ID + 1。

1651849449_627538e979854fd13b10d.png!small

0x11 UDP Scan

由于 UDP 扫描通常比 TCP 更慢且更困难,但是也不能忽略UDP端口扫描。
它可以与诸如 SYN 扫描 (-sS) 之类的 TCP 扫描类型结合使用,以在同一运行期间检查两种协议,UDP 扫描通过向每个目标端口发送一个 UDP 数据包来工作。

UDP扫描一般如果返回ICMP port unreachable说明端口关闭。
没有回应或有回应则认为是端口开放,但是UDP是不可靠的,存在丢包的可能性。
1651849455_627538ef8e08bf0f13a0a.png!small

使用nmap

nmap -h 

SCAN TECHNIQUES:=
  -sU: UDP Scan

nmap -sU 地址。
1651849464_627538f86e4693c5b1edb.png!small

图片地址:https://nmap.org/

reference:
https://hmurl.cn/JfHqdODP
https://nmap.org/

# 端口扫描
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录