iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
自我挑戰組

從零開始:資安滲透初探系列 第 8

08: 資安滲透初探: Python 編程項目 1 - 端口掃描器

  • 分享至 

  • xImage
  •  

今天分享的部分算是額外的內容,
如果對於Python沒有興趣或是想專注在課程主軸的,這篇可以跳過不會影響

但是,編寫python可以用另一個角度,透過代碼更加理解port掃描哦
今天分享的代碼是一個簡單的端口掃描工具,用來檢查指定目標IP地址的一系列port是否開放

這段代碼是一個簡單的端口掃描工具,用來檢查指定目標IP地址的一系列端口是否開放。以下是逐步解釋和說明代碼的作用:

  1. 導入模塊

    import socket
    import termcolor
    
    • socket 模塊提供了網絡連接相關的功能。
    • termcolor 模塊用於在終端上顯示彩色文本。
  2. 定義 scan_ports 函數

    def scan_ports(target, number_of_ports):
        """
        掃描指定目標的開放端口。
    
        :param target: 要掃描的目標IP地址。
        :param number_of_ports: 要掃描的端口範圍(從1開始)。
        """
        print('\nStarting Scan For ' + target)
        for port in range(1, number_of_ports + 1):
            check_port(target, port)
    
    • 這個函數負責掃描指定目標IP地址的開放端口。
    • target 是目標IP地址,number_of_ports 是要掃描的端口數量。
    • 對於從1到 number_of_ports 的每個端口,調用 check_port 函數進行檢查。
  3. 定義 check_port 函數

    def check_port(ip_address, port):
        """
        檢查指定IP地址的特定端口是否開放。
    
        :param ip_address: 目標IP地址。
        :param port: 要檢查的端口號。
        """
        try:
            # 建立套接字連接
            with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
                # 設定連接超時時間為1秒
                sock.settimeout(1)
                # 嘗試連接目標IP和端口
                result = sock.connect_ex((ip_address, port))
                if result == 0:
                    print(termcolor.colored(f"[+] Port {port} is Open", 'green'))
        except Exception as e:
            print(termcolor.colored(f"[-] Error scanning port {port}: {e}", 'red'))
    
    • 該函數檢查指定IP地址的特定端口是否開放。
    • 使用 socket 模塊創建一個TCP連接,設置超時時間為1秒。
    • 使用 connect_ex 方法嘗試連接目標IP和端口。如果連接成功(返回值為0),則該端口是開放的。
    • 如果出現異常,則打印錯誤信息。
  4. 定義 main 函數

    def main():
        """
        主程序,負責獲取用戶輸入和啟動端口掃描。
        """
        targets = input("[*] Enter Targets To Scan (split them by ','): ").split(',')
        ports = int(input("[*] Enter Number Of Ports To Scan (1 to n): "))
    
        for target in map(str.strip, targets):  # 去除每個IP地址的多餘空格
            print(termcolor.colored(f"[*] Scanning Target: {target}", 'blue'))
            scan_ports(target, ports)
    
    • 該函數負責從用戶獲取輸入信息,包括目標IP地址和要掃描的端口數量。
    • 將用戶輸入的目標IP地址按逗號分隔,並去除每個IP地址的多餘空格。
    • 依次掃描每個目標IP地址,調用 scan_ports 函數進行掃描。
  5. 主程序入口

    if __name__ == "__main__":
        main()
    
    • 該部分檢查當前腳本是否作為主程序運行,如果是,則調用 main 函數啟動程序。

總結

這段代碼用來進行一個簡單的掃描,通過嘗試連接指定目標的各個端口來檢查它們是否開放,並且使用 termcolor 模塊在終端上以彩色顯示結果。

以下是完整的程序,可以參考看看

import socket
import termcolor

def scan_ports(target, number_of_ports):
    """
    掃描指定目標的開放端口。

    :param target: 要掃描的目標IP地址。
    :param number_of_ports: 要掃描的端口範圍(從1開始)。
    """
    print('\nStarting Scan For ' + target)
    for port in range(1, number_of_ports + 1):
        check_port(target, port)

def check_port(ip_address, port):
    """
    檢查指定IP地址的特定端口是否開放。

    :param ip_address: 目標IP地址。
    :param port: 要檢查的端口號。
    """
    try:
        # 建立套接字連接
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
            # 設定連接超時時間為1秒
            sock.settimeout(1)
            # 嘗試連接目標IP和端口
            result = sock.connect_ex((ip_address, port))
            if result == 0:
                print(termcolor.colored(f"[+] Port {port} is Open", 'green'))
    except Exception as e:
        print(termcolor.colored(f"[-] Error scanning port {port}: {e}", 'red'))

def main():
    """
    主程序,負責獲取用戶輸入和啟動端口掃描。
    """
    targets = input("[*] Enter Targets To Scan (split them by ','): ").split(',')
    ports = int(input("[*] Enter Number Of Ports To Scan (1 to n): "))

    for target in map(str.strip, targets):  # 去除每個IP地址的多餘空格
        print(termcolor.colored(f"[*] Scanning Target: {target}", 'blue'))
        scan_ports(target, ports)

if __name__ == "__main__":
    main()


上一篇
07: 資安滲透初探: 掃描(Scanning)
下一篇
09: 資安滲透初探: 漏洞分析
系列文
從零開始:資安滲透初探27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言