龙空技术网

Python 实现端口扫描

墨客moke 1300

前言:

此时看官们对“pythonsocket端口”大概比较着重,朋友们都需要了解一些“pythonsocket端口”的相关内容。那么小编也在网络上网罗了一些关于“pythonsocket端口””的相关文章,希望各位老铁们能喜欢,大家快快来了解一下吧!

TCP Connect扫描

TCP Connect扫描又叫做全连接扫描,客户端与服务器建立 TCP 连接要进行一次三次握手,如果进行了一次成功的三次握手,则说明端口开放。 假设客户端想与服务端的80端口进行通信,首先客户端会发送一个带有SYN标识和端口号的TCP数据包给服务器,如果服务器这个端口是开放的,则会接受这个连接并返回一个带有SYN和ACK标识的数据包给客户端,随后客户端会发送带有ACK和RST标识的数据包给服务点,此时客户端与服务器建立了连接。

当客户端发送一个带有 SYN 标识和端口号的 TCP 数据包给服务器后,如果服务器端返回一个带 RST 标识的数据包,则说明端口处于关闭状态。

实现代码

# #!/usr/bin/python3#sacn.py# python3 TCP 连接扫描import sysfrom socket import *import time#统计端口开启数量open_num = 0def scan(ip,port):    global open_num    try:        s = socket(AF_INET,SOCK_STREAM)        s.connect((ip,port))        open_num+=1        print('{0} port {1} is open'.format(ip, port))    except Exception as err:        #print('{0} port {1} is close'.format(ip,port))        pass    finally:        s.close()def main():    #设置超时时间,秒为单位    setdefaulttimeout(1)    #获取第一个参数为主机名称    host = sys.argv[1]    #获取端口区间    ports= sys.argv[2].split('-')    start_pt = int(ports[0])    end_pt = int(ports[1])    #获取主机IP地址    target_ip = gethostbyname(host)    #开始计时    start_time = time.time()    for port in range(start_pt,end_pt):        scan(target_ip,port)    #计时结束    end_time = time.time()    #输出存活端口数量    print('存活端口%d 个'%(open_num))    #输出扫描耗费市场    print('总共用时{:.2f}秒'.format(end_time-start_time))if __name__=='__main__':    main()

上述代码实现了TCP connect单线程扫描功能,如果全端口扫描将会超级慢,下面引入多线程改造。

多线程操作实现

#!/usr/bin/python3# python3 TCP 连接扫描import sysfrom socket import *import timeimport threadinglock = threading.Lock()threads =[]open_num = 0setdefaulttimeout(1)def scan(ip,port):    global open_num    try:        s = socket(AF_INET,SOCK_STREAM)        s.connect((ip,port))        lock.acquire()        open_num+=1        print('{0} port {1} is open'.format(ip, port))        lock.release()    except Exception as err:        #print('{0} port {1} is close'.format(ip,port))        pass    finally:        #lock.release()        s.close()def main():    host = sys.argv[1]    ports= sys.argv[2].split('-')    start_pt = int(ports[0])    end_pt = int(ports[1])    target_ip = gethostbyname(host)    start_time = time.time()    for port in range(start_pt,end_pt):        t = threading.Thread(target=scan,args=(target_ip,port))        threads.append(t)        t.start()        #scan(target_ip,port)    for t in threads:        t.join()    end_time = time.time()    print('存活端口 %d 个'%(open_num))    print('总共用时{:.2f}秒'.format(end_time-start_time))if __name__=='__main__':    main()
相同扫描执行时间对比
moke@moke:~/moke_python$ python3 scan.py  22-28218.203.117.211 port 25 is open存活端口1 个总共用时5.01秒moke@moke:~/moke_python$ python3 scan_thread.py  22-28218.203.111.82 port 25 is open存活端口 1 个总共用时1.00秒
本章节知识点
1.socket:Socket 是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。2.threading:多线程
下一讲内容

python多线程

标签: #pythonsocket端口