Python端口扫描程序原理解析

Nmap是一款强大的端口扫描工具,渗透测试中经常用到,其功能主要有主机发现,端口扫描,版本侦测,OS侦测等。其中端口扫描是Nmap的核心功能,端口扫描有SYN扫描、TCP connect扫描、UDP扫描、ACK扫描等。为了了解Nmap的端口扫描原理,现用Python实现一个简单的端口扫描器,并用Wireshark抓包分析。附上源码:

#python3环境下运行
#encoding: utf-8  
from socket import *
import threading

lock = threading.Lock()
openNum = 0
threads = []

def portScanner(host,port):
    global openNum
    try:
        s = socket(AF_INET,SOCK_STREAM)
        s.connect((host,port))
        lock.acquire()
        openNum+=1
        print('[+] %d open' % port)
        lock.release()
        s.close()
    except:
        pass

def main():
    setdefaulttimeout(1)
    ip = input('please enter your host: ')
    for p in range(1,4000):
        t = threading.Thread(target=portScanner,args=(ip,p))
        threads.append(t)
        t.start()     

    for t in threads:
        t.join()

    print('[+] The scan is complete!')
    print('[+] A total of %d open port ' % (openNum))

if __name__ == '__main__':
    main()

上面源码用的socket模块下的socket函数,其中socket(AF_INET,SOCK_STREAM)中的SOCK_STREAM代表TCP连接,如果是SOCK_DGRAM则代表UDP连接,上面程序还用到了多线程技术。程序运行结果如下:
这里写图片描述
下面就通过Wireshark抓包工具来看看程序是如何识别开放与关闭的端口的:
这里写图片描述
端口1的TCP数据包
这里写图片描述
端口22的TCP数据包(中间两行其他端口的被cut掉了)

运行程序后,在过滤器里面直接输入TCP,可以看到tcp数据包的传输过程,以端口1和端口22为例,由程序运行结果图可知端口1是关闭的,端口22(ssh服务)是开放的。
扫描端口1时,客户端先创建套接字,然后连接远程服务器ip和端口1,发送标志位SYN,服务器端口1并没有开放,所以服务器返回[RST,ACK]标志位,RST代表复位,并强制关闭tcp连接。

扫描22端口时,客户端发送SYN标志位,服务器端口22是开放的,服务器会发送一个[SYN,ACK]标志位,然后客户端发送一个ACK标志位,整个TCP三次握手完成,最后客户端还会发送一个[FIN,ACK],FIN标志位代表连接断开。
这是TCP端口扫描方式,其原理跟Nmap中的TCP端口扫描方式一样,这种连接方式的缺点是建立了三次握手,不够隐蔽,是无法进行SYN扫描的选择,SYN扫描没有建立三次握手,隐蔽性较强。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值