本文共 3248 字,大约阅读时间需要 10 分钟。
端口是设备与外界进行通信的重要接口。就像一栋房子的门一样,端口是服务器与外部网络进行交流的通道。不同的端口可能指向不同的服务或应用程序。如果入侵者能够掌握服务器的控制权,首先需要通过一个开放的端口进入系统,然后利用获得的权限逐步扩大影响范围。因此,了解服务器开启的端口状态以及这些端口后面所提供的服务信息,对于网络安全防护具有极其重要的意义。
传统的端口扫描技术能够帮助网络管理员识别开放的端口和潜在的安全漏洞。通过扫描可以发现哪些端口正在监听请求,哪些端口可能被恶意利用,从而采取相应的安全防护措施。
本节将展示一个用于端口扫描的Python程序,该程序能够高效地扫描目标机器上开放的端口,并支持多线程操作以加快扫描速度。
导入必要的库
sys
:用于标准输入输出操作socket
:用于socket编程threading
:用于多线程操作queue
:用于线程间的数据通信端口扫描类
import socketimport threadingimport queueclass PortScanner(threading.Thread): def __init__(self, port_queue, ip): threading.Thread.__init__(self) self.port_queue = port_queue self.ip = ip def run(self): while True: if self.port_queue.empty(): break port = self.port_queue.get(timeout=0.5) try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(3) conn = s.connect_ex((self.ip, port)) if conn == 0: print(f"[{port}] OPEN") except Exception as e: print(e) finally: s.close()
启动端口扫描
def StartScan(target_ip, ports, num_threads): port_list = [] if '-' in ports: start, end = map(int, ports.split('-')) port_list = list(range(start, end + 1)) else: port_list.append(int(ports)) port_queue = queue.Queue() for port in port_list: port_queue.put(port) threads = [] for _ in range(num_threads): threads.append(PortScanner(port_queue, target_ip)) for thread in threads: thread.start() for thread in threads: thread.join()
主函数入口
if __name__ == '__main__': parser = optparse.OptionParser('usage: %prog [options]') parser.add_option('-i', '--ip', dest='target_ip', default='127.0.0.1', type='str', help='目标IP地址') parser.add_option('-p', '--port', dest='target_port', default='80', type='str', help='要扫描的端口或端口范围') parser.add_option('-t', '--thread', dest='thread_num', default=100, type='int', help='同时扫描的线程数') options, args = parser.parse_args() StartScan(options.target_ip, options.target_port, options.thread_num)
为了提高扫描效率和准确性,可以利用现有的Nmap库进行端口扫描。以下是基于Nmap的优化代码:
#!/usr/bin/python3# -*- coding: utf-8 -*-import nmapimport optparsedef NmapScan(target_ip, target_port): nm = nmap.PortScanner() try: result = nm.scan(hosts=target_ip, arguments='-p' + str(target_port)) port_info = result['scan'][target_ip]['tcp'][int(target_port)] print(f"[{target_port}] : {port_info['state']}") except Exception as e: print(e)if __name__ == '__main__': parser = optparse.OptionParser('usage: python %prog [options]') parser.add_option('-i', '--ip', dest='target_ip', default='192.168.1.1', type='str', help='目标IP地址') parser.add_option('-p', '--port', dest='target_port', default='80', type='str', help='要扫描的端口或端口范围') options, args = parser.parse_args() for port in options.target_port.split(','): NmapScan(options.target_ip, port)
运行上述代码后,程序会输出每个端口的状态信息。例如:
80 : OPEN443 : OPEN
从输出结果可以看出,目标服务器开放了80端口和443端口。这些端口分别对应HTTP和HTTPS服务,可能意味着服务器上运行着相应的网络服务。
转载地址:http://bfog.baihongyu.com/