【信息安全】基于TCP协议半连接的端口扫描程序实现

开发目的

端口扫描是一种网络安全测试技术,它使用特定的程序来检测网络上的端口状态。端口扫描可以帮助网络管理员发现和阻止违章应用程序和服务器端口上的潜在安全漏洞,以及帮助网络管理员了解网络的设置和构造;可以帮助安全专家发现和修复网络漏洞,并防止恶意攻击者利用它们来攻击网络系统;可以帮助网络管理员查找潜在的安全漏洞,并执行必要的安全措施,以防止被攻击。此外,端口扫描还可以帮助网络管理员查找未被识别的服务器端口,确定可以利用的资源,以及查找未授权的连接;可以帮助网络管理员确定哪些端口可以被安全使用,以及哪些应当被关闭以防止攻击。

按照使用的协议,端口扫描技术可以分为:TCP/UDP扫描、ICMP扫描和其他协议扫描。TCP/UDP扫描是最常用的,它通过发送连接或查询请求到目标端口,查看端口响应的状态来判断相应端口是否开放。ICMP扫描则是利用ICMP报文发送给主机,以检测其是否存活,以及主机是否支持ICMP回显请求和回显应答。其他协议扫描包括ARP扫描、RPC扫描、SMB扫描等。

其中,TCP协议半连接端口扫描技术利用TCP协议的特性,通过简单的三次握手,就可以实现端口的扫描,这样可以更安全的探测到目标主机的端口信息,并不会影响到目标主机的安全。优势主要有三点:1、运行速度快:TCP协议半连接端口扫描技术只需要简单的三次握手,因此,扫描的速度要比其他类型的端口扫描技术快得多,可以节省大量的时间;2、可靠性高:TCP协议半连接端口扫描技术是基于TCP协议,因此,在探测端口信息的时候,可靠性要比其他类型的端口扫描技术高得多,可以保证扫描的精准度;3、安全性高:TCP协议半连接端口扫描技术只需要三次握手,不会对目标主机造成安全威胁,是一种很安全的端口扫描技术。

因此,基于这样一种安全、快速、可靠的端口扫描技术——TCP协议半连接端口扫描技术,我们设计了一个端口扫描程序,帮助实现更有效的探测到目标主机的端口信息,同时为网络安全提供有力的保障。

程序功能

本文描述的程序主要就是基于TCP协议半连接端口扫描技术实现的端口扫描程序,核心功能包括发送探测数据包、接收和分析对方机器返回的响应数据包。

TCP协议半连接端口扫描技术概述如下:扫描主机向目标主机的选择端口发送SYN数据包,如果目标主机的应答数据包中包含RST标志位,那么说明该端口是关闭的;如果目标主机的应答数据包中包含SYN和ACK标志位,说明该端口处于监听状态,此时需要发送一个RST数据包给目标机从而停止连接的建立。由于在此过程中全连接尚未建立,所以这种技术通常被称为半连接端口扫描技术。

在程序中总共包含两次数据包的发送过程,第一次是发送探测数据包,也就是发送SYN数据包与目标主机进行第一次握手,第二次是在收到目标主机的响应数据包时,发现其中包含SYN和ACK标志位,则再次发送一个RST数据包给目标主机从而停止连接的建立。

程序的重点就是分析目标主机返回的数据包,若其中包含RST标志位,那么说明端口是关闭的,若其中包含SYN和ACK标志位,则说明目标端口处于监听状态。

示意图如下:
目标主机端口开放:
在这里插入图片描述

目标主机端口关闭:
在这里插入图片描述

程序代码

#!/bin/env python3
# 导入所需要的软件包
from scapy.all import IP, TCP, sr1,send
import argparse

# 实现端口扫描
def port_sacn(dst,sport,dport):
    # 构造tcp数据包
    pkt=IP(dst=dst)/TCP(sport=sport,dport=dport,flags='S')
    # 发送tcp数据包并接受应答数据包
    ans=sr1(pkt, timeout=1)
    # 没有收到回应(可能是ip不存在)
    if str(type(ans)) == "<class 'NoneType'>":
        print('没有收到%s'%dst,'的%s端口的回应'%dport)
    # 收到了tcp数据包作为回应
    elif ans.haslayer(TCP):
        # 拿到数据包的TCP标志位
        ans_flags=[x for x in ans.getlayer(TCP).flags]
        # SA
        if 'S' in ans_flags and 'A' in ans_flags:
            print(ans.src,'的',ans.sport,'端口开放!')
            # 构造RST数据包并发送,不接受响应
            seq = ans.ack
            ack = ans.seq + 1
            pkt=IP(dst=dst)/TCP(sport=sport,dport=dport,seq=seq,ack=ack,flags='R')
            send(pkt)
        # RA
        elif 'R' in ans_flags:
            print(ans.src,'的',ans.sport,'端口未开放!')
    # 收到异常回应
    else:
        print('收到%s'%dst,':%s端口的异常回应'%dport)

if __name__ == "__main__" :
    # 获取参数 
    parser = argparse.ArgumentParser(description='manual to this script')
    parser.add_argument("--dst", type=str, default="10.0.2.6")
    parser.add_argument("--dports", nargs='+',type=int, default=[8081])
    args = parser.parse_args()
    dst=args.dst 
    dports=args.dports 
    sport=20

    # 对各个端口进行扫描
    for dport in dports:
        port_sacn(dst,sport,dport)
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值