博客
关于我
端口探测
阅读量:363 次
发布时间:2019-03-05

本文共 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库进行端口扫描。以下是基于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/

    你可能感兴趣的文章
    Java基础题:小根堆为8,15,10,21,34,16,12,删除关键字8之后需重建堆,需要的比较次数为?
    查看>>
    phthon基本语法——温习
    查看>>
    sleep、wait、yield、join——简介
    查看>>
    web项目配置
    查看>>
    VTK:相互作用之MouseEventsObserver
    查看>>
    VTK:相互作用之PickableOff
    查看>>
    VTK:相互作用之Picking
    查看>>
    VTK:Medical之MedicalDemo2
    查看>>
    libfacedetection库的配置及基本使用——内涵(cmake编译libfacedetection库)
    查看>>
    VS配置属性表,保存Opencv配置信息
    查看>>
    c语言(基本数据类型)实参与形参传值 用汇编理解
    查看>>
    输入端噪声容限
    查看>>
    vue——this.$route 与 this.$router
    查看>>
    基于单片机可控音乐流水灯控制设计-全套资料
    查看>>
    基于单片机简易信号误差分析设计-全套资料
    查看>>
    基于单片机简易洗衣机系统仿真设计-全套资料
    查看>>
    基于单片机简易脉搏测量仪系统设计-毕设课设资料
    查看>>
    基于单片机八层电梯系统控制设计-毕设课设资料
    查看>>
    并发框架下的“基础类型”——浅析基本类型、ThreadLocal、原子类的线程安全机制
    查看>>
    Android Studio同步Gradle失败的解决办法
    查看>>