Python for InfoSec Part 2: Scan Port


  • administrators

    Trong bảo mật việc xác định dịch vụ đang chạy ở cổng nào nhằm bảo mật cho cổng kết nối đó là một việc quan trọng và rất cơ bản. Việc đầu tiên là chúng ta sẽ sinh ngẫu nhiên các cổng kết nối với một danh sách có sẵn sau đó kiểm tra từng cổng đó.
    Giả sử tôi sẽ thử sinh như sau:

    >>>
    >>> for port in range(1000,1024):
    ...   print "[+] The port is: "+str(port)
    ...
    [+] The port is: 1000
    [+] The port is: 1001
    [+] The port is: 1002
    [+] The port is: 1003
    [+] The port is: 1004
    [+] The port is: 1005
    [+] The port is: 1006
    [+] The port is: 1007
    ...
    

    Tiếp theo chúng ta sẽ thử kết nối đến máy chủ với các cổng có sẵn. Trong ví dụ sau chúng tôi sẽ dùng thư viện socket để tạo kết nối:

    >>>
    >>> import socket
    >>>
    >>> s = socket.socket()
    >>> s.connect(('127.0.0.1', 22))
    >>> s.send('Python Viet Nam\n')
    17
    >>> banner = s.recv(1024)
    >>> print banner
    OpenSSH
    

    Ở ví dụ trên chúng ta dùng module socket và gọi hàm connect () để kết nối đến địa chỉ IP nhất định và cổng kết nối. Nếu kết nối TCP được mở (SYN/SYN-ACK/ACK) và chúng ta có thể gửi dữ liệu tới một đích nhận với hàm send(), sau đó in kết quả phản hồi với recv(). Giả sử cổng không được mở như ví dụ sau:

    >>> s.connect(('127.0.0.1', 23))
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "<string>", line 1, in connect
    socket.error: (111, 'Connection refused')
    

    Chúng ta sẽ phải bắt lỗi phần này ví dụ sau chúng ta đưa vào try ... except

    >>>
    >>> try:
    ...   s.connect(('127.0.0.1', 23))
    ... except: pass
    ...
    >>>
    

    Giờ chúng ta sẽ thử hoàn thiện chương trình nhỏ như sau:

    >>>
    >>> for port in range(20,25):
    ...   try:
    ...    print "[+] Attempting to connect to 127.0.0.1:"+str(port)
    ...     s.connect(('127.0.0.1', port))
    ...     s.send('Python Viet Nam \n')    
    ...     banner = s.recv(1024)
    ...     if banner:
    ...       print "[+] Port "+str(port)+" open: "+banner
    ...     s.close()
    ...   except: pass
    ...
    17
    [+] Attempting to connect to 127.0.0.1:20
    [+] Attempting to connect to 127.0.0.1:21
    [+] Attempting to connect to 127.0.0.1:22
    [+] Port 22 open: OpenSSH
    [+] Attempting to connect to 127.0.0.1:23
    [+] Attempting to connect to 127.0.0.1:24
    [+] Attempting to connect to 127.0.0.1:25
    
    

    Trong ví dụ trên, để quét các cổng chúng ta sẽ đưa vào vòng lặp for để kiểm tra.
    Tiếp theo giả sử chúng ta sẽ chỉ quét một số cổng mà chúng ta chỉ định, việc đầu tiên là phải khai báo các cổng đó.
    Ví dụ:

    >>>
    >>> ports = [22, 445, 80, 443, 3389]
    >>> for port in ports:
    ...   print port
    ...
    22
    445
    80
    443
    3389
    >>>
    

    Cũng tương tự với địa chỉ IP, giả sử tôi muốn quét một số cổng của một số IP. Ta có ví dụ sau:

    >>>
    >>> hosts = ['127.0.0.1', '192.168.1.5', '10.0.0.1']
    >>>
    >>> ports = [22, 445, 80, 443, 3389]
    >>>
    >>> for host in hosts:
    ...   for port in ports:
    ...     try:
    ...        print "[+] Connecting to "+host+":"+str(port)
    ...        s.connect((host, port))
    ...        s.send('Python Viet Nam \n')
    ...        banner = s.recv(1024)
    ...        if banner:
    ...          print "[+] Port "+str(port)+" open: "+banner
    ...        s.close()
    ...     except:pass
    ...
    [+] Connecting to 127.0.0.1:22
    [+] Port 22 open: OpenSSH
    [+] Connecting to 127.0.0.1:445
    [+] Connecting to 127.0.0.1:80
    [+] Connecting to 127.0.0.1:443
    [+] Connecting to 127.0.0.1:3389
    [+] Connecting to 192.168.1.5:22
    [+] Connecting to 192.168.1.5:445
    [+] Connecting to 192.168.1.5:80
    [+] Connecting to 192.168.1.5:443
    [+] Connecting to 192.168.1.5:3389
    [+] Connecting to 10.0.0.1:22
    [+] Connecting to 10.0.0.1:445
    [+] Connecting to 10.0.0.1:80
    [+] Connecting to 10.0.0.1:443
    [+] Connecting to 10.0.0.1:3389
    

    Trên thực tế có nhiều cách khác để làm việc này tối ưu hơn ví dụ dùng một số phần mềm chuyên dụng để scan port, ip với nhiều tuỳ chọn hay và đúng đắn hơn. Các bạn có thể nghiên cứu và mở rộng chương trình của mình.
    Chúc các bạn thành công, hy vọng nhận được góp ý của các bạn.



  • anh cho em hỏi ngu tí, infosec là gì ạ


Hãy đăng nhập để trả lời
 

Có vẻ như bạn đã mất kết nối tới Cộng đồng Python Việt Nam, vui lòng đợi một lúc để chúng tôi thử kết nối lại.