0x00 前言

使用Python对目标主机开放的TCP端口进行多线程扫描,编程思路:

1、定义portscan函数,创建socke对象,进行TCP端口扫描

2、启动多线程运行PortScan函数

3、记录并输出扫描结果与时间

0x01 运行原理

基于TCP连接建立时的三次握手来判断目标端口是否开启:

TCP三次握手.jpg

0x02 创建端口扫描函数

def portscan(target,port):
    # 定义portscan函数,进行TCP端口扫描
    try:
        client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  #创建socket对象
        client.connect((target,port))  #建立socket连接,判断端口是否开放
        print("[*] %s:%d端口开放" % (target,port))
        client.close()
    except:
        pass  #捕获异常,避免socket连接建立失败造成程序退出

0x03 多线程

扫描20-30端口,所需时间

单线程耗时189s:

单线程.jpg

多线程几乎瞬间完成:

多线程.jpg

导入Thread模块多线程调用portscan()函数进行端口扫描

for port in range(1,9999):
        # 启动多线程运行PortScan函数
        t = Thread(target=portscan,args=(target,port))  #创建线程对象
        t.start()  #开始线程

0x04 完整代码

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
# 编程思路
# 1、定义portscan函数,创建socket对象进行TCP端口扫描
# 2、启动多线程运行PortScan函数
# 3、记录并输出扫描结果与时间

import socket  #创建TCP连接
from threading import Thread  #多线程模块,进行多线程扫描
import time  #时间模块,记录扫描所需时间

def main():
    target = input("IP:")
    start_time = time.time()
    s_time = time.ctime()
    print("[*] Start port scan at %s" % s_time)
    for port in range(1,9999):  #定义扫描的端口范围
        # 2、启动多线程运行PortScan函数
        t = Thread(target=portscan, args=(target, port))  # 创建线程对象
        t.start()  # 开始线程

    end_time = time.time()
    print("[*] All done in %.2f s" % (end_time - start_time))

def portscan(target,port):
    # 1、定义portscan函数,进行TCP端口扫描
    try:
        client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  #创建socket对象
        client.connect((target,port))  #建立TCP连接
        print("[*] %s:%d端口开放" % (target,port))
        client.close()
    except:
        pass  #捕获异常

if __name__ == "__main__":
    main()

运行结果:

运行结果.gif