TCP端口掃描器

一個基於Python3的TCP端口掃描器

原理:就是和不同的端口進行TCP連接,能連接成功就表示此端口是開放的,不能連接成就表示此端口是關閉的。


import socket
import re
import threading
import time
 
lock = threading.Lock()
threads = list()
ports_list = list()
 
 
def judge_hostname_or_ip(target_host):
    # 判斷輸入的是域名還是IP地址
    result = re.match(
        r"^(\d|[1-9]\d|1\d\d|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(\d|[1-9]\d|1\d\d|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\."
        "(\d|[1-9]\d|1\d\d|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(\d|[1-9]\d|1\d\d|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$",
        target_host)
 
    if result:
        # print(result.group())
        return result.group()
    else:
        try:
            socket.setdefaulttimeout(1)
            IP = socket.gethostbyname(target_host)
            return IP
        except Exception as e:
            print("請正確輸入網址或者ip地址...", e)
            exit()
 
 
def parse_port(ports):
    """把連接符-傳輸過來的值解析爲對應的數字   端口範圍1-65535"""
    if ports:
        try:
            res = re.match(r'(\d+)-(\d+)', ports)
            if res:
                if int(res.group(2)) > 65535:
                    print("末尾端口輸入有誤!!....請新輸入")
                    exit()
                return range(int(res.group(1)), int(res.group(2)))
        except:
            print("端口解析錯誤.....請正確輸入端口範圍")
            exit()
    else:
        return [19, 21, 22, 23, 25, 31, 42, 53, 67, 69, 79, 80, 88, 99, 102, 110, 113, 119, 220, 443]
 
 
def test_port(host, port):
    """測試端口是否開啓"""
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((host, port))
        lock.acquire()   # 加線程鎖
        print("{}, {}端口打開".format(host, port))
        ports_list.append(port)
    except:
        lock.acquire()
    finally:
        lock.release()
        s.close()
 
 
def main():
    ip = judge_hostname_or_ip(input("請輸入域名或者IP:"))
    l = parse_port(input("請輸入端口範圍如: 1-1024 [不輸入直接回車默認掃描常見端口]:"))
 
    t1 = time.time()
    # 每個套接字的最大超時時間
    socket.setdefaulttimeout(3)
    # 開啓線程來測試
    for port in l:
        t = threading.Thread(target=test_port, args=(ip, port))
        threads.append(t)    # 添加到等待線程列表裏面
        t.start()
 
    for t in threads:
        t.join()    # 等待線程全部執行完畢
 
    t2 = time.time()
    print("總共耗時:", t2 - t1)
    print("IP:{}, 有{},共{}個端端口打開".format(ip, ports_list, len(ports_list)))
 
 
if __name__ == '__main__':
    main()

二:TCP相關知識

1、TCP connect掃描:也稱爲全連接掃描,這種方式直接連接到目標端口,完成了TCP三次握手的過程,這種方式掃描結果比較準確,但速度比較慢而且可輕易被目標系統檢測到。

2、TCP SYN掃描:也稱爲半開放掃描,這種方式將發送一個SYN包,啓動一個TCP會話,並等待目標響應數據包。如果收到的是一個RST包,則表明端口是關閉的,而如果收到的是一個SYN/ACK包,則表示相應的端口是打開的。

3、Tcp FIN掃描:這種方式發送一個表示拆除一個活動的TCP連接的FIN包,讓對方關閉連接。如果收到了一個RST包,則表明相應的端口是關閉的。

4、TCP XMAS掃描:這種方式通過發送PSH、FIN、URG、和TCP標誌位被設爲1的數據包。如果收到了一個RST包,則表明相應的端口是關閉的

參考文章:https://blog.csdn.net/wgpython/article/details/79439830

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章